CloudFormationでFargate Spotを使用する
Fargate Spotを使用することによって、通常よりも低価格でFargateの利用できます。
Fargate Spotを使用すると、割り込み許容のあるAmazon ECSタスクを、Fargate料金と比較して割引料金で実行できます。Fargate Spot は、予備のコンピュートキャパシティーでタスクを実行します。AWS がキャパシティーを戻す必要がある場合、タスクは中断され、2 分間の警告が表示されます。
AWS Fargate キャパシティープロバイダー
今回はFargate Spotの基本的な動作を確認します。
また常にFargate Spot上でタスクを実行する方法についても確認します。
構築する環境
パブリックサブネットを用意し、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に関する基本的な事項については、以下のページをご確認ください。
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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- ECSクラスター:fa-090-cluster
- ECSサービス:fa-090-service
作成されたリソースをAWS Management Consoleから確認します。
ECSクラスターを確認します。
確かにクラスターが作成されています。
次にECSサービスを確認します。
確かにサービスが作成されており、キャパシティプロバイダーの設定状況が表示されています。
具体的には、ECSタスクが起動する際のFargate SpotとFargateの割合(2:1)や、Fargateに少なくとも1つタスクを実行させることが確認できます。
起動中のECSタスクを確認します。
タスクの希望数通りに、確かに7つタスクが起動していることがわかります。
いくつかタスクの詳細を確認します。
Fargate上で起動しているタスクの例です。
「Capacity Provider」の値が「FARGATE」とあります。
Fargate Spot上で起動しているタスクの例です。
「Capacity Provider」の値が「FARGATE SPOT」とあります。
今回、7つのタスクを実行していますが、すべてのキャパシティプロバイダーを確認しました。
その内訳は以下の通りです。
キャパシティプロバイダー | タスク数 |
Fargate Spot | 4 |
Fargate | 3 |
まず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の基本的な動作を確認しました。