サービスの更新を AWS ECS にデプロイする方法
このノウハウガイドでは、CircleCI Orb を使用してCircleCIをAWS ECSにデプロイする方法を説明しています。
はじめに
Amazon Elastic Container Service (ECS) は、スケーラブルなコンテナ オーケストレーション サービスです。 Docker コンテナをサポートし、コンテナ化されたアプリケーションを AWS で実行およびスケールできます。 Amazon ECS を使用することにより、独自のコンテナ オーケストレーション ソフトウェアをインストール・設定せずに済むため、デプロイの複雑さが解消され、CircleCI プラットフォームでコンテナをシンプルかつ最適にデプロイすることができます。 このガイドでは、CircleCI Orb を使ってソフトウェアの変更を Amazon ECS にデプロイする方法を説明します。
1. 環境変数の設定
2. バージョンの指定
すべての CircleCI config.yml
は、最初にバージョンキーを指定します。 このキーは、互換性を損なう変更に関する警告を表示するために使用します。
version: 2.1
2.1 は、CircleCI の最新のバージョンであり、CircleCI のすべての最新機能と改善事項の利用が可能です。 |
3. Orb の使用
このサンプルでは、設定ファイルで 3 つの Orb を使用する必要があります。 お客様の .circleci/config.yaml
の最初に、以下のように追加します。
orbs:
aws-ecr: circleci/aws-ecr@8.1.2 # use the AWS ECR orb
aws-ecs: circleci/aws-ecs@3.2.0 # use the AWS ECS orb
aws-cli: circleci/aws-cli@3.1.1 # use the AWS CLI orb
4. ワークフローの作成
ワークフローは、一連のジョブとその実行順序を定義するためのルールです。 ワークフローを使用すると、設定キーを組み合わせて複雑なジョブオーケストレーションを構成でき、問題の早期解決に役立ちます。 ワークフロー内で実行したいジョブを定義します、 このワークフローはコミットのたびに実行されます。 詳細は、 ワークフローの設定 を参照して下さい。
workflows:
build-and-deploy: # this can be any name you choose
5. サービスの更新のビルド、プッシュ、およびデプロイ
新しくビルドしたイメージを AWS ECR からデプロイするように AWS サービスの更新 を設定する際、Orb を使用して設定ファイルをできるだけシンプルにすることができます。
-
更新されたイメージをビルドして ECR にプッシュする ECR Orb の
build-and-push-image
ジョブ -
サービスの更新をデプロイする ECS Orb の
deploy-service-update
ジョブ
workflows:
build-and-deploy:
jobs:
- aws-ecr/build-and-push-image: # orb built-in job
repo: '${MY_APP_PREFIX}'
tag: '${CIRCLE_SHA1}'
- aws-ecs/deploy-service-update: # orb built-in job
requires:
- aws-ecr/build-and-push-image
family: '${MY_APP_PREFIX}-service'
cluster: '${MY_APP_PREFIX}-cluster'
container-image-name-updates: 'container=${MY_APP_PREFIX}-service,tag=${CIRCLE_SHA1}'
使用方法のオプションと Orb エレメントの全リストについては、CircleCI Orb レジストリの AWS-ECS Orb のページ を参照してください。
6. デプロイの検証
Amazon ECS サービスの更新が完了したら、更新が正しく行われたかを検証できます。 設定をできる限りシンプルにするために、AWS CLI Orbと ECS Orb を使います。 ここでは、Orb の組み込みジョブを使用して必要なプロセスを実行するのではなく、 Orb からのコマンドを verify-deployment
という新しく定義されたジョブのステップとして使用します。
jobs:
verify-deployment:
executor: aws-cli/default
steps:
- aws-cli/install
- aws-cli/setup:
aws-access-key-id: AWS_SECRET_ACCESS_KEY
aws-region: AWS_DEFAULT_REGION
aws-secret-access-key: AWS_DEFAULT_REGION
- run:
name: Get last task definition
command: >
TASK_DEFINITION_ARN=$(aws ecs describe-task-definition \
--task-definition ${MY_APP_PREFIX}-service \
--output text \
--query 'taskDefinition.taskDefinitionArn')
echo "export TASK_DEFINITION_ARN='${TASK_DEFINITION_ARN}'" >>
"$BASH_ENV"
- aws-ecs/verify-revision-is-deployed:
family: '${MY_APP_PREFIX}-service'
cluster: '${MY_APP_PREFIX}-cluster'
task-definition-arn: '${TASK_DEFINITION_ARN}'
ここでは、Orb を使用して AWS CLI をインストールおよび設定し、以前デプロイされた タスク定義を取得し、AWS-ECS
Orb から verify-revision-is-deployed
コマンドを使用して、この変更がデプロイされたかどうかを 検証 する方法を示しています。
7. 検証ジョブをワークフローに追加
verify-deployment
という検証ジョブが作成されたので、これを build-and-deploy
ワークフローに追加します。 requires
キーを使って必ずビルドジョブとデプロイジョブの後で順番に実行されるようにします。
workflows:
build-and-deploy:
jobs:
- aws-ecr/build-and-push-image: # orb built-in job
repo: '${MY_APP_PREFIX}'
tag: '${CIRCLE_SHA1}'
- aws-ecs/deploy-service-update: # orb built-in job
requires:
- aws-ecr/build-and-push-image
family: '${MY_APP_PREFIX}-service'
cluster: '${MY_APP_PREFIX}-cluster'
container-image-name-updates: 'container=${MY_APP_PREFIX}-service,tag=${CIRCLE_SHA1}'
- verify-deployment:
requires:
- aws-ecs/deploy-service-update
config.yml 全文
version: 2.1 # 2.1 config required to use orbs
orbs:
aws-ecr: circleci/aws-ecr@8.1.2 # use the AWS ECR orb
aws-ecs: circleci/aws-ecs@3.2.0 # use the AWS ECS orb
aws-cli: circleci/aws-cli@3.1.1 # use the AWS CLI orb
jobs:
verify-deployment:
executor: aws-cli/default
steps:
- aws-cli/install
- aws-cli/setup:
aws-access-key-id: AWS_SECRET_ACCESS_KEY
aws-region: AWS_DEFAULT_REGION
aws-secret-access-key: AWS_DEFAULT_REGION
- run:
name: Get last task definition
command: >
TASK_DEFINITION_ARN=$(aws ecs describe-task-definition \
--task-definition ${MY_APP_PREFIX}-service \
--output text \
--query 'taskDefinition.taskDefinitionArn')
echo "export TASK_DEFINITION_ARN='${TASK_DEFINITION_ARN}'" >>
"$BASH_ENV"
- aws-ecs/verify-revision-is-deployed:
family: '${MY_APP_PREFIX}-service'
cluster: '${MY_APP_PREFIX}-cluster'
task-definition-arn: '${TASK_DEFINITION_ARN}'
workflows:
build-and-deploy:
jobs:
- aws-ecr/build-and-push-image: # orb built-in job
repo: '${MY_APP_PREFIX}'
tag: '${CIRCLE_SHA1}'
- aws-ecs/deploy-service-update: # orb built-in job
requires:
- aws-ecr/build-and-push-image
family: '${MY_APP_PREFIX}-service'
cluster: '${MY_APP_PREFIX}-cluster'
container-image-name-updates: 'container=${MY_APP_PREFIX}-service,tag=${CIRCLE_SHA1}'
- verify-deployment:
requires:
- aws-ecs/deploy-service-update