【ECS】FargateSpotを設定しようとしたらエラー
事象内容
コスト削減のため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 プロパティどちらも指定することができてしまうようです。
- CapacityProviderStrategy プロパティは指定せず、LaunchType プロパティを指定して AWS::ECS::Service リソース作成
- 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 コマンドを使用してテンプレートのバリデーションを行います。
- 参考リンク
Discussion