AWS ECR/ECS へのデプロイ
ここでは、CircleCI を使用して、Amazon Elastic Container Registry (ECR) から Amazon Elastic Container Service (ECS) にデプロイする方法を説明します。
概要
このガイドは、次の 2 段階に分かれています。
- Docker イメージをビルドして AWS ECR にプッシュする
- 新しい Docker イメージを既存の AWS ECS サービスにデプロイする
また、アプリケーションの CircleCI でのビルドについても取り上げます。
メモ: このプロジェクトには、簡単な Dockerfile が含まれています。
詳細については、「カスタム イメージの手動作成」を参照してください。
前提条件
Terraform を使用して AWS リソースを作成する
このガイドに沿ってアプリケーションをビルドしてデプロイするには、いくつかの AWS リソースが必要です。 CircleCI では、これらのリソースを作成するためにいくつかの Terraform スクリプトを提供しています。 これらのスクリプトを使用するには、以下の手順を行います。
- AWS アカウントを作成します。
- Terraform をインストールします。
- サンプル プロジェクトのクローンを作成し、そのルート ディレクトリに移動します。
- AWS 変数の実際の値で
~/terraform_setup/terraform.tfvars
を更新します。 詳細については、以下の「CircleCI 環境変数を設定する」セクションを参照してください。 - 以下のコマンドを実行して、AWS リソースを作成します。
cd terraform_setup
terraform init
terraform plan # プランをレビューします
terraform apply # プランを適用して AWS リソースを作成します
メモ: ほとんどの AWS リソースは、terraform destroy
を実行することで破棄できます。 リソースが残っている場合は、AWS マネジメント コンソール、特に ECS、CloudFormation、VPC のページを確認してください。 apply
が失敗した場合は、ユーザーが EC2、Elastic Load Balancing、IAM のサービスの権限を持っているかどうかを確認してください。
CircleCI 環境変数を設定する
CircleCI アプリケーションで、以下のプロジェクト環境変数を設定します。
変数 | 説明 |
---|---|
AWS_ACCESS_KEY_ID | AWS のセキュリティ認証情報です。 |
AWS_SECRET_ACCESS_KEY | AWS のセキュリティ認証情報です。 |
AWS_DEFAULT_REGION | AWS CLI によって使用されます。 |
AWS_ACCOUNT_ID | デプロイに必要です。 AWS アカウント ID はこちらで確認してください。 |
AWS_RESOURCE_NAME_PREFIX | 必須の AWS リソースのプレフィックスです。 terraform_setup/terraform.tfvars の aws_resource_prefix の値に対応する必要があります。 |
設定の詳細説明
すべての CircleCI プロジェクトには、.circleci/config.yml
という設定ファイルが必要です。 以下の手順に従って、完全な config.yml
ファイルを作成してください。
メモ: このセクションで説明するサンプル プロジェクトは、以下で提供されている CircleCI の AWS-ECR Orb と AWS-ECS Orb を使用します。
Docker イメージをビルドして AWS ECR にプッシュする
build_and_push_image
ジョブは、デフォルトの場所 (チェック アウト ディレクトリのルート) に Dockerfile から Docker イメージをビルドし、それを指定された ECR リポジトリにプッシュします。
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@0.0.2
aws-ecs: circleci/aws-ecs@0.0.10
workflows:
build-and-deploy:
jobs:
- aws-ecr/build_and_push_image:
account-url: "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}
.amazonaws.com"
repo: "${AWS_RESOURCE_NAME_PREFIX}"
region: ${AWS_DEFAULT_REGION}
tag: "${CIRCLE_SHA1}"
- ...
新しい Docker イメージを既存の AWS ECS サービスにデプロイする
aws-ecs Orb の deploy-service-update
ジョブは、現在のタスク定義に基づきつつ、タスク定義のコンテナ定義で指定された新しい Docker イメージを使用して新しいタスク定義を作成し、この新しいタスク定義を指定された ECS サービスにデプロイします。 CircleCI AWS-ECS Orb の詳細については、https://circleci.com/developer/ja/orbs/orb/circleci/aws-ecs を参照してください。
メモ: deploy-service-update
ジョブは、requires
キーがあるため、build_and_push_image
に依存します。
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@0.0.2
aws-ecs: circleci/aws-ecs@0.0.8
workflows:
build-and-deploy:
jobs:
- ...
- aws-ecs/deploy-service-update:
requires:
- aws-ecr/build_and_push_image
aws-region: ${AWS_DEFAULT_REGION}
family: "${AWS_RESOURCE_NAME_PREFIX}-service"
cluster-name: "${AWS_RESOURCE_NAME_PREFIX}-cluster"
container-image-name-updates: "container=${AWS_RESOURCE_NAME_PREFIX}-service,tag=${CIRCLE_SHA1}"
ワークフローを準備する
ワークフローを使用して、build_and_push_image
ジョブと deploy-service-update
ジョブをリンクします。
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@0.0.2
aws-ecs: circleci/aws-ecs@0.0.8
workflows:
build-and-deploy:
jobs:
- aws-ecr/build_and_push_image:
account-url: "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}
.amazonaws.com"
repo: "${AWS_RESOURCE_NAME_PREFIX}"
region: ${AWS_DEFAULT_REGION}
tag: "${CIRCLE_SHA1}"
- aws-ecs/deploy-service-update:
requires:
- aws-ecr/build_and_push_image
aws-region: ${AWS_DEFAULT_REGION}
family: "${AWS_RESOURCE_NAME_PREFIX}-service"
cluster-name: "${AWS_RESOURCE_NAME_PREFIX}-cluster"
container-image-name-updates: "container=${AWS_RESOURCE_NAME_PREFIX}-service,tag=${CIRCLE_SHA1}"
詳細については、ワークフローを使用したジョブのスケジュールについて参照してください。
完全な設定ファイル
version: 2.1
orbs:
aws-ecr: circleci/aws-ecr@0.0.10
aws-ecs: circleci/aws-ecs@0.0.8
workflows:
build-and-deploy:
jobs:
- aws-ecr/build_and_push_image:
account-url: "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com"
repo: "${AWS_RESOURCE_NAME_PREFIX}"
region: ${AWS_DEFAULT_REGION}
tag: "${CIRCLE_SHA1}"
- aws-ecs/deploy-service-update:
requires:
- aws-ecr/build_and_push_image
aws-region: ${AWS_DEFAULT_REGION}
family: "${AWS_RESOURCE_NAME_PREFIX}-service"
cluster-name: "${AWS_RESOURCE_NAME_PREFIX}-cluster"
container-image-name-updates: "container=${AWS_RESOURCE_NAME_PREFIX}-service,tag=${CIRCLE_SHA1}"
関連項目
- Docker イメージをビルドおよびテストして ECR にプッシュした後で、
aws-ecs
Orb を使用して更新をデプロイする例を参照するには、AWS-ECS-ECR Orbs のデモ ページにアクセスしてください。 - CircleCI Orbs を使用しない例を参照するには、Non-Orbs AWS ECR-ECS のデモ ページにアクセスしてください。