ECS のデプロイでコンテナ数が一時的に増えることを防ぎたいです。多重起動を制御する方法を教えてください
困っていた内容
必要数(タスク数)を1
に設定した ECS サービスを使ってアプリを動かしています。
ローリング更新を行うと新しいタスクが起動し終わってから、古いタスクが終了する挙動となり、一時的にタスク数が2
になります。
使用する外部サービス関係で、一時的でもタスク数が2
以上にならないようにしたいのですが、どうしたら良いでしょうか。
どう対応すればいいの?
最小ヘルス率(minimumHealthyPercent
)と最大ヘルス率(maximumPercent
)の変更をご検討ください。
サービス定義パラメータ - Amazon Elastic Container Service
maximumPercent
パラメータは、デプロイ時にRUNNING
、STOPPING
、またはPENDING
状態で許可されるサービスのタスクの上限数を表します。…(中略)…
minimumHealthyPercent
は、デプロイ時にRUNNING
状態に留まる必要があるサービスのタスクの下限数を表します。
デフォルト値である最小ヘルス率:100%、最大ヘルス率:200%の場合、ECS サービスは最小ヘルス率(起動数)を保つため次の順番でデプロイを行います。
よって、デプロイ時は一時的にタスク数が必要数以上になります。
- 新規ECSタスクを起動開始する
- 新規ECSタスクが起動状態になる
- 既存ECSタスクを停止開始する
- 既存ECSタスクが停止状態になる
一方で、最小ヘルス率:0%、最大ヘルス率:100%の場合、最小ヘルス率(起動数)を保つ必要がなく、かつ最大ヘルス率(最大起動数)を超えないように次の順番でデプロイを行います。
処理は順番に行われ、既存のタスクが停止してから新しいタスクが起動します。
- 既存ECSタスクを停止開始する
- 既存ECSタスクが停止状態になる
- 新規ECSタスクを起動開始する
- 新規ECSタスクが停止状態になる
そのため、タスク数が必要数以上になることを防ぎ、デプロイが行われます。
デプロイ中は起動数が0になるタイミングがあるため、システムによっては注意が必要な場合があります。
なお、最小ヘルス率の0%はデプロイ時に適用される設定であり、デプロイ時以外でタスク数が減少(例:異常停止)した場合は、自動的に新規タスクが起動します。