現状の管理方法
ECSのServiceをCloudformaitonで管理しており、
デプロイ時にaws cloudformation deploy
を実行しています。
具体的には以下のようなイメージです。
aws cloudformation deploy \
--template-file template/sample.yml \
--stack-name sample-ecs-service \
--parameter-overrides ImageTag=${image_tag} EnvName=${env} DesiredCount=1 \
--capabilities CAPABILITY_NAMED_IAM \
--no-fail-on-empty-changeset
発生経緯
元々はECSのタスクは以下のように固定で起動していました。
AutoScalingの導入をするときにスケールアウト中にデプロイすることで
タスク数が変動してしまうことを懸念しDesiredCount
のオプションを削除しました。
AutoScaling設定で最小を1 にしているので1は起動する認識でいました。
尚かつデフォルトパラメータで1を指定しているため問題ないだろうと考えてました。
DesiredCount:
Type: String
Default: '1'
事象発生
再度デプロイするとタスク数が0になってしまいました。
切り分けのためCloudformationのStackパラメータ値を確認したところ、
DesiredCountが0になっていました。
原因
ECSのService定義でDesiredCount
を指定しており、
それが原因のようでした。
Properties:
Cluster: !ImportValue
Fn::Sub: sample-ecs-cluster
- DesiredCount: !Ref DesiredCount
LaunchType: 'FARGATE'
EnableExecuteCommand: true
PropagateTags: 'TASK_DEFINITION'
Cloudformationのオプション削除だけでは不足しており、
テンプレートファイルの修正も必要でした。
ただ、Default値は1を指定しているため
1が指定されると思ったのですが、
以前のStackの値が引き継がれてしまうような仕様に思えます。
(元々は0指定でした)
まとめ
同じ役割をもつパラメータが複数箇所にあると想定しない挙動することがあるという
ケースでした。
Cloudformaitonの仕様把握不足な部分もありますが、
パラメータ管理は一元管理するようにしていくようにし運用の負担を減らしていきたいですね。