📝

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 からのデプロイ後に以下の挙動を確認できました。

  1. 新規 ECS サービスの作成
  2. 既存 ECS サービスの削除



まとめ

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

参考資料

Discussion