始めに
バックエンドのプログラムをdocker buildし、コンテナをECRにアップロードする作業を、これまではコードの変更があるたびに手動で行っていました。GitHub Actionsを使って自動化することで作業を効率化できるのではないかと考え、実装してみたところ、まとまった情報が少なかったため、この記事に手順をまとめました。同じことを試みようとしている方に参考にしていただければと思います。
AWS認証情報の設定
まず、GitHubからAWSを操作するには、認証情報(Credential)を設定する必要があります。方法としては以下の2通りがあります:
- IAMユーザーの固定キーを使用する方法
- IDプロバイダーを用いて一時的な認証情報を付与するIAMロールを使用する方法
セキュリティの観点から、今回は後者の方法を選択しました。以下の記事を参考にして、IDプロバイダーを用いた認証情報の設定を行いました。
GitHubActionsのworkflowには以下の設定を追記しました。
※your-role-arn
には自身のロールのarnを記入してください。
permissions:
id-token: write
contents: read
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: your-role-arn
aws-region: ap-northeast-1
ECRにアップロードする方法
ECRにコンテナをアップロードするためには、以下のコードをワークフローに記載します。(以下はECRプライベートリポジトリ用のコードです。パブリックリポジトリの場合は公式ドキュメントをご確認ください。)
※your-ecr-repo
には自身のリポジトリ名を記載してください。
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build, tag, and push docker image to Amazon ECR
env:
REGISTRY: ${{ steps.login-ecr.outputs.registry }}
REPOSITORY: your-ecr-repo
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG .
docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
参考:
最終的なコード
以下が最終的なworkflowのコードです。
name: Docker Image CI
on:
push:
branches: [ "main" ]
permissions:
id-token: write
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: your-role-arn
aws-region: ap-northeast-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build, tag, and push Docker image to Amazon ECR
env:
REGISTRY: ${{ steps.login-ecr.outputs.registry }}
REPOSITORY: your-ecr-repo
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG .
docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
最後に
今回、GitHub Actionsを初めて使用しました。これまで手動で行っていた作業が自動化され、とても効率的になったことに感動しています。今後もGitHub Actionsは活用していきたいと思います。