

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon ECS 服務部署的 lifecycle hook
<a name="deployment-lifecycle-hooks"></a>

部署開始時，它會進入生命週期階段。每個階段都可以處於 狀態，例如 `IN_PROGRESS`或 `SUCCEEDED`。您可以使用 lifecycle hook，這是 Amazon ECS 在指定生命週期階段代表您執行的 Lambda 函式。每個調用都包含 JSON 承載，其中包含部署目前狀態的相關資訊。

## lifecycle hook
<a name="lifecycle-hook-status"></a>

生命週期掛鉤是 Amazon ECS 在部署的特定階段調用的 Lambda 函數。您可以使用勾點來執行驗證測試、強制執行控管政策，或在部署進行之前實作手動核准步驟。

當 Amazon ECS 調用掛鉤時，您的函數必須傳回包含`hookStatus`欄位的 JSON 物件。您可以選擇包含 `callBackDelay` 來控制重試時間`hookDetails`，以及在調用之間傳遞資料。如果您的函數未傳回有效的 `hookStatus`，或如果失敗，Amazon ECS 會復原部署。

### hookStatus 值
<a name="hook-status-values"></a>

以下是有效`hookStatus`值：
+ `SUCCEEDED` – 部署會繼續進入下一個生命週期階段。
+ `FAILED` – Amazon ECS 會將部署復原至上次成功的服務修訂。
+ `IN_PROGRESS` – Amazon ECS 會在延遲後再次叫用函數。根據預設，延遲為 30 秒。您可以`callBackDelay`搭配 傳回 來自訂此值`hookStatus`。

下列範例說明如何傳回具有自訂復原延遲的 `hookStatus`。在此範例中，Amazon ECS 會在 60 秒後重試勾點，而不是預設的 30 秒：

```
{
    "hookStatus": "IN_PROGRESS",
    "callBackDelay": 60
}
```

### 使用 hookDetails 傳遞狀態
<a name="hook-details"></a>

`hookDetails` 欄位是字典，可用來將資料傳遞至生命週期掛鉤函數。有兩種方式可以填入 `hookDetails`：
+ **建立或更新服務時** – 在服務定義的生命週期掛鉤組態`hookDetails`中定義 。每次叫用時，Amazon ECS 都會將此資料傳遞給您的函數。使用此選項透過傳入服務特定的組態，讓您的勾點在多個服務之間可重複使用。
+ **在執行時間透過 IN\_PROGRESS 回應** – `hookDetails`傳回勾`IN_PROGRESS`點狀態。Amazon ECS 會在下一次調用時將此資料傳回您的函數。使用此項目可在不使用外部儲存體的叫用之間維持狀態。

下列範例顯示服務定義中的生命週期掛鉤組態，會將 S3 儲存貯體名稱傳遞給 函數：

```
{
    "hookTargetArn": "arn:aws:lambda:us-west-2:123456789012:function:my-approval-hook",
    "roleArn": "arn:aws:iam::123456789012:role/ecs-lambda-invoke-role",
    "lifecycleStages": [
        "POST_TEST_TRAFFIC_SHIFT"
    ],
    "hookDetails": {
        "S3_BUCKET_NAME": "my-approval-bucket"
    }
}
```

當函數傳回 時`IN_PROGRESS`，您也可以在回應`hookDetails`中包含 。Amazon ECS 會合併此資料，並在下次調用時將其傳回。常見的使用案例包括在叫用之間傳遞外部資源的指標計數器或 ARNs。

```
{
    "hookStatus": "IN_PROGRESS",
    "callBackDelay": 30,
    "hookDetails": {
        "approvalChecked": true,
        "S3_BUCKET_NAME": "my-approval-bucket"
    }
}
```

在下次調用時，Amazon ECS 會將 與 一起包含在事件承載`hookDetails`中`executionDetails`：

```
{
  "executionId": "e8d5a28f-eb01-4f3c-9454-a30ba6dc54bc",
  "lifecycleStage": "POST_TEST_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  },
  "hookDetails": {
    "approvalChecked": true,
    "S3_BUCKET_NAME": "my-approval-bucket"
  }
}
```

您的函數可以讀取`event["hookDetails"]`以存取先前調用中的組態和狀態。

**注意**  
`hookDetails` 在執行時間新增至 的資料只會在單一部署中呼叫相同掛鉤之間保留。資料不會在相同部署中的不同掛鉤或不同部署中的相同掛鉤之間轉移。

## 生命週期階段類別
<a name="lifecycle-stage-categories"></a>

生命週期階段分為兩個類別：

1. **單一調用階段** – Amazon ECS 在服務部署期間只會調用這些階段一次：
   + `RECONCILE_SERVICE`
   + `PRE_SCALE_UP`
   + `POST_SCALE_UP`
   + `POST_TEST_TRAFFIC_SHIFT`
   + `POST_PRODUCTION_TRAFFIC_SHIFT`

1. **週期性調用階段** – Amazon ECS 可以在服務部署期間多次調用這些階段，包括復原期間：
   + `TEST_TRAFFIC_SHIFT`
   + `PRODUCTION_TRAFFIC_SHIFT`

## 生命週期承載
<a name="service-deployment-lifecycle-payloads"></a>

### 常見的承載結構
<a name="common-payload-structure"></a>

當 Amazon ECS 調用您的 lifecycle hook Lambda 函數時，事件承載包含下列最上層欄位：
+ `executionId` – 此掛鉤執行的唯一識別符。
+ `lifecycleStage` – 目前的生命週期階段 （例如 `PRODUCTION_TRAFFIC_SHIFT`)。
+ `resourceArn` – 與部署相關聯的資源 ARN。
+ `executionDetails` – 物件，其中包含下列清單所述的部署特定資訊。

`executionDetails` 物件包含下列欄位：
+  `serviceArn` – 服務的 Amazon Resource Name (ARN)。
+  `targetServiceRevisionArn` – 要部署之目標服務修訂的 ARN。
+  `testTrafficWeights` – 服務修訂 ARNs 對應至其對應測試流量權重百分比的映射。
+  `productionTrafficWeights` – 服務修訂 ARNs 對應至其對應生產流量權重百分比的映射。

下列範例顯示 Lambda 函數收到的完整事件結構：

```
{
  "executionId": "f4fcae0f-9bec-41c6-ba87-0eaa0cef8af5",
  "lifecycleStage": "PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 100,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 0
    }
  }
}
```

### 生命週期階段承載
<a name="lifecycle-stage-payloads"></a>

下列各節顯示每個生命週期階段的範例承載。在這些範例中，綠色服務修訂版 (`9313423515462893900`) 是正在部署的新修訂版，而藍色服務修訂版 (`1920498462936580504`) 是現有的生產修訂版。

#### PRE\_SCALE\_UP
<a name="pre-scale-up"></a>

此階段會在 Amazon ECS 啟動綠色服務修訂任務之前發生。綠色服務修訂尚未啟動，而且沒有流量路由到它。

```
{
  "executionId": "e8d5a28f-eb01-4f3c-9454-a30ba6dc54bc",
  "lifecycleStage": "PRE_SCALE_UP",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

#### POST\_SCALE\_UP
<a name="post-scale-up"></a>

此階段發生在 Amazon ECS 啟動綠色服務修訂任務且運作狀態良好之後。綠色任務正在執行，但尚未接收任何流量。

```
{
  "executionId": "8b095b05-7bb0-4c56-a223-a3f61f4f9295",
  "lifecycleStage": "POST_SCALE_UP",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

#### TEST\_TRAFFIC\_SHIFT
<a name="test-traffic-shift"></a>

當 Amazon ECS 將測試流量轉移到綠色服務修訂版時，就會發生此階段。`testTrafficWeights` 顯示綠色修訂版接收 100% 的測試流量，而藍色修訂版接收 0%。生產流量會繼續流向藍色修訂版。

```
{
  "executionId": "779085de-ab47-42bc-84ad-41f9914a8643",
  "lifecycleStage": "TEST_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 100,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 0
    },
    "productionTrafficWeights": {}
  }
}
```

#### POST\_TEST\_TRAFFIC\_SHIFT
<a name="post-test-traffic-shift"></a>

此階段會在 Amazon ECS 完成測試流量轉移後發生。綠色服務修訂正在處理 100% 的測試流量。

```
{
  "executionId": "3a0345ba-b029-404b-890d-7da2a4b266aa",
  "lifecycleStage": "POST_TEST_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

#### PRODUCTION\_TRAFFIC\_SHIFT
<a name="production-traffic-shift"></a>

當 Amazon ECS 將生產流量轉移到綠色服務修訂版時，就會發生此階段。`productionTrafficWeights` 顯示綠色修訂版接收 100% 的生產流量，而藍色修訂版接收 0%。

```
{
  "executionId": "f4fcae0f-9bec-41c6-ba87-0eaa0cef8af5",
  "lifecycleStage": "PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 100,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 0
    }
  }
}
```

#### POST\_PRODUCTION\_TRAFFIC\_SHIFT
<a name="post-production-traffic-shift"></a>

此階段會在 Amazon ECS 完成生產流量轉移後發生。綠色服務修訂現在正在處理所有生產流量。

```
{
  "executionId": "5f40ed04-7e54-437d-b95d-98bc872fec49",
  "lifecycleStage": "POST_PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {}
  }
}
```

## 復原期間的生命週期掛鉤
<a name="lifecycle-hooks-during-rollback"></a>

沒有專用`ROLLBACK`生命週期階段。發生轉返時，Amazon ECS 會重新叫用在 `PRODUCTION_TRAFFIC_SHIFT`和 `TEST_TRAFFIC_SHIFT`階段 （重複叫用階段） 註冊的掛鉤。在復原期間，承載`productionTrafficWeights`中的 會顯示流量移回藍色修訂版。

`targetServiceRevisionArn` 仍然是綠色修訂 ARN，因為它仍然是原始部署的目標，即使流量正在移離它。

下列範例顯示復原期間的`PRODUCTION_TRAFFIC_SHIFT`承載。請注意，藍色修訂版 (`1920498462936580504`) 現在接收到 100% 的生產流量，而綠色修訂版 (`9313423515462893900`) 接收到 0%：

```
{
  "executionId": "70073435-cb99-457f-b900-6ee1dcad05ec",
  "lifecycleStage": "PRODUCTION_TRAFFIC_SHIFT",
  "resourceArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
  "executionDetails": {
    "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
    "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900",
    "testTrafficWeights": {},
    "productionTrafficWeights": {
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/9313423515462893900": 0,
      "arn:aws:ecs:us-west-2:123456789012:service-revision/my-cluster/my-service/1920498462936580504": 100
    }
  }
}
```

若要判斷您的勾點是否在復原期間被叫用，請檢查 `productionTrafficWeights`。如果 `targetServiceRevisionArn`（綠色修訂版） 的權重為 0%，而另一個修訂版的權重為 100%，則部署會轉返。