常见问题解答 - AWS OpsWorks

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

常见问题解答

以下常见问题解答提供了一些常见问题的答案。

我可以迁移哪些 AWS OpsWorks Stacks 版本?

您只能迁移 Chef 11.10 和 Chef 12, Amazon Linux, Amazon Linux 2, Ubuntu, 和 Red Hat Enterprise Linux 7 堆栈。

我的迁移实例可以使用哪些 Chef 版本?

迁移的实例可以使用 Chef 11 到 14。

注意

不支持 Windows 堆栈迁移。

我可以迁移哪些存储库类型?

您可以迁移 S3、Git 和 HTTP 存储库类型。

我可以继续使用私有 Git 存储库吗?

是的,您可以继续使用私有 Git 存储库。

如果您使用私有 GitHub 存储库,则必须为 SSH 创建新的Ed25519主机密钥。这是因为 GitHub 更改了 SSH 中支持的密钥并删除了未加密的 Git 协议。有关Ed25519主机密钥的更多信息,请参阅 GitHub 博客文章 “改进 Git 协议安全” GitHub。生成新的 Ed25519 主机密钥后,为此 SSH 密钥创建一个 Systems Manager SecureString 参数,并使用参数名称作为 --repo-private-key 参数的值。有关如何创建 System SecureString s Manager 参数的更多信息,请参阅《AWS Systems Manager 用户指南》中的创建 SecureString 参数 (AWS CLI)

对于任何其他 Git 存储库类型,请为此 SSH 密钥创建一个 Systems Manager SecureString 参数,并将该参数名称用作脚本 --repo-private-key 参数的值。

我可以使用哪些 SSH 密钥来访问我的实例?

运行脚本时,脚本会迁移堆栈中配置的 SSH 密钥和实例。您可以使用 SSH 密钥访问您的实例。如果为堆栈和实例提供了 SSH 密钥,则脚本将使用堆栈中的密钥。如果您不确定要使用哪些 SSH 密钥,请在 EC2 控制台中查看实例 (https://console.aws.amazon.com/ec2/)。EC2 控制台中的详细信息页面显示您实例的 SSH 密钥。

为什么我的实例会自动扩展和缩减?

自动扩缩根据自动扩缩组的伸缩规则来扩缩实例。您可以为组设置最小最大所需容量值。当您更新这些值时,自动扩缩组会自动相应地扩缩您的容量。

我可以关闭自动扩缩吗?

您可以通过将自动扩缩组的最小最大所需容量值设置为相同的数字来关闭自动扩缩。例如,如果您希望始终有十个实例,请将最小最大所需容量值设置为十。

我能否对启动的 EC2 实例执行内核和软件包更新?

默认情况下,内核和软件包更新在 EC2 实例启动时发生。使用以下步骤对已启动的 EC2 实例执行内核或软件包更新。例如,您可能希望在运行部署或配置配方后应用更新。

  1. 连接到您的 EC2 实例。

  2. 创建以下 perform_upgrade 函数并在您的实例上运行它。

    perform_upgrade() { #!/bin/bash if [ -e '/etc/system-release' ] || [ -e '/etc/redhat-release' ]; then sudo yum -y update elif [ -e '/etc/debian_version' ]; then sudo apt-get update sudo apt-get dist-upgrade -y fi } perform_upgrade
  3. 内核和软件包更新后,您可能需要重启您的 EC2 实例。要检查是否需要重启,请创建以下 reboot_if_required 函数并在您的 EC2 实例上运行该函数。

    reboot_if_required () { #!/bin/bash if [ -e '/etc/debian_version' ]; then if [ -f /var/run/reboot-required ]; then echo "reboot is required" else echo "reboot is not required" fi elif [ -e '/etc/system-release' ] || [ -e '/etc/redhat-release' ]; then export LC_CTYPE=en_US.UTF-8 export LC_ALL=en_US.UTF-8 LATEST_INSTALLED_KERNEL=`rpm -q --last kernel | perl -X -pe 's/^kernel-(\S+).*/$1/' | head -1` CURRENTLY_USED_KERNEL=`uname -r` if [ "${LATEST_INSTALLED_KERNEL}" != "${CURRENTLY_USED_KERNEL}" ];then echo "reboot is required" else echo "reboot is not required" fi fi } reboot_if_required
  4. 如果在 reboot is required 消息中运行 reboot_if_required 结果,请重启 EC2 实例。如果您收到 reboot is not required 消息,则无需重启 EC2 实例。

为什么我的实例中的 EBS 卷不包含任何数据?

运行该脚本时,该脚本会迁移 EBS 卷的配置,从而为您的 OpsWorks 堆栈和层创建替代架构。该脚本不会迁移实际实例或实例中包含的数据。该脚本仅在层级迁移 EBS 卷的配置,并将空的 EBS 卷附加到已启动的 EC2 实例。

按照以下步骤从先前实例的 EBS 卷中提取数据。

  1. 为您的之前的实例 EBS 卷拍摄快照。有关创建快照的更多信息,请参阅《Amazon EC2 用户指南》中的创建 Amazon EBS 快照

  2. 从快照创建卷。有关通过快照创建卷的更多信息,请参阅 Amazon EC2 用户指南中的从快照创建卷

  3. 将您创建的卷附加到实例。有关附加卷的更多信息,请参阅《Amazon EC2 用户指南》中的将 Amazon EBS 卷附加到实例

为什么我的启动模板中描述的 EBS 卷没有挂载?

如果您为带有 EBS 卷的 --launch-template 参数提供启动模板 ID,则该脚本会附加 EBS 卷,但不会挂载卷。您可以通过运行脚本为已启动的 EC2 实例创建的MountEBSVolumes RunCommand 文档来挂载附加的 EBS 卷。

如果您未设置 --launch-template 参数,则脚本会创建一个模板,当自动扩缩组启动新的 EC2 实例时,自动扩缩组会自动附加 EBS 卷,然后运行 SetupAutomation 命令将附加的卷挂载到层设置中配置的挂载点。

我在哪里可以找到 Chef 配方和 Mount EBS 卷日志?

OpsWorks 将日志传送到 S3 存储桶,您可以通过为--command-logs-bucket参数提供值来指定该存储桶。默认S3 存储桶名称的格式为 aws-opsworks-stacks-application-manager-logs-account-id。Chef 配方日志存储在 ApplyChefRecipes 前缀中。挂载 EBS 卷日志存储在 MountEBSVolumes 前缀中。从堆栈迁移的所有层都会将日志传送到同一 S3 存储桶。

注意
  • S3 存储桶的生命周期配置包括一条在 30 天后删除日志的规则。如果您想保存日志超过 30 天,则必须更新 S3 存储桶生命周期配置中的规则。

  • 目前, OpsWorks 仅记录厨师setupterminate食谱。

在哪里可以找到迁移脚本的调试日志?

该脚本将调试日志放在名为 aws-opsworks-stacks-transition-logs-account-id 的存储桶中。您可以在 S3 存储桶的 migration_script 文件夹中找到与您迁移的层名称相匹配的文件夹下的调试日志。

迁移脚本是否支持 CloudFormation 模板版本控制?

该脚本生成类型的 Systems Manager 文档 CloudFormation ,用于替换要迁移的图层或堆栈。即使使用相同的参数,再次运行脚本也会导出先前导出的层模板的新版本。模板版本与脚本日志存储在同一 S3 存储桶中。

我可以迁移多个图层吗?

脚本的 --layer-id 参数在单个层中传递。要迁移多个图层,请重新运行脚本并在不同的 --layer-id 传递。

在应用程序管理器中,属于同一 OpsWorks 堆栈的图层列在同一个应用程序下。

  1. 通过 https://console.aws.amazon.com/systems-manager/ 打开 Systems Manager 控制台。

  2. 在导航窗格中,选择 Application Manager

  3. 应用程序一节中,选择自定义应用程序

  4. 选择您的应用程序。应用程序名称以 app-stack-name-first-six-characters-stack-id 开头。

  5. 以 app 开头的顶级元素显示了与您的 OpsWorks 堆栈对应的所有组件。这包括与您的 OpsWorks 图层对应的组件。

  6. 选择与该层对应的组件以查看该层的资源。在 “自定义应用程序” 部分中,代表 OpsWorks 图层的组件也可作为单个应用程序查看。

我该如何创建 SecureString 参数?

您可以使用 Systems Manager 来创建 SecureString 参数。有关如何创建 System SecureString s Manager 参数的更多信息,请参阅《AWS Systems Manager 用户指南》中的创建 SecureString 参数 (AWS CLI) 或创建 Systems Manager 参数(控制台)。

必须提供一个 SecureString 参数作为 --http-username--http-password、或 --repo-private-key 参数的值。

如何保护新自动扩缩组中的实例免受终止事件的影响?

您可以通过将 --enable-instance-protection 参数设置为 TRUE 并向要保护的每个 EC2 实例添加 protected_instance 标签密钥来保护实例,使其免受终止事件的影响。当您将 --enable-instance-protection 参数设置为 TRUE 并添加 protected_instance 标签密钥时,脚本会将自定义终止策略添加到您的新自动扩缩组并暂停 ReplaceUnhealthy 进程。使用 protected_instance 标签密钥的实例受到保护,免受以下终止事件的影响:

  • 横向缩减事件

  • 实例刷新

  • 再平衡

  • 实例最大生命周期

  • 允许列出实例终止

  • 终止和替换运行状况不佳的实例

注意

您必须在要保护的实例上设置 protected_instance 标签密钥。此标签密钥区分大小写。无论标签值如何,任何具有该标签密钥的实例都将受到保护。

要缩短自定义终止策略的运行时间,您可以通过更新 default_sample_size 函数代码变量的值来增加 Lambda 函数用于筛选受保护实例的默认实例数。默认值为 15。如果您增加 default_sample_size,则可能需要增加分配给 Lambda 函数的内存,这将增加 Lambda 函数的成本。有关 AWS Lambda 定价的信息,请参阅 AWS Lambda 定价

迁移脚本有哪些负载均衡器可用?

该脚本提供了三个负载均衡器选项。

  • (推荐)创建新的 Application Load Balancer。默认情况下,该脚本会创建一个新的 Application Load Balancer。您也可以将 --lb-type 参数设置为 ALB。有关应用程序负载均衡器的更多信息,请参阅《Elastic Load Balancing 用户指南》中的什么是应用程序负载均衡器?

  • 如果无法选择 Application Load Balancer,请通过将 --lb-type 参数设置为来创建 Classic Load BalancerClassic。如果您选择此选项,则连接到您的 OpsWorks层的现有 Classic Load Balancer 将与您的应用程序分开。有关应用程序负载均衡器的更多信息,请参阅《Elastic Load Balancing:经典负载均衡器用户指南》中的什么是经典负载均衡器?

  • 您可以通过将 --lb-type 参数设置为 None 来连接现有的负载均衡器。

    重要

    我们建议为您的 AWS OpsWorks Stacks 层创建新的 Elastic Load Balancing 负载均衡器。如果您选择使用现有的 Elastic Load Balancing 负载均衡器,应先确认它当前未用于其他用途并且没有挂载实例。将负载均衡器连接到层后, OpsWorks 移除所有现有实例,并将负载均衡器配置为仅处理该层的实例。从技术上来说,在将某个负载均衡器挂载到层之后使用 Elastic Load Balancing 控制台或 API 来修改它的配置尽管是可行的,但您不应如此操作;更改将不会是永久的。

将现有 OpsWorks 层负载均衡器连接到 Auto Scaling 群组

  1. --lb-type 参数设置为 None,运行迁移脚本。当该值设置为 None 时,脚本不会克隆或创建负载均衡器。

  2. 脚本部署 CloudFormation 堆栈后,更新 Auto Scaling 组MinMaxDesired capacity值,然后测试您的应用程序。

  3. 选择 Link to the template 显示在脚本输出中。如果您关闭了终端,请按照以下步骤访问模板。

    1. 通过 https://console.aws.amazon.com/systems-manager/ 打开 Systems Manager 控制台。

    2. 在导航窗格中,选择 Application Manager

    3. 选择CloudFormation 堆栈,然后选择模板库

    4. 选择我拥有并找到您的模板。

  4. 在 CloudFormation 模板中,从 “操作” 菜单中选择 “编辑”。

  5. 在 CloudFormation模板的ApplicationAsg资源部分中更新该LabelBalancerNames属性。

    ApplicationAsg: DependsOn: CustomTerminationLambdaPermission Properties: #(other properties in ApplicationAsg to remain unchanged) LoadBalancerNames: - load-balancer-name HealthCheckType: ELB
  6. 如果您希望自动扩缩组实例的运行状况检查也使用负载均衡器的运行状况检查,请删除 HealthCheckType 下的一节并输入 ELB。如果您只需要 EC2 运行状况检查,则无需更改模板。

  7. 保存您的更改。保存会创建模板的新默认版本。如果这是您第一次运行层的脚本,也是您第一次在控制台中保存更改,则较新的版本是 2。

  8. 操作中,选择预配置堆栈

  9. 确认您要使用模板的默认版本。确保选中 “选择现有堆栈”,然后选择要更新的 CloudFormation 堆栈。

  10. 在接下来的每个页面中选择下一步,直到看到审查和预配置页面。在 “查看和配置” 页面上,选择我确认 AWS CloudFormation 可能会使用自定义名称创建 IAM 资源,并且我知道所选模板中的更改可能会 AWS CloudFormation 导致更新或删除现有 AWS 资源。

  11. 选择配置堆栈

如果您需要回滚更新,请执行以下步骤。

  1. 选择操作,然后选择预置堆栈

  2. 选择选择现有版本之一,然后选择以前的模板版本。

  3. 选择 “选择现有堆栈”,然后选择要更新的 CloudFormation 堆栈。

自定义说明书配置配方是否已迁移?

不支持在设置事件期间运行配置自定义配方。该脚本迁移自定义说明书配置配方,并为您创建 Systems Manager Automation 运行手册。但是,您必须手动运行配方。

请执行以下步骤来运行配置配方。

  1. 通过 https://console.aws.amazon.com/systems-manager/ 打开 Systems Manager 控制台。

  2. 在导航窗格中,选择 Application Manager

  3. 应用程序一节中,选择自定义应用程序

  4. 选择您的应用程序。应用程序名称以 app-stack-name 开头。

  5. 选择资源,然后选择配置运行手册。

  6. 选择执行自动化

  7. 选择要为其运行配置配方的实例 ID,然后选择执行

我能否在新创建的实例上运行部署和取消部署配方?

根据层的配置,该脚本可以创建三个可能的自动化运行手册。

  • 设置

  • 配置

  • 终止

该脚本还可以创建以下 Systems Manager 参数,这些参数包含 AWS-ApplyChefRecipes Run Command 文档的输入值。

  • 设置

  • 部署

  • 配置

  • Undeploy

  • 终止

当发生横向扩展事件时,安装程序自动化运行手册会自动运行。这包括设置和部署原始 OpsWorks 图层中的自定义食谱食谱。当发生横向缩减事件时,安装程序自动化运行手册会自动运行。终止自动化运行手册包含原始 OpsWorks 图层中的关闭方法。

如果要手动运行取消部署或配置配方,请执行以下步骤。

  1. 通过 https://console.aws.amazon.com/systems-manager/ 打开 Systems Manager 控制台。

  2. 在导航窗格中,选择 Application Manager

  3. 应用程序一节中,选择自定义应用程序

  4. 选择您的应用程序。应用程序名称以 app-stack-name-first-six-characters-stack-id 开头。Application Manager 打开概述选项卡。

  5. 选择资源,然后选择配置自动化运行手册。

  6. 选择执行自动化

  7. 有关 applyChefRecipesPropertiesParameter 自动运行手册输入参数,请引用正确的 Systems Manager 参数。Systems Manager 参数名称遵循格式 /ApplyChefRecipes-Preset/OpsWorks-stack-name-OpsWorks-layer-name-first-six-characters-stack-id/event,其中 event 的值为ConfigureDeploy、或Undeploy,具体取决于您要运行的配方。

  8. 选择要为其运行配方的实例 ID,然后选择执行

我能否更改自动扩缩组跨越的子网?

默认情况下,Auto Scaling 组跨越您的堆栈 OpsWorks VPC 中的所有子网。要更新要跨越的子网,请执行以下步骤。

  1. 选择 Link to the template 显示在脚本输出中。如果您关闭了终端,请按照以下步骤访问模板。

    1. 通过 https://console.aws.amazon.com/systems-manager/ 打开 Systems Manager 控制台。

    2. 在导航窗格中,选择 Application Manager

    3. 选择CloudFormation 堆栈,然后选择模板库

    4. 选择我拥有并找到您的模板。

  2. 操作中,选择预配置堆栈

  3. 确认您要使用默认模板。选择 “选择现有堆栈”,然后选择要更新的 CloudFormation 堆栈。

    注意

    如果在--provision-application参数设置为的情况下运行脚本FALSE,则必须创建一个新 CloudFormation 堆栈。

  4. 对于 SubnetIDs 参数,请提供您希望自动扩缩组跨越的子网 ID 列表,以逗号分隔。

  5. 选择下一步,直到看到审查和配置页面。

  6. 在 “查看和配置” 页面上,选择 “我确认 AWS CloudFormation 可能会使用自定义名称创建 IAM 资源”,并且我知道所选模板中的更改可能会 AWS CloudFormation 导致更新或删除现有 AWS 资源

  7. 选择配置堆栈