(小ネタ)GitHub Actionsのdocker/build-push-actionで「ERROR: unexpected status: 403 Forbidden」が発生する

大晦日にお届けするdocker/build-push-actionのエラー対応☆ミ
2021.12.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!コンサル部のinomaso(@inomasosan)です。

GitHub ActionsにDockerイメージビルドのキャッシュを導入するために、docker/setup-buildx-actiondocker/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ポリシーで実行していました。

ECR用の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リポジトリのイメージに対する詳細情報を取得しているようで、以下のハイライト箇所の追加権限が必要でした。

ECR用のIAMポリシー(修正後)

{
    "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-loginPermissionsを確認した時に、もしかするとIAMポリシー側の原因では?と思い試したら正解でした。

この記事が、どなたかのお役に立てば幸いです。それでは!