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に関する基本的な事項については、以下のページをご確認ください。

あわせて読みたい
CloudFormationでFargate入門 【CloudFormationでFargateに入門するための構成】 AWS FargateはサーバーレスでDockerコンテナを実行することができるサービスです。今回はFargate入門ということで、C...

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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

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

  • 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の基本的な動作を確認しました。