

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

# 使用自定义 AMIs
<a name="workinginstances-custom-ami"></a>

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

OpsWorks Stacks 支持两种自定义实例的方式：自定义 [Amazon 机器映像 (AMIs)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) 和 Chef 食谱。这两种方法都可以让您对安装哪个软件包和软件包版本、如何配置等进行控制。但是，每种方法都有不同优势，因此哪种方法最佳取决于您的要求。

以下是考虑使用自定义 AMI 的主要理由：
+ 您希望预捆绑特定软件包，而不是在实例启动之后安装它们。
+ 您想要控制软件包更新的时间，以便为您的层提供一致的基本映像。
+ 您希望实例 (特别是[基于负载的](workinginstances-autoscaling.md)实例) 尽快启动。

以下是考虑使用 Chef 配方的主要理由：
+ 它们比定制更灵活 AMIs。
+ 更容易更新。
+ 它们可以对正在运行的实例执行更新。

 实际上，最佳的解决方案可能是这两种方法的结合。有关配方的更多信息，请参阅[说明书和诀窍](workingcookbook.md)。

**Topics**
+ [“自定义” AMIs 如何使用 OpsWorks 堆栈](#workinginstances-custom-ami-work)
+ [为 OpsWorks 堆栈创建自定义 AMI](#workinginstances-custom-ami-create)

## “自定义” AMIs 如何使用 OpsWorks 堆栈
<a name="workinginstances-custom-ami-work"></a>

要为您的实例指定自定义 AMI，请在创建新实例时选择**使用自定义 AMI** 作为实例的操作系统。 OpsWorks 然后，堆栈会显示堆栈区域 AMIs 中的自定义列表，您可以从列表中选择相应的堆栈。有关更多信息，请参阅 [将实例添加到层](workinginstances-add.md)。

**注意**  
您不能将特定自定义 AMI 指定为堆栈的默认操作系统。您可以将 `Use custom AMI` 设置为堆栈的默认操作系统，但只有在向层中添加新实例时才可以指定特定 AMI。有关更多信息，请参阅[将实例添加到层](workinginstances-add.md)和[创建新堆栈](workingstacks-creating.md)。虽然有可能使用其他操作系统（例如CentOS 6）创建实例。 *x*) 由自定义或社区生成的 AMIs，官方不支持这些内容。

此主题将讨论在创建或使用自定义 AMI 之前应考虑的一些一般问题。

**Topics**
+ [启动行为](#workinginstances-custom-ami-work-startup)
+ [选择层](#workinginstances-custom-ami-work-layer)
+ [处理应用程序](#workinginstances-custom-ami-work-apps)

### 启动行为
<a name="workinginstances-custom-ami-work-startup"></a>

当您启动实例时， OpsWorks Stacks 会使用指定的自定义 AMI 启动新的亚马逊 EC2 实例。 OpsWorks 然后，堆栈使用 c [loud-init](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonLinuxAMIBasics.html#included-aws-command-line-tools) 在实例上安装 OpsWorks 堆栈代理，然后代理运行实例的安装配方，然后运行部署配方。实例处于在线状态后，代理会为堆栈中的每个实例 (包括新添加的实例) 运行 Configure 配方。

### 选择层
<a name="workinginstances-custom-ami-work-layer"></a>

 OpsWorks Stacks 代理通常不会与已安装的软件包发生冲突。但是，该实例必须是至少一个层的成员。 OpsWorks Stacks 总是运行该层的配方，这可能会导致问题。您应准确了解在使用自定义 AMI 向层添加实例之前，该层的配方对实例要执行的操作。

要查看特定层类型在您的实例上运行哪些配方，请打开包含该层的堆栈。然后在导航窗格中单击 **Layers**，再单击所关注层的 **Recipes**。要查看实际代码，请单击配方名称。

**注意**  
对于 Linux AMIs，减少冲突可能性的一种方法是使用 OpsWorks 堆栈来配置和配置作为自定义 AMI 基础的实例。有关更多信息，请参阅 [从 OpsWorks 堆栈实例创建自定义 Linux AMI](#workinginstances-custom-ami-create-opsworks)。

### 处理应用程序
<a name="workinginstances-custom-ami-work-apps"></a>

除了软件包，您也可能想在 AMI 中包含一个应用程序。如果您有大型复杂应用程序，在 AMI 中包含该应用程序可以缩短实例的启动时间。您可以在 AMI 中加入小型应用程序，但是与让 OpsWorks Stacks 部署应用程序相比，时间优势通常很小或根本没有。

一个选择是在您的 AMI 中包含应用程序并[创建一个应用程序](workingapps-creating.md)，该应用程序从存储库向实例部署应用程序。这种方法不但可以缩短启动时间，而且能够在运行实例后提供一种更新应用程序的便捷方法。请注意，Chef 配方是幂等的，因此只要存储库中的版本与实例上的版本相同，部署配方就不会修改应用程序。

## 为 OpsWorks 堆栈创建自定义 AMI
<a name="workinginstances-custom-ami-create"></a>

要将自定义 AMI 与 OpsWorks 堆栈配合使用，必须先从自定义实例创建 AMI。可从两个选项中选择：
+ 使用 Amazon EC2 控制台或 API 基于其中一个[OpsWorks 堆栈 AMIs](workinginstances-os.md)支持的 64 位版本创建和自定义实例。
+ 对于 Linux AMIs，使用 OpsWorks 基于其关联层的配置创建亚马逊 EC2 实例。

在创建自定义 Linux AMI 之前，请在`/tmp`分区`noexec`上禁用以允许 OpsWorks Stacks 在自定义 Linux 实例上安装其代理。

**注意**  
请注意，AMI 可能不适用于部分实例类型，因此请确保您启动的 AMI 与计划使用的实例类型兼容。具体而言，[R3](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/r3-instances.html) 实例类型需要硬件辅助虚拟化 (HVM) AMI。

然后，您可以使用 Amazon EC2 控制台或 API 从自定义实例创建自定义 AMI。通过向层添加实例并指定您的自定义 AMIs AMI，您可以在同一区域的任何堆栈中使用您的自定义。有关如何使用自定义 AMI 创建实例的更多信息，请参阅 [将实例添加到层](workinginstances-add.md)。

**注意**  
默认情况下， OpsWorks Stacks 会在启动时安装所有 Amazon Linux 更新，从而为您提供最新版本。此外，Amazon Linux 大约每六个月发布一个新版本，其中可能涉及重大更改。默认情况下， AMIs 基于 Amazon Linux 的自定义版本在新版本发布时会自动更新到新版本。建议的做法是，将您的自定义 AMI 锁定到特定的 Amazon Linux 版本，这样，您就可以推迟更新，直到您对新版本进行了测试。有关更多信息，请参阅[如何将我的 AMI 保持在特定版本？](https://aws.amazon.com/amazon-linux-ami/faqs/#lock)

**Topics**
+ [使用亚马逊创建自定义 AMI EC2](#workinginstances-custom-ami-create-ec2)
+ [从 OpsWorks 堆栈实例创建自定义 Linux AMI](#workinginstances-custom-ami-create-opsworks)
+ [创建自定义 Windows AMI](#w2ab1c14c55c15c13c21c20)

### 使用亚马逊创建自定义 AMI EC2
<a name="workinginstances-custom-ami-create-ec2"></a>

创建自定义 AMI 的最简单方法（也是 Windows 的唯一选择 AMIs）是使用亚马逊 EC2 控制台或 API 执行整个任务。有关以下步骤的更多详细信息，请参阅[创建自己的](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami.html)步骤 AMIs。

**使用亚马逊 EC2 控制台或 API 创建自定义 AMI**

1. 使用[OpsWorks 堆栈 AMIs](workinginstances-os.md)支持的 64 位版本创建实例。

1. 通过配置实例、安装程序包等自定义步骤 1 的实例。请记住，将根据 AMI 在每个实例上复制您安装的所有内容，因此请勿包括应特定于特定实例的项目。

1. 停止实例并创建自定义 AMI。

### 从 OpsWorks 堆栈实例创建自定义 Linux AMI
<a name="workinginstances-custom-ami-create-opsworks"></a>

要使用自定义 OpsWorks Stacks Linux 实例创建 AMI，请注意，创建的每个亚马逊 EC2 实例都 OpsWorks 包含一个唯一身份。如果您通过此类实例创建自定义 AMI，它将包含该身份并且基于 AMI 的所有实例都将具有相同的身份。为了确保基于您的自定义 AMI 的实例具有唯一的身份，必须在创建 AMI 之前先删除自定义实例中的身份。

**从 OpsWorks Stacks 实例创建自定义 AMI**

1. [创建 Linux 堆栈](workingstacks-creating.md)并[添加一个或多个层](workinglayers-basics-create.md)以定义自定义实例的配置。您可以使用内置层、根据需要自定义，以及完全自定义层。有关更多信息，请参阅 [自定义堆栈 OpsWorks](customizing.md)。

1. [编辑图层](workinglayers-basics-edit.md)并禁用 AutoHealing。

1. [利用首选 Linux 发行版向层中添加实例](workinginstances-add.md)并[启动它](workinginstances-starting.md)。我们建议使用 Amazon EBS 支持的实例。打开实例的详细信息页面并记录其 Amazon EC2 ID 以备日后使用。

1. 当实例处于联机状态时，[使用 SSH 登录](workinginstances-ssh.md)，然后执行接下来的四个步骤之一，具体取决于您的实例操作系统。

1. 对于 Chef 11 或 Chef 12 堆栈中的 Amazon Linux 实例或者 Chef 11 堆栈中的 Red Hat Enterprise Linux 7 实例，请执行以下操作。

   1. `sudo /etc/init.d/monit stop`

   1. `sudo /etc/init.d/opsworks-agent stop`

   1. `sudo rm -rf /etc/aws/opsworks/ /opt/aws/opsworks/ /var/log/aws/opsworks/ /var/lib/aws/opsworks/ /etc/monit.d/opsworks-agent.monitrc /etc/monit/conf.d/opsworks-agent.monitrc /var/lib/cloud/ /etc/chef`
**注意**  
对于 Chef 12 堆栈中的实例，请将以下两个文件夹添加到此命令中：  
`/var/chef`
`/opt/chef`

   1. `sudo rpm -e opsworks-agent-ruby`

   1. `sudo rpm -e chef`

1. 对于 Chef 12 堆栈中的 Ubuntu 16.04 LTS 或 18.04 LTS 实例，请执行以下操作。

   1. `sudo systemctl stop opsworks-agent`

   1. `sudo rm -rf /etc/aws/opsworks/ /opt/aws/opsworks/ /var/log/aws/opsworks/ /var/lib/aws/opsworks/ /etc/monit.d/opsworks-agent.monitrc /etc/monit/conf.d/opsworks-agent.monitrc /var/lib/cloud/ /var/chef /opt/chef /etc/chef`

   1. `sudo apt-get -y remove chef`

   1. `sudo dpkg -r opsworks-agent-ruby`

   1. `systemctl stop apt-daily.timer`

   1. `systemctl stop apt-daily-upgrade.timer`

   1. `rm /var/lib/systemd/timers/stamp-apt-daily.timer`

   1. `rm /var/lib/systemd/timers/stamp-apt-daily-upgrade.timer`

1. 对于 Chef 12 堆栈中受支持的其他 Ubuntu 版本，请执行以下操作。

   1. `sudo /etc/init.d/monit stop`

   1. `sudo /etc/init.d/opsworks-agent stop`

   1. `sudo rm -rf /etc/aws/opsworks/ /opt/aws/opsworks/ /var/log/aws/opsworks/ /var/lib/aws/opsworks/ /etc/monit.d/opsworks-agent.monitrc /etc/monit/conf.d/opsworks-agent.monitrc /var/lib/cloud/ /var/chef /opt/chef /etc/chef`

   1. `sudo apt-get -y remove chef`

   1. `sudo dpkg -r opsworks-agent-ruby`

1. 对于 Chef 12 堆栈中的 Red Hat Enterprise Linux 7 实例，请执行以下操作。

   1. `sudo systemctl stop opsworks-agent`

   1. `sudo rm -rf /etc/aws/opsworks/ /opt/aws/opsworks/ /var/log/aws/opsworks/ /var/lib/aws/opsworks/ /etc/monit.d/opsworks-agent.monitrc /etc/monit/conf.d/opsworks-agent.monitrc /var/lib/cloud/ /etc/chef /var/chef`

   1. `sudo rpm -e opsworks-agent-ruby`

   1. `sudo rpm -e chef`

1. 此步骤取决于实例类型：
   + 对于由亚马逊 EBS 支持的实例，请使用 OpsWorks Stacks 控制台[停止该实例](workinginstances-starting.md)并创建 AMI，如创建由[亚马逊 EBS 提供支持的 L](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html) inux AMI 中所述。
   + 对于由实例存储支持的实例，请按照创建实例[存储支持的 Linux AMI 中所述创建 AMI，然后使用堆栈控制台停止 OpsWorks 该实](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-instance-store.html)例。

     当您创建 AMI 时，请确保包含证书文件。例如，您可以调用 [https://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/CLTRG-ami-bundle-vol.html](https://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/CLTRG-ami-bundle-vol.html) 命令（将 `-i` 参数设置为 `-i $(find /etc /usr /opt -name '*.pem' -o -name '*.crt' -o -name '*.gpg' | tr '\n' ',')`）。请勿在绑定时删除 apt 公有密钥。默认 `ec2-bundle-vol` 命令处理此任务。

1. 返回堆栈控制台并从 OpsWorks 堆栈中[删除实例，](workinginstances-delete.md)清理堆栈。

### 创建自定义 Windows AMI
<a name="w2ab1c14c55c15c13c21c20"></a>

以下过程 AMIs 为 Windows Server 2022 Base 创建了自定义版本。您可以在亚马逊 EC2 管理控制台中选择其他 Windows 服务器操作系统。

**重要**  
**目前，无法在 OpsWorks 使用非英语-美国 (en-US) 的系统界面语言的基于 Windows 的实例上安装 OpsWorks Stacks 代理，Stacks 也无法管理。**

**Topics**
+ [使用 `Sysprep` 创建自定义 Windows AMI](#w2ab1c14c55c15c13c21c20b9)
+ [不使用 `Sysprep` 创建自定义 Windows AMI](#w2ab1c14c55c15c13c21c20c11)
+ [使用自定义 Windows AMI 添加新实例](#w2ab1c14c55c15c13c21c20c13)

#### 使用 `Sysprep` 创建自定义 Windows AMI
<a name="w2ab1c14c55c15c13c21c20b9"></a>

使用 Sysprep 创建自定义 Windows AMIs 通常会导致实例启动速度变慢，但过程更简洁。由于`Sysprep`活动、重启、堆栈配置和第一次 OpsWorks OpsWorks 堆栈运行（包括设置和配置），首次启动使用创建的映像创建的实例会`Sysprep`花费更多时间。完成在亚马逊 EC2控制台中创建自定义 Windows AMI 的步骤。

**使用 Sysprep 创建自定义 Windows AMI**

1. 在 Amazon EC2 控制台中，选择**启动实例**。

1. 查找 **Microsoft Windows Server 2022 Base**，然后选择**选择**。

1. 选择您需要的实例类型，然后选择 **Configure Instance Details**。对 AMI 进行配置更改，包括机器名称、存储和安全组设置。选择**启动**。

1. 实例启动过程完成后，获取密码，然后连接到 Windows **Remote Desktop Connection** 窗口中的实例。

1. 在 Windows 的 “**开始**” 屏幕上，选择 “**开始**”，然后开始键入，**ec2configservice**直到结果显示**EC2ConfigServiceSettings**控制台。打开 控制台。

1. 在 “**常规**” 选项卡上，确保选中 “**启用 UserData 执行**” 复选框（尽管此选项不是必需的`Sysprep`，但 OpsWorks Stacks 需要安装其代理）。清除 **Set the computer name of the instance... (设置实例的计算机名称...)** 选项对应的复选框，因为此选项可导致 OpsWorks Stacks 重新启动循环。

1. 在 “**图像**” 选项卡上，将 “**管理员密码**” 设置为 “**随机**” EC2 以允许 Amazon 自动生成您可以使用 SSH 密钥检索的密码，或者将 “指定” 设置为**指定**您自己的密码。 `Sysprep`保存此设置。如果您指定自己的密码，请将密码保存在方便的位置。建议您不要选择 **Keep Existing**。

1. 选择 **Apply**，然后选择 **Shutdown with Sysprep**。如果提示确认，请选择 **Yes**。

1. 实例停止后，在 Amazon EC2 控制台中，右键单击 “实例” 列表中的**实例**，选择 “**映像**”，然后选择 “**创建映像**”。

1. 在 **Create Image** 页面中，提供映像的名称和描述，并指定卷配置。完成后，选择 **Create Image**。

1. 打开 **Images** 页面，等待映像从 **pending** 阶段变为 **available**。新的 AMI 已准备就绪，可供使用。

#### 不使用 `Sysprep` 创建自定义 Windows AMI
<a name="w2ab1c14c55c15c13c21c20c11"></a>

完成在亚马逊 EC2 控制台中创建自定义 Windows AMI 的步骤。

**不使用 Sysprep 创建自定义 Windows AMI**

1. 在 Amazon EC2 控制台中，选择**启动实例**。

1. 查找 **Microsoft Windows Server 2022 Base**，然后选择**选择**。

1. 选择您需要的实例类型，然后选择 **Configure Instance Details**。对 AMI 进行配置更改，包括机器名称、存储和安全组设置。选择**启动**。

1. 实例启动过程完成后，获取密码，然后连接到 Windows **Remote Desktop Connection** 窗口中的实例。

1. 在实例上，打开 `C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml`，更改以下两项设置，然后保存并关闭文件：
   + `Ec2SetPassword` 到 `Enabled`
   + `Ec2HandleUserData` 到 `Enabled`

1. 断开与**远程桌面**会话的连接，然后返回 Amazon EC2 控制台。

1. 在 **Instances** 列表中，停止实例。

1. 实例停止后，在 Amazon EC2 控制台中，右键单击 “实例” 列表中的**实例**，选择 “**映像**”，然后选择 “**创建映像**”。

1. 在 **Create Image** 页面中，提供映像的名称和描述，并指定卷配置。完成后，选择 **Create Image**。

1. 打开 **Images** 页面，等待映像从 **pending** 阶段变为 **available**。新的 AMI 已准备就绪，可供使用。

#### 使用自定义 Windows AMI 添加新实例
<a name="w2ab1c14c55c15c13c21c20c13"></a>

您的映像变为 **available** 状态后，就可以创建基于自定义 Windows AMI 的新实例。当你从**操作系统**列表中选择**使用自定义 Windows AMI** 时， OpsWorks Stacks 会显示自定义 AMIs列表。

**添加基于自定义 Windows AMI 的新实例**

1. 当您的新 AMI 可用时，前往 OpsWorks 堆栈控制台，打开 Windows 堆栈的 “**实例**” 页面，然后选择页面底部附近的 **\$1** Instance 来添加新实例。

1. 在 **New** 选项卡上，选择 **Advanced**。

1. 在 **Operating system** 下拉列表中，选择 **Use custom Windows AMI**。

1. 在 **Custom AMI** 下拉列表中，选择您创建的 AMI，然后选择 **Add Instance**。

现在您就可以启动和运行该实例了。