(小ネタ)GitHub Actionsのdocker/build-push-actionで「ERROR: unexpected status: 403 Forbidden」が発生する
こんにちは!コンサル部のinomaso(@inomasosan)です。
GitHub ActionsにDockerイメージビルドのキャッシュを導入するために、docker/setup-buildx-actionとdocker/build-push-actionを検証したところ、エラーメッセージの対応に時間がかかったので、備忘としてブログにまとめることにしました。
エラー内容
docker/build-push-action
を実行時に、以下のエラーが発生しました。
#6 exporting to image #6 pushing layers 1.2s done #6 pushing manifest for ***.dkr.ecr.ap-northeast-1.amazonaws.com/githubactions-httpd:4fb5333bcd727bd6f6a0409f94a542ee70761153@sha256:edb8099f3f0d65d2e613b8c583961eeab66bec85905924a6f665d11f637a33cf #6 pushing manifest for ***.dkr.ecr.ap-northeast-1.amazonaws.com/githubactions-httpd:4fb5333bcd727bd6f6a0409f94a542ee70761153@sha256:edb8099f3f0d65d2e613b8c583961eeab66bec85905924a6f665d11f637a33cf 0.1s done #6 ERROR: unexpected status: 403 Forbidden ------ > exporting to image: ------ error: failed to solve: unexpected status: 403 Forbidden Error: buildx failed with: error: failed to solve: unexpected status: 403 Forbidden
該当部分のワークフローは以下の通りです。
- uses: docker/build-push-action@v2 id: build-image with: push: true tags: ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ github.sha }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
原因
GitHub ActionsからECRに対するIAMポリシーの権限不足でした。
エラー発生時は、GitHub ActionsからECSとECRへのCI/CDを最小権限で実行したいで作成した以下のIAMポリシーで実行していました。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetAuthorizationToken", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": "*" }, { "Sid": "PushImageOnly", "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:PutImage" ], "Resource": "arn:aws:ecr:ap-northeast-1:<AWSアカウントID>:repository/<リポジトリ名>" } ] }
docker/build-push-action
は、ECRリポジトリのイメージに対する詳細情報を取得しているようで、以下のハイライト箇所の追加権限が必要でした。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetAuthorizationToken", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": "*" }, { "Sid": "PushImageOnly", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:PutImage" ], "Resource": "arn:aws:ecr:ap-northeast-1:<AWSアカウントID>:repository/<リポジトリ名>" } ] }
ECRの権限追加後に、docker/build-push-action
は正常に完了しました。
#6 exporting to image #6 pushing layers 1.7s done #6 pushing manifest for ***.dkr.ecr.ap-northeast-1.amazonaws.com/githubactions-httpd:41b2bb9c3a34a9c6446124ea84168d59c7e882ea@sha256:34dcdcdc49a8ee495f679c0c6e60618d8d57eef94ef0d2e177d6ab0bc47c3afe #6 pushing manifest for ***.dkr.ecr.ap-northeast-1.amazonaws.com/githubactions-httpd:41b2bb9c3a34a9c6446124ea84168d59c7e882ea@sha256:34dcdcdc49a8ee495f679c0c6e60618d8d57eef94ef0d2e177d6ab0bc47c3afe 0.5s done #6 DONE 2.5s Setting outputs digest=sha256:34dcdcdc49a8ee495f679c0c6e60618d8d57eef94ef0d2e177d6ab0bc47c3afe metadata={ "containerimage.config.digest": "sha256:504e5b49c48da9e7961694adcd65f7e94c847898c5f5c452bda0c7b688234ca9", "containerimage.digest": "sha256:34dcdcdc49a8ee495f679c0c6e60618d8d57eef94ef0d2e177d6ab0bc47c3afe", "image.name": "***.dkr.ecr.ap-northeast-1.amazonaws.com/githubactions-httpd:41b2bb9c3a34a9c6446124ea84168d59c7e882ea" }
まとめ
今回のエラーについては、IAMポリシーに関する明示的なエラーメッセージではなかったので、ずっとワークフロー側の原因を疑っていました。
ふとaws-actions/amazon-ecr-loginのPermissions
を確認した時に、もしかするとIAMポリシー側の原因では?と思い試したら正解でした。
この記事が、どなたかのお役に立てば幸いです。それでは!