AWS アカウントが 2 つあります。 - ECR リポジトリを持つアカウント A。 - Fargate を実行する ECS クラスターを持つアカウント b。
アカウント B との信頼関係を持つ「クロスアカウント」ロールをアカウント A に作成し、このロールに「AmazonEC2ContainerRegistryPowerUser」ポリシーを添付しました。
アカウント B の ID と「クロスアカウント」ロールをリポジトリ ポリシーに追加して、アカウント A の ECR リポジトリへのアクセス権を付与しました。
Fargate が「クロスアカウント」ロールを引き受けることを許可するポリシーを Fargate の「TaskExecutionRole」に添付しました。
アカウント A のイメージを参照してアカウント B に Fargate タスクをデプロイしようとすると、500 エラーが発生します。
ベストアンサー1
Fargate は、クロスアカウントロールを自動的に引き受けることはありません。幸いなことに、そのアカウントの ECR リポジトリからイメージをプルするために、別のアカウントでロールを引き受ける必要はありません。
ECR内のイメージへのアカウント間アクセスを有効にするには、アカウントAのリポジトリにアカウントBのアクセスを追加します(リポジトリポリシー) を作成し、ECR からプルする権限を持つアカウント B の TaskExecutionRole ("ecr:GetDownloadUrlForLayer"、"ecr:BatchGetImage"、"ecr:BatchCheckLayerAvailability") を指定します。
たとえば、アカウント A のリポジトリに次のようにリポジトリ ポリシーを設定します。
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT_B_ID:root"
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage"
]
}
]
}
次に、アカウント B の TaskExecutionRole に次のようなポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "*"
}
]
}
あるいは、管理ポリシーを使用することもできますAmazonECSTaskExecutionRolePolicy
独自に定義するのではなく、TaskExecutionRole に対して定義します。