☕️
ecspresso advent calendar 2020 day 8 - refresh
Amazon ECS のデプロイツールである ecspresso の利用法をまとめていく ecspresso Advent calendar 8日目です。
ECS サービスのタスクをすべて入れ替える
現在動作しているサービス内のタスクを、設定は変更せずに全て新しく起動したタスクに入れ替えたいことがあります。
起動時に外部から何らかのリソースを読み込む処理があってそれを再読込したい場合であったり、運用上どうしてもメモリーリークが発生してしまうタスクを定期的に再起動する必要があったり、Fargate タスクの退役が予告されたので事前に入れ替えておきたい場合など、理由は様々です。
ecspresso refresh コマンドは、サービス内のタスクをすべて入れ替えます。
実は refresh コマンドは deploy --skip-task-definition --force-new-deployment --no-update-service
のショートカットです。
- タスク定義を新しく登録しない (
--skip-task-definition
) - タスクを新しくデプロイし直す (
--force-new-deployment
) - サービス定義に変更があっても更新しない (
--no-update-service
)
これらのオプションを指定して、デプロイと同じ操作を実行します。前述の通り、様々な理由で設定変更をせずにタスクを入れ替えたいことが多いため、簡単に使えるようにコマンドとして独立させています。
ソースコード上でも、オプションを決め打ちにした ecspresso.DeployOption
を作成して
refresh := kingpin.Command("refresh", "refresh service. equivalent to deploy --skip-task-definition --force-new-deployment --no-update-service")
refreshOption := ecspresso.DeployOption{
DryRun: refresh.Flag("dry-run", "dry-run").Bool(),
DesiredCount: nil,
SkipTaskDefinition: boolp(true),
ForceNewDeployment: boolp(true),
NoWait: refresh.Flag("no-wait", "exit ecspresso immediately after just deployed without waiting for service stable").Bool(),
UpdateService: boolp(false),
LatestTaskDefinition: boolp(false),
}
case "refresh":
err = app.Deploy(refreshOption)
のが分かります。
refresh コマンドのオプション
$ ecspresso --config config.yaml refresh --help
usage: ecspresso refresh [<flags>]
refresh service. equivalent to deploy --skip-task-definition --force-new-deployment --no-update-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
--no-wait exit ecspresso immediately after just deployed without waiting for service stable
--no-wait
deploy --no-wait
と同様、タスクの入れ替えを指示した後に完了を待たず、即終了します。
9日目は各種操作を --no-wait
で実行した場合に、サービスが安定状態になるまで待機する方法を説明します。
Discussion