別アカウントの ECR を Lambda で使用する際の権限設定について教えてください
困っていた内容
Lambda でコンテナイメージをデプロイする予定ですが、イメージは Lambda とは別アカウントの ECR にプッシュされています。
この場合にどのように権限を設定すればよいでしょうか。
どう対応すればいいの?
ECR のリソースベースポリシーと Lambda の IAM ロールの両方で権限を設定する必要があります。
必要な権限は以下の 2 つです。
- ecr:BatchGetImage
- ecr:GetDownloadUrlForLayer
クロスアカウントアクセスを有効にするには、リソースベースのポリシー で、アカウント全体または別のアカウントのIAMエンティティをプリンシパルとして指定できます。リソースベースのポリシーにクロスアカウントのプリンシパルを追加しても、信頼関係は半分しか確立されない点に注意してください。プリンシパルとリソースが異なる AWS アカウントにある場合は、プリンシパルエンティティにリソースへのアクセス許可も付与する必要があります。
AWS ナレッジセンターではポリシーの例が紹介されていますので、あわせてご参照ください。
ECR のリソースベースポリシーの例は以下の通りです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountPermission",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
},
{
"Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Condition": {
"StringLike": {
"aws:sourceARN": "arn:aws:lambda:us-east-1:111111111111:function:*"
}
}
}
]
}
Lambda の IAM ロールの例は以下の通りです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECR Repository Access Permissions",
"Effect": "Allow",
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "arn:aws:ecr:us-east-1:222222222222:repository/hello-repository"
}
]
}