Skip to main content

Amazon Elastic Container Serviceへのデプロイ

継続的デプロイメント(CD)ワークフローの一部として、Amazon Elastic Container Service (ECS) へのデプロイを行えます。

注: GitHub ホステッド ランナーは、現在 GitHub Enterprise Server でサポートされていません。 GitHub public roadmap で、今後の計画的なサポートの詳細を確認できます。

はじめに

このガイドでは、コンテナー化されたアプリケーションをビルドし、それを 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のセットアップのステップを完了しておかなければなりません。

  1. イメージを保存するAmazon ECRリポジトリの作成

    たとえば、AWS CLI を使用する:

    Bash
    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 リージョン値を使用していることを確認します。

  2. Amazon ECS タスク定義、クラスター、サービスを作成します。

    詳細については、Amazon ECS コンソールの入門ウィザード、または Amazon ECS ドキュメントのファースト ステップ ガイドに従ってください。

    Amazon ECS サービスとクラスターに設定した名前をメモし、以下のワークフローの ECS_SERVICE 変数とECS_CLUSTER 変数に使用していることを確認します。

  3. Amazon ECS タスク定義を JSON ファイルとして GitHub リポジトリに格納します。

    ファイルの形式は、次によって生成される出力と同じである必要があります。

    Bash
    
    aws ecs register-task-definition --generate-cli-skeleton
    
    

    以下のワークフローで、JSON ファイルへのパスとして ECS_TASK_DEFINITION 変数を設定していることを確認します。

    以下のワークフローの CONTAINER_NAME 変数を、タスク定義の containerDefinitions セクションのコンテナー名として設定していることを確認します。

  4. 名前付きのGitHub Actions シークレット AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY を作成し、Amazon IAM アクセスキーの値を格納します。

    GitHub Actions 用のシークレット作成についての詳細は、「GitHub Actions でのシークレットの使用」をご覧ください。

    IAM ユーザーに推奨される IAM ポリシーと、アクセスキー資格情報を処理する方法については、以下で使用する各操作のドキュメントを参照してください。

  5. 必要に応じて、デプロイ環境を構成します。 環境は、一般的なデプロイ ターゲットを記述するために使用されます (例: productionstaging、または development)。 GitHub Actions ワークフローが環境にデプロイされると、その環境がリポジトリのメイン ページに表示されます。 環境を使って、ジョブを進めるには承認を必須にすること、ワークフローをトリガーできるブランチを制限すること、カスタム デプロイ保護規則を使ってデプロイを制御すること、またはシークレットへのアクセスを制限することができます。 環境の作成の詳細については、「デプロイに環境の使用」を参照してください。

ワークフローの作成

必要な環境を整えたら、ワークフローの作成に進むことができます。

以下のワークフロー例は、コンテナー イメージをビルドして Amazon ECR にプッシュする方法を示しています。 その後、新しいイメージ ID でタスク定義を更新し、Amazon ECS にタスク定義をデプロイします。

ワークフローの env キー内のすべての変数に独自の値を指定していることを確認してください。

デプロイ環境を構成した場合は、environment の値を環境の名前に変更します。 環境を構成しなかった場合 を使わない場合は、environment キーを削除します。

YAML
# このワークフローは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 を参照してください。

この例で使われているサービスに関する詳しい情報については、以下のドキュメンテーションを参照してください。