CloudFormationでFargate Spotを使用する

CloudFormationでFargate Spotを使用する

CloudFormationでFargate Spotを使用する

Fargate Spotを使用することによって、通常よりも低価格でFargateの利用できます。

Fargate Spotを使用すると、割り込み許容のあるAmazon ECSタスクを、Fargate料金と比較して割引料金で実行できます。Fargate Spot は、予備のコンピュートキャパシティーでタスクを実行します。AWS がキャパシティーを戻す必要がある場合、タスクは中断され、2 分間の警告が表示されます。

AWS Fargate キャパシティープロバイダー

今回はFargate Spotの基本的な動作を確認します。
また常にFargate Spot上でタスクを実行する方法についても確認します。

構築する環境

Diagram of Fargate Spot in CloudFormation

パブリックサブネットを用意し、FargateタイプのECSを作成します。
ECSクラスターにキャパシティプロバイダーの設定を行い、ECSタスクが動作する基盤を、以下の割合で振り分けます。

  • 通常のFargate:1
  • Fargate Spot:2

今回は合計で7つのタスクを作成することとします。
ただし少なくとも1つのタスクはFargate上に動作させるものとします。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/090

テンプレートファイルのポイント解説

本ページでは、Fargate Spotの設定方法に関する事柄を中心に取り上げます。

Fargateに関する基本的な事項については、以下のページをご確認ください。

https://awstut.com/2022/01/25/introduction-to-fargate

ECSクラスター

Resources:
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      CapacityProviders:
        - FARGATE_SPOT
        - FARGATE
      ClusterName: !Sub "${Prefix}-cluster"
      DefaultCapacityProviderStrategy:
        - CapacityProvider: FARGATE_SPOT
          Weight: 2
        - Base: 1
          CapacityProvider: FARGATE
          Weight: 1
Code language: YAML (yaml)

ECSクラスターにキャパシティプロバイダーの設定を行います。
クラスターに設定したキャパシティプロバイダーに関する設定が、クラスター全体のデフォルト設定となります。

キャパシティプロバイダーの設定は2つのプロパティがあります。

1つ目はCapacityProvidersプロパティです。
クラスターのキャパシティプロバイダー、つまりECSタスクが実行される基盤を指定します。
今回はFargateおよびFargate Spotの両方の上でタスクを実行しますから、「FARGATE」と「FARGATE SPOT」を指定します。

2つ目はDefaultCapacityProviderStrategyプロパティです。
本プロパティに、デフォルトのFargateおよびFargate Spotで起動するタスクの割合を指定します。
詳細はAWS公式ページで説明されていますが、Weightプロパティで割合を、Baseプロパティで最低限、起動させるタスク数を指定します。
今回はFargate SpotとFargateの割合は2:1ですから、それぞれWeightプロパティには「2」、「1」となります。
そしてFargateに少なくとも1つのタスクを実行させますから、Fargate側のBaseプロパティに「1」を指定します。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cluster-capacity-providers.html

ECSサービス

Resources:
  Service1:
    Type: AWS::ECS::Service
    Properties:
      #CapacityProviderStrategy:
      Cluster: !Ref Cluster
      DesiredCount: 7
      #LaunchType: FARGATE
      TaskDefinition: !Ref TaskDefinition1
      ServiceName: !Sub "${Prefix}-service1"
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - !Ref ContainerSecurityGroup
          Subnets:
            - !Ref PublicSubnet1
Code language: YAML (yaml)

クラスターでデフォルトキャパシティプロバイダーの設定を行う場合は、ECSサービス側では設定は不要です。
ですからCapacityProviderStrategyおよびLaunchTypeプロパティは使用しません。
なお両プロパティを使用する場合は、こちらの内容が優先されます。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • ECSクラスター:fa-090-cluster
  • ECSサービス:fa-090-service

作成されたリソースをAWS Management Consoleから確認します。
ECSクラスターを確認します。

Detail of Fargate 1.

確かにクラスターが作成されています。

次にECSサービスを確認します。

Detail of Fargate 2.

確かにサービスが作成されており、キャパシティプロバイダーの設定状況が表示されています。
具体的には、ECSタスクが起動する際のFargate SpotとFargateの割合(2:1)や、Fargateに少なくとも1つタスクを実行させることが確認できます。

起動中のECSタスクを確認します。

Detail of Fargate 3.

タスクの希望数通りに、確かに7つタスクが起動していることがわかります。

いくつかタスクの詳細を確認します。

Detail of Fargate 4.

Fargate上で起動しているタスクの例です。
「Capacity Provider」の値が「FARGATE」とあります。

Detail of Fargate 5.

Fargate Spot上で起動しているタスクの例です。
「Capacity Provider」の値が「FARGATE SPOT」とあります。

今回、7つのタスクを実行していますが、すべてのキャパシティプロバイダーを確認しました。
その内訳は以下の通りです。

キャパシティプロバイダータスク数
Fargate Spot4
Fargate3

まずFargate側で設定されているベース分、つまり1つのタスクがFargate上で実行されます。

残りの6つ分のタスクですが、キャパシティプロバイダー戦略によって、ECSタスクが起動する際のFargate SpotとFargateの割合は2:1になるように割り振られます。
つまりFargate Spot上が4つ、Fargate上が2つということになります。

以上をまとめると、上記表の通りとなります。

(参考)常にFargate Spot上でタスクを実行する

CloudFormationテンプレートファイルを、以下の通りに修正することで、タスクが常にFargate Spot上で動作するようになります。

Resources:
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      CapacityProviders:
        - FARGATE_SPOT
        #- FARGATE
      ClusterName: !Sub "${Prefix}-cluster"
      DefaultCapacityProviderStrategy:
        - CapacityProvider: FARGATE_SPOT
          Weight: 1
        #- Base: 1
        #  CapacityProvider: FARGATE
        #  Weight: 1
Code language: YAML (yaml)

キャパシティプロバイダーにおいて、Fargateに関する記述をコメントアウトしました。
これで本クラスターで動作するタスクは、常にFargate Spot上で動作することになります。

まとめ

今回はFargate Spotの基本的な動作を確認しました。