AWSCodeBuild

CodeBuildでAccessDeniedException GetAuthorizationTokenのエラー

DockerのコンテナイメージをビルドしてECRへ保存するように設定したCodeBuildで An error occurred (AccessDeniedException) when calling the GetAuthorizationToken のエラーに遭遇したのでメモっておきます。

スポンサーリンク

事象

こちらの記事のようにECSで使用するためのDockerイメージをECRへ保存するように設定したCodeBuildを構築しました。

そのCodeBuildを実行したところ異常終了し、CodeBuildの実行ログには以下のようなメッセージが出力されていました。

[Container] 2022/06/11 05:38:23 Running command echo Logging in to Amazon ECR...
Logging in to Amazon ECR...
[Container] 2022/06/11 05:38:23 Running command aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URI
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::123456789012:assumed-role/codebuild-demo-build-service-role/AWSCodeBuild-xxxxx is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action
Error: Cannot perform an interactive login from a non TTY device
[Container] 2022/06/11 05:38:24 Command did not exit successfully aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URI exit status 1
[Container] 2022/06/11 05:38:24 Phase complete: PRE_BUILD State: FAILED
[Container] 2022/06/11 05:38:24 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_URI. Reason: exit status 1

原因

buildspec.ymlのaws ecr get-login-passwordの部分で必要な認証トークン取得の権限がないため当該エラーとなっていました。

対応

CodeBuildに設定しているサービスロールにGetAuthorizationTokenの権限を付与します。(実際にはイメージをECRへpushするためGetAuthorizationToken以外の権限も必要になります)

設定しているロールは、AWSマネジメントコンソールの画面上部検索窓 [ CodeBuild ] で検索 → 当該ビルドプロジェクトを選択 → 画面真ん中の [ ビルドの詳細 ]タブ → 環境の [ サービスロール ] から確認できます。

当該ロールに対して、こちらのようにデフォルトで既に用意されているAmazonEC2ContainerRegistryPowerUserポリシーを割り当てます。

ただ今回の目的のポリシーはこちらのように以下の権限さえあれば良いので、最小権限の原則に従うならば、これを元にしたポリシーを使用するほうが良いと思います。

    {
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:CompleteLayerUpload",
        "ecr:GetAuthorizationToken",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },

今回は以上です〜ノシ

参考

(`・ω・´)ノ アリガトウゴザイマス!!

CodeBuild のDocker サンプル
CodeBuild ロールに Amazon ECR 権限を追加する
GitHub ActionsからECSとECRへのCI/CDを最小権限で実行したい