ecspresso advent calendar 2020 day 4 - deploy
Amazon ECS のデプロイツールである ecspresso の利用法をまとめていく ecspresso Advent calendar 4日目です。
デプロイする
3日目で既存ECSサービスから作成した設定ファイルを修正して、実際にECSサービスをデプロイしてみましょう。
現在デプロイされている ECS サービスは nginx:latest
のイメージを実行しているため、LB 経由で port 80 にアクセスすると nginx のデフォルトページが表示されます。
ここでは例として、ecs-task-def.json を編集してコンテナに設定されているイメージ名を httpd:latest
に変更します。
--- a/ecs-task-def.json
+++ b/ecs-task-def.json
@@ -6,7 +6,7 @@
"entryPoint": [],
"environment": [],
"essential": true,
- "image": "nginx:latest",
+ "image": "httpd:latest",
"links": [],
"logConfiguration": {
"logDriver": "awslogs",
ecspresso deploy
コマンドでデプロイを実行できます。--dry-run
オプションを指定すると、これからデプロイしようとしている内容が表示されます。
$ ecspresso deploy --config config.yaml --dry-run
2020/12/04 12:27:40 nginx-service/ecspresso-demo Starting deploy DRY RUN
Service: nginx-service
Cluster: ecspresso-demo
TaskDefinition: first-run-task-definition:1
Deployments:
PRIMARY first-run-task-definition:1 desired:1 pending:0 running:1
Events:
2020/12/04 12:27:41 nginx-service/ecspresso-demo task definition:
{
"containerDefinitions": [
{
"command": [],
"cpu": 256,
"entryPoint": [],
"environment": [],
"essential": true,
"image": "httpd:latest",
"links": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/first-run-task-definition",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
},
"memoryReservation": 512,
"mountPoints": [],
"name": "nginx",
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"volumesFrom": []
}
],
"cpu": "256",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"family": "first-run-task-definition",
"memory": "512",
"networkMode": "awsvpc",
"placementConstraints": [],
"requiresCompatibilities": [
"FARGATE"
],
"volumes": []
}
2020/12/04 12:27:41 nginx-service/ecspresso-demo service attributes will not change
2020/12/04 12:27:41 nginx-service/ecspresso-demo desired count: 1
2020/12/04 12:27:41 nginx-service/ecspresso-demo DRY RUN OK
実行した状態が以下です。ecspresso は deploy を行うと以下の処理を行います。
- 新しいタスク定義を ECS に登録 (register)
- サービスに設定されているタスク定義を新しく登録したものに変更
- 他にサービス定義に変更点があればサービスの設定を更新
- ECSサービスが stable の状態になるまで待つ
- タイムアウトは config.yaml で定義できます。デフォルトでは10分です
$ ecspresso deploy --config config.yaml
2020/12/04 12:29:04 nginx-service/ecspresso-demo Starting deploy
Service: nginx-service
Cluster: ecspresso-demo
TaskDefinition: first-run-task-definition:1
Deployments:
PRIMARY first-run-task-definition:1 desired:1 pending:0 running:1
Events:
2020/12/04 12:29:05 nginx-service/ecspresso-demo Registering a new task definition...
2020/12/04 12:29:05 nginx-service/ecspresso-demo Task definition is registered first-run-task-definition:2
2020/12/04 12:29:05 nginx-service/ecspresso-demo service attributes will not change
2020/12/04 12:29:05 nginx-service/ecspresso-demo desired count: 1
2020/12/04 12:29:05 nginx-service/ecspresso-demo Updating service tasks...
2020/12/04 12:29:09 nginx-service/ecspresso-demo Waiting for service stable...(it will take a few minutes)
(省略)
2020/12/04 12:35:59 (service nginx-service) has reached a steady state.
2020/12/04 12:35:59 (service nginx-service) (deployment ecs-svc/9464613761205047708) deplo
yment completed.
2020/12/04 12:35:40 (service nginx-service) has stopped 1 running tasks: (task 2778f71b5fd
d4cadb7e043cc18b55c5d).
2020/12/04 12:36:03 nginx-service/ecspresso-demo Service is stable now. Completed!
デプロイが完了し、アクセスすると Apache HTTPd のデフォルトの画面が表示されるようになりました。
deploy コマンドのオプション
deploy コマンドのオプションを解説します。
usage: ecspresso deploy [<flags>]
deploy service
Flags:
--help Show context-sensitive help (also try --help-long and
--help-man).
--config=CONFIG config file
--debug enable debug log
--dry-run dry-run
--tasks=-1 desired count of tasks
--skip-task-definition skip register a new task definition
--force-new-deployment force a new deployment of the service
--no-wait exit ecspresso immediately after just deployed without
waiting for service stable
--suspend-auto-scaling set suspend to auto-scaling attached with the ECS service
--rollback-events=ROLLBACK-EVENTS
rollback when specified events happened
(DEPLOYMENT_FAILURE,DEPLOYMENT_STOP_ON_ALARM,DEPLOYMENT_STOP_ON_REQUEST,...)
CodeDeploy only.
--update-service update service attributes by service definition
--latest-task-definition deploy with latest task definition without registering new task definition
--tasks
デプロイ時に、サービスのタスク数を同時に設定します。以下の優先順位でタスク数が決まります。
- オプションで指定した
--tasks
の値 - サービス定義にある
desiredCount
の値
デプロイ時にこの値が適用されます。オートスケーリングなどを設定していて外部からタスク数をコントロールしている場合には、サービス定義のdesiredCount
を項目ごと削除してください - 現在のタスク数を維持する
--skip-task-definition
新しいタスク定義を登録しません。現在のサービスに設定されているものをそのまま維持します。
--tasks
と組み合わせることで、タスク定義自体はそのままタスク数だけを変更できます。
--force-new-deployment
サービスで動作しているタスクを強制的にすべて新しいタスクに置き換えます。
指定しない場合、--skip-task-definition
によってタスク定義が更新されないと、既存の動作しているタスクはそのまま動き続けます。タスク定義自体は変更しないが、新しいタスクにすべて入れ換えたい場合に指定します。
--no-wait
タスク定義の登録、サービスの更新を行ったらすぐに終了します。
CI/CD環境で実行する場合など、デプロイ(=タスクの入れ換え)が終了するまで待たずに、デプロイの指示だけして終了したい場合に指定します。
この場合、実際にデプロイが正常に完了するかは確認できないため、別の手段で確認が必要です。ecspresso wait
というコマンドで、サービスが stable な状態になるまで待機できます。
--suspend-auto-scaling
デプロイ前に、一時的にオートスケール (Application Auto Scaling)の動作を抑止(suspend)します。デプロイが完了すると suspend は解除されます。
--rollback-events
AWS CodeDeploy と連携してデプロイを行う場合に、自動ロールバックの契機になるイベント名を ,
区切りで指定します。
--update-service
サービス定義ファイルと実際のサービスの設定に差異がある場合、サービスの設定を変更します (デフォルトの動作)。--no-update-service
を指定することで、タスク定義以外のサービスの設定を変更しないようになります。
--latest-task-definition
登録されている最新のタスク定義(一番revisonが大きいもの)を利用してデプロイを行います。
あらかじめ ecspresso register
を利用して新しいタスク定義を登録している場合に--skip-task-definition
と同時に指定することで、サービスが使用するタスク定義を最新revisionのものに更新できます。
ここで説明していないこと
- AWS CodeDeploy でのデプロイ 17日目 CodeDeployとの連携 を参照してください
-
--no-wait
で実行した場合に、デプロイの終了を待つecspresso wait
コマンド 9日目 waitコマンド を参照してください
5日目は、ecspresso の設定、定義ファイルで使用できるテンプレート記法について説明します。
Discussion