はじめに
このガイドでは、コンテナー化されたアプリケーションをビルドし、それを Amazon Elastic Container Registry (ECR) にプッシュし、それを、main
ブランチへのプッシュがあるとき、Amazon Elastic Container Service (ECS) にデプロイする目的で GitHub Actions を使用する方法について説明します。
GitHub リポジトリで main
に新しくプッシュするたびに、GitHub Actions ワークフローによって新しいコンテナ イメージがビルドされ、Amazon ECR にプッシュされ、新しいタスクの定義が Amazon ECS にデプロイされます。
注: GitHub Actions ワークフローが OpenID Connect (OIDC) をサポートするクラウド プロバイダーのリソースにアクセスする必要がある場合、そのクラウド プロバイダーで直接認証されるようにワークフローを構成できます。 これにより、有効期間の長いシークレットとしてこれらの資格情報の格納を停止し、その他のセキュリティ上の利点を提供できます。 詳しくは、「OpenID Connect を使ったセキュリティ強化について」をご覧ください と「アマゾン ウェブ サービスでの OpenID Connect の構成」。
前提条件
GitHub Actionsワークフローを作成する前に、まず以下のAmazon ECR及びECSのセットアップのステップを完了しておかなければなりません。
-
イメージを保存するAmazon ECRリポジトリの作成
たとえば、AWS CLI を使用する:
Bash aws ecr create-repository \ --repository-name MY_ECR_REPOSITORY \ --region MY_AWS_REGION
aws ecr create-repository \ --repository-name MY_ECR_REPOSITORY \ --region MY_AWS_REGION
以下のワークフローの
ECR_REPOSITORY
変数には、同じ Amazon ECR リポジトリ名 (ここでMY_ECR_REPOSITORY
で表されます)を使用していることを確認します。以下のワークフローで、
AWS_REGION
(ここでMY_AWS_REGION
で表される) 変数に同じ AWS リージョン値を使用していることを確認します。 -
Amazon ECS タスク定義、クラスター、サービスを作成します。
詳細については、Amazon ECS コンソールの入門ウィザード、または Amazon ECS ドキュメントのファースト ステップ ガイドに従ってください。
Amazon ECS サービスとクラスターに設定した名前をメモし、以下のワークフローの
ECS_SERVICE
変数とECS_CLUSTER
変数に使用していることを確認します。 -
Amazon ECS タスク定義を JSON ファイルとして GitHub リポジトリに格納します。
ファイルの形式は、次によって生成される出力と同じである必要があります。
Bash aws ecs register-task-definition --generate-cli-skeleton
aws ecs register-task-definition --generate-cli-skeleton
以下のワークフローで、JSON ファイルへのパスとして
ECS_TASK_DEFINITION
変数を設定していることを確認します。以下のワークフローの
CONTAINER_NAME
変数を、タスク定義のcontainerDefinitions
セクションのコンテナー名として設定していることを確認します。 -
名前付きのGitHub Actions シークレット
AWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
を作成し、Amazon IAM アクセスキーの値を格納します。GitHub Actions 用のシークレット作成についての詳細は、「GitHub Actions でのシークレットの使用」をご覧ください。
IAM ユーザーに推奨される IAM ポリシーと、アクセスキー資格情報を処理する方法については、以下で使用する各操作のドキュメントを参照してください。
-
必要に応じて、デプロイ環境を構成します。 環境は、一般的なデプロイ ターゲットを記述するために使用されます (例:
production
、staging
、またはdevelopment
)。 GitHub Actions ワークフローが環境にデプロイされると、その環境がリポジトリのメイン ページに表示されます。 環境を使って、ジョブを進めるには承認を必須にすること、ワークフローをトリガーできるブランチを制限すること、カスタム デプロイ保護規則を使ってデプロイを制御すること、またはシークレットへのアクセスを制限することができます。 環境の作成の詳細については、「デプロイに環境の使用」を参照してください。
ワークフローの作成
必要な環境を整えたら、ワークフローの作成に進むことができます。
以下のワークフロー例は、コンテナー イメージをビルドして Amazon ECR にプッシュする方法を示しています。 その後、新しいイメージ ID でタスク定義を更新し、Amazon ECS にタスク定義をデプロイします。
ワークフローの env
キー内のすべての変数に独自の値を指定していることを確認してください。
デプロイ環境を構成した場合は、environment
の値を環境の名前に変更します。 環境を構成しなかった場合、またはワークフローがプライベート リポジトリにあり、GitHub Enterprise Cloud を使わない場合は、environment
キーを削除します。
# このワークフローはGitHubによって認定されていないアクションを使用します。 # それらはサードパーティによって提供され、 # 別個の利用規約、プライバシーポリシー、 # ドキュメントを参照してください。 # GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。 # 新しいバージョンを取得するには、SHA を更新する必要があります。 # タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。 name: Deploy to Amazon ECS on: push: branches: - main env: AWS_REGION: MY_AWS_REGION # set this to your preferred AWS region, e.g. us-west-1 ECR_REPOSITORY: MY_ECR_REPOSITORY # set this to your Amazon ECR repository name ECS_SERVICE: MY_ECS_SERVICE # set this to your Amazon ECS service name ECS_CLUSTER: MY_ECS_CLUSTER # set this to your Amazon ECS cluster name ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition # file, e.g. .aws/task-definition.json CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the # containerDefinitions section of your task definition jobs: deploy: name: Deploy runs-on: ubuntu-latest environment: production steps: - name: Checkout uses: actions/checkout@v4 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ env.AWS_REGION }} - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a - name: Build, tag, and push image to Amazon ECR id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} IMAGE_TAG: ${{ github.sha }} run: | # Build a docker container and # push it to ECR so that it can # be deployed to ECS. docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT - name: Fill in the new image ID in the Amazon ECS task definition id: task-def uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc with: task-definition: ${{ env.ECS_TASK_DEFINITION }} container-name: ${{ env.CONTAINER_NAME }} image: ${{ steps.build-image.outputs.image }} - name: Deploy Amazon ECS task definition uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a with: task-definition: ${{ steps.task-def.outputs.task-definition }} service: ${{ env.ECS_SERVICE }} cluster: ${{ env.ECS_CLUSTER }} wait-for-service-stability: true
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。
# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。
name: Deploy to Amazon ECS
on:
push:
branches:
- main
env:
AWS_REGION: MY_AWS_REGION # set this to your preferred AWS region, e.g. us-west-1
ECR_REPOSITORY: MY_ECR_REPOSITORY # set this to your Amazon ECR repository name
ECS_SERVICE: MY_ECS_SERVICE # set this to your Amazon ECS service name
ECS_CLUSTER: MY_ECS_CLUSTER # set this to your Amazon ECS cluster name
ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
# file, e.g. .aws/task-definition.json
CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the
# containerDefinitions section of your task definition
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
その他のリソース
もともとのスターター ワークフローについては、GitHub Actions starter-workflows
リポジトリの aws.yml
を参照してください。
この例で使われているサービスに関する詳しい情報については、以下のドキュメンテーションを参照してください。
- Amazon AWS ドキュメントの "IAM のセキュリティ ベスト プラクティス"。
- 公式 AWS "AWS 資格情報を構成する" アクション。
- 公式 AWS Amazon ECR "ログイン" アクション。
- 公式 AWS Amazon ECS "タスク定義のレンダリング" アクション。
- 公式 AWS Amazon ECS "タスク定義のデプロイ" アクション。