

# 适用于 Amazon ECS 服务部署的生命周期挂钩
<a name="deployment-lifecycle-hooks"></a>

部署启动后，会经历一系列生命周期阶段。这些阶段可能处于“IN\$1PROGRESS”或已成功等状态。您可以使用生命周期挂钩，这是 Amazon ECS 在指定的生命周期阶段代表您运行的 Lambda 函数。这些函数可以是以下任一项：
+ 异步 API，可在 15 分钟内验证运行状况检查。
+ 轮询 API，可启动另一个异步进程，用于评估生命周期挂钩的完成情况。

函数运行结束后，必须返回 `hookStatus` 才能继续部署。如果未返回 `hookStatus`，或者函数失败，部署将回滚。以下是 `hookStatus` 的值：
+ `SUCCEEDED`：部署将持续到下一个生命周期阶段
+ `FAILED`：部署将回滚到上次成功部署。
+ `IN_PROGRESS`：Amazon ECS 将在短时间内再次运行该函数。默认情况下，时间间隔为 30 秒，但是可以通过在返回 `hookStatus` 的同时一并返回的 `callBackDelay` 来自定义该值。

以下示例演示了如何返回带有自定义回调延迟的 `hookStatus`。在此示例中，Amazon ECS 将在 60 秒（不是默认的 30 秒）后重试此挂钩：

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

发生回滚时，Amazon ECS 会为以下生命周期阶段运行生命周期挂钩：
+ PRODUCTION\$1TRAFFIC\$1SHIFT
+ TEST\$1TRAFFIC\$1SHIFT

## 生命周期有效载荷
<a name="service-deployment-lifecycle-payloads"></a>

 为 ECS 服务部署配置生命周期挂钩时，Amazon ECS 会在部署过程的特定阶段调用这些挂钩。每个生命周期阶段都会提供包含当前部署状态相关信息的 JSON 有效载荷。本文档描述了每个生命周期阶段的有效载荷结构。

### 常用有效载荷结构
<a name="common-payload-structure"></a>

 所有生命周期阶段的有效载荷均包含以下常用字段：
+  `serviceArn`：服务的 Amazon 资源名称（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

### 生命周期挂钩运行期间的部署状态
<a name="deployment-status-during-lifecycle-hooks"></a>

 生命周期挂钩运行时，所有生命周期阶段的部署状态都将为 `IN_PROGRESS`。


| 生命周期阶段 | 部署状态 | 
| --- | --- | 
| RECONCILE\$1SERVICE | 进行中 | 
| PRE\$1SCALE\$1UP | 进行中 | 
| POST\$1SCALE\$1UP | 进行中 | 
| TEST\$1TRAFFIC\$1SHIFT | 进行中 | 
| POST\$1TEST\$1TRAFFIC\$1SHIFT | 进行中 | 
| PRODUCTION\$1TRAFFIC\$1SHIFT | 进行中 | 
| POST\$1PRODUCTION\$1TRAFFIC\$1SHIFT | 进行中 | 