Amazon ECS で Fargate Spot キャパシティープロバイダーを使用するにはどうすればよいですか?

最終更新日: 2022 年 4 月 5 日

Amazon Elastic Container Service (Amazon ECS) で AWS Fargate Spot キャパシティープロバイダーを使用したいと考えています。

簡単な説明

使用を開始する前に、次の点に注意してください。

  • Fargate および Fargate Spot キャパシティープロバイダーを作成する必要はありません。これらはすべてのアカウントで使用でき、クラスターに関連付けるだけで使用できるようになります。
  • Fargate Spot キャパシティープロバイダーは、ECS PutClusterCapacityProviders API および ECS put-cluster-capacity-providers の CLI コマンドリファレンスを使用して、既存のクラスターに関連付けることができます。AWS マネジメントコンソールでは、既存のクラスターへの Fargate Spot キャパシティープロバイダーの追加はサポートされていません。
  • Fargate および Fargate Spot キャパシティープロバイダーは予約されており、削除できません。PutClusterCapacityProviders API を使用して、クラスターとの関連付けを解除できます。
  • Fargate Spot では、タスクでプラットフォームバージョン 1.3.0 以降 (Linux の場合) を使用する必要があり、Fargate Spot キャパシティープロバイダーは Fargate 上の Windows コンテナではサポートされていません。

解決方法

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

Fargate Spot キャパシティープロバイダーの作成、クラスターへの関連付け、関連付けの解除

Fargate Spot キャパシティープロバイダーは、Networking only クラスターテンプレートを使用して Amazon ECS コンソールから作成すると、クラスターに自動的に関連付けられます。詳細については、新しいコンソールを使用して Fargate 起動タイプのクラスターを作成するを参照してください。

Fargate Spot キャパシティープロバイダーをクラスターに関連付ける

Fargate Spot キャパシティープロバイダーがまだ関連付けられていない場合は、PutClusterCapacityProviders API または次の AWS CLI コマンドを使用して、キャパシティープロバイダーをクラスターに関連付けることができます。

aws ecs put-cluster-capacity-providers \
        --cluster <Cluster_name> \
        --capacity-providers FARGATE FARGATE_SPOT \
        --default-capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \
        --region <Region>

重要: キャパシティープロバイダーを上書きしないようにするには、すべての既存のキャパシティープロバイダーとキャパシティープロバイダー戦略を前述のコマンドに含めます。コマンドに含まれていないキャパシティープロバイダーは、クラスターとの関連付けが解除されます。

Fargate Spot キャパシティープロバイダーとクラスターの関連付けを解除する

クラスターに関連付けられ、PutClusterCapacityProviders API コールから省略された既存のキャパシティープロバイダーは、クラスターとの関連付けが解除されます。Amazon ECS クラスターから Fargate Spot キャパシティープロバイダーとの関連付けを解除するには、次の AWS CLI コマンドを実行します。

aws ecs put-cluster-capacity-providers \
        --cluster <Cluster_name> \
        --capacity-providers FARGATE \
        --default-capacity-provider-strategy capacityProvider=FARGATE,weight=1 \
        --region <Region>

Fargate Spot キャパシティープロバイダーが Amazon ECS クラスターに関連付けられていることを確認する

Fargate Spot キャパシティープロバイダーが Amazon ECS クラスターに関連付けられていることを確認するには、次のコマンドを実行します。

aws ecs describe-clusters \
        --cluster <Cluster_name> \
        --region <Region>

出力は次のようになります。

Output:
      "capacityProviders": [
           "FARGATE",
           "FARGATE_SPOT"
      ]

注: 前述のコマンドの出力には、Amazon ECS クラスターに関連付けられているキャパシティープロバイダーを含む capacityProviders セクションが含まれています。

Fargate Spot キャパシティープロバイダーを使用してタスクを実行したり、サービスを作成したりする

Fargate Spot キャパシティープロバイダーを使用してタスクを実行するには、次のコマンドを実行します。

aws ecs run-task \
        --cluster <Cluster_name> \
        --capacity-provider-strategy capacityProvider=FARGATE_SPOT,weight=1 \
        --task-definition <Task_definition_family>:<revision> \
        --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \
        --count <Number_of_Tasks> \
        --region <Region>

Fargate Spot キャパシティープロバイダーを使用する Amazon ECS サービスを作成するには、次のコマンドを実行します。

aws ecs create-service \ 
        --cluster <Cluster_name> \
        --service-name <Service_name> \
        --capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \
        --task-definition <Task_defintition_family>:<revision> \
        --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \
        --desired-count <Number_of_tasks> \
        --region <Region>

Fargate Spot キャパシティープロバイダーでタスクが実行されていることを検証する

タスクが Fargate キャパシティープロバイダーを使用していることを確認するには、次のコマンドを実行します。

aws ecs describe-tasks 
        --cluster <Cluster_name> \
        --tasks <TaskID> \
        --region <Region>

Amazon CloudWatch からのサービスごとの Fargate OnDemand と Fargate Spot の使用状況の追跡は、現在サポートされていません。ただし、CloudWatch を使用して Fargate OnDemand と Spot の合計使用量のメトリクスを表示できます。詳細については、AWS Fargate 使用状況メトリクスをご参照ください。

よくある質問

Fargate Spot のベストプラクティスにはどのようなものがありますか?

  • Fargate Spot は、ステートレスでフォールトトレラントなワークロードには最適ですが、重要なワークロードを Spot タスクだけに頼るわけではありません。代わりに、通常の Fargate タスクを組み合わせて設定します。
  • SIGTERM シグナルを受信して、割り込みを正常に処理します。SIGTERM シグナルを受信するときは、StopTimeout120 秒に設定するのがベストプラクティスです。詳細については、ECS によるグレースフルシャットダウンを参照してください。
  • Fargate Spot で実行されるアプリケーションは、フォールトトレラントである必要があります。

FARGATE_SPOT キャパシティーが使用できない場合、タスクはどうなりますか?

キャパシティーが使用できないために ECS スケジューラがタスクを起動できない場合、SERVICE_TASK_PLACEMENT_FAILURE イベントが発せられます。タスクは PROVISIONING の第 1 段階には到達せず、ECS イベントに通知も表示されません。ECS スケジューラは、引き続きタスクの起動を試行します。キャパシティーが使用可能になると、SERVICE_STEADY_STATE イベントが発せられます。

Fargate Spot キャパシティーが使用できない場合、Fargate へのフェイルオーバーはありますか?

利用可能な FARGATE_SPOT キャパシティーがない場合、FARGATE にフェイルバックするメカニズムを設定することはできません。

ECS サービスでキャパシティープロバイダーを使用する場合に、タスクがどのように配置されるかの例を挙げてください。

この例では、次の 2 つのキャパシティープロバイダーを含むキャパシティープロバイダー戦略があります。

Provider 1: FARGATE      |  Base:2   Weight:1
Provider 2: FARGATE_SPOT |  Base:0   Weight:3

この戦略によれば、基本値が満たされると、FARGATE を使用して実行するタスクごとに、3 つのタスクが FARGATE_SPOT を使用します。ECS サービスが望まれるカウント (5) で作成されると、次のようになります。

  • 基本値を満たすために FARGATE を使用して 2 つのタスクが起動され、残りの 3 つは FARGATEFARGATE_SPOT の間で 1:3 の比率で分割されます。
  • FARGATE を使用して 3 つのタスクを実行し、FARGATE_SPOT2 つのタスクを実行します。

この同じ戦略を使用して、スケールアウトイベントが発生し、望まれるカウントが 9 に増加します。ECS スケジューラは、ベースが満たされた FARGATE を使用して 3 つのタスクがすでに実行されていることを確認します。また、PROVISIONING 状態にある新しい 4 つのタスクが FARGATEFARGATE_SPOT の間で 1:3 の比率で分割されます。最後の 4 つのタスクは FARGATE を使用して実行され、5 つのタスクは FARGATE_SPOT で実行されます。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?