☕️

ecspresso advent calendar 2020 day 14 - register

2020/12/14に公開

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

タスク定義を登録する register コマンド

ecspresso register は、デプロイやタスク実行を伴わずに、単に新しいタスク定義を登録するコマンドです。

ecspresso deploy コマンドや run コマンドは、デフォルトでは新しいタスク定義を登録してからデプロイやタスク実行を行います。ではなぜ register という単独のコマンドが必要になるのでしょうか。

デプロイ時のワークフロー

データベースを使用するアプリケーションを例として考えます。

このアプリケーションでは、データベースのスキーマには前方互換性があるものとします。つまり、あるタイミングで新しいバージョンのスキーマに変更されても古いバージョンのアプリケーションは問題なく動作し、新しいバージョンのアプリケーションがデプロイされた時点で、新しいスキーマを使用できるようになるものとします。

アプリケーションがこのような特性を持っている場合、データベースのスキーマ変更を伴うデプロイを以下の手順で行えば、ダウンタイムを作らずに新バージョンが利用できます。

  1. 新しいアプリケーションのコンテナをビルドする
  2. 新しいアプリケーションを使用するタスク定義を登録する (ecspresso register)
  3. 2.で登録した最新のタスク定義を使用してタスクを起動(ecspresso run --latest-task-definition)し、データベースのマイグレーションコマンドを実行する
    (この時点でスキーマは新しいアプリケーションに対応します)
  4. 最新のタスク定義を使用してECSサービスを更新する(ecspresso deploy --latest-task-definition)
    (このデプロイが完了した時点で、アプリケーションは新しいスキーマを使用しはじめます)

rundeploy を実行する際に、それぞれ内容が同じでリビジョンが異なるタスク定義を登録してしまうと、ECSサービスをデプロイ後に問題が発生した場合のロールバックが困難になります。ecspresso rollback6日目で説明したとおり、「現在サービスが使用しているひとつ前のリビジョンに戻す」挙動をするためです。

古いアプリケーションが使用しているタスク定義のリビジョンが 10、run で登録されたリビジョンが 11、deploy で登録されたリビジョンが 12 だとすると、deploy 後の時点でロールバックを行うと同一内容の 11 に戻ります。これでは実質的にロールバックができないことになります。

あらかじめ register で登録した最新のタスク定義を rundeploy--latest-task-definition で利用すれば、このような問題を避けられます。

register コマンドの実行例

$ ecspresso --config config.yaml register
2020/12/14 12:05:14 nginx-service/ecspresso-demo Starting register task definition
2020/12/14 12:05:14 nginx-service/ecspresso-demo Registering a new task definition...
2020/12/14 12:05:15 nginx-service/ecspresso-demo Task definition is registered first-run-task-definition:6

register コマンドのオプション

usage: ecspresso register [<flags>]

register task definition

Flags:
  --help           Show context-sensitive help (also try --help-long and --help-man).
  --config=CONFIG  config file
  --debug          enable debug log
  --color          enalble colored output
  --dry-run        dry-run
  --output         output registered task definition

--output

新しいタスク定義を登録後、実際に登録されたタスク定義の内容を ECS から取得し、JSON 形式で出力します。


15日目は、ECSサービスを新規作成する方法を説明します。

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

Discussion