使用 “就地 AWS OpsWorks Stacks 分离” 工具 - AWS OpsWorks

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

使用 “就地 AWS OpsWorks Stacks 分离” 工具

重要

该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。

本节介绍如何使用原地 AWS OpsWorks Stacks 分离工具将您的 OpsWorks 实例与 OpsWorks Stacks 服务分离。

您分离的实例将保留在您的中 AWS 账户,但您将无法再使用 OpsWorks来管理它们。相反,您将使用 Amazon EC2 或任何与 EC2 兼容的方法来配置和管理实例。 AWS Systems Manager

从总体上讲,分离过程包括以下步骤:

  1. 该工具会执行验证检查,以确保资源已准备就绪,可以分离。

  2. 该工具从您的 OpsWorks 堆栈中导出自定义 JSON,并将其作为对象存储在 Amazon S3 中。

  3. 该工具可创建代表每个 OpsWorks Stacks 生命周期事件的 Systems Manager 自动化文档。

  4. 该工具为所有正在分离的实例创建 AWS Service Catalog AppRegistry 目录,并将所有 Elastic Load Balancing (ELB) 负载均衡器与层分离。 OpsWorks

  5. 最后,该工具会分离和注销其他资源,包括亚马逊关系数据库服务 (Amazon RDS) 实例。

流程是如何运作的

Detach In Place 工具提供以下 3 个命令和类似向导的体验,可指导您完成一系列步骤,在继续分离图层之前检查和配置实例。

命令 描述

handle-prerequisites

此命令分析图层中的所有实例是否符合分离条件并解析先决条件。这些实例必须处于健康状态 OpsWorks,不能有基于时间或负载的自动缩放器,并且必须安装最新的 OpsWorks 代理版本。

此外,该命令还会检查是否所有实例都具有支持 SSM 代理所需的权限,以及是否安装了最新的 SSM 代理版本。如果 SSM 代理不存在,则该命令将安装该代理;如果 SSM 代理未使用最新版本,则会更新 SSM 代理。该命令还将添加所有必要的权限。

detach

此命令分离指定层的所有 OpsWorks 实例。

首先,该命令将运行先决条件检查,以确保该层符合分离条件。如果您不想解决先决条件,则可以选择强制分离。

接下来,该命令将指示通过标 OpsWorks 记 API 或通过从图层和堆栈传播标签添加到您的实例的所有标签都将被保留。分离完成后,您可以使用相关的 EC2 API 删除这些标签中的任何一个。

然后,该命令将检查您是否要将与 Chef 相关的配置导出到 SSM 参数。

如果您在层上连接了 Classic Load Balancer,则该命令将询问它是否可以分离负载均衡器以防止停机。

cleanup

此命令会 OpsWorks 从您的账户中删除所有实体。它将终止实例并删除所有堆栈。这应该用于清理账户的最后一步不再需要的资源。

注意

我们建议您在运行该cleanup命令之前运行新安装程序几天。这样可以确保堆栈中的任何必要配置在需要时随时可用。

限制

就地分离工具的主要目的是安全地分离 OpsWorks 堆栈实例。本节总结了该工具的局限性。

  • Windows SSM 代理 — 如果实例上未安装 SSM 代理,则需要手动安装它。如果代理未更新到最新版本,则同样适用。

  • 时间/加载 Auto Scaling 实例 — 分离工具不支持启用了 Auto Scaling 的实例。您必须在要分离的实例上禁用 Auto Scaling。

  • 权限 — 分离工具不会创建或生成 OpsWorks 控制台权限页面上指定的 IAM 实体。

  • 应用程序-分离工具不会在外部创建或生成应用程序。 OpsWorks

开始使用

步骤 1:验证是否满足先决条件

就地分离工具的所有 3 个命令都是 Python 脚本,您可以在本地、在 EC2 实例上运行或通过使用AWS CloudShell来运行这些脚本。

AWS CloudShell 是一个基于浏览器的外壳,可让您通过命令行访问选定 AWS 资源中的资源。 AWS 区域 AWS CloudShell 预装了常用工具(例如 AWS CLI 和 Python)。使用时 AWS CloudShell,您使用的凭证与登录控制台时使用的凭证相同。

本演练假设您正在使用 AWS CloudShell.

第 2 步:下载脚本

  1. 通过运行以下命令下载包含迁移脚本和所有相关文件的 zip 文件:

    aws s3api get-object \ --bucket detach-in-place-bucket-prod-us-east-1 \ --key detach_in_place_script.zip detach_in_place_script.zip
  2. 运行以下命令解压缩文件。

    unzip detach_in_place_script.zip

    文件解压缩后,以下文件可用:

    • README.md

    • LICENSE

    • NOTICE

    • requirements.txt

    • TODO.py

  3. 如有必要,请运行以下命令进行安装pipenv

    pip install pipenv

步骤 3:运行脚本

首先,设置您的环境,以便您可以通过运行以下命令来运行脚本。

pipenv install -r requirements.txt pipenv shell

然后,查看脚本参数。

命令 参数 描述 类型 必需 默认

handle-prerequisites

--layer-id

要分离的图层的 ID。

String

-

--region

OpsWorks 堆栈的区域。如果您的 OpsWorks 堆栈区域和 API 终端节点区域不同,请使用堆栈区域。此区域与 OpsWorks 堆栈中的其他资源部分(例如,EC2 实例和子网)属于同一区域。

String

us-east-1

detach

--layer-id

要分离的图层的 ID。

String

-

--batch-size

要从图层分离的实例数(例如,5)。

String

-

--region

OpsWorks 堆栈的区域。如果您的 OpsWorks 堆栈区域和 API 终端节点区域不同,请使用堆栈区域。此区域与 OpsWorks 堆栈中的其他资源部分(例如,EC2 实例和子网)属于同一区域。

String

us-east-1

cleanup

--stack-id

要删除的堆栈的 ID。

String

互不相容,必须指定层 ID 或堆栈 ID

--layer-id

要删除的图层的 ID

String

--region

OpsWorks 堆栈的区域。如果您的 OpsWorks 堆栈区域和 API 终端节点区域不同,请使用堆栈区域。此区域与 OpsWorks 堆栈中的其他资源部分(例如,EC2 实例和子网)属于同一区域。

String

us-east-1

您可以通过运行带有选项的detachcleanup命令来查看handle-prerequisites和命令的可用--help选项,如下所示:

python3 layer_detacher.py detach --help python3 layer_detacher.py handle-prerequisites --help python3 layer_detacher.py cleanup --help

现在,您已准备好开始了。以下示例显示了如何针对不同的用例运行命令。

示例 1:检查图层是否满足所有先决条件并且符合分离条件

以下命令读取有关 OpsWorks 层(及其包含的实例)的信息,并检查是否满足以下先决条件:

  • 所有实例都处于联机状态。

  • 没有 Load/Time Auto Scaling 实例。

  • 所有实例都有最新的 OpsWorks 代理。

  • 所有实例都安装并配置了最新的 SSM 代理。

  • 所有实例都有 SSH 密钥对。

  • 每个实例恰好属于一个图层。

python3 layer_detacher.py handle-prerequisites \ --layer-id opsworks-layer-id \ --region opsworks-stack-region

示例 2:分离图层的所有实例

以下命令将遍历该层的所有实例,检查这些实例是否满足先决条件,并尝试并行分离所有满足先决条件的实例。如果不满足一个或多个先决条件,则该命令将为其余的不合规实例提供强制分离选项。

在分离任何实例之前,该命令将:

  1. 保存自定义 JSON 并将其上传到 S3。

  2. 为层的每个 OpsWorks 生命周期事件创建 SSM 自动化文档,并将自动化文档的执行日志上传到 S3。

  3. 为所有要分离的实例创建 AppRegistry 应用程序。该应用程序有一个与之关联的资源组,其中包含所有分离的实例和资源。这些资源包括 SSM 自动化文档和 SSM 参数,其中包含有关生命周期事件和自定义 Chef 食谱的信息。

  4. 将 Classic Load Balancer 与该层(如果存在)分离。

此命令将仅修改 OpsWorks 资源。EC2 实例的状态将保持不变。

python3 layer_detacher.py detach \ --layer-id opsworks-layer-id \ --region opsworks-stack-region

示例 3:批量分离图层的所有实例

以下命令的作用与前面的示例相同。唯一的区别是它会批量分离实例。

此命令将仅修改 OpsWorks 资源。EC2 实例的状态将保持不变。

python3 layer_detacher.py detach \ --layer-id opsworks-layer-id \ --region opsworks-stack-region \ --batch-size 5

示例 4:清理图层的所有资源并删除该图层

以下命令将遍历图层的所有资源并将其删除。更详细地说,它将停止并删除和 EC2 中的 OpsWorks 所有实例,分离负载均衡器并注销 Amazon RDS 实例、弹性 IP 和卷。清理资源后,它将删除该图层。

此命令将删除 OpsWorks 资源和 EC2 实例。如果您想让 EC2 实例保持不变,请在使用detach命令之前使用该cleanup命令。这样,该cleanup命令将删除所有剩余的资源。

python3 layer_detacher.py cleanup \ --layer-id opsworks-layer-id \ --region opsworks-stack-region

示例 5:清理堆栈的所有资源并删除堆栈

以下命令将遍历所有层,然后迭代每个层的资源。对于每一层,该命令将停止并删除和 EC2 中的所有实例,分离负载均衡器, OpsWorks 并注销 Amazon RDS 实例、弹性 IP 和卷。然后,该命令将删除该图层。将在属于该堆栈的每一层中执行相同的过程。最后,删除所有图层后,堆栈将被移除。

此命令将删除 OpsWorks 资源和 EC2 实例。如果您想让 EC2 实例保持不变,请在使用detach命令之前使用该cleanup命令。这样,该cleanup命令将删除所有剩余的资源。

python3 layer_detacher.py cleanup \ --stack-id opsworks-stack-id \ --region opsworks-stack-region

第 4 步:从资源分离后继续操作您的资源 OpsWorks

运行该detach命令后,该工具将创建一个与分离的图层对应的新 AWS Service Catalog AppRegistry 应用程序。应用程序名称遵循以下格式layer-name---layer-id。它还添加了OpsWorksLayerId标记,以唯一标识与分离层匹配的应用程序。

要向该应用程序添加新 AWS 资源(例如,新的 EC2 实例),您可以执行以下操作之一:

  1. 使用应用程序的唯一应用程序标签来 AppRegistry标记资源:

    标签密钥:awsApplication

    值:arn:aws:resource-groups:region:account-id:group/application-name/application-id>

  2. 运行 associate-resource 命令。

此外,还会为每个 AppRegistry 应用程序创建一个资源组。资源组包含以下标签。

标签密钥

EnableAWSServiceCatalogAppRegistry

TRUE

aws:servicecatalog:applicationName

application-name

aws:servicecatalog:applicationId

application-id

aws:servicecatalog:applicationArn

arn:aws:servicecatalog:region:account-id:/applications/application-id

分队后执行任务

下表提供了有关在分离后如何执行任务的信息:

任务 描述

执行生命周期事件

运行detach命令后,如果您选择了该选项,则脚本将创建 5 个与 5 个 OpsWorks 生命周期事件匹配的 Automation 文档。

每个自动化文档的名称都遵循以下格式:layer-id_lifecycle-event_automation_document.

要模拟 Systems Manager 中的 OpsWorks 行为,您需要在配置、终止 EC2 实例或部署/删除配方时手动触发自动化执行。

更新自定义 JSON

堆栈和层的自定义 JSON 存储在分离期间指定的 S3 存储桶中,或者存储在创建的新 S3 存储桶中。

为 JSON 文件存储的文件名如下:

  • layercustomjson.json

  • stackcustomjson.json

更改生命周期事件的运行列表

每个生命周期事件的运行列表在相应的 Automation 文档中定义。要更改运行列表,请在 AppRegistry 应用程序中找到 Automation 文档并修改RunList参数。

更新食谱和食谱的过程没有变化AWS-ApplyChefRecipes,因为自动化文档触发的支持与之相同的 OpsWorks来源。

管理自动修复/自动缩放

当您分离实例时, OpsWorks 代理会卸载。如果没有代理, OpsWorks 就无法自动修复或替换运行状况不佳的实例,也无法自动扩展您的队列。要继续自动扩展和替换失败的实例,请创建一个 Amazon EC2 Auto Scaling 组。当 Amazon EC2 检测到需要更换的不健康实例时,该组将启动新实例以保持其所需容量。

管理 Load Balancer

如果您的层使用 Classic Load Balancer,则该detach命令将在注销实例之前将其分离。这样做是为了确保在整个分离过程中所有 ELB 实例关联都保留在 Amazon EC2 上,从而实现零停机时间。该过程完成后,您将能够在 EC2 上管理您的 ELB。

连接到实例

运行handle-prerequisitesdetach命令时,会进行两项检查:

  • SSM 代理的版本和权限

  • SSH 密钥

这些命令还为您提供更新 SSM 代理和添加所需权限的选项,以便您可以使用会话管理器连接到实例。如果存在 SSH 密钥,您还可以选择 SSH 进入实例。

使用 Systems Manager 应用程序管理器实例选项卡

分离后,您将能够在 Application Manager 实例选项卡上查看和管理您的实例

实例选项卡提供有关应用程序的 EC2 实例的汇总信息,例如其状态、运行状况和上次命令状态。使用此选项卡,您可以查看有关单个实例的详细信息,例如命令历史记录、警报状态、Systems Manager 代理运行状况等。“实例” 选项卡还提供各种操作,例如能够应用 Chef 配方、启动或停止实例,或者在 Auto Scaling 组中添加或删除实例。