AWS Fargate Spot タスクで Spot 終了通知を処理するにはどうすればよいですか?

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

AWS Fargate Spot タスクで Spot 終了通知を処理する方法を知りたいと考えています。

簡単な説明

Fargate Spot を使用すると、中断に耐性のある Amazon Elastic Container Service (Amazon ECS) タスクを実行できます。終了通知は、Fargate Spot タスクが終了する 2 分前に受信する警告です。この警告は、アプリケーションに正常なシャットダウンに備える時間を与えることで、Spot の中断を管理するのに役立ちます。終了通知は、Fargate Spot タスクが終了対象としてマークされるとすぐに作成されます。通知には、実行中の Fargate Spot タスクが終了する時刻が示されます。警告は、Amazon EventBridge にタスク状態変更イベントとして送信され、実行中のタスクに SIGTERM シグナルとして送信されます。

タスクが停止する前に Fargate Spot 上のコンテナが確実に終了するようにするには、タスクが使用するコンテナ定義で stopTimeout 値を 120 秒以下に指定します。stopTimeout 値を指定することで、コンテナが正常に終了する時間を設定できます。この時間が経過すると、コンテナは強制的に停止されます。

注: 指定できる stopTimeout の最大値は 120 秒です。このパラメータに値を指定しない場合、デフォルト値の 30 秒が使用されます。

Fargate Spot を使用して Amazon ECS サービスで中断シグナルを受信すると、サービススケジューラは minimumHealthyPercentmaximumPercent の値を使用して、追加の容量が使用可能かどうかを判断します。容量が使用可能な場合、サービススケジューラは Fargate Spot で追加のタスクの起動を試みます。ただし、サービススケジューラが新しいタスク用の容量を見つけられなかった場合、stopTimeout 期間が経過すると古いタスクは終了します。

ロードバランサーで Fargate Spot を使用する場合は、次の点を考慮してください。

  • FARGATE_SPOT として実行されるタスクは、タスクが STOPPED 状態に移行するまで、ロードバランサーのターゲットグループから登録解除されない場合があります。
  • FARGATE_SPOT では、2 分以内に、タスクがシャットダウンされる前にターゲットグループの登録を解除する必要があります。つまり、FARGATE_SPOT に関連付けられているターゲットグループの登録解除の遅延を 2 分未満の値に設定する必要があります。

解決方法

容量が利用できない場合、または Fargate Spot 用に容量が取り戻されると、ECS サービススケジューラは新しいタスクを起動できず、通知から 2 分間が経過すると既存のタスクを終了します。ただし、これらのイベントは Amazon ECS コンソールではレポートされません。

ECS からのイベントはほぼリアルタイムで EventBridge に配信されるため、選択したイベントと、イベントがルールに一致したときに実行する必要のある自動アクションを示す単純なルールを記述するのがベストプラクティスです。この記事では、次のユースケース向けの EventBridge ルールについて説明します。

  • FARGATE_SPOT タスクが Fargate Spot の中断によりシャットダウンされた。
  • Fargate Spot 容量が使用できないために FARGATE_SPOT タスクを配置できない。

FARGATE_SPOT タスクが Fargate Spot の中断によりシャットダウンされた

Fargate Spot の中断の停止理由と停止コードを表示するタスク状態変更イベントのスニペットを次に示します。

{
  "version": "0",
  "id": "a99d3f53-4a7c-4153-a1a5-48957fc83b8f",
  "detail-type": "ECS Task State Change",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9b"
  ],
  "detail": {
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "createdAt": "2022-02-25T10:13:08.455Z",
    "desiredStatus": "STOPPED",
    "lastStatus": "RUNNING",
    "stoppedReason": "Your Spot Task was interrupted.",
    "stopCode": "TerminationNotice",
    "taskArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9bEXAMPLE",
    ...
  }
}

Fargate Spot の中断によりタスクが停止した場合、stopCodeTerminationNotice として言及されることに注意してください。つまり、停止コード TerminationNotice によって FARGATE_SPOT タスクが停止するたびに Amazon Simple Notification Service (Amazon SNS) アラートを送信する EventBridge ルールを作成できます。

以下の操作を実行します。

  1. Amazon SNS トピックを作成します。
  2. このユースケース向けの EventBridge ルールを作成します。

このユースケース向けの EventBridge ルールを作成するには、次の手順を実行します。

1.    Amazon EventBridge コンソールを開きます。

2.    ナビゲーションペインで [Rules★] をクリックします。

3.    [Create rule] (ルールの作成) を選択します。

4.    ルールの名前と説明を入力します。

5.    [Event bus] (イベントバスを選択) で、[AWS default event bus] (AWS デフォルトイベントバス) を選択します。

6.    [Rule type] (ルールタイプ) で、[Rule with an event pattern] (イベントパターンを含むルール) を選択します。

7.    [次へ] を選択します。

8.    [Event source] (イベントソース) で、[AWS services] (AWS のサービス) を選択します。

9.    [Event pattern] (イベントパターン) で、[Custom patterns (JSON editor)] (カスタムパターン (JSON エディタ)) を選択し、次のパターンを追加します。

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Task State Change"
  ],
  "detail": {
    "stopCode": [
      "TerminationNotice"
    ],
    "clusterArn": [
      "arn:aws:ecs:exampleregion:1111222233334444:cluster/examplecluster"
    ]
  }
}

10.    [Next] (次へ) を選択します。

11.    [Target types] (ターゲットタイプ) で、[AWS service] (AWS のサービス) を選択します。

12.    [Select a target] (ターゲットを選択) で、[SNS topic] (SNS トピック) を選択します。

13.    [Topic] (トピック) で、作成した SNS トピックを選択します。

14.    [Next] (次へ) を選択します。

15.    [configure tags - optional] (タグを設定 - オプション) ページで、[Next] (次へ) を選択します。

16.    オプションを確認し、[Create rule] (ルールを作成) を選択します。

Fargate Spot 容量が使用できないために FARGATE_SPOT タスクを配置できない

次の条件下で発生したサービスタスク配置失敗イベントのスニペットを次に示します。

  • タスクは FARGATE_SPOT 容量プロバイダーの使用を試みました。
  • サービススケジューラは Fargate Spot の容量を取得できませんでした。
{
  "version": "0",
  "id": "403b98b2-616e-4ec7-8dff-b2cba8d5bf64",
  "detail-type": "ECS Service Action",
  "source": "aws.ecs",
  "account": "1111222233334444",
  "time": "2022-02-25T14:56:32.756Z",
  "region": "ap-southeast-2",
  "resources": [
    "arn:aws:ecs:ap-southeast-2:1111222233334444:service/default/servicetest"
  ],
  "detail": {
    "eventType": "ERROR",
    "eventName": "SERVICE_TASK_PLACEMENT_FAILURE",
    "clusterArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:cluster/default",
    "capacityProviderArns": [
      "arn:aws:ecs:ap-southeast-2:1111222233334444:capacity-provider/FARGATE_SPOT"
    ],
    "reason": "RESOURCE:FARGATE",
    "createdAt": "2022-02-25T14:21:04.163Z"
  }
}

Fargate Spot 容量が使用できないためにタスクを配置できない場合、eventName は SERVICE_TASK_PLACEMENT_FAILURE として言及されます。つまり、FARGATE_SPOT タスクを配置できないときに SNS アラートを送信する EventBridge ルールを作成できます。

以下の操作を実行します。

1.    SNS トピックを作成します。

2.    このユースケース向けの Amazon EventBridge ルールを作成します。これを行うには、次の変更を除き、「FARGATE_SPOT タスクが Fargate Spot の中断によりシャットダウンされた」のセクションに記載されている手順を使用します。

[Event pattern] (イベントパターン) で、[Custom patterns (JSON editor)] (カスタムパターン (JSON エディタ)) を選択し、次のパターンを追加します。

{
  "source": [
    "aws.ecs"
  ],
  "detail-type": [
    "ECS Deployment State Change"
  ],
  "detail": {
    "eventName": [
      "SERVICE_TASK_PLACEMENT_FAILURE"
    ],
    "clusterArn": [
      "arn:aws:ecs:example-region:1111222233334444:cluster/example-cluster"
    ],
    "reason": [
      "RESOURCE:FARGATE"
    ]
  }
}

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


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