

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

# 创建映像配方的新版本
<a name="create-image-recipes"></a>

本节介绍如何创建映像配方的新版本。

**Topics**
+ [通过控制台创建新的映像配方版本](#create-image-recipe-version-console)
+ [使用创建图像配方 Amazon CLI](#create-image-recipe-cli)
+ [在控制台中导入虚拟机 (VM) 作为基础映像](#import-vm-recipes)

## 通过控制台创建新的映像配方版本
<a name="create-image-recipe-version-console"></a>

当您创建新的配方版本时，它与创建新配方的操作几乎相同。不同之处在于，在大多数情况下，为匹配基础配方，某些详细信息都是预先选择的。以下列表描述创建新配方和创建现有配方的新版本之间的区别。

**新版本中的基础配方详细信息**
+ **名称** - *不可编辑*。
+ **版本** - 必填。输入要创建的版本号，格式为 *<major>.<minor>.<patch>*。Image Builder 支持食谱的自动版本递增，允许您在配方版本中使用通配符模式。使用通配符版本（例如）创建配方时`1.0.x`，Image Builder 会自动增加版本（例如`1.0.1``1.0.2`、`1.0.3`、等）。这样就无需手动跟踪和增加配方版本。
+ **选择映像**选项 - 已预先选择，但您可以对其进行编辑。如果您更改对基础映像来源的选择，则可能会丢失其他详细信息，这些详细信息取决于您选择的原始选项。

  要查看与您的基础映像选择相关的详细信息，请选择与您的选择相匹配的选项卡。

------
#### [ Managed image ]
  + **映像操作系统 (OS)** - *不可编辑*。
  + **映像名称** - 根据您为现有配方所做的基础映像选择的组合进行预先选择。但是，如果您更改**选择映像**选项，则会丢失预先选择的**映像名称**。
  + **自动版本控制选项** - 与您的基础配方*不*匹配。此映像选项默认为**使用选定的操作系统版本**选项。
**重要**  
如果您使用语义版本控制来启动管道构建，请确保将此值更改为**使用最新的可用操作系统版本**。要了解有关 Image Builder 资源的语义版本控制的更多信息，请参阅[Image Builder 中的语义版本控制](ibhow-semantic-versioning.md)。

------
#### [ Amazon Web Services Marketplace image ]
  + **订阅** — 此选项卡应处于打开状态，并且 Amazon Web Services Marketplace 应预先选择订阅的图片以匹配您的基本食谱。如果您更改配方用作基础映像的映像，则可能会丢失其他详细信息，这些详细信息取决于您选择的原始映像。

  有关 Amazon Web Services Marketplace 产品的更多信息，请参阅《[买*Amazon Web Services Marketplace 家指南》*中的 “购买商品](https://docs.amazonaws.cn/marketplace/latest/buyerguide/buyer-subscribing-to-products.html)”。

------
#### [ Custom AMI ]

  **AMI 来源**（必填）-输入 AMI ID 或 Amazon Systems Manager (SSM) 参数存储参数，其中包含用作基础映像的 AMI ID。SSM 代理必须预先安装在选定的 AMI 中。
  + **AMI ID** — 此设置未预先填入您的原始条目。输入您的基础映像的 AMI ID。示例：`ami-1234567890abcdef1`。
  + **SSM 参数**-输入包含基础映像的 AMI ID 的 SSM 参数存储参数的名称或 ARN。示例：`/ib/test/param` 或 `arn:aws:ssm:us-east-1:111122223333:parameter/ib/test/param`。

------
+ **实例配置** - 设置是预先选择的，但您可以对其进行编辑。
  + **Systems Manager 代理** – 您可以选中或清除此复选框来控制在新映像上安装 Systems Manager 代理。默认情况下，该复选框处于清除状态，以便在新映像中包含 Systems Manager 代理。要从最终映像中移除 Systems Manager 代理，请选中该复选框以使代理不包含在您的 AMI 中。
  + **用户数据** – 当您启动构建实例时，可以使用此区域以提供要运行的命令或命令脚本。但是，此值会替换 Image Builder 可能添加的任何命令，以确保安装 Systems Manager。这些命令包括 Image Builder 通常在创建新映像之前为 Linux 映像运行的清理脚本。

    当 Image Builder 启动实例时，用户数据脚本将在组件执行开始之前的云初始化阶段运行。此步骤将记录到实例上的以下文件中：`var/log/cloud-init.log`。
**注意**  
如果您要输入用户数据，请确保在您的基础映像上预先安装 Systems Manager 代理，或者将安装的内容包含在您的用户数据中。
对于 Linux 映像，请通过创建一条在用户数据脚本中命名为 `perform_cleanup` 的空文件的命令，以确保运行清理步骤。Image Builder 会检测到此文件，并在创建新映像之前运行清理脚本。有关更多信息和示例脚本，请参阅 [Image Builder 的安全最佳实践](security-best-practices.md)。
+ **工作目录** - 已预先选择，但您可以对其进行编辑。
+ **组件** - 已包含在配方中的组件显示在每个组件列表（构建和测试）末尾的**选定组件**部分中。您可以移除所选组件或对其重新排序，以满足您的需要。

  CIS 加固组件未遵循 Image Builder 配方中的标准组件排序规则。CIS 强化组件始终最后运行，以确保基准测试针对您的输出映像运行。
**注意**  
构建和测试组件列表根据组件所有者类型显示可用组件。要添加组件，请选择**添加构建组件**，然后选择适用的所有权筛选器。例如，要添加与 Amazon Web Services Marketplace 产品关联的生成组件，请选择`Amazon Web Services Marketplace`。这将在控制台界面的右侧打开一个列出 Amazon Web Services Marketplace 组件的选择面板。  
对于 CIS 组件，请选择`Third party managed`。

  您可以为自己的所选组件配置以下设置：
  + **版本控制选项** - 已预先选择，但您可以对其进行更改。我们建议您选择**使用最新的可用组件版本**选项，以确保您的映像版本始终使用最新版本的组件。如果您需要在配方中使用特定的组件版本，则可以选择**指定组件版本**，然后在出现的**组件版本**框中输入版本。
  + **输入参数** - 显示组件接受的输入参数。该**值**预先填充了配方先前版本中的值。如果您在此配方中首次使用此组件，并且已为该输入参数定义了默认值，则默认值以灰色文本显示在**值**框中。如果未输入其他值，Image Builder 将使用默认值。

    如果需要输入参数，但组件中未定义默认值，则必须提供一个值。如果缺少任何必需的参数且未定义默认值，Image Builder 将不会创建配方版本。
**重要**  
组件参数是纯文本值，并且已记录在 Amazon CloudTrail中。我们建议您使用 Amazon Secrets Manager 或 P Amazon Systems Manager arameter Store 来存储您的密钥。有关 Secrets Manager 的更多信息，请参阅*Amazon Secrets Manager 用户指南*中的[什么是 Secrets Manager?](https://docs.amazonaws.cn/secretsmanager/latest/userguide/intro.html)。有关 Amazon Systems Manager Parameter Store 的更多信息，请参阅*《Amazon Systems Manager 用户指南》*中的[Amazon Systems Manager Parameter Store](https://docs.amazonaws.cn/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

  要展开**版本控制选项**或**输入参数**的设置，可以选择设置名称旁边的箭头。要展开所有选定组件的所有设置，可以关闭和打开**全部展开**开关。
+ **存储（卷）** - 已预先填好。根卷**设备名称**、**快照**和 **IOPS** 选项不可编辑。但是，您可以更改所有其余设置，例如**大小**。您还可以添加新卷以及加密新卷或现有卷。

  要在源区域（运行构建的地方）为 Image Builder 在您的账户下创建的映像进行加密，您必须在映像配方中使用存储卷加密。在该构建的分配阶段运行的加密仅适用于分配给其他账户或地区的映像。
**注意**  
如果您对卷使用加密，则必须分别为每个卷选择密钥，即使该密钥与用于根卷的密钥相同也是如此。

**创建新的映像配方版本：**

1. 在配方详细信息页面顶部，选择**创建新版本**。这将带您进入**创建映像配方**页面。

1. 要创建新版本，请进行更改，然后选择**Create recipe**（创建配方）。

   您的最终图片最多可以包含来自 Amazon Web Services Marketplace 图片产品和组件的四个产品代码。如果您选择的基本图片和组件包含四个以上的产品代码，则当您尝试创建配方时，Image Builder 会返回错误。

有关如何在创建映像管道时创建映像配方的更多信息，请参阅本指南的**入门**部分的 [步骤 2：选择配方](start-build-image-pipeline.md#start-build-image-step2)。

## 使用创建图像配方 Amazon CLI
<a name="create-image-recipe-cli"></a>

要使用中的 Image Builder `create-image-recipe` 命令创建图像配方 Amazon CLI，请执行以下步骤：

**先决条件**  
在运行本节中的 Image Builder 命令从中创建图像配方之前 Amazon CLI，您可以选择创建配方使用的组件。以下步骤中的映像配方示例引用了在本指南 [从中创建自定义组件 Amazon CLI](create-component.md#create-component-ib-cli) 部分中创建的示例组件。

如果要在食谱中添加组件，请 ARNs 记下要包含的组件。您也可以创建没有任何组件的配方，用于测试现有 AMIs 或仅限分发的工作流程。

1. 

**创建 CLI 输入 JSON 文件**

   您可以使用内联命令参数为 **create-image-recipe** 命令提供所有输入。但是，生成的命令可能会很长。为了简化命令，您可以改为提供包含所有配方设置的 JSON 文件。
**注意**  
JSON 文件中数据值的命名约定遵循为 Image Builder API 操作请求参数指定的模式。要查看 API 操作请求参数，请参阅《*EC2 Image Builder API 参考*》中的[CreateImageRecipe](https://docs.amazonaws.cn/imagebuilder/latest/APIReference/API_CreateImageRecipe.html)命令。  
要将数据值作为命令行参数提供，请参阅《*Amazon CLI 命令引用*》中指定的参数名称。

   以下是这些示例指定的参数的摘要：
   + **名称**（字符串，必填项） - 映像配方的名称。
   + **描述**（字符串）- 映像配方的描述。
   + **parentImage** （字符串，必填项）- 映像配方用作自定义映像基础的映像。您可以使用以下选项之一来指定父映像：
     + AMI ID
     + Image Builder 图片资源 ARN
     + Amazon Systems Manager (SSM) 参数存储参数，前缀为`ssm:`，后跟参数名称或 ARN。
     + Amazon Web Services Marketplace 产品编号
**注意**  
Linux 和 macOS 示例使用 Image Builder AMI，Windows 示例使用 ARN。
   + **SemanticVersion** *<major>（字符串，必填）-输入要按格式创建的版本号。 <minor>。 *<patch>。Image Builder 支持食谱的自动版本递增，允许您在配方版本中使用通配符模式。使用通配符版本（例如）创建配方时`1.0.x`，Image Builder 会自动增加版本（例如`1.0.1``1.0.2`、`1.0.3`、等）。这样就无需手动跟踪和增加配方版本。要了解有关 Image Builder 资源的语义版本控制的更多信息，请参阅[Image Builder 中的语义版本控制](ibhow-semantic-versioning.md)。
   + **组件**（数组，可选）-包含`ComponentConfiguration`对象数组。组件是可选的-您可以创建没有任何组件的配方，用于测试或分发工作流程：
**注意**  
Image Builder 按照您在配方中指定的顺序安装组件。但是，CIS 强化组件始终最后运行，以确保基准测试针对您的输出映像运行。
     + **componentARN**（字符串，必填）– 组件 ARN。
**提示**  
要使用其中一个示例来创建自己的图像配方，必须将该示例 ARNs 替换 ARNs 为用于配方的组件。
     + **参数**（对象数组）- 包含 `ComponentParameter` 对象数组。如果需要输入参数，但组件中未定义默认值，则必须提供一个值。如果缺少任何必需的参数且未定义默认值，Image Builder 将不会创建配方版本。
**重要**  
组件参数是纯文本值，并且已记录在 Amazon CloudTrail中。我们建议您使用 Amazon Secrets Manager 或 P Amazon Systems Manager arameter Store 来存储您的密钥。有关 Secrets Manager 的更多信息，请参阅*Amazon Secrets Manager 用户指南*中的[什么是 Secrets Manager?](https://docs.amazonaws.cn/secretsmanager/latest/userguide/intro.html)。有关 Amazon Systems Manager Parameter Store 的更多信息，请参阅*《Amazon Systems Manager 用户指南》*中的[Amazon Systems Manager Parameter Store](https://docs.amazonaws.cn/systems-manager/latest/userguide/systems-manager-parameter-store.html)。
       + **名称**（字符串，必填）- 要设置的组件参数的名称。
       + **值**（字符串数组，必填）- 包含用于设置指定组件参数值的字符串数组。如果为组件定义了默认值，但未提供其他值，则 EC2 TOE 使用默认值。
   + **additionalInstanceConfiguration**(object)-为您的编译实例指定其他设置并启动脚本。
     + **systemsManagerAgent**（对象）-包含编译实例上的 Systems Manager 代理的设置。
       + **uninstallAfterBuild**（布尔值）-控制在创建新 AMI 之前是否从最终构建映像中删除 Systems Manager 代理。如果将此选项设置为 `true`，则从最终映像中移除该代理。如果将此选项设置为 `false`，则保留该代理，以便将它包含在新 AMI 中。默认值为 `false`。
**注意**  
如果 JSON 文件中未包含该 `uninstallAfterBuild` 属性，并且满足以下条件，则 Image Builder 会从最终映像中移除 Systems Manager 代理，使其在 AMI 中不可用：  
`userDataOverride` 为空或已从 JSON 文件中省略。
对于未在基础映像上预装代理的操作系统，Image Builder 会自动在构建实例上安装 Systems Manager 代理。
     + **userDataOverride**（字符串）-提供启动构建实例时要运行的命令或命令脚本。
**注意**  
用户数据始终采用 base 64 编码。例如，以下命令被编码为 `IyEvYmluL2Jhc2gKbWtkaXIgLXAgL3Zhci9iYi8KdG91Y2ggL3Zhcg==`：  

       ```
       #!/bin/bash
       mkdir -p /var/bb/
       touch /var
       ```
Linux 示例使用此编码值。

------
#### [ Linux ]

   以下示例中的基础映像（`parentImage` 属性）是 AMI。使用 AMI 时，您必须具有访问该 AMI 的权限，并且 AMI 必须位于源区域（与 Image Builder 运行命令的区域相同）。将文件另存为 `create-image-recipe.json`，并在 **create-image-recipe** 命令中使用。

   ```
   {
   "name": "BB Ubuntu Image recipe",
   "description": "Hello World image recipe for Linux.",
   "parentImage": "ami-1234567890abcdef1",
   "semanticVersion": "1.0.0",
   "components": [
   	{
   		"componentArn": "arn:aws:imagebuilder:us-west-2:111122223333:component/bb$"
   	}
   ],
   "additionalInstanceConfiguration": {
   	"systemsManagerAgent": {
   	 	"uninstallAfterBuild": true
   	},
   	"userDataOverride": "IyEvYmluL2Jhc2gKbWtkaXIgLXAgL3Zhci9iYi8KdG91Y2ggL3Zhcg=="
   }
   }
   ```

------
#### [ Windows ]

   以下示例引用最新版本的 Windows Server 2016 英文版全基础映像。此示例中的 ARN 引用基于您指定的语义版本过滤器的最新图像:. `arn:aws:imagebuilder:us-west-2:aws:image/windows-server-2016-english-full-base-x86/x.x.x` 

   ```
   {
   "name": "MyBasicRecipe",
   "description": "This example image recipe creates a Windows 2016 image.",
   "parentImage": "arn:aws:imagebuilder:us-west-2:aws:image/windows-server-2016-english-full-base-x86/x.x.x",
   "semanticVersion": "1.0.0",
   "components": [
   	{
   		"componentArn": "arn:aws:imagebuilder:us-west-2:111122223333:component/my-example-component/2019.12.02/1"
   	},
   	{
   		"componentArn": "arn:aws:imagebuilder:us-west-2:111122223333:component/my-imported-component/1.0.0/1"
   	}
   ]
   }
   ```

**注意**  
要了解有关 Image Builder 资源的语义版本控制的更多信息，请参阅[Image Builder 中的语义版本控制](ibhow-semantic-versioning.md)。

------
#### [ macOS ]

   以下示例中的基础映像（`parentImage` 属性）是 AMI。使用 AMI 时，您必须具有访问该 AMI 的权限，并且 AMI 必须位于源区域（与 Image Builder 运行命令的区域相同）。将文件另存为 `create-image-recipe.json`，并在 **create-image-recipe** 命令中使用。

   ```
   {
   "name": "macOS Catalina Image recipe",
   "description": "Hello World image recipe for macOS.",
   "parentImage": "ami-1234567890abcdef1",
   "semanticVersion": "1.0.0",
   "components": [
   	{
   		"componentArn": "arn:aws:imagebuilder:us-west-2:111122223333:component/catalina$"
   	}
   ],
   "additionalInstanceConfiguration": {
   	"systemsManagerAgent": {
   	 	"uninstallAfterBuild": true
   	},
   	"userDataOverride": "IyEvYmluL2Jhc2gKbWtkaXIgLXAgL3Zhci9iYi8KdG91Y2ggL3Zhcg=="
   }
   }
   ```

------

   **示例：不含组件的食谱**

   您可以创建没有任何组件的配方，用于测试现有 AMIs 或仅限分发的工作流程。以下示例显示了一个使用现有 AMI 而不应用任何其他组件的配方：

   ```
   {
   	"name": "Test Distribution Recipe",
   	"description": "Recipe for testing and distributing existing AMI without modifications.",
   	"parentImage": "ami-1234567890abcdef1",
   	"semanticVersion": "1.0.0",
   	"additionalInstanceConfiguration": {
   		"systemsManagerAgent": {
   		 	"uninstallAfterBuild": true
   		}
   	}
   }
   ```

1. 

**创建配方**

   使用以下命令以创建配方。在 `--cli-input-json` 参数中提供您在上一步中创建的 JSON 文件的名称：

   ```
   aws imagebuilder create-image-recipe --cli-input-json file://create-image-recipe.json
   ```
**注意**  
JSON 文件路径开头必须包含 `file://` 符号。
JSON 文件的路径应遵循运行命令的基本操作系统的相应约定。例如，Windows 使用反斜杠 (\$1) 引用目录路径，而 Linux 和 macOS 使用正斜杠 (/)。

   您的最终图片最多可以包含来自 Amazon Web Services Marketplace 图片产品和组件的四个产品代码。如果您选择的基础图片和组件包含四个以上的产品代码，则在运行`create-image-recipe`命令时，Image Builder 会返回错误。

## 在控制台中导入虚拟机 (VM) 作为基础映像
<a name="import-vm-recipes"></a>

在本节中，我们将重点介绍如何导入虚拟机 (VM) 作为映像配方的基础映像。这里我们不介绍创建配方或配方版本所涉及的其他步骤。有关在 Image Builder 控制台中使用管道创建向导创建新映像配方的其他步骤，请参阅 [管道向导：创建 AMI](start-build-image-pipeline.md)。有关创建新映像配方或配方版本的其他步骤，请参阅 [创建映像配方的新版本](#create-image-recipes)。

要在 Image Builder 控制台中导入虚拟机 (VM) 作为映像配方的基础映像，请按照以下步骤以及任何其他必需的步骤来创建您的配方或配方版本。

1. 在基础映像的**选择映像**部分中，选择**导入基础映像**选项。

1. 像往常一样选择**映像操作系统 (OS)**和**操作系统 (OS) 版本**。

### 虚拟机导入配置
<a name="import-vm-recipe-console-config"></a>

当您从虚拟化环境中导出虚拟机时，该过程会创建一个或多个磁盘容器文件，这些文件充当虚拟机环境、设置和数据的快照。您可以使用这些文件导入虚拟机作为映像配方的基本映像。有关 VMs 在 Image Builder 中导入的更多信息，请参阅 [导入和导出 VM 映像](vm-import-export.md)

要指定导入源的位置，请执行以下步骤：

**导入源**  
在**磁盘容器 1 **部分中指定要导入的第一个虚拟机映像磁盘容器或快照的来源。

1. **源** – 可以是 S3 存储桶或 EBS 快照。

1. **选择磁盘的 S3 位置** – 输入 Amazon S3 中存储磁盘映像的位置。要浏览位置，请选择**浏览 S3**。

1. 要添加磁盘容器，请选择**添加磁盘容器**。

**IAM 角色**  
要将 IAM 角色与您的虚拟机导入配置相关联，请从 **IAM 角色**下拉列表中选择该角色，或者选择**创建新角色**来创建一个新角色。如果您创建了新角色，IAM 角色控制台页面将在单独的标签页中打开。

#### 高级设置 – *可选*
<a name="import-vm-recipe-console-opt"></a>

以下设置可选：使用这些设置，您可以为导入创建的基本映像配置加密、许可、标签等。

**General**

1. 为基本映像指定一个唯一的**名称**。如果不输入任何值，则基础映像将继承该配方名称。

1. 指定基础映像的**版本**。采用以下格式：`<major>.<minor>.<patch>`。如果不输入任何值，则基础映像将继承该配方版本。

1. 您也可以为基础映像输入**描述**。

**基础映像架构**  
要指定虚拟机导入源的架构，请从**架构**列表中选择一个值。

**加密**  
如果您的虚拟机磁盘映像已加密，则必须提供用于导入过程的密钥。要 Amazon KMS key 为导入指定一个，请从**加密（KMS 密钥）**列表中选择一个值。该列表包含您的账户在当前区域中有权访问的 KMS 密钥。

**许可证管理**  
导入虚拟机时，导入过程会自动检测虚拟机操作系统并将相应的许可证应用于基本映像。根据您的操作系统平台，许可证类型如下：
+ **包含许可证** — 适用于您的平台的相应 Amazon 许可证将应用于您的基本映像。
+ **自带许可（BYOL）** - 保留源自虚拟机的许可证（如果适用）。

要将使用创建的许可证配置附加 Amazon License Manager 到您的基础映像，请从**许可证配置名称**列表中进行选择。有关 License Manager 的更多信息，[请参阅使用 Amazon License Manager]()

**注意**  
许可证配置包含基于您的企业协议条款的许可规则。
Linux 仅支持 BYOL 许可证。

**标签（基本映像）**  
标签使用键值对为您的 Image Builder 资源分配可搜索的文本。要为导入的基础映像指定标签，请使用**键**和**值**框输入键值对。

要添加标签，请选择 **Add tag**（添加标签）。要删除标签，请选择 **Remove tag**（删除标签）。