ECS サービスのキャパシティプロバイダー設定を CloudFormation から更新した際の挙動について
Amazon ECS に ECS サービスのキャパシティプロバイダー設定の更新サポートが追加 - AWS
コンソール上では既存の ECS サービスを更新可能ですが、本記事執筆時点では CloudFormation から更新した際は以下のエラーが発生しました。
Resource handler returned message: "Resource of type 'AWS::ECS::Service' with identifier 'my-fargate-service' already exists." (RequestToken: b10b0291-cd5c-7b20-06d6-6c878877f8e7, HandlerErrorCode: AlreadyExists)
1. ECS クラスターの作成
検証用の ECS クラスターはコンソールから作成しました。

2. CloudFormation から ECS サービス作成
手順 1 の ECS クラスターに以下のテンプレートでサービスを作成します。
コンソールの設定における「コンピューティングオプション」にはいわゆる Fargate 起動タイプである「LaunchType: FARGATE」を指定しています。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
ECSService:
Type: AWS::ECS::Service
Properties:
ServiceName: my-fargate-service
Cluster: test
TaskDefinition: arn:aws:ecs:ap-northeast-1:012345678901:task-definition/test
DesiredCount: 1
LaunchType: FARGATE
NetworkConfiguration:
AwsvpcConfiguration:
Subnets:
- subnet-xxx
AssignPublicIp: ENABLED
CloudFormation からのデプロイ完了後に ECS サービスの更新画面を確認すると、起動タイプが Fargate になっています。

3. キャパシティープロバイダー戦略に変更してみる
手順 2 で作成した CloudFormation スタックを以下のテンプレートで更新します。
変更点としては以下の通りです。
- 変更前: Fargate 起動タイプ (LaunchType: FARGATE)
- 変更後: キャパシティープロバイダー戦略 (CapacityProviderStrategy)
AWSTemplateFormatVersion: "2010-09-09"
Resources:
ECSService:
Type: AWS::ECS::Service
Properties:
ServiceName: my-fargate-service
Cluster: test
TaskDefinition: arn:aws:ecs:ap-northeast-1:012345678901:task-definition/test
DesiredCount: 1
CapacityProviderStrategy:
- CapacityProvider: FARGATE
Weight: 1
Base: 0
NetworkConfiguration:
AwsvpcConfiguration:
Subnets:
- subnet-xxx
AssignPublicIp: ENABLED
上記テンプレートで CloudFormation スタックを更新中に以下のエラーが発生しました。
Resource handler returned message: "Resource of type 'AWS::ECS::Service' with identifier 'my-fargate-service' already exists." (RequestToken: b10b0291-cd5c-7b20-06d6-6c878877f8e7, HandlerErrorCode: AlreadyExists)
上記エラーより、既存の ECS サービスの更新ができないようでした。
なお、本挙動については CDK の GitHub リポジトリでも Issue として報告されていました。
aws-ecs: Updating capacity provider strategies on EC2 service causes replacement · Issue #29826 · aws/aws-cdk
4. コンソールから更新してみる
ECS サービスの更新をコンソールから実行してみます。

コンソールからは既存の ECS サービスの更新が可能でした。

5. ECS サービス名を変更してみる
手順 3 のテンプレートで ECS サービス名だけ変更してデプロイしてみます。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
ECSService:
Type: AWS::ECS::Service
Properties:
ServiceName: my-fargate-service-with-capacity-provider
Cluster: test
TaskDefinition: arn:aws:ecs:ap-northeast-1:012345678901:task-definition/test
DesiredCount: 1
CapacityProviderStrategy:
- CapacityProvider: FARGATE
Weight: 1
Base: 0
NetworkConfiguration:
AwsvpcConfiguration:
Subnets:
- subnet-xxx
AssignPublicIp: ENABLED
CloudFormation からのデプロイ後に以下の挙動を確認できました。
- 新規 ECS サービスの作成
- 既存 ECS サービスの削除



まとめ
今回は ECS サービスのキャパシティプロバイダー設定を CloudFormation から更新した際の挙動について紹介しました。
どなたかの参考になれば幸いです。
Discussion