

• AWS Systems Manager CloudWatch 控制面板在 2026 年 4 月 30 日之后将不再可用。客户可以像现在一样继续使用 Amazon CloudWatch 控制台来查看、创建和管理其 Amazon CloudWatch 控制面板。有关更多信息，请参阅 [Amazon CloudWatch 控制面板文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)。

# 教程：使用控制台更新应用程序依赖项、修补托管式节点并执行特定于应用程序的运行状况检查
<a name="aws-runpatchbaselinewithhooks-tutorial"></a>

在许多情况下，在使用最新软件更新修补托管式节点后必须将其重启。但是，在没有安全措施的情况下重启生产中的节点可能会导致若干问题，例如调用告警、记录不正确的指标数据以及中断数据同步。

本教程将演示为了避免上述类似问题，如何通过使用 AWS Systems Manager 文档（SSM 文档）`AWS-RunPatchBaselineWithHooks` 来实现复杂的多步骤修补操作，该操作可完成以下事项：

1. 防止新连接到应用程序

1. 安装操作系统更新

1. 更新应用程序的软件包依赖项

1. 重启系统

1. 执行特定于应用程序的运行状况检查

在此示例中，我们以这种方式设置了我们的基础设施：
+ 目标虚拟机在 Systems Manager 中注册为托管式节点。
+ `Iptables` 作本地防火墙。
+ 托管式节点上托管的应用程序正在端口 443 上运行。
+ 托管式节点上托管的应用程序是 `nodeJS` 应用程序。
+ 托管式节点上托管的应用程序由 pm2 进程管理器管理。
+ 应用程序已经具有指定的运行状况检查终端节点。
+ 应用程序的运行状况检查终结点不需要终端用户身份验证。终端节点允许进行运行状况检查，以满足组织在建立可用性方面的要求。（在您的环境中，可能只需确定正在运行 `nodeJS` 应用程序，并且能够侦听请求。在其他情况下，您可能还需要验证是否已建立到缓存层或数据库层的连接。）

本教程中的示例仅用于演示目的，并不意味着按原样实施到生产环境中。另请注意，Patch Manager（Systems Manager 中的一项工具）的生命周期挂钩功能和 `AWS-RunPatchBaselineWithHooks` 文档搭配使用，可以支持许多其他场景。下面是几个示例。
+ 在修补之前停止指标报告代理，并在托管式节点重启后重启该代理。
+ 在进行修补之前，将托管式节点与 CRM 或 PCS 集群分离，并在节点重启后重新连接。
+ 在应用操作系统 (OS) 更新之后、托管式节点重启之前，在 Windows Server 计算机上更新第三方软件（例如，Java、Tomcat、Adobe 应用程序等）。

**更新应用程序依赖项、修补托管式节点并执行特定于应用程序的运行状况检查**

1. 使用以下内容为预安装脚本创建 SSM 文档，并将其命名为 `NodeJSAppPrePatch`。将*您的应用程序*替换为应用程序的名称。

   此脚本会立即阻止新的传入请求，并在开始修补操作之前为已经激活的请求提供 5 秒钟的完成时间。对于 `sleep` 选项，请指定一个比传入请求完成通常所需秒数大的秒数。

   ```
   # exit on error
   set -e
   # set up rule to block incoming traffic
   iptables -I INPUT -j DROP -p tcp --syn --destination-port 443 || exit 1
   # wait for current connections to end. Set timeout appropriate to your application's latency
   sleep 5 
   # Stop your application
   pm2 stop your_application
   ```

   有关创建 SSM 文档的信息，请参阅 [创建 SSM 文档内容](documents-creating-content.md)。

1. 为安装后脚本创建包含以下内容的另一个 SSM 文档，以更新应用程序依赖项，并将其命名为 `NodeJSAppPostPatch`。将*/您的/应用程序/路径*替换为通向您的应用程序的路径。

   ```
   cd /your/application/path
   npm update 
   # you can use npm-check-updates if you want to upgrade major versions
   ```

1. 创建另一个包含以下内容的 SSM 文档，其中的 `onExit` 脚本使应用程序备份并执行运行状况检查。命名此 SSM 文档为 `NodeJSAppOnExitPatch`。将*您的应用程序*替换为您的应用程序的名称。

   ```
   # exit on error
   set -e
   # restart nodeJs application
   pm2 start your_application
   # sleep while your application starts and to allow for a crash
   sleep 10
   # check with pm2 to see if your application is running
   pm2 pid your_application
   # re-enable incoming connections
   iptables -D INPUT -j DROP -p tcp --syn --destination-port 
   # perform health check
   /usr/bin/curl -m 10 -vk -A "" http://localhost:443/health-check || exit 1
   ```

1. 在State Manager（AWS Systems Manager 中的一项工具）中创建关联，通过执行下列步骤发出操作：

   1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

   1. 在导航窗格中，选择 **State Manager**，然后选择**创建关联**。

   1. 对于**名称**，请提供一个名称来帮助标识关联的用途。

   1. 在**文档**列表中，选择 `AWS-RunPatchBaselineWithHooks`。

   1. 对于**操作**，选择**安装**。

   1. （可选）对于**快照 ID**，提供您生成的 GUID，以帮助加快操作速度并确保一致性。GUID 值可以像 `00000000-0000-0000-0000-111122223333` 一样简单。

   1. 对于**安装前钩子文档名称**，输入 `NodeJSAppPrePatch`。

   1. 对于**安装后钩子文档名称**，输入 `NodeJSAppPostPatch`。

   1. 对于**针对 ExitHook 文档名称**，输入 `NodeJSAppOnExitPatch`。

1. 对于 **Targets**（目标），通过指定标签、手动选择节点、选择资源组或选择所有托管式节点来标识托管式节点。

1. 对于**指定时间表**，指定运行关联的频率。对于托管式节点修补，每周修补一次是常见的节奏。

1. 在 **Rate control**（速率控制）部分中，选择用于控制如何在多个托管式节点上运行关联的选项。确保一次只更新部分托管式节点。否则，您的所有或大部分队列都可以同时离线。有关使用速率控制的更多信息，请参阅 [了解 State Manager 关联中的目标和速率控制](systems-manager-state-manager-targets-and-rate-controls.md)。

1. （可选）对于 **Output options (输出选项)**，要将命令输出保存到文件，请选中 **Enable writing output to S3 (启用将输出写入 S3)** 方框。在方框中输入存储桶和前缀（文件夹）名称。
**注意**  
授予将数据写入 S3 存储桶的能力的 S3 权限，是分配给托管式节点的实例配置文件的权限，而不是执行此任务的 IAM 用户的权限。有关更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)或[为混合环境创建 IAM 服务角色](hybrid-multicloud-service-role.md)。此外，如果指定的 S3 存储桶位于不同的 AWS 账户 中，请确认与该托管式节点关联的实例配置文件或 IAM 服务角色具有写入该存储桶的所需权限。

1. 选择**创建关联**。