docker/build-push-action で ECR に push する際に最小限必要な権限
docker/build-push-action
はGitHub ActionsでDockerイメージをBuildxを用いてビルドおよびプッシュするためのカスタムアクションです。色々な設定をコンパクトにまとめることができるため非常に有用です。
Amazon ECRにプッシュする用途で利用する場合はaws-actions/configure-aws-credentials
で特定のIAMロールを指定し、認証を通す必要があります。このロールに指定するポリシーにアタッチする権限の選定に時間がかかったのでまとめます。
ECR に push する際に最小限必要な権限
docker/build-push-action
で特定のECRリポジトリにpushするために必要なポリシーはこちらです。
{
"Statement": [
{
"Action": "ecr:GetAuthorizationToken",
"Effect": "Allow",
"Resource": "*"
},
{
"Action": [
"ecr:UploadLayerPart",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:CompleteLayerUpload",
"ecr:BatchGetImage", // この権限がポイントです
"ecr:BatchCheckLayerAvailability"
],
"Effect": "Allow",
"Resource": [
"<pushするECRリポジトリのARN>",
]
}
],
"Version": "2012-10-17"
}
ecr:BatchGetImage
が必要であること
ポイントはDocker CLIから直接ECRにpushする場合は、ecr:BatchGetImage
は必要ありません[1]。
しかし同じポリシーでdocker/build-push-action
を利用しようとすると以下の403エラーが発生しました。
- 実際のエラーの抜粋(一部改変しています)
ERROR: failed to solve: failed to push 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/<ecr repository arn>:6a28b9fd5dd16e5fc371b0192b65f293f55fc363: unexpected status from HEAD request to https://000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/v2/<ecr repository arn>/manifests/9c0a0c20b61992a480f79df020763909c5401b1a: 403 Forbidden
Error: buildx failed with: ERROR: failed to solve: failed to push 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/<ecr repository arn>:9c0a0c20b61992a480f79df020763909c5401b1a: unexpected status from HEAD request to https://319807237558.dkr.ecr.ap-northeast-1.amazonaws.com/v2/<ecr repository arn>/manifests/9c0a0c20b61992a480f79df020763909c5401b1a: 403 Forbidden
ecr:BatchGetImage
はECRリポジトリからイメージのメタ情報であるマニフェストを取得するために使用します。
When an image is pulled, the BatchGetImage API is called once to retrieve the image manifest.
https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_BatchGetImage.html
上記のエラーログを見るにECRのmanifestにアクセスしていることがわかります。そのため追加でecr:BatchGetImage
が必要でした[2]。
-
docker/build-push-actionを使わない場合に必要なものがまとめられている資料です GitHub Actions から ECR に Docker イメージを push する ↩︎
-
docker/build-push-action
のissueでもecr:BatchGetImage
が必要という記載がありました https://github.com/docker/build-push-action/issues/901 ↩︎
Discussion