🐙

【PipeCD】AutoScalingが有効なECS ServiceをPipeCDで扱う方法

2024/08/11に公開

結論

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の場合

  1. servicedef.yamlのdesiredCountの項目を未指定にして、PipeCDアプリケーション(ECS)を新規作成・デプロイします。

    -> desiredCount=0でServiceが作成されます。

  2. 何らかの手段で、AutoScalingを有効化します。

b. 既にPipeCDで管理しているServiceのAutoScalingを有効にする場合

  1. 対象Serviceのservicedef.yamlのdesiredCountの項目を未指定に更新して、デプロイを走らせます。

    -> desiredCountは、現在稼働中の値のままになります。

  2. 何らかの手段で、AutoScalingを有効化します。

仕組み概説

PipeCDでは、servicedef.yaml の desiredCountが0または未指定の場合、
Serviceの desiredCount更新しない仕様になりました。(2023-07リリースのv0.48.2より)

該当コードは下記になります。

https://github.com/pipe-cd/pipecd/blob/ce98424ceb0eb0f0006b71931037a7c27fe07fc3/pkg/app/piped/platformprovider/ecs/client.go#L148-L151

脚注
  1. Terraformの場合、ignore_changesなどを使うかと思います。 ↩︎

サイバーエージェント Developer Productivity室

Discussion