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を最小権限で実行したい