ECR にpushするときにはDockerでloginが必要となる。 一番お手軽なのは、AWS CLI を使うやり方ではないだろうか

aws ecr get-login-password | docker login --username AWS --password-stdin  <account>.dkr.ecr.<region>.amazonaws.com

しかし、コンテナ上で実行されるCIで、 AWS CLI がインストールされているコンテナと Docker がインストールされているコンテナが分かれているとこの方法がとれない。

そこで awslabs/amazon-ecr-credential-helper を使用して以下のようにしてみた。 こんな記法のCIはないが、疑似CIのコードを書くと以下のような感じ

# ecr-loginをインストール
- image: golang
  command: go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login@latest
# 別アカウントに対してAssumeRoleするような場合はsession tokenを取得。そうでなければこれは不要
- image: awscli
  command: aws sts assume-role --role-arn "<role arn>" --role-session-name "<session name>"
  output:
    AWS_ACCESS_KEY_ID: <access key>
    AWS_SECRET_ACCESS_KEY: <secret>
    AWS_SESSION_TOKEN: <token>
- image: docker 
  command: |-
    # ecr-loginをPATHの通った場所に配置
    mv docker-credential-ecr-login /usr/local/bin/
    # credential helperを使用する設定
    mkdir -p ~/.docker
    cat <<'EOF' > ~/.docker/config.json
    {
      "credHelpers": {
        "<account>.dkr.ecr.<region>.amazonaws.com": "ecr-login"
      }
    }
    EOF
    
    docker build -t <account>.dkr.ecr.<region>.amazonaws.com/my-image:latest .
    # これが通るはず
    docker push <account>.dkr.ecr.<region>.amazonaws.com/my-image:latest