如何處理 AWS Fargate Spot 任務的 Spot 終止通知?

3 分的閱讀內容
0

我想知道如何處理 AWS Fargate Spot 任務的 Spot 終止通知。

簡短描述

您可以使用 Fargate Spot 執行可容忍中斷的 Amazon Elastic Container Service (Amazon ECS) 任務。終止通知是您在 Fargate Spot 任務終止之前兩分鐘收到的警告。此警告透過讓應用程式有時間準備正常關閉,來協助管理 Spot 中斷。一旦 Fargate Spot 任務被標記為終止,就會建立此終止通知。該通知指示正在執行的 Fargate Spot 任務將終止的時間。警告作為任務狀態變更事件傳送到 Amazon EventBridge,並作為 SIGTERM 訊號傳送到正在執行的任務。

若要確保 Fargate Spot 上的容器在任務停止之前退出,請在任務使用的容器定義中指定 120 秒或更短的 stopTimeout 值。指定 stopTimeout 值讓容器有時間正常退出。在經過這段時間後,容器將被強制停止。

**注意:**您可以為 stopTimeout 指定的最大值為 120 秒。如果沒有為此參數指定任何值,則使用預設值 30 秒。

當使用 Fargate Spot 的 Amazon ECS 服務收到中斷訊號時,服務排程器會判斷是否有額外的可用容量。服務排程器會使用 minimumHealthyPercentmaximumPercent 值來進行判斷。如果有容量可用,則服務排程器會嘗試在 Fargate Spot 上啟動額外的任務。但是,如果服務排程器無法找到容量供新任務使用,則舊任務會在經過 stopTimeout 時間後終止。

將 Fargate Spot 與負載平衡器一起使用時,請考慮以下事項:

  • 對於作為 FARGATE_SPOT 執行的任務而言,在狀態變更為 STOPPED 之前,可能不會從負載平衡器的目標群組中取消註冊。
  • 使用 FARGATE_SPOT,在任務關閉之前,您只有兩分鐘的時間來取消註冊目標群組。這意味著您必須將與 FARGATE_SPOT 關聯的任何目標群組的取消註冊延遲設定為小於兩分鐘的值。

解決方案

當容量不可用或 Fargate Spot 被收回容量時,ECS 服務排程器無法啟動新任務。而是會在提供兩分鐘通知之後終止現有任務。但是,這些事件不會在 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": "SpotInterruption",
    "taskArn": "arn:aws:ecs:ap-southeast-2:1111222233334444:task/4be29e5b-b05c-42a2-a596-be62090eea9bEXAMPLE",
    ...
  }
}

請注意,當任務因 Fargate Spot 中斷而停止時,stopCode 則會是 SpotInterruption。您可以建立一個 EventBridge 規則,以在 FARGATE_SPOT 任務由 SpotInterruption 停止時傳送 Amazon Simple Notification Service (Amazon SNS) 提醒。

請執行下列操作:

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.    選擇 Next (下一步)。

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": [
      "SpotInterruption"
    ],
    "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。這意味著您可以建立一個 EventBridge 規則,以在無法置放 FARGATE_SPOT 任務時發出 SNS 提醒。

執行以下操作:

1.    建立一個 SNS 主題

2.    為此使用案例建立 Amazon EventBridge 規則。為此,請使用 A 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"
    ]
  }
}

相關資訊

處理 Fargate Spot 終止通知

建立回應事件的 Amazon EventBridge 規則

AWS 官方
AWS 官方已更新 1 年前