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:getRepositoryPolicyecr:setRepositoryPolicy の権限がある場合に限り、この制約を意識することなくコンテナ Lambda を作成できる。

クロスアカウントで ECR にアクセスする場合

素直に考えて、ECR 側で、アクセスしたい任意の lambda を許可する Resource-based Policy を上記の通りに指定してやればいけそうな気がするが、それだけでは実現ができない。

ECR 側の Resource-based Policy に、 ecr:BatchGetImageecr: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

関連記事