🐳

lambrollでAWS LambdaをDockerデプロイするときに注意したいIam ポリシー設定

2023/04/01に公開

lambrollでAWS LambdaをDockerデプロイするときに注意したいIam ポリシー設定

lambrollはAWS lambdaをさくっとデプロイすることが可能なツールです

https://github.com/fujiwara/lambroll

今回はlambrollでAWS LambdaをGithub actionsからDockerデプロイしようとした際にエラーが発生たのですが
エラーの内容に対応した内容をメモとして残します。

この記事が参考となるひと

  • lambrollでAWS LambdaをGithub actionsからzipデプロイはできていたが、コンテナデプロイできるようにもしたい
  • lambroll deployするとコンテナデプロイできなくて各種ログでcheck the ecr permissionsのようなエラー出力がされた

github actionsのworkflow

下記のようなGithub Actionsのworkflowを運用しようとしていました。

jobs:
  deploy:
    name: ecr push and lambroll deploy
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3
    - name: Configure AWS credentials from Test account
      uses: aws-actions/configure-aws-credentials@v2
      with:
        role-to-assume: arn:aws:iam::111111111111:role/my-github-actions-role-test
        aws-region: ap-northeast-1

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

    - name: Build, tag, and push docker image to Amazon ECR
      env:
        REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        REPOSITORY: my-ecr-repo
        IMAGE_TAG: ${{ github.sha }}
      run: |
        docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG .
        docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
    - uses: fujiwara/lambroll@v0
      with:
        version: v0.12.2
    - run: |
        lambroll deploy

※ECR Push自体はlambrollではできなさそうだったので、AWS製の下記のgithub actionsを使ってimageのpushをしています

https://github.com/aws-actions/amazon-ecr-login

エラーログの内容

ログでは下記のようなエラー内容になっていました

lambda does not have permission to access the ecr image. check the ecr permissions.

AWSマネージコンソールにログインして、CloudTrailで確認してみても同じようなエラーが発生していて、Github Actionsに紐付けたロールに影響していたのでそのロールのIAM周りを見直してみることに


イベント名をCreateFunction20150331で絞り込みすると当該ログがみつかるはず(CreateFunctionではなかった)

CIの実行ユーザのIam設定の修正

AWSのドキュメントを参考(Permissionsのあたり)に

https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-images.html

CIの実行ロールでは下記のような編集を行ってみた

{
    "Statement": [
        {
            "Action": [
                "lambda:UpdateFunctionConfiguration",
                "lambda:UpdateFunctionCode",
                "lambda:UpdateAlias",
                "lambda:ListTags",
                "lambda:GetFunctionConfiguration",
                "lambda:GetFunction",
                "lambda:CreateFunction",
                "lambda:CreateAlias",
+                "ecr:SetRepositoryPolicy",
+                "ecr:GetRepositoryPolicy",
+                "ecr:DeleteRepositoryPolicy"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": ""
        }
    ],
    "Version": "2012-10-17"
}

DeleteRepositoryPolicylambroll deleteで使うのかも?と思って付与しています

これでも同様のエラーが発生するので、次にあやしいと思ったLambda実行ロールのIam設定を

Lambda実行ロールのIam設定の修正

Lambda実行ロールについて、修正前はAWSマネージドポリシーのAWSLambdaBasicExecutionRoleのみアタッチした状態でした。

また、AWSのドキュメントを参考(Amazon ECR permissionsのあたり)に

https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-images.html

追加で下記のポリシーを作成してアタッチしたところGithub ActionsからlambrollでのDockerデプロイが可能になりました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LambdaECRImageRetrievalPolicy",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "*"
        }
    ]
}

Discussion