GitHubActionsでECRにpushしようとしたら権限エラーでハマった

## はじめに
GitHubActionsでECRにpushをしようと試みた際にIAMロールの権限エラーで少しハマったので備忘録として起こったこと、原因とその対処法をまとめます。

## 何が起こったのか
以下のymlファイルでGitHubActionsからECRへのイメージプッシュを試みました。
``` main.yml
name: Build And Push

on:
  workflow_call:
  workflow_dispatch:

env:
  AWS_REGION: ap-northeast-1
  ECR_REGISTRY: 992382548989.dkr.ecr.ap-northeast-1.amazonaws.com

jobs:
  build:
    name: Build And Push
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_IAM_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}
          
      - name: Login to Amazon ECR  
        run: |
          aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ env.ECR_REGISTRY }}

      - name: Build and push API
        uses: docker/build-push-action@v5
        with:
          push: true
          provenance: false
          tags: ${{ env.ECR_REGISTRY }}/develop/skygallery:latest
          context: ./backend
```
しかし、以下の権限エラーが出てしまいます。
```
buildx failed with: ERROR: failed to solve: failed to push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/develop/skygallery:latest: unexpected status from HEAD request to https://<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/v2/develop/skygallery/manifests/latest: 403 Forbidden
```
ECRへのpushに使用しているIAMロールの権限は以下の通りです。
ECRのpushに必要な権限はあるはず。。なのになぜエラー？？！！
```
{
    "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/<リポジトリ名>"
        }
    ]
}
```
## 原因と解決策
調べてみるとecrへのpushを行っている「docker/build-push-action@v5」においてimageのmanifestを取得しているらしく、それをするための権限「"ecr:BatchGetImage",」が不足しているとのことでした。
上記権限を追加した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のpushに使用しているIAMロールの権限を上記のように更新したら無事成功しました。

## 参考にさせていただいた記事
https://dev.classmethod.jp/articles/github-wf-docer-ecr/

https://dev.classmethod.jp/articles/github-actions-docker-build-push-action-error-unexpected-status-403-forbidden/