

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

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

部署開始後，會經歷多個生命週期階段。這些階段可能處於 IN\$1PROGRESS 或成功等狀態。您可以使用 lifecycle hook，這是 Amazon ECS 在指定生命週期階段代表您執行的 Lambda 函式。這些函式可以是下列其中一項：
+ 非同步 API，可在 15 分鐘內驗證運作狀態檢查。
+ 輪詢 API，會啟動另一個非同步程序來評估 lifecycle hook 完成情況。

函式執行完成後，必須傳回 `hookStatus`，部署才能繼續。如果未傳回 `hookStatus`，或函式執行失敗，部署將會復原。以下為 `hookStatus` 的值：
+ `SUCCEEDED` – 部署會繼續進入下一個生命週期階段
+ `FAILED` – 部署會復原至上次成功的部署。
+ `IN_PROGRESS` – Amazon ECS 會在短時間內再次執行函式。預設時間間隔為 30 秒，但此值可透過在傳回 `hookStatus` 時同時傳回 `callBackDelay` 進行自訂。

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

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

發生復原時，Amazon ECS 會為下列生命週期階段執行 lifecycle hook：
+ PRODUCTION\$1TRAFFIC\$1SHIFT
+ TEST\$1TRAFFIC\$1SHIFT

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

 為 ECS 服務部署設定 lifecycle hook 時，Amazon ECS 會在部署程序的特定階段調用這些勾點。每個生命週期階段都會提供 JSON 承載，其中包含有關目前部署狀態的資訊。本文件主要介紹每個生命週期階段的承載結構。

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

 所有生命週期階段承載都包含下列常見欄位：
+  `serviceArn` – 服務的 Amazon Resource Name (ARN)。
+  `targetServiceRevisionArn` – 正在部署的目標服務修訂版的 ARN。
+  `testTrafficWeights` – 服務修訂版 ARN 對其對應測試流量權重百分比的映射。
+  `productionTrafficWeights` – 服務修訂版 ARN 對其對應生產流量權重百分比的映射。

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

#### RECONCILE\$1SERVICE
<a name="reconcile-service"></a>

 此階段發生在部署程序開始時 (即正在協調服務時)。下列顯示此生命週期階段的範例承載。

```
{
  "serviceArn": "arn:aws:ecs:us-west-2:1234567890:service/myCluster/myService",
  "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892",
  "testTrafficWeights": {
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892": 100,
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/78652123": 0
  },
  "productionTrafficWeights": {
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892": 100,
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/78652123": 0
  }
}
```

 **此階段的預期狀態：**
+ 主要任務集規模為 0%

#### PRE\$1SCALE\$1UP
<a name="pre-scale-up"></a>

 此階段發生在新任務向上擴展之前。下列顯示此生命週期階段的範例承載。

```
{
  "serviceArn": "arn:aws:ecs:us-west-2:1234567890:service/myCluster/myService",
  "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892",
  "testTrafficWeights": {},
  "productionTrafficWeights": {}
}
```

 **此階段的預期狀態：**
+ 綠色服務修訂版任務規模為 0%

#### POST\$1SCALE\$1UP
<a name="post-scale-up"></a>

 此階段發生在新任務向上擴展且運作狀態良好之後。下列顯示此生命週期階段的範例承載。

```
{
  "serviceArn": "arn:aws:ecs:us-west-2:1234567890:service/myCluster/myService",
  "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892",
  "testTrafficWeights": {},
  "productionTrafficWeights": {}
}
```

 **此階段的預期狀態：**
+ 綠色服務修訂版任務規模為 100%
+ 綠色服務修訂版中的任務運作狀態良好

#### TEST\$1TRAFFIC\$1SHIFT
<a name="test-traffic-shift"></a>

 此階段發生在測試流量在轉移到綠色服務修訂版任務時。

下列顯示此生命週期階段的範例承載。

```
{
  "serviceArn": "arn:aws:ecs:us-west-2:1234567890:service/myCluster/myService",
  "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892",
  "testTrafficWeights": {
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892": 100,
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/78652123": 0
  },
  "productionTrafficWeights": {}
}
```

 **此階段的預期狀態：**
+ 測試流量正在流向綠色服務修訂版任務。

#### POST\$1TEST\$1TRAFFIC\$1SHIFT
<a name="post-test-traffic-shift"></a>

 此階段發生在測試流量完全轉移到新任務之後。

下列顯示此生命週期階段的範例承載。

```
{
  "serviceArn": "arn:aws:ecs:us-west-2:1234567890:service/myCluster/myService",
  "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892",
  "testTrafficWeights": {},
  "productionTrafficWeights": {}
}
```

 **此階段的預期狀態：**
+ 100% 的測試流量已流向綠色服務修訂版任務。

#### PRODUCTION\$1TRAFFIC\$1SHIFT
<a name="production-traffic-shift"></a>

 此階段發生在生產流量轉在移到綠色服務修訂版任務時。

```
{
  "serviceArn": "arn:aws:ecs:us-west-2:1234567890:service/myCluster/myService",
  "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892",
  "testTrafficWeights": {},
  "productionTrafficWeights": {
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892": 100,
    "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/78652123": 0
  }
}
```

 **此階段的預期狀態：**
+ 生產流量正在流向綠色服務修訂版。

#### POST\$1PRODUCTION\$1TRAFFIC\$1SHIFT
<a name="post-production-traffic-shift"></a>

 此階段發生在生產流量完全轉移到綠色服務修訂版任務之後。

```
{
  "serviceArn": "arn:aws:ecs:us-west-2:1234567890:service/myCluster/myService",
  "targetServiceRevisionArn": "arn:aws:ecs:us-west-2:1234567890:service-revision/myCluster/myService/01275892",
  "testTrafficWeights": {},
  "productionTrafficWeights": {}
}
```

 **此階段的預期狀態：**
+ 100% 的生產流量已流向綠色服務修訂版任務。

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

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

1.  **單次調用階段** – 這些階段在服務部署期間僅調用一次：
   + PRE\$1SCALE\$1UP
   + POST\$1SCALE\$1UP
   + POST\$1TEST\$1TRAFFIC\$1SHIFT
   + POST\$1PRODUCTION\$1TRAFFIC\$1SHIFT

1.  **重複調用階段** – 這些階段在服務部署期間可能會多次調用，例如發生復原操作時：
   + TEST\$1TRAFFIC\$1SHIFT
   + PRODUCTION\$1TRAFFIC\$1SHIFT

### Lifecycle hook 期間的部署狀態
<a name="deployment-status-during-lifecycle-hooks"></a>

 Lifecycle hook 執行期間，所有生命週期階段的部署狀態都將是 `IN_PROGRESS`。


| 生命週期狀態 | 部署狀態 | 
| --- | --- | 
| RECONCILE\$1SERVICE | IN\$1PROGRESS | 
| PRE\$1SCALE\$1UP | IN\$1PROGRESS | 
| POST\$1SCALE\$1UP | IN\$1PROGRESS | 
| TEST\$1TRAFFIC\$1SHIFT | IN\$1PROGRESS | 
| POST\$1TEST\$1TRAFFIC\$1SHIFT | IN\$1PROGRESS | 
| PRODUCTION\$1TRAFFIC\$1SHIFT | IN\$1PROGRESS | 
| POST\$1PRODUCTION\$1TRAFFIC\$1SHIFT | IN\$1PROGRESS | 