💸

ecspresso で Fargate Spot を利用するための設定と要注意ポイント

2023/03/22に公開

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,
    },
  ],

上記は FARGATEFARGATE_SPOT それぞれを、 12 の割合で利用することを weight で指定しています。
そして、FARGATEbase1 となっているため、最初に起動する 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