🐙

Github Actions で AWS ECR 向け Docker コンテナの Build and Push

2021/12/02に公開

この記事は、Wano Group Advent Calendar2021の3日目の記事です(フライング
弊社並びに弊グループに関心がある方はぜひご連絡を。特に音楽関係のサービスに興味があればWanoに、インターネット広告配信に興味があれば弊社Alpha Architectに是非。

Github Actionsでdocker/build-push-actionを使う場合、ビルドしたコンテナイメージをECRにPushする方法がすぐにわからなかったのでまとめる。

AWSにログインする

以下前提として各種環境変数やシークレットは入れているとする。

steps:
  - name: Configure AWS credentials
    uses: aws-actions/configure-aws-credentials@v1
    with:
      aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
      aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
      aws-region: ap-northeast-1

これでいい。ちなみにここでログインを済ませておくと他のAWS系のActionを通せるので便利。

コンテナのエンドポイントをECRに変更する

- name: Login to ecr
  uses: docker/login-action@v1
  with:
    registry: ${{ env.ECR_ENDPOINT }}/${{ env.ECR_REPO }}

これが必要。ちなみにAWSへのログインも docker/login-action に書いている通りにすれば通るらしい。もしbuildとpushだけならここでログイン情報を書いた方が全体が短くはなる。

この公式の docker/login-action に従えばAzureだろうがGCPだろうがコンテナをPushできる(私はなかなか気づけなかった)

build and push

- name: Build and push
  id: docker-build
  uses: docker/build-push-action@v2
  with:
    push: true
    tags: ${{ env.ECR_ENDPOINT }}/${{ env.ECR_REPO }}:latest
    file: ./Dockerfile
    cache-from: ${{ env.ECR_ENDPOINT }}/${{ env.ECR_REPO }}

つけようと思えばdocker buildコマンドでつけるオプションはだいたい指定可能なのでお好みでつけます。ちなみにv2でBUILD_KITは標準で使用されるのでDOCKER_BUILDKIT=1は不要です。

ちなみにですが、ECRにpushする際は タグにレジストリとリポジトリが入った形式が指定されます 。これが正しくないと弾かれるので注意が必要です。参照より、具体的には<aws_account_id>.dkr.ecr.<region>.amazonaws.com/<my-repository>:tagという形です。ここではエンドポイントとかリポジトリ名でそのまま使い回してます。また環境次第でタグはLatest以外を入れるのが王道でしょう。

まとめ

意外と簡単なうえに、全部公式が提供しているものなので手書きでスクリプトを run の下にあれこれ書くよりこっちの方がメンテコストが下がる&信頼性が高くなると思います。

現場ではこの上でコンテナのImageタグを入れてECSのタスク定義も作ってデプロイしたり、リリースブランチと開発ブランチでタグを分けたりもして運用しています。

Discussion