ECSタスクのスケールアウト中に、CloudFormationのデプロイを行いECSサービスを更新した場合、DesiredCountはテンプレートで指定している値で更新されますか

2021.08.29

困っていた内容

ECSタスクでApplication AutoScaling ( AWS::ApplicationAutoScaling::ScalableTarget、ScalingPolicy を指定) を使用しています。

Application Auto ScalingのScheduled Actionによって、アクセスが集中する特定の時間帯でECSタスクをスケールアウトしています。 具体的には、アクセスが集中する夜間に DesiredCount を6に設定し、アクセスが減少する深夜に再び 3 に戻しています。

CodePipelineにより、ソースコードが更新されたタイミングで、CloudFormationのスタックのデプロイを行うよう設定しているのですが、 スケールアウトしている時間帯に、CloudFormationのデプロイが実行されてECSサービスが更新された場合、 ECSタスクのDesiredCountはCloudFormationのテンプレートで指定している値に上書きされるのでしょうか?

どう対応すればいいの?

スケジュールでの DesiredCount の更新と CloudFormation の更新のいずれの場合も、ECS サービスの更新は UpdateService API を使用して更新されます。

Application AutoScaling により DesiredCount を 6 と設定した場合でも、 CloudFormation から DesiredCount 3 が指定されて更新されると、 結果的に DesiredCount は 3 となります。 直近の UpdateService の呼び出しで指定した DesiredCount が反映されることになります。

スケジュールにより DesiredCount を変更している状況は、CloudFormation により作成したリソースを CloudFormation の外部で変更している状況となります。

CloudFormation から更新する際にも、デプロイする時間に応じて、 CloudFormation テンプレートのパラメータ: ECSTaskDesiredCount に指定する値を変更することでご対応ください。

参考資料

[1] サービスのオートスケーリング - Amazon Elastic Container Service

[2] UpdateService - Amazon Elastic Container Service