Github Actions で AWS ECR 向け Docker コンテナの Build and Push
この記事は、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