AWS Lambda + ECR の際の IAM 権限まわりについて
Published: 2022/11/6
プライベートな ECR リポジトリのイメージを利用して Lambda を動かす際の IAM 権限まわりが少し分かりにくかったので、そのメモ。
前提: Lambda が ECR イメージを pull するには Resource-based Policy が必要
コンテナイメージで Lambda を動かす際に、そのイメージを pull する主体は AWS Lambda となる。 よって、これは AWS Service が主体(Principal)となる動作であるので、それは ECR リポジトリに対して下記のような Resource-based Policy を付与する必要がある。
{
"Sid": "LambdaECRImageRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
Lambda 関数を作成する際に ECR の設定も行われる
Lambda 関数の作成時に上記の Policy が ECR に設定されていない場合、 Lambda はその作成者(Principal)にその設定を行わせる。
なので、 lambda:CreateFunction
を行っている主体に ecr:getRepositoryPolicy
と ecr:setRepositoryPolicy
の権限がある場合に限り、この制約を意識することなくコンテナ Lambda を作成できる。
クロスアカウントで ECR にアクセスする場合
素直に考えて、ECR 側で、アクセスしたい任意の lambda を許可する Resource-based Policy を上記の通りに指定してやればいけそうな気がするが、それだけでは実現ができない。
ECR 側の Resource-based Policy に、 ecr:BatchGetImage
と ecr:GetDownloadUrlForLayer
に対する許可を、対象アカウントの root ユーザーに対しても付与する必要がある。
{"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountPermission",
"Effect": "Allow",
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
}
},
{
"Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
"Effect": "Allow",
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Condition": {
"StringLike": {
"aws:sourceARN":
"arn:aws:lambda:us-east-1:123456789012:function:*"
}
}
}
]
}
おまけ: Execution Role
ECR の際は、上に述べた通り Lambda のサービスが主体となってイメージの pull を行う。 一方で、それ以外の Lambda が実現している他サービスとの連携機能については、Execution Role が用いられる。
このような連携機能としては、例えば CloudWatch へのロギングであったり、 SQS などの EventSource Mapping による Lambda 連携であったりが挙げられる。
参考 URL
https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-images.html
Tags: aws-lambdaaws-ecraws
関連記事
実行されている環境が AWS Lambda かどうか判定する方法
2022/10/23
SNS + Lambda vs SNS + SQS + Lambda
2022/10/4