☕️

ecspresso advent calendar 2020 day 4 - deploy

2020/12/04に公開

Amazon ECS のデプロイツールである ecspresso の利用法をまとめていく ecspresso Advent calendar 4日目です。

デプロイする

3日目で既存ECSサービスから作成した設定ファイルを修正して、実際にECSサービスをデプロイしてみましょう。

現在デプロイされている ECS サービスは nginx:latest のイメージを実行しているため、LB 経由で port 80 にアクセスすると nginx のデフォルトページが表示されます。

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 を行うと以下の処理を行います。

  1. 新しいタスク定義を ECS に登録 (register)
  2. サービスに設定されているタスク定義を新しく登録したものに変更
    • 他にサービス定義に変更点があればサービスの設定を更新
  3. 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

デプロイ時に、サービスのタスク数を同時に設定します。以下の優先順位でタスク数が決まります。

  1. オプションで指定した --tasks の値
  2. サービス定義にある desiredCount の値
    デプロイ時にこの値が適用されます。オートスケーリングなどを設定していて外部からタスク数をコントロールしている場合には、サービス定義の desiredCount を項目ごと削除してください
  3. 現在のタスク数を維持する

--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のものに更新できます。

ここで説明していないこと


5日目は、ecspresso の設定、定義ファイルで使用できるテンプレート記法について説明します。

https://zenn.dev/fujiwara/articles/ecspresso-20201205

Discussion