ecspresso で Fargate Spot を利用するための設定と要注意ポイント
tl;dr
- ecspresso を使って Fargate Spot を構成に入れるためにはサービス定義ファイルに
capacityProviderStrategy
設定を記述する。 - その場合
launchType
の設定は削除する必要がある。 -
launchType
を指定されて起動しているサービスを更新する場合は--force-new-deployment
を指定する必要がある。
背景
- AWS ECS でコンテナアプリケーションをプロダクション運用している
- デプロイツールとして ecspresso を利用している
- アプリケーションの性質として B2B SaaS で平日の日中が負荷のピークであるが、まだ規模的にはコンテナ 1 個の構成でも十分捌ける程度
- コンテナ 1 個でも十分な状態だが、サービスの可用性/安定性を考慮してコンテナは 2 個の構成にしている
Fargate Spot の利用に至った経緯
Fargate Spot はAWSの余剰リソースを利用する形であるため、AWS側でキャパシティを確保する必要がでてきたときに割り当てが取り消される可能性がある代わりに、通常のコンテナ実行リソースと比較して低いコスト( 70% OFF 相当? )で利用できるという特徴があます。
上記の「背景」に記載のとおりコンテナ 2 個の構成でインフラの待機コストを多少なりとも削減したいと考え、Fargate Spot を導入することにしてみました。
ecspresso の設定
ecspresso で Fargate Spot を利用する場合には ecs-service-def.yaml(json)
に capacityProvicerStrategy
設定を記述します。
(担当しているプロダクトの都合で jsonnet での記述例になっています)
capacityProviderStrategy: [
{
capacityProvider: 'FARGATE',
base: 1,
weight: 1,
},
{
capacityProvider: 'FARGATE_SPOT',
base: 0,
weight: 2,
},
],
上記は FARGATE
と FARGATE_SPOT
それぞれを、 1
対 2
の割合で利用することを weight
で指定しています。
そして、FARGATE
の base
が 1
となっているため、最初に起動する 1
個のコンテナは通常の ( Spot ではない ) Fargate で実行されることが保証されます。
詳細は AWS のドキュメントを参照してください。
Amazon ECS capacity providers - Amazon Elastic Container Service
注意点など
launchType
と併用できない
もともと launchType: "FARGATE"
のように指定していた場合、 capacityProviderStrategy
の記述をそのまま追加すると、ecspresso 実行時に以下のエラーが発生します。
run FAILED. failed to run task: InvalidParameterException: You may choose a capacity provider or a launch type but not both.
launchType
の記述は忘れずに削除しましょう。
--force-new-deployment
の指定が必要
すでに起動しているサービスが存在する場合 すでに launchType: "FARGATE"
で起動しているサービスを capacityProviderStrategy
に切り替える場合に以下のエラーが発生しました。
deploy FAILED. failed to update service attributes: InvalidParameterException: When switching from launch type to capacity provider strategy on an existing service, or making a change to a capacity provider strategy on a service that is already using one, you must force a new deployment.
対応方法としては以下のように ecspresso 実行時に --force-new-deployment
フラグを指定する必要がありました。
- ecspresso deploy --config ecspresso/dev/web/config.yaml
+ ecspresso deploy --force-new-deployment --config ecspresso/dev/web/config.yaml
まとめ
この記事では、コンテナアプリケーションのデプロイに ecspresso を利用している場合での Fargate Spot の設定方法を解説しました。
参考としたWebの情報は以下です。
Discussion