

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

# 使用 Image Builder 设置跨账户 AMI 分配
<a name="cross-account-dist"></a>

本部分介绍了如何配置分配设置，以将 Image Builder AMI 传递给您指定的其他账户。

然后，目标账户可以根据需要启动或修改 AMI。

**注意**  
AWS CLI 本节中的命令示例假设您之前创建了图像配方和基础设施配置 JSON 文件。要为映像配方创建 JSON 文件，请参阅 [使用创建图像配方 AWS CLI](create-image-recipes.md#create-image-recipe-cli)。要为基础设施配置创建 JSON 文件，请参阅 [创建基础设施配置](create-infra-config.md)。

## 跨账户 AMI 分配的先决条件
<a name="cross-account-dist-prereqs"></a>

为确保目标账户能够成功地从您的 Image Builder 映像启动实例，您必须为所有区域的所有目标账户配置相应权限。

如果您使用 AWS Key Management Service (AWS KMS) 加密您的 AMI，则必须 AWS KMS key 为您的账户配置一个用于加密新映像的。

当 Image Builder 执行跨账户分发加密操作时 AMIs，源账户中的图像将被解密并推送到目标区域，然后使用该区域的指定密钥对其进行重新加密。由于 Image Builder 代表目标账户行事，并使用您在目标区域创建的 IAM 角色，因此该账户必须有权访问源区域和目标区域中的密钥。

### 加密密钥
<a name="cross-account-prereqs-encryption"></a>

如果您的映像使用 AWS KMS加密，则需要满足以下先决条件。IAM 先决条件将在下一部分中介绍。

**源账户要求**
+ 在您构建和分配 AMI 的所有区域的账户中创建 KMS 密钥。您也可以使用现有密钥。
+ 更新所有这些密钥的密钥策略，以允许目标账户使用您的密钥。

**目标账户要求**
+ 向 `EC2ImageBuilderDistributionCrossAccountRole` 添加内联策略，允许该角色执行分配加密 AMI 所需的操作。有关 IAM 配置步骤，请参阅 [IAM 策略](#cross-account-prereqs-iam) 先决条件部分。

有关使用跨账户访问的更多信息 AWS KMS，请参阅*AWS Key Management Service 开发者指南*[中的允许其他账户中的用户使用 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

在映像配方中指定您的加密密钥，如下所示：
+ 如果您使用的是 Image Builder 控制台，请从配方的**存储（卷）**部分的**加密（KMS 别名）**下拉列表中选择您的加密密钥。
+ 如果您使用的是 **CreateImageRecipe** API 操作或中的**create-image-recipe**命令，请在 AWS CLI JSON 输入下方的`ebs`部分`blockDeviceMappings`中配置您的密钥。

  以下 JSON 片段显示了映像配方的加密设置。除了提供您的加密密钥外，您还必须将 `encrypted` 标志设置为 `true`。

  ```
  {
  	...
  	"blockDeviceMappings": [
  	{
  		"deviceName": "Example root volume",
  		"ebs": { 
  			"deleteOnTermination": true,
  			"encrypted": true,
  			"iops": 100,
  			"kmsKeyId": "image-owner-key-id",
  			...
  		},
  		...
  	}],
  	...
  }
  ```

### IAM 策略
<a name="cross-account-prereqs-iam"></a>

要在 AWS Identity and Access Management (IAM) 中配置跨账户分配权限，请执行以下步骤：

1. 要使用跨账户分布 AMIs 的 Image Builder，目标账户所有者必须在其账户中创建一个名为的新 IAM 角色`EC2ImageBuilderDistributionCrossAccountRole`。

1. 他们必须将 [Ec2ImageBuilderCrossAccountDistributionAccess 策略](security-iam-awsmanpol.md#sec-iam-manpol-Ec2ImageBuilderCrossAccountDistributionAccess) 附加到角色才能启用跨账户分配。有关托管策略的更多信息，请参阅 *AWS Identity and Access Management 用户指南* 中的[托管策略与内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

1. 确认源账户 ID 已添加到目标账户的 IAM 角色所附的信任策略中。以下示例显示了目标账户中的信任策略，该策略指定了源账户的账户 ID。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [{
           "Effect": "Allow",
           "Principal": {
               "AWS": "arn:aws:iam::444455556666:root"
           },
           "Action": "sts:AssumeRole"
       }]
   }
   ```

------

   有关信任策略的更多信息，请参阅 *AWS Identity and Access Management 用户指南* 中的 [基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)。

1. 如果您分配的 AMI 已加密，则目标账户所有者必须在其账户的 `EC2ImageBuilderDistributionCrossAccountRole` 中添加以下内联策略，以便使用您的 KMS 密钥。`Principal` 部分包含他们的账号。这使得 Image Builder 能够在使用每个 AWS KMS 区域的相应密钥对 AMI 进行加密和解密时代表他们采取行动。

------
#### [ JSON ]

****  

   ```
   {
   	"Version":"2012-10-17",		 	 	 
   	"Statement": [
   		{
   			"Sid": "AllowRoleToPerformKMSOperationsOnBehalfOfTheDestinationAccount",
   			"Effect": "Allow",
   			"Action": [
   				"kms:Encrypt",
   				"kms:Decrypt",
   				"kms:ReEncrypt*",
   				"kms:GenerateDataKey*",
   				"kms:DescribeKey",
   				"kms:CreateGrant",
   				"kms:ListGrants",
   				"kms:RevokeGrant"
   			],
   			"Resource": "*"
   		}
   	]
   }
   ```

------

   有关内联策略的更多信息，请参阅 *AWS Identity and Access Management 用户指南*中的[内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)。

1. 如果您使用 `launchTemplateConfigurations` 指定 Amazon EC2 启动模板，则还必须在每个目标账户的 `EC2ImageBuilderDistributionCrossAccountRole` 中添加以下策略。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateLaunchTemplateVersion",
                   "ec2:ModifyLaunchTemplate"
               ],
               "Resource": "*",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/CreatedBy": "EC2 Image Builder"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:DescribeLaunchTemplates"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateTags"
               ],
               "Resource": "arn:aws:ec2:*:*:launch-template/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/CreatedBy": "EC2 Image Builder"
                   }
               }
           }
       ]
   }
   ```

------

1. 如果您使用 P AWS Systems Manager arameter Store 参数来存储分配账户和区域的输出 AMI 的 AMI ID，则必须在每个目标账户`EC2ImageBuilderDistributionCrossAccountRole`中将以下策略添加到您的中。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ssm:PutParameter"
               ],
               "Resource": "arn:aws:ssm:*:111122223333:parameter/ImageBuilder-*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:DescribeImages"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

## 跨账户分配的限制
<a name="cross-account-dist-limits"></a>

跨账户分配 Image Builder 映像时有一些限制：
+ 每个目标区域的目标账户仅限 50 个并发 AMI 副本。
+ 如果要将半虚拟化 (PV) 虚拟化 AMI 复制到另一个区域，则目标区域必须支持 PV 虚拟化 AMIs。有关更多信息，请参阅 [Linux AMI 虚拟化类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html)。
+ 您无法创建加密快照的未加密副本。如果您没有为 `KmsKeyId` 参数指定 AWS Key Management Service (AWS KMS) 客户托管密钥，Image Builder 将使用 Amazon Elastic Block Store (Amazon EBS) 的默认密钥。有关更多信息，请参阅 *Amazon Elastic Compute Cloud 用户指南* 中的 [Amazon EBS 加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)。

有关更多信息，请参阅 [CreateDistributionConfiguration](https://docs.aws.amazon.com/imagebuilder/latest/APIReference/API_CreateDistributionConfiguration.html)*EC2 Image Builder API 参考*中的。

## 通过控制台为 Image Builder AMI 配置跨账户分配
<a name="cross-account-dist-console-create-ami"></a>

本节介绍如何 AMIs 使用创建和配置用于跨账户分发您的 Image Builder 的分发设置。 AWS 管理控制台配置跨账户分配需要特定的 IAM 权限。在继续操作之前，您必须完成本部分的 [跨账户 AMI 分配的先决条件](#cross-account-dist-prereqs)。

要在 Image Builder 控制台中创建分配，请执行以下步骤：

1. 打开 EC2 Image Builder 控制台，网址为[https://console.aws.amazon.com/imagebuilder/](https://console.aws.amazon.com/imagebuilder/)。

1. 从导航窗格中，选择**分配设置**。这将显示在您的账户下创建的分配设置列表。

1. 在**分配设置**页面的顶部，选择**创建分配设置**。这将跳转到**创建分配设置**页面。

1. 在**映像类型**部分，选择 **Amazon Machine Image (AMI)** 作为**输出类型**。这是默认设置。

1. 在**常规**部分中，输入要创建的分配设置资源的**名称**（*必填*）。

1. 在**区域设置**部分，在选定区域的**目标账户**中输入您要向其分配 AMI 的 12 位账户 ID，然后按**输入**。这将检查格式是否正确，然后框的下方会显示您输入的账户 ID。重复该过程以添加更多帐户。

   要删除您输入的账户，请选择账户 ID 右侧显示的 **X**。

   输入每个区域的**输出 AMI 名称**。

1. 继续指定所需的任何其他设置，然后选择**创建设置**以创建新的分配设置资源。

## 从中为 Image Builder AMI 配置跨账户分发 AWS CLI
<a name="cross-account-dist-cli-ami-create"></a>

本节介绍如何配置分发设置文件以及如何使用中的**create-image**命令在账户之间构建和分发 Image Builder AMI。 AWS CLI 

配置跨账户分配需要特定的 IAM 权限。在运行 **create-image** 命令之前，您必须完成本部分的 [跨账户 AMI 分配的先决条件](#cross-account-dist-prereqs)。

1. 

**配置分配设置文件**

   在使用中的**create-image**命令创建分发给其他账户的 Image Builder AMI 之前，必须创建一个在`AmiDistributionConfiguration`设置 IDs 中指定目标账户的 `DistributionConfiguration` JSON 结构。 AWS CLI 您必须在源区域中指定至少一个 `AmiDistributionConfiguration`。

   以下名为 `create-distribution-configuration.json` 的示例文件显示了源区域中跨账户映像分配的配置。

   ```
   {
   	"name": "cross-account-distribution-example",
   	"description": "Cross Account Distribution Configuration Example",
   	"distributions": [
   		{
   			"amiDistributionConfiguration": {
   				"targetAccountIds": ["123456789012", "987654321098"],
   				"name": "Name {{ imagebuilder:buildDate }}", 
   				"description": "ImageCopy Ami Copy Configuration"
   			}, 
   			"region": "us-west-2"
   		}
   	]
   }
   ```

1. 

**创建分配设置**

   要使用中的[create-distribution-configuration](https://docs.aws.amazon.com/cli/latest/reference/imagebuilder/create-distribution-configuration.html)命令创建 Image Builder 分发设置资源 AWS CLI，请在命令中提供以下参数：
   + 在 `--name` 参数中输入分配的名称。
   + 附加您在 `--cli-input-json` 参数中创建的分配配置 JSON 文件。

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

*您也可以使用 `--distributions` 参数直接在命令中提供 JSON。*