

# 适用于 Amazon ECS 服务部署的暂停钩子
<a name="pause-lifecycle-hooks"></a>

暂停钩子在特定的生命周期阶段暂停 Amazon ECS 服务部署，并等待您调用 `ContinueServiceDeployment` 后再进行部署。在继续部署之前需要手动审批或外部验证的情况下，请使用暂停钩子。

## 暂停钩子的工作方式
<a name="pause-hooks-how-they-work"></a>

当部署进入配置了暂停钩子的生命周期阶段时，将发生以下情况：

1. Amazon ECS 为 `hookId` 暂停钩子生成一个唯一值。

1. Amazon ECS 发出详细信息类型为 `ECS Hook State Change` 且事件名称为 `HOOK_AWAITING_ACTION` 的 EventBridge 事件。

1. 在通过 `hookId` 和 `CONTINUE` 或 `ROLLBACK` 操作调用 `ContinueServiceDeployment`，或者达到配置的超时时间之前，部署将保持暂停状态。

您可以通过调用 `DescribeServiceDeployments` 来检索 `hookId`。响应包括一个带有钩子状态的 `lifecycleHookDetails` 数组：

```
{
    "serviceDeployments": [
        {
            "lifecycleHookDetails": [
                {
                    "hookId": "ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw",
                    "targetType": "PAUSE",
                    "status": "AWAITING_ACTION",
                    "expiresAt": "2024-01-15T12:00:00Z",
                    "timeoutAction": "ROLLBACK"
                }
            ]
        }
    ]
}
```

## 配置暂停钩子
<a name="pause-hooks-configuring"></a>

以下示例展示了服务定义中的暂停钩子配置，即在测试流量转移完成后暂停部署：

```
{
    "deploymentConfiguration": {
        "strategy": "BLUE_GREEN",
        "lifecycleHooks": [
            {
                "targetType": "PAUSE",
                "lifecycleStages": [
                    "POST_TEST_TRAFFIC_SHIFT"
                ],
                "timeoutConfiguration": {
                    "timeoutInMinutes": 10,
                    "action": "ROLLBACK"
                }
            }
        ]
    }
}
```

### 配置字段
<a name="pause-hooks-configuration-fields"></a>


| 字段 | 说明 | 有效值 | 必需 | 
| --- | --- | --- | --- | 
| targetType | 挂钩的类型。暂停钩子必须为 PAUSE。 | PAUSE | 是 | 
| lifecycleStages | 部署暂停的生命周期阶段。 | RECONCILE\_SERVICE, PRE\_SCALE\_UP, POST\_SCALE\_UP, POST\_TEST\_TRAFFIC\_SHIFT, PRE\_PRODUCTION\_TRAFFIC\_SHIFT, POST\_PRODUCTION\_TRAFFIC\_SHIFT | 是 | 
| timeoutConfiguration.timeoutInMinutes | 采取超时操作之前的等待时间。默认值：1,440 分钟（24 小时）。 | 1-20,160（14 天） | 否 | 
| timeoutConfiguration.action | 超时到期后执行的操作。 | ROLLBACK (默认值)CONTINUE | 否 | 

## 约束
<a name="pause-hooks-constraints"></a>
+ 每个服务最多可以配置 10 个暂停钩子和 10 个 Lambda 钩子。
+ 暂停钩子不使用 `hookTargetArn` 或 `roleArn`。这些字段仅适用于 Lambda 钩子。
+ 不能在 `TEST_TRAFFIC_SHIFT` 或 `PRODUCTION_TRAFFIC_SHIFT` 阶段配置暂停钩子。

## 继续暂停的部署
<a name="pause-hooks-continuing"></a>

部署暂停时（暂停钩子状态为 `AWAITING_ACTION`），需通过 `hookId` 和要执行的操作调用 `ContinueServiceDeployment`。

继续部署：

```
aws ecs continue-service-deployment \
    --hook-id ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw \
    --action CONTINUE
```

回滚部署：

```
aws ecs continue-service-deployment \
    --hook-id ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw \
    --action ROLLBACK
```

有关更多信息，请参阅 [继续服务部署](continue-service-deployment.md)。

## 同一阶段有多个钩子
<a name="pause-hooks-multiple-at-same-stage"></a>

在同一生命周期阶段配置多个钩子时，部署将保持暂停状态，直到该阶段的所有钩子都继续执行。如果任一钩子触发回滚，则无论该阶段其他钩子的状态如何，整个部署都将回滚。

此行为适用于 Lambda 钩子和暂停钩子在同一个生命周期阶段配置的情况。只有该阶段的所有钩子都成功完成或继续执行时，部署才会继续。

在同一生命周期阶段配置的所有钩子将并行运行。

## 超时行为
<a name="pause-hooks-timeout"></a>

如果在超时到期之前未调用 `ContinueServiceDeployment`，Amazon ECS 将执行配置的超时操作：
+ `ROLLBACK`（默认）：Amazon ECS 将部署回滚至上一个服务修订。
+ `CONTINUE`：Amazon ECS 使部署持续到下一个生命周期阶段。

检查 `DescribeServiceDeployments` 响应的 `lifecycleHookDetails` 数组中的 `expiresAt` 字段，查看超时何时到期。

## 使用线性部署和金丝雀部署的暂停钩子
<a name="pause-hooks-linear-canary"></a>

对于线性部署和灰度部署，在 `PRE_PRODUCTION_TRAFFIC_SHIFT` 阶段配置的暂停钩子将在每个流量转移步骤中进行调用。每次调用都会生成一个唯一 `hookId`，您必须为每个 ID 调用 `ContinueServiceDeployment`。

例如，线性部署有 5 个流量转移步骤，`PRE_PRODUCTION_TRAFFIC_SHIFT` 阶段的暂停钩子会暂停 5 次，即执行每个步骤之前一次。每次暂停都需要通过相应的 `hookId` 单独调用 `ContinueServiceDeployment`。

## EventBridge 事件
<a name="pause-hooks-eventbridge"></a>

随着暂停钩子在生命周期中的进展，Amazon ECS 将发出详细信息类型为 `ECS Hook State Change` 的 EventBridge 事件。下表描述了事件名称：


| 事件名称 | 说明 | 
| --- | --- | 
| HOOK\_AWAITING\_ACTION | 钩子正等待您调用 ContinueServiceDeployment。 | 
| HOOK\_SUCCEEDED | 钩子成功完成（您使用 ContinueServiceDeployment 调用了 CONTINUE）。 | 
| HOOK\_FAILED | 钩子失败（您使用 ContinueServiceDeployment 调用了 ROLLBACK）。 | 
| HOOK\_TIMED\_OUT | 钩子在调用 ContinueServiceDeployment 之前已超时。 | 

以下示例显示了暂停钩子等待操作时发出的 EventBridge 事件：

```
{
    "version": "0",
    "id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
    "detail-type": "ECS Hook State Change",
    "source": "aws.ecs",
    "account": "123456789012",
    "time": "2024-01-15T10:00:00Z",
    "region": "us-west-2",
    "detail": {
        "eventType": "INFO",
        "eventName": "HOOK_AWAITING_ACTION",
        "hookId": "ecs-pause-e7tK9G_WRJqNF_EOMjztDXfKenlJuEUVjsNStf4WLKw",
        "hookType": "PAUSE",
        "expiresAt": "2024-01-15T12:00:00Z",
        "lifecycleStage": "POST_TEST_TRAFFIC_SHIFT",
        "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/my-cluster",
        "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/my-cluster/my-service",
        "serviceDeploymentArn": "arn:aws:ecs:us-west-2:123456789012:service-deployment/my-cluster/my-service/EZe5RNVLH6PPzHXINuP28",
        "updatedAt": "2024-01-15T10:00:00Z"
    }
}
```