ECS のデプロイでコンテナ数が一時的に増えることを防ぎたいです。多重起動を制御する方法を教えてください

2023.05.18

困っていた内容

必要数(タスク数)をに設定した ECS サービスを使ってアプリを動かしています。
ローリング更新を行うと新しいタスクが起動し終わってから、古いタスクが終了する挙動となり、一時的にタスク数が2になります。
使用する外部サービス関係で、一時的でもタスク数が2以上にならないようにしたいのですが、どうしたら良いでしょうか。

どう対応すればいいの?

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

サービス定義パラメータ - Amazon Elastic Container Service

maximumPercentパラメータは、デプロイ時にRUNNINGSTOPPING、または PENDING状態で許可されるサービスのタスクの上限数を表します。

…(中略)…

minimumHealthyPercentは、デプロイ時にRUNNING状態に留まる必要があるサービスのタスクの下限数を表します。

デフォルト値である最小ヘルス率:100%、最大ヘルス率:200%の場合、ECS サービスは最小ヘルス率(起動数)を保つため次の順番でデプロイを行います。
よって、デプロイ時は一時的にタスク数が必要数以上になります。

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

一方で、最小ヘルス率:0%、最大ヘルス率:100%の場合、最小ヘルス率(起動数)を保つ必要がなく、かつ最大ヘルス率(最大起動数)を超えないように次の順番でデプロイを行います。
処理は順番に行われ、既存のタスクが停止してから新しいタスクが起動します。

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

そのため、タスク数が必要数以上になることを防ぎ、デプロイが行われます。

デプロイ中は起動数が0になるタイミングがあるため、システムによっては注意が必要な場合があります。

なお、最小ヘルス率の0%はデプロイ時に適用される設定であり、デプロイ時以外でタスク数が減少(例:異常停止)した場合は、自動的に新規タスクが起動します。

参考資料