ecspresso advent calendar 2020 day 14 - register
Amazon ECS のデプロイツールである ecspresso の利用法をまとめていく ecspresso Advent calendar 14日目です。
タスク定義を登録する register コマンド
ecspresso register
は、デプロイやタスク実行を伴わずに、単に新しいタスク定義を登録するコマンドです。
ecspresso deploy
コマンドや run
コマンドは、デフォルトでは新しいタスク定義を登録してからデプロイやタスク実行を行います。ではなぜ register
という単独のコマンドが必要になるのでしょうか。
デプロイ時のワークフロー
データベースを使用するアプリケーションを例として考えます。
このアプリケーションでは、データベースのスキーマには前方互換性があるものとします。つまり、あるタイミングで新しいバージョンのスキーマに変更されても古いバージョンのアプリケーションは問題なく動作し、新しいバージョンのアプリケーションがデプロイされた時点で、新しいスキーマを使用できるようになるものとします。
アプリケーションがこのような特性を持っている場合、データベースのスキーマ変更を伴うデプロイを以下の手順で行えば、ダウンタイムを作らずに新バージョンが利用できます。
- 新しいアプリケーションのコンテナをビルドする
- 新しいアプリケーションを使用するタスク定義を登録する (
ecspresso register
) - 2.で登録した最新のタスク定義を使用してタスクを起動(
ecspresso run --latest-task-definition
)し、データベースのマイグレーションコマンドを実行する
(この時点でスキーマは新しいアプリケーションに対応します) - 最新のタスク定義を使用してECSサービスを更新する(
ecspresso deploy --latest-task-definition
)
(このデプロイが完了した時点で、アプリケーションは新しいスキーマを使用しはじめます)
run
と deploy
を実行する際に、それぞれ内容が同じでリビジョンが異なるタスク定義を登録してしまうと、ECSサービスをデプロイ後に問題が発生した場合のロールバックが困難になります。ecspresso rollback
は6日目で説明したとおり、「現在サービスが使用しているひとつ前のリビジョンに戻す」挙動をするためです。
古いアプリケーションが使用しているタスク定義のリビジョンが 10、run
で登録されたリビジョンが 11、deploy
で登録されたリビジョンが 12 だとすると、deploy
後の時点でロールバックを行うと同一内容の 11 に戻ります。これでは実質的にロールバックができないことになります。
あらかじめ register
で登録した最新のタスク定義を run
と deploy
の --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サービスを新規作成する方法を説明します。
Discussion