【ECS】FargateSpotを設定しようとしたらエラー

2024/08/02に公開

事象内容

コスト削減のためFargate Spotの導入したのですが、
ECSをCloudFormaitionでのデプロイ時に以下エラーが発生しました。

  • エラー内容
Resource handler returned message: "Invalid request provided: CreateService error: Specifying both a launch type and capacity provider strategy is not supported. Remove one and try again. (Service: AmazonECS; Status Code: 400; Error Code: InvalidParameterException; Request ID: XXXXXXXXXXXXXXXXXXXXX; Proxy: null)" 

原因

AWS::ECS::Service リソースタイプのリファレンスに記載があるように、
CapacityProviderStrategy プロパティを指定した場合は LaunchType プロパティは指定しないようにする必要があるそうです。

以下手順で操作を行うことで CapacityProviderStrategy プロパティと LaunchType プロパティどちらも指定することができてしまうようです。

  1. CapacityProviderStrategy プロパティは指定せず、LaunchType プロパティを指定して AWS::ECS::Service リソース作成
  2. LaunchType プロパティは変更せず、CapacityProviderStrategy プロパティを追加

また、CapacityProviderStrategy プロパティと LaunchType プロパティどちらも指定された状況において、
その他のプロパティを変更してのリソース更新は可能でした。

AWSサポートに確認してみたところ
LaunchType を指定することはできない(起動タイプは変更できない)ため、LaunchType プロパティは無視されるため
とのことでした。

対処方法

  • 元々の設定
    Properties:
      CapacityProviderStrategy: 
        - CapacityProvider: FARGATE
          Base: 0
          Weight: 0
        - CapacityProvider: FARGATE_SPOT
          Base: 1
          Weight: 1
        Fn::Sub: SampleECSCluster-${EnvName}
      LaunchType: 'FARGATE'
  • 変更後
    Properties:
      CapacityProviderStrategy: 
        - CapacityProvider: FARGATE
          Base: 0
          Weight: 0
        - CapacityProvider: FARGATE_SPOT
          Base: 1
          Weight: 1

LaunchTypeのプロパティを削除することで
エラーが解消されました。

補足

  • CapacityProviderStrategy と LaunchType の違い
    CapacityProviderStrategy と LaunchType は、
    ECSサービスの起動方法を指定するためのプロパティですが、これらは同時に使用することができません。

CapacityProviderStrategy: ECSサービスが使用するキャパシティプロバイダーを指定します。
FARGATE や FARGATE_SPOT などのプロバイダーを組み合わせて使用することができます。

LaunchType: ECSサービスの起動タイプを指定します。FARGATE や EC2 などの単一の起動タイプを指定します。

プロパティの一貫性: CapacityProviderStrategy と LaunchType のように、互いに排他的なプロパティを同時に指定しないように注意します。
テンプレートのバリデーション: テンプレートをデプロイする前に、aws cloudformation validate-template コマンドを使用してテンプレートのバリデーションを行います。

  • 参考リンク
Goals Tech Blog

Discussion