教程:更新应用程序依赖项、修补托管式节点并执行特定于应用程序的运行状况检查 - Amazon Systems Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

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

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

  2. 安装操作系统更新

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

  4. 重启系统

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

在此示例中,我们以这种方式设置了我们的基础设施:

  • 目标虚拟机在 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 文档内容

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

    cd /your/application/path npm update # you can use npm-check-updates if you want to upgrade major versions
  3. 创建另一个包含以下内容的 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
  4. 在 State Manager ( Amazon Systems Manager 的一个功能)中创建关联,通过执行下列步骤发出操作:

    1. 访问 https://console.aws.amazon.com/systems-manager/,打开 Amazon Systems Manager 控制台。

    2. 在导航窗格中,选择 State Manager,然后选择创建关联

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

    4. 文档列表中,选择 AWS-RunPatchBaselineWithHooks

    5. 对于操作,选择安装

    6. (可选)对于快照 ID,提供您生成的 GUID,以帮助加快操作速度并确保一致性。GUID 值可以像 00000000-0000-0000-0000-111122223333 一样简单。

    7. 对于安装前钩子文档名称,输入 NodeJSAppPrePatch

    8. 对于安装后钩子文档名称,输入 NodeJSAppPostPatch

    9. 对于针对 ExitHook 文档名称,输入 NodeJSAppOnExitPatch

  5. 对于 Targets(目标),通过指定标签、手动选择节点、选择资源组或选择所有托管式节点来标识托管式节点。

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

  7. Rate control(速率控制)部分中,选择用于控制如何在多个托管式节点上运行关联的选项。确保一次只更新部分托管式节点。否则,您的所有或大部分队列都可以同时离线。有关使用速率控制的更多信息,请参阅 关于 State Manager 关联中的目标和速率控制

  8. (可选)对于 Output options (输出选项),要将命令输出保存到文件,请选中 Enable writing output to S3 (启用将输出写入 S3) 方框。在方框中输入存储桶和前缀(文件夹)名称。

    注意

    授予将数据写入 S3 存储桶的能力的 S3 权限,是分配给托管式节点的实例配置文件的权限,而不是执行此任务的 IAM 用户的权限。有关更多信息,请参阅为 Systems Manager 配置实例权限为混合环境创建 IAM 服务角色。此外,如果指定的 S3 存储桶位于不同的 Amazon Web Services 账户 中,请确认与该托管式节点关联的实例配置文件或 IAM 服务角色具有写入该存储桶的所需权限。

  9. 选择创建关联