【PipeCD】AutoScalingが有効なECS ServiceをPipeCDで扱う方法
結論
ServiceのdesiredCount
を未指定にすることで、PipeCD外で設定したAutoScalingとの共存が可能
背景
ECSでAutoScalingを有効にしている場合、ServiceのTask数(desiredCount
)が自動で変更されます。
一方で、PipeCDは「Git上で設定された値」に実際のリソースを合致させようとするツールです。
そのため、例えば AutoScalingによって desiredCount=10
になっていても、PipeCD側で desiredCount=3
に設定していた場合、PipeCDのデプロイによって desiredCount=3
になってしまい、予期せぬスケールイン(不足7)が生じてしまいます。
この記事では、PipeCDにおいてそうした事態を回避し、AutoScalingと共存させる方法について解説します。[1]
やり方
基本的には、desiredCount
を削除すれば良いです。
これにより、以後PipeCDでデプロイを行なってもdesiredCount
は更新されず、オートスケールした値が維持され続けます。
Before:
cluster: arn:aws:ecs:ap-northeast-1:<account>:cluster/my-cluster
serviceName: my-service
desiredCount: 3
After:
cluster: arn:aws:ecs:ap-northeast-1:<account>:cluster/my-cluster
serviceName: my-service
# desiredCount: 3 # この行を削除する
移行パターンは以下2点の通りです。
a. 新規作成するServiceの場合
-
servicedef.yamlの
desiredCount
の項目を未指定にして、PipeCDアプリケーション(ECS)を新規作成・デプロイします。->
desiredCount=0
でServiceが作成されます。 -
何らかの手段で、AutoScalingを有効化します。
b. 既にPipeCDで管理しているServiceのAutoScalingを有効にする場合
-
対象Serviceのservicedef.yamlの
desiredCount
の項目を未指定に更新して、デプロイを走らせます。->
desiredCount
は、現在稼働中の値のままになります。 -
何らかの手段で、AutoScalingを有効化します。
仕組み概説
PipeCDでは、servicedef.yaml の desiredCount
が0または未指定の場合、
Serviceの desiredCount
を更新しない仕様になりました。(2023-07リリースのv0.48.2より)
該当コードは下記になります。
-
Terraformの場合、
ignore_changes
などを使うかと思います。 ↩︎
Discussion