

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

# 常见问题解答
<a name="migrating-to-systems-manager-faqs"></a>

以下内容 FAQs 提供了一些常见问题的答案。

**Topics**
+ [我可以迁移哪些 AWS OpsWorks Stacks 版本？](#w2ab1c14c43c19b7)
+ [我的迁移实例可以使用哪些 Chef 版本？](#w2ab1c14c43c19b9)
+ [我可以迁移哪些存储库类型？](#w2ab1c14c43c19c11)
+ [我可以继续使用私有 Git 存储库吗？](#w2ab1c14c43c19c13)
+ [我可以使用哪些 SSH 密钥来访问我的实例？](#w2ab1c14c43c19c15)
+ [为什么我的实例会自动扩展和缩减？](#w2ab1c14c43c19c17)
+ [我可以关闭自动扩缩吗？](#w2ab1c14c43c19c19)
+ [我能否对已启动的 EC2实例执行内核和软件包更新？](#w2ab1c14c43c19c21)
+ [为什么我的实例中的 EBS 卷不包含任何数据？](#w2ab1c14c43c19c23)
+ [为什么我的启动模板中描述的 EBS 卷没有挂载？](#w2ab1c14c43c19c25)
+ [我在哪里可以找到 Chef 配方和 Mount EBS 卷日志？](#w2ab1c14c43c19c27)
+ [在哪里可以找到迁移脚本的调试日志？](#w2ab1c14c43c19c29)
+ [迁移脚本是否支持 CloudFormation 模板版本控制？](#w2ab1c14c43c19c31)
+ [我可以迁移多个图层吗？](#w2ab1c14c43c19c33)
+ [我该如何创建 `SecureString` 参数？](#w2ab1c14c43c19c35)
+ [如何保护新自动扩缩组中的实例免受终止事件的影响？](#w2ab1c14c43c19c37)
+ [迁移脚本有哪些负载均衡器可用？](#w2ab1c14c43c19c39)
+ [自定义说明书配置配方是否已迁移？](#w2ab1c14c43c19c41)
+ [我能否在新创建的实例上运行部署和取消部署配方？](#w2ab1c14c43c19c43)
+ [我能否更改自动扩缩组跨越的子网？](#w2ab1c14c43c19c45)

## 我可以迁移哪些 AWS OpsWorks Stacks 版本？
<a name="w2ab1c14c43c19b7"></a>

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

## 我的迁移实例可以使用哪些 Chef 版本？
<a name="w2ab1c14c43c19b9"></a>

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

**注意**  
不支持 Windows 堆栈迁移。

## 我可以迁移哪些存储库类型？
<a name="w2ab1c14c43c19c11"></a>

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

## 我可以继续使用私有 Git 存储库吗？
<a name="w2ab1c14c43c19c13"></a>

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

如果您使用私有 GitHub 存储库，则必须为 SSH 创建新的`Ed25519`主机密钥。这是因为 GitHub 更改了 SSH 中支持的密钥并删除了未加密的 Git 协议。有关`Ed25519`主机密钥的更多信息，请参阅 GitHub 博客文章 “[改进 Git 协议安全” GitHub](https://github.blog/2021-09-01-improving-git-protocol-security-github/)。生成新的 `Ed25519` 主机密钥后，为此 SSH 密钥创建一个 Systems Manager `SecureString` 参数，并使用参数名称作为 `--repo-private-key` 参数的值。有关如何创建 System `SecureString` s Manager 参数的更多信息，请参阅*《AWS Systems Manager 用户指南*》中的[创建 SecureString 参数 (AWS CLI)](https://docs.aws.amazon.com/systems-manager/latest/userguide/param-create-cli.html#param-create-cli-securestring)。

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

## 我可以使用哪些 SSH 密钥来访问我的实例？
<a name="w2ab1c14c43c19c15"></a>

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

## 为什么我的实例会自动扩展和缩减？
<a name="w2ab1c14c43c19c17"></a>

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

## 我可以关闭自动扩缩吗？
<a name="w2ab1c14c43c19c19"></a>

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

## 我能否对已启动的 EC2实例执行内核和软件包更新？
<a name="w2ab1c14c43c19c21"></a>

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

1.  Connect 连接到您的 EC2 实例。

1.  创建以下 `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
   ```

1.  内核和软件包更新后，您可能需要重启 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
   ```

1.  如果运行`reboot_if_required`结果`reboot is required`显示一条消息，请重启实 EC2 例。如果您收到一条`reboot is not required`消息，则无需重启实 EC2 例。

## 为什么我的实例中的 EBS 卷不包含任何数据？
<a name="w2ab1c14c43c19c23"></a>

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

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

1. 为您的之前的实例 EBS 卷拍摄快照。有关创建快照的更多信息，请参阅[亚马逊* EC2 用户指南中的创建 Amazon* EBS 快照](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html)。

1. 从快照创建卷。有关使用快照创建卷的更多信息，请参阅 *Amazon EC2 用户指南*中的[从快照创建卷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-volume.html#ebs-create-volume-from-snapshot)。

1. 将您创建的卷附加到实例。有关连接卷的更多信息，请参阅亚马逊* EC2 用户*指南中的[将 Amazon EBS 卷附加到实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-attaching-volume.html)。

## 为什么我的启动模板中描述的 EBS 卷没有挂载？
<a name="w2ab1c14c43c19c25"></a>

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

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

## 我在哪里可以找到 Chef 配方和 Mount EBS 卷日志？
<a name="w2ab1c14c43c19c27"></a>

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

**注意**  
S3 存储桶的生命周期配置包括一条在 30 天后删除日志的规则。如果您想保存日志超过 30 天，则必须更新 S3 存储桶生命周期配置中的规则。
目前， OpsWorks 仅记录厨师`setup`和`terminate`食谱。

## 在哪里可以找到迁移脚本的调试日志？
<a name="w2ab1c14c43c19c29"></a>

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

## 迁移脚本是否支持 CloudFormation 模板版本控制？
<a name="w2ab1c14c43c19c31"></a>

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

## 我可以迁移多个图层吗？
<a name="w2ab1c14c43c19c33"></a>

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

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

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

1. 在导航窗格中，选择 **Application Manager**。

1.  在**应用程序**一节中，选择**自定义应用程序**。

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

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

1.  选择与该层对应的组件以查看该层的资源。代表 OpsWorks 图层的组件也可以作为单个应用程序从**自定义应用程序**部分看到。

## 我该如何创建 `SecureString` 参数？
<a name="w2ab1c14c43c19c35"></a>

您可以使用 Systems Manager 来创建 `SecureString` 参数。有关如何创建 System `SecureString` s Manager 参数的更多信息，请参阅《*AWS Systems Manager 用户指南》*中的[创建[ SecureString 参数 (AWS CLI)](https://docs.aws.amazon.com/systems-manager/latest/userguide/param-create-cli.html#param-create-cli-securestring) 或创建 Systems Manager 参数（控制台）](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-create-console.html)。

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

## 如何保护新自动扩缩组中的实例免受终止事件的影响？
<a name="w2ab1c14c43c19c37"></a>

您可以通过将`--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 定价](https://aws.amazon.com/)。

## 迁移脚本有哪些负载均衡器可用？
<a name="w2ab1c14c43c19c39"></a>

该脚本提供了三个负载均衡器选项。
+  （推荐）创建新的 Application Load Balancer。默认情况下，该脚本会创建一个新的 Application Load Balancer。您也可以将 `--lb-type` 参数设置为 `ALB`。有关应用程序负载均衡器的更多信息，请参阅《*Elastic Load Balancing 用户指南*》中的[什么是应用程序负载均衡器？](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)。
+  如果无法选择 Application Load Balancer，请通过将 `--lb-type` 参数设置为来创建 Classic Load Balancer`Classic`。如果您选择此选项，则连接到您的 OpsWorks层的现有 Classic Load Balancer 将与您的应用程序分开。有关应用程序负载均衡器的更多信息，请参阅《*Elastic Load Balancing：经典负载均衡器用户指南*》中的[什么是经典负载均衡器？](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/introduction.html)。
+  您可以通过将 `--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` 时，脚本不会克隆或创建负载均衡器。

1. 脚本部署 CloudFormation 堆栈后，更新 Auto Scaling 组`Min``Max`和`Desired capacity`值，然后测试您的应用程序。

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

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

   1. 在导航窗格中，选择 **Application Manager**。

   1. 选择**CloudFormation 堆栈**，然后选择**模板库**。

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

1. 在 CloudFormation 模板中，从 “**操作**” 菜单中选择 “**编辑**”。

1. 更新 CloudFormation模板`ApplicationAsg`资源部分中的`LabelBalancerNames`属性。

   ```
   ApplicationAsg:
      DependsOn: CustomTerminationLambdaPermission
      Properties:
      #(other properties in ApplicationAsg to remain unchanged)
         LoadBalancerNames:
           - load-balancer-name 
         HealthCheckType: ELB
   ```

1. 如果您希望自动扩缩组实例的运行状况检查也使用负载均衡器的运行状况检查，请删除 `HealthCheckType` 下的一节并输入 `ELB`。如果您只需要运行 EC2 状况检查，则无需更改模板。

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

1. 从**操作**中，选择**预配置堆栈**。

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

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

1. 选择**配置堆栈**。

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

1. 选择**操作**，然后选择**预置堆栈**。

1. 选择**选择现有版本之一**，然后选择以前的模板版本。

1. 选择 **“选择现有堆栈**”，然后选择要更新的 CloudFormation 堆栈。

## 自定义说明书配置配方是否已迁移？
<a name="w2ab1c14c43c19c41"></a>

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

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

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

1. 在导航窗格中，选择 **Application Manager**。

1.  在**应用程序**一节中，选择**自定义应用程序**。

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

1.  选择**资源**，然后选择配置运行手册。 ****

1. 选择**执行自动化**。

1.  选择要 IDs 为其运行配置配方的实例，然后选择**执行**。

## 我能否在新创建的实例上运行部署和取消部署配方？
<a name="w2ab1c14c43c19c43"></a>

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

该脚本还可以创建以下 Systems Manager 参数，这些参数包含 `AWS-ApplyChefRecipes Run Command` 文档的输入值。
+  设置 
+  部署 
+  配置 
+  Undeploy 
+  终止 

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

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

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

1. 在导航窗格中，选择 **Application Manager**。

1.  在**应用程序**一节中，选择**自定义应用程序**。

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

1.  选择**资源**，然后选择配置自动化运行手册。

1. 选择**执行自动化**。

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

1. 选择要 IDs 在其中运行配方的实例，然后选择 “**执行**”。

## 我能否更改自动扩缩组跨越的子网？
<a name="w2ab1c14c43c19c45"></a>

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

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

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

   1. 在导航窗格中，选择 **Application Manager**。

   1. 选择**CloudFormation 堆栈**，然后选择**模板库**。

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

1.  从**操作**中，选择**预配置堆栈**。

1.  确认您要使用默认模板。选择 **“选择现有堆栈**”，然后选择要更新的 CloudFormation 堆栈。
**注意**  
 如果在`--provision-application`参数设置为的情况下运行脚本`FALSE`，则必须创建一个新 CloudFormation 堆栈。

1.  对于`SubnetIDs`参数，请提供您希望 Auto Scaling 组跨越 IDs 的子网的列表，以逗号分隔。

1.  选择**下一步**，直到看到**审查和配置**页面。

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

1.  选择**配置堆栈**。