ECS のローリング更新でデプロイ時間を短くする方法を教えてください

2021.10.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

ECS サービスのデプロイ方法としてローリング更新を設定しています。開発環境では頻繁にデプロイするので、デプロイ時間を少しでも短くしたいです。変更するとデプロイ時間が短くなる設定項目とかはあったりしませんか?

どう対応すればいいの?

最小ヘルス率(minimumHealthyPercent)の変更をご検討ください。

ローリング更新 - Amazon ECS

minimumHealthyPercent は、デプロイメント中またはコンテナインスタンスがドレインしているときに、サービスに対して実行する必要があるタスク数の下限を、サービスに必要なタスク数の割合 (%) として表します。

minimumHealthyPercentの設定値がデフォルトの100%の場合、RUNNING状態のタスク数を保つため、ローリング更新は次の順番でデプロイを行います。

  1. 新規ECSタスクを起動開始する
  2. 新規ECSタスクがRUNNING状態になる
  3. 既存ECSタスクを停止開始する
  4. 既存ECSタスクがSTOPPED状態になる

一方で、minimumHealthyPercentの設定値が0%の場合、RUNNING状態のタスク数を保つ必要がないため、次の順番でデプロイを行います。

  1. 新規ECSタスクを起動開始、既存ECSタスクを停止開始する
  2. 新規ECSタスクがRUNNING状態になる
  3. 既存ECSタスクがSTOPPED状態になる

※2と3の順番は不定

新規ECSタスクの起動処理と 既存ECSタスクの停止処理が並列して行われるため、デプロイ時間の短縮が期待できます。

なお、デプロイ中はRUNNING状態のタスク数が0以下になることが想定されますので、ご注意ください。

やってみた

AWS Fargate を1タスク(中身はnginx)でminimumHealthyPercentを変更した場合の例となります。

経過時間およびイベントメッセージはECSサービスのイベントタブを確認しました。

minimumHealthyPercent 100%

デプロイ時間は3分33秒でした。追加⇨停止の順番で実施されたことが確認できます。

経過時間(秒) イベントメッセージ
- デプロイ開始
14 service hato has started 1 tasks: task
115 service hato has stopped 1 running tasks: task
213 service hato (deployment ecs-svc/123) deployment completed.

minimumHealthyPercent 0%

デプロイ時間は58秒でした。追加と停止がほぼ同時タイミングで実施されたことが確認できます。

経過時間(秒) 処理内容
- デプロイ開始
4 service ngx has stopped 1 running tasks: task
4 service ngx has started 1 tasks: task
58 service hato (deployment ecs-svc/123) deployment completed.

参考資料