技術ブログ

AWS Fargate SpotをECS Serviceで利用する

2021年1月13日

Amazon ECS

AWS Fargate Spot を ECS Service で設定する方法を解説します。Fargate Spot を使用すると、ECS タスクを Fargate 価格と比較して割引価格で実行できます。通常の Fargate をサービスで起動する場合との差分のみを解説していますので、一部の説明を省略しています。ご了承ください。

目次

  1. ECS クラスターを作成する
  2. ECS サービスを作成する
  3. FARGATE_SPOT で起動していることを確認する
  4. FARGATE と FARGATE_SPOT を混ぜて起動する
  5. FARGATE_SPOT と FARGATE どちらで起動しているかを確認する
  6. Fargate Spot 終了通知の処理

ECS クラスターを作成する

ECS マネジメントコンソールより、新規の ECS クラスターを作成します。この後 Fargate 起動タイプのタスクを利用するため「ネットワーキングのみ」を選択してウィザートを進め、クラスターを作成します。

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_SPOTを選択

あとは、通常の Fargate サービスを構築するのと同じようにウィザードを進めてサービスを作成します。

FARGATE_SPOT で起動していることを確認する

タスクが起動したら、FARGATE_SPOT で起動しているか確認をしましょう。タスク詳細画面のキャパシティープロバイダーに FARGATE_SPOT と表示されていれば OK です。

FARGATE_SPOTの起動確認

FARGATE と FARGATE_SPOT を混ぜて起動する

さきほどの例では、すべて FARGATE_SPOT で起動させていましたが、FARGATE と FARGATE_SPOT を混ぜで起動させることもできます。サービスを作成または更新する画面で「プロバイダーを追加」のリンクをクリックします。

プロバイダーの追加

追加されたプロバイダー 2 は「FARGATE」を選択します。

FARGATEを設定

ベースとウェイトについて

ベースとウェイトには、FARGATE_SPOT と FARGATE の起動のルールを設定できます。

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_SPOTの起動確認

FARGATE の場合は以下のように 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 を利用する判断材料になります。

-技術ブログ
-