AWS Fargate Spot を ECS Service で設定する方法を解説します。Fargate Spot を使用すると、ECS タスクを Fargate 価格と比較して割引価格で実行できます。通常の Fargate をサービスで起動する場合との差分のみを解説していますので、一部の説明を省略しています。ご了承ください。
目次
- ECS クラスターを作成する
- ECS サービスを作成する
- FARGATE_SPOT で起動していることを確認する
- FARGATE と FARGATE_SPOT を混ぜて起動する
- FARGATE_SPOT と FARGATE どちらで起動しているかを確認する
- Fargate Spot 終了通知の処理
ECS クラスターを作成する
ECS マネジメントコンソールより、新規の ECS クラスターを作成します。この後 Fargate 起動タイプのタスクを利用するため「ネットワーキングのみ」を選択してウィザートを進め、クラスターを作成します。
クラスターが追加されたら、キャパシティープロバイダーのタブをクリックし、FARGATE と FARGATE_SPOT のキャパシティープロバイダーが作成されていることを確認します。これが作成されていないと、この後のサービスの作成のところでキャパシティープロバイダーを選択することができません。
AWS CLI などでクラスターを作成した場合や、Fargate Spot リリース以前に作成した古い ECS クラスターなど、キャパシティープロバイダーが作成されていない場合は、AWS CLI から作成します。
aws ecs put-cluster-capacity-providers \
--cluster MyCluster \
--capacity-providers FARGATE FARGATE_SPOT
詳しくは 既存のクラスターへの Fargate キャパシティープロバイダーの追加 - Amazon Elastic Container Service を参照。
ECS サービスを作成する
サービスの作成で、起動タイプの下にある「キャパシティープロバイダー戦略への切り替え」リンクをクリックをします。
「プロバイダーを追加」をクリックします。
プロバイダー 1 に「FARAGATE_SPOT」を選択します。この記事の後半で詳しく解説しますが、プロバイダーを 1 つだけ追加して FARGATE_SPOT と指定すると、タスクがすべて FARGATE_SPOT で起動します。
あとは、通常の Fargate サービスを構築するのと同じようにウィザードを進めてサービスを作成します。
FARGATE_SPOT で起動していることを確認する
タスクが起動したら、FARGATE_SPOT で起動しているか確認をしましょう。タスク詳細画面のキャパシティープロバイダーに FARGATE_SPOT と表示されていれば OK です。
FARGATE と FARGATE_SPOT を混ぜて起動する
さきほどの例では、すべて FARGATE_SPOT で起動させていましたが、FARGATE と FARGATE_SPOT を混ぜで起動させることもできます。サービスを作成または更新する画面で「プロバイダーを追加」のリンクをクリックします。
追加されたプロバイダー 2 は「FARGATE」を選択します。
ベースとウェイトについて
ベースとウェイトには、FARGATE_SPOT と FARGATE の起動のルールを設定できます。
ベースには、実行するタスクの最小数を設定します。ベースは FARGATE_SPOT または FARGATE のどちらか片方にしか設定ができません。
一方ウェイトには、起動されるタスクの総数の相対的な割合を設定できます。詳細は create-service — AWS CLI v2 Command Reference の --capacity-provider-strategy
を参照。
ここはややこしいので、実際に設定をして動きを見てみるのがおすすめです。いくつかパターンを乗せておきます。
FARGATE_SPOT と FARGATE を 1 対 1 でバランスよく起動させたい場合
キャパシティープロバイダー | ウェイト | ベース |
---|---|---|
FARGATE_SPOT | 1 | 0 |
FARGATE | 1 | 0 |
タスク数を 6 にすると、FARGATE_SPOT が 3 個、FARGATE が 3 個起動します
FARGATE を 2 タスクまで起動し、残りは FARGATE_SPOT を起動させたい場合
キャパシティープロバイダー | ウェイト | ベース |
---|---|---|
FARGATE_SPOT | 1 | 0 |
FARGATE | 0 | 2 |
タスク数を 2 に設定すると FARGATE が 2 個起動します。
タスク数を 6 に設定すると FARGATE が 2 個、FARGATE_SPOT が 4 個起動します。
FARGATE_SPOT と FARGATE を 2 対 1 の割合で起動させたい場合
キャパシティープロバイダー | ウェイト | ベース |
---|---|---|
FARGATE_SPOT | 2 | 0 |
FARGATE | 1 | 0 |
タスク数を 6 にすると、FARGATE_SPOT が 4 個、FARGATE が 2 個起動します。
FARGATE_SPOT と FARGATE どちらで起動しているかを確認する
ベースとウェイト、タスクの数を設定してウィザードを進めサービスを更新すると、設定した内容でタスクが起動します。
繰り返しなりますが FARGATE_SPOT で起動している場合は、タスク詳細画面のキャパシティープロバイダーに FARGATE_SPOT と表示されます。
FARGATE の場合は以下のように FARGATE と表示されます。
Fargate Spot 終了通知の処理
Fargate Spot タスクは AWS の Spot の在庫が少なくなってくると停止されることがあります。タスクが停止されるときは、タスク停止の 2 分前に警告が送信されます。警告は EventBridge イベント、及び実行中のタスクに SIGTERM として送信されます。詳細は AWS Fargate キャパシティープロバイダー Fargate Spot 終了通知の処理 - Amazon ECS を参照。
Amazon EventBridge に送信されたイベントは CloudWatch Event で捕獲し、SNS で通知をしたり、Lambda で終了処理を行うことができます。
実行中のタスクに SYGTERM が送信されると、サービスはまずロードバランサーからタスクを削除し (ロードバランサが使用されている場合)、接続のドレインが完了するのを待ちます。その後、タスクで実行されているコンテナに docker stop と同等のコマンドが発行されます。詳細は サービスの更新 - Amazon Elastic Container Service を参照。
Spot の在庫不足によるタスクの停止が起きた場合、2 分以内に安全に終了ができるか、停止されても途中からやり直せる設計にできるかどうかが、Fargate Spot を利用する判断材料になります。