🪐

docker/build-push-action で ECR に push する際に最小限必要な権限

2024/07/21に公開

docker/build-push-actionはGitHub ActionsでDockerイメージをBuildxを用いてビルドおよびプッシュするためのカスタムアクションです。色々な設定をコンパクトにまとめることができるため非常に有用です。

https://github.com/docker/build-push-action

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]

脚注
  1. docker/build-push-actionを使わない場合に必要なものがまとめられている資料です GitHub Actions から ECR に Docker イメージを push する ↩︎

  2. docker/build-push-actionのissueでもecr:BatchGetImageが必要という記載がありました https://github.com/docker/build-push-action/issues/901 ↩︎

Discussion