

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在中配置节点生命周期操作 AWS 个
<a name="cng-node-lifecycle-actions-configure"></a>

您可以在计算节点组配置中定义节点生命周期操作。本主题介绍如何定义脚本、控制脚本是否在重启时重新运行、存储脚本、向其传递参数、处理故障、缓存脚本、验证其完整性以及读取其日志。

**代理版本要求**  
节点生命周期操作需要 AWS PCS 代理版本 1.5.0-1 或更高版本。如果您的计算节点使用带有较旧代理版本的自定义 AMI，请在配置生命周期操作之前更新代理。有关更多信息，请参阅 [AWS PCS 代理版本](pcs-agent-versions.md)。

## 如何定义脚本
<a name="cng-node-lifecycle-actions-configure-define"></a>

每个脚本都有一个`name``scriptSource`、一个`arguments`、可选、一个`onError`策略和一个`executionPolicy`。位置和完整性字段分组如下`scriptSource`。

```
{
  "name": "My script",
  "scriptSource": {
    "scriptLocation": "s3://{{my-bucket}}/{{my-script}}.sh",
    "s3VersionId": "optional, S3 only",
    "checksum": "optional 64-char SHA-256 hex"
  },
  "arguments": ["{{arg1}}", "{{arg2}}"],
  "onError": "TERMINATE",
  "executionPolicy": "FIRST_BOOT_ONLY"
}
```

## 向计算节点组添加生命周期操作
<a name="cng-node-lifecycle-actions-configure-add"></a>

在创建或更新计算节点组时，您可以添加生命周期操作。使用 AWS 管理控制台 或 AWS CLI。

------
#### [ AWS 管理控制台 ]

**使用控制台添加生命周期操作**

1. 打开 [AWS PCS 控制台](https://console.aws.amazon.com/pcs/home#/clusters)。

1. 打开计算节点组的创建或更新页面。

1. 在**节点生命周期操作**部分中，选择**添加脚本**。

1. 选择脚本源：

   1. **从 AWS PCS 脚本库中添加 ** — 引用 AWS维护的脚本。有关更多信息，请参阅 [使用 AWS-维护了中节点生命周期操作的脚本 AWS PCS](cng-node-lifecycle-actions-vetted-scripts.md)。

   1. **通过 S3 添加 ** — 按脚本的 Amazon S3 URI 引用脚本。

   1. **通过 HTTPS 添加 ** — 通过脚本的 HTTPS 网址引用脚本。

1. 选择节点阶段。

1. 对于通过 S3 或 HTTPS 添加的脚本，请指定以下设置：

   1. **脚本位置 **-输入脚本的 S3 URI 或 HTTPS 网址。

   1. **名称 ** — 输入脚本的名称。

   1. （可选）**校验和 **-输入 SHA-256 校验和以验证脚本的完整性。有关更多信息，请参阅 [脚本完整性（校验和）](#cng-node-lifecycle-actions-configure-checksums)。

   1. （可选）对于通过 S3 添加的脚本，输入版本以引用该对象的特定版本。

1. 对于所有脚本源，请指定以下设置：

   1. **错误处理行为 **-选择`TERMINATE``STOP_SEQUENCE`、或`CONTINUE`。

   1. **执行策略 **-选择`FIRST_BOOT_ONLY`或`EVERY_BOOT`。

   1. （可选）**参数 **-添加要传递给脚本的参数。

1. 要添加更多脚本，请重复这些步骤。

1. 脚本在一个阶段内从上到下运行。要更改执行顺序，请**为脚本选择 “**操作”，然后选择 “上**移” ** 或 “下**移” **。

1. 对于**缓存策略**，选择`CACHE_ONCE`或`REFRESH_ON_REBOOT`。缓存策略适用于所有脚本。有关更多信息，请参阅 [脚本缓存和更新](#cng-node-lifecycle-actions-configure-caching)。

------
#### [ AWS CLI ]

使用带有 `create-compute-node-group` or `update-compute-node-group` 命令的`--node-lifecycle-actions`参数。有关参数结构，请参阅 *AWS PCS API 参考[NodeLifecycleActionsRequest](https://docs.aws.amazon.com/pcs/latest/APIReference/API_NodeLifecycleActionsRequest.html)中的*。有关命令示例，请参见[的节点生命周期操作示例 AWS 个](cng-node-lifecycle-actions-examples.md)。

------

## 控制重启行为
<a name="cng-node-lifecycle-actions-configure-reboot"></a>

设置`executionPolicy`每个脚本以控制它是否在重启时重新运行。


| **值** | **行为** | **何时使用** | 
| --- | --- | --- | 
| `FIRST_BOOT_ONLY`（默认值） | 在节点首次启动时运行一次脚本。随后每次重启时都要跳过它。 | One-time 设置，例如安装软件包、加入域或初始化存储。你不必让这些脚本成为等效的。 | 
| `EVERY_BOOT` | 在首次启动**和每次重启**时运行脚本。 | 重启后必须重新应用的配置，例如重新安装临时文件系统或重新设置节点状态。 | 

脚本设置为`FIRST_BOOT_ONLY`运行一次，重新启动时会跳过。脚本设置为在每次启动时`EVERY_BOOT`运行，并且应该是等效的（可以安全地多次运行并获得相同的结果）。

## 脚本存储位置
<a name="cng-node-lifecycle-actions-configure-storage"></a>

您可以将脚本存储在 ** Amazon S3 中**或通过 ** HTTPS 提供脚本**。脚本无法通过 API 内联上传，并且每个脚本必须不大于 2 MiB，代理会拒绝任何超过此大小的脚本。
+ **亚马逊 S3 (`s3://{{bucket}}/{{key}}`) ** — 对象`s3:GetObject`上必须有实例 IAM 配置文件。使用 S3 网关 VPC 终端节点，私有子网中的节点可以通过 VPC 终端节点检索脚本。将特定版本固定到`scriptSource.s3VersionId`（仅限 S3 位置）。
+ **HTTPS (`https://{{hostname}}/{{path}}`) ** — 主机必须是公开可读的（无身份验证），并且该节点需要出站互联网接入（互联网网关、NAT 网关或 HTTP 代理）。这对于托管在 GitHub 或其他公共存储库上的脚本很有用。

外部存储提供版本控制、可审计性和跨团队重复使用。不支持内联或上传的脚本。

## 将参数传递给脚本
<a name="cng-node-lifecycle-actions-configure-arguments"></a>

将参数作为有序数组传递。它们作为位置命令行参数到达您的脚本。

```
arguments: ["fs-12345678", "/shared", "nfs4"]
# script.sh fs-12345678 /shared nfs4   ($1=fs-12345678, $2=/shared, $3=nfs4)
```

代理将环境变量导出到每个脚本。这些变量包含集群和节点元数据。


| **变量** | **描述** | 
| --- | --- | 
| `PCS_CLUSTER_ID` / `PCS_CLUSTER_NAME` | 集群标识符/名称 | 
| `PCS_COMPUTE_NODE_GROUP_ID` / `PCS_COMPUTE_NODE_GROUP_NAME` | 计算节点组标识符/名称 | 
| `PCS_NODE_ID` | 节点标识符 | 
| `PCS_IS_FIRST_BOOT` | `1`在节点首次启动时，`0`在随后每次重启时。使用它来分支`EVERY_BOOT`脚本中的行为。 | 

```
#!/usr/bin/env bash
echo "Configuring node $PCS_NODE_ID in cluster $PCS_CLUSTER_NAME"
```

## 错误处理
<a name="cng-node-lifecycle-actions-configure-errors"></a>

每个脚本都有一个`onError`字段，用于控制脚本退出非零值或被信号终止时发生的情况。


| **值** | **行为** | **何时使用** | 
| --- | --- | --- | 
| `TERMINATE`（默认值） | 标记节点失败并终止该节点。 | 关键设置（存储挂载、Active Directory 加入）。防止为损坏的节点付费。 | 
| `STOP_SEQUENCE` | 停止舞台中的剩余脚本；让节点保持运行状态。 | 调试 — 失败后检查实例。 | 
| `CONTINUE` | 记录错误并运行下一个脚本。 | 可选或尽力而为的任务。 | 

如果脚本以非零值退出或被信号杀死（例如），则脚本会失败。`SIGSEGV`**脚本未重试。**如果操作可能遇到暂时性故障，请在脚本中添加重试逻辑。但是，在行为应用之前，会重试脚本*检索*（下载），最多 3 次尝试，指数回退（最长约 17 秒）。`onError`

## 脚本缓存和更新
<a name="cng-node-lifecycle-actions-configure-caching"></a>

代理会在首次启动时将每个脚本下载到实例并将其存储在本地。两个字段控制重启时的行为：`scriptCachingPolicy`控制重新下载和`executionPolicy`控制重新执行。
+ **`CACHE_ONCE`（默认）**— 首次启动时下载一次；永远不要重新获取。重启后的行为是相同的。更新脚本*内容*需要更换实例。
+ **`REFRESH_ON_REBOOT`**— 每次 Re-download 重启时，都会覆盖缓存。这使您可以通过重启来发布脚本修复程序。每次启动都需要网络访问权限；如果刷新失败，则下载将被视为检索失败，脚本的`onError`行为适用（缓存副本没有回退）。刷新后的脚本只有在重新启动时才会真正重新运行。`executionPolicy` `EVERY_BOOT`

每个实例的生命周期*配置*（运行哪些脚本、其参数、错误处理和执行策略）始终是不可变的。更改它只`UpdateComputeNodeGroup`会影响**新**实例并触发`DRAIN`策略，因此运行任务在替换节点之前完成。

## 脚本完整性（校验和）
<a name="cng-node-lifecycle-actions-configure-checksums"></a>

（可选） SHA-256 `checksum`在脚本中提供 64 个字符的`scriptSource`十六进制字符串。代理在下载时对其进行验证；不匹配被视为下载失败并触发。`onError`我们建议在生产环境中使用校验和，特别是对于来自共享或外部来源的脚本。

```
sha256sum mount-efs.sh   # use the 64-char hex hash as the checksum value
```

## 记录和调试
<a name="cng-node-lifecycle-actions-configure-logging"></a>

每个脚本都写入自己的日志文件，代理保留自己的操作日志。

```
# agent: download, caching, checksum, orchestration
/var/log/amazon/pcs/lifecycle/actions/executor.log
# each script's stdout/stderr
/var/log/amazon/pcs/lifecycle/actions/<stage>/<script-name>.log
```

日志文件名使用您定义的脚本名称。空间被保留。例如，一个名为的脚本`Mount EFS home directory`写入`Mount EFS home directory.log`。使用 SSH 或 AWS Systems Manager 会话管理器进行阅读——两者均可在`nodeBootstrapped`舞台前使用。由于失败的节点会`TERMINATE`被替换，因此在终止后将日志转发到实例外进行调试：添加节点引导脚本，配置 Amazon CloudWatch 代理将生命周期日志目录发送到 Amazon Logs。 CloudWatch 由 AWS维护的`configure-cloudwatch-logs.sh`脚本执行此操作。有关更多信息，请参阅 [使用 AWS-维护了中节点生命周期操作的脚本 AWS PCS](cng-node-lifecycle-actions-vetted-scripts.md)。