

# Amazon EC2 中的亚马逊机器映像
<a name="AMIs"></a>

亚马逊机器映像（AMI）是一个映像，它提供设置和启动 Amazon EC2 实例所需的软件。每个 AMI 还包含块设备映射，指定要附加到启动的实例的块设备。在启动实例时，您必须指定 (AMI)。AMI 必须与您为实例选择的实例类型兼容。您可以使用 AWS 提供的 AMI、公共 AMI、其他人与您共享的 AMI 或从 AWS Marketplace 购买的 AMI。

AMI 特定于以下各项：
+ 区域
+ 操作系统
+ 处理器架构
+ 根卷类型
+ 虚拟化类型

在需要具有相同配置的多个实例时，您可以从单个 AMI 启动多个实例。在需要不同的配置的实例时，您可以使用其他 AMI 启动实例，如下图中所示。

![\[从一个 AMI 上启动多个实例。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/launch-from-ami.png)


您可以从 Amazon EC2 实例创建 AMI，然后使用它启动具有相同配置的实例。您可以将 AMI 复制到另一个 AWS 区域，然后使用它在该区域中启动实例。您还可以与其他账户共享您创建的 AMI，以便他们可以启动具有相同配置的实例。您可以使用 AWS Marketplace 销售 AMI。

**Topics**
+ [AMI 特征](ComponentsAMIs.md)
+ [查找 AMI](finding-an-ami.md)
+ [AWS Marketplace 中的付费 AMI](paid-amis.md)
+ [AMI 周期](ami-lifecycle.md)
+ [启动模式](ami-boot.md)
+ [AMI 加密](AMIEncryption.md)
+ [共享 AMI](sharing-amis.md)
+ [监控 AMI 事件](monitor-ami-events.md)
+ [了解 AMI 账单](ami-billing-info.md)
+ [AMI 限额](ami-quotas.md)

# Amazon EC2 中的 AMI 类型和特征
<a name="ComponentsAMIs"></a>

启动实例时，您选择的 AMI 必须与您选择的实例类型兼容。可以基于以下特性选择要使用的 AMI：
+ [区域](using-regions-availability-zones.md)
+ 操作系统
+ 处理器架构
+ [启动许可](#launch-permissions)
+ [根卷类型](#storage-for-the-root-device)
+ [虚拟化类型](#virtualization_types)

## 启动许可
<a name="launch-permissions"></a>

启动许可决定谁可以使用 AMI 启动实例。您可以将启动许可视为[共享 AMI](sharing-amis.md)，即当您授予启动许可时，您就是在与其他用户共享 AMI。只有 AMI 的拥有者可以通过指定启动许可来确定其可用性。启动许可分为以下类别。


| 启动权限 | 描述 | 
| --- | --- | 
| 公有 | 拥有者向所有 AWS 账户授予启动许可。 | 
| 显式 | 拥有者向特定 AWS 账户、企业或企业部门（OU）授予启动许可。 | 
| 隐式 | 拥有者拥有 AMI 的隐式启动许可。 | 

Amazon 和 Amazon EC2 社区提供了大量的公用 AMI。有关更多信息，请参阅[了解 Amazon EC2 中共享 AMI 的使用情况](sharing-amis.md)。开发人员可以为其 AMI 收费。有关更多信息，请参阅 [AWS Marketplace 中适用于 Amazon EC2 实例的付费 AMI](paid-amis.md)。

## 根卷类型
<a name="storage-for-the-root-device"></a>

所有 AMI 均可归类为*由 Amazon EBS 支持*或*由 Amazon S3 支持*。
+ Amazon EBS-backed AMI – 从 AMI 启动的实例的根卷是从 Amazon EBS 快照创建的 Amazon Elastic Block Store（Amazon EBS）卷。同时支持 Linux 和 Windows AMI。
+ Amazon S3 支持的 AMI – 从 AMI 启动的实例的根卷是根据一个存储在 Amazon S3 中的模板创建而来的实例存储卷。仅支持 Linux AMI。Windows AMI 不支持根卷的实例存储。

有关更多信息，请参阅 [Amazon EC2 实例的根卷](RootDeviceStorage.md)。

**注意**  
Amazon S3 支持的 AMI 已达生命周期终止，不建议新使用此类 AMI。仅下列早期实例类型支持此类 AMI：C1、C3、D2、I2、M1、M2、M3、R3 和 X1。

下表总结了使用两种类型的 AMI 时的重要区别。


| 特征 | Amazon EBS-backed AMI | Amazon S3 支持的 AMI | 
| --- | --- | --- | 
| 根卷 | EBS 卷 | 实例存储卷 | 
| 实例的启动时间 | 通常不到 1 分钟 | 通常不到 5 分钟 | 
| 数据持久性  |  默认情况下，实例终止时将删除根卷。\$1 默认情况下，在实例终止后，任何其他 EBS 卷上的数据仍然存在。  |  任意实例存储卷上的数据仅在实例的生命周期内保留。  | 
| 停止状态 |  可以处于停止状态。即使实例已停止并且未运行，根卷也会持久保留在 Amazon EBS 中。  |  不可置于已停止状态；实例正在运行或已终止。  | 
| 修改 |  实例停止后，实例类型、内核、RAM 磁盘和用户数据仍可更改。  |  实例存在期间，实例属性是稳定不变的。  | 
| 收费 |  您需要为实例使用、EBS 卷使用以及将 AMI 存储为 EBS 快照付费。  |  您需要为实例使用以及在 Amazon S3 中存储 AMI 付费。  | 
| AMI 创建/捆绑 | 使用单一命令/调用 | 需要安装和使用 AMI 工具 | 

\$1 默认情况下，EBS 根卷的 `DeleteOnTermination` 标志设置为 `true`。有关如何更改此标志以便卷在终止之后保留的信息，请参阅[Amazon EC2 实例终止后会保留 Amazon EBS 根卷](configure-root-volume-delete-on-termination.md)。

\$1\$1 仅支持 `io2` EBS Block Express。有关更多信息，请参阅《Amazon EBS 用户指南》**中的[预调配 IOPS SSD Block Express 卷](https://docs.aws.amazon.com/ebs/latest/userguide/provisioned-iops.html#io2-block-express)。

# 识别由您的 AMI 确定的根卷类型
<a name="display-ami-root-device-type"></a>

您用于启动 EC2 实例的 AMI 决定根卷的类型。EC2 实例的根卷是 EBS 卷或实例存储卷。

[基于 Nitro 的实例](instance-types.md#instance-hypervisor-type)仅支持 EBS 根卷。下列上一代实例类型是支持实例存储根卷的唯一实例类型：C1、C3、D2、I2、M1、M2、M3、R3 和 X1。

------
#### [ Console ]

**识别由 AMI 确定的根卷类型**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **AMIs**（AMI），选择 AMI。

1. 在 **Details**（详细信息）选项卡中检查 **Root Device Type**（根设备类型）的值，如下所示：
   + `ebs` – 从此 AMI 启动的实例将获得 EBS 根卷
   + `instance store` – 从此 AMI 启动的实例将获得实例存储根卷。

------
#### [ AWS CLI ]

**识别由 AMI 确定的根卷类型**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --image-ids ami-0abcdef1234567890 \
    --query Images[].RootDeviceType
```

下面是示例输出。

```
ebs
```

------
#### [ PowerShell ]

**识别由 AMI 确定的根卷类型**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
(Get-EC2Image `
    -ImageId ami-0abcdef1234567890).RootDeviceType.Value
```

下面是示例输出。

```
ebs
```

------

## 虚拟化类型
<a name="virtualization_types"></a>

亚马逊机器映像使用两种虚拟化类型之一：半虚拟化 (PV) 或硬件虚拟机 (HVM)。半虚拟化和 HVM AMI 之间的主要区别在于它们的启动方式，以及它们能否使用特定硬件扩展（CPU、网络和存储）实现更好的性能。Windows AMI 是硬件虚拟机 AMI。

下表比较 HVM 和 PV AMI。


| 特征 | 全虚拟化 | PV | 
| --- | --- | --- | 
| 描述 | 硬件虚拟机 AMI 配有一组完全虚拟化的硬件，通过执行映像根块储存设备的主启动记录来启动。通过此虚拟化类型可以直接在虚拟机上运行操作系统而不进行任何修改 (如同它在裸机硬件上运行一样)。Amazon EC2 主机系统可模拟向客户机提供的部分或所有底层硬件。 | 半虚拟化 AMIs 使用名为 PV-GRUB 的特殊启动加载程序启动，该加载程序开始启动周期，然后对映像链式加载 menu.lst 文件中指定的内核。半虚拟来宾可以在没有明确支持虚拟化的主机硬件上运行。有关 PV-GRUB 及其在 Amazon EC2 中的使用情况的更多信息，请参阅 [User provided kernels](https://docs.aws.amazon.com/linux/al2/ug/UserProvidedKernels.html)。 | 
| 支持的实例类型 | 当前一代的所有实例类型都支持 HVM AMI。 | 以下上一代实例类型支持 PV AMI：C1、C3、M1、M3、M2 和 T1。最新一代实例类型不支持 PV AMI。 | 
| 支持硬件扩展 | 硬件虚拟机客户机可以利用硬件扩展快速访问主机系统上的底层硬件。它们需要使用增强联网和 GPU 处理。要将指令传递给专用网络和 GPU 设备，操作系统必须能访问本机硬件平台；HVM 虚拟化可提供这种访问。有关更多信息，请参阅 [Amazon EC2 实例上的增强联网功能](enhanced-networking.md)。 | 否，它们无法利用特殊的硬件扩展，例如增强网络或 GPU 处理。 | 
| [如何查找](finding-an-ami.md) | 使用控制台或 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令验证 AMI 的虚拟化类型是否已设置为 hvm。 | 使用控制台或 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令验证 AMI 的虚拟化类型是否已设置为 paravirtual。 | 

**硬件虚拟机上的半虚拟化**  
以往，半虚拟化客户机在存储和网络操作方面的性能要优于硬件虚拟机客户机，因为它们可以对 I/O 使用特殊驱动程序，从而避免模拟网络和磁盘硬件的开销，而硬件虚拟机客户机必须将这些指令转换为模拟的硬件。现在，半虚拟化驱动程序可用于硬件虚拟机客户机，因此无法移植到半虚拟化环境中运行的操作系统仍可以通过它们获得存储和网络 I/O 方面的性能优势。借助这些硬件虚拟机驱动程序上的半虚拟化，硬件虚拟机客户机可以获得与半虚拟化客户机相同甚至更佳的性能。

# 查找满足您的 EC2 实例要求的 AMI
<a name="finding-an-ami"></a>

AMI 包括启动实例所需的组件和应用程序，例如操作系统和根卷的类型。要启动实例，必须找到满足您需求的 AMI。

选择 AMI 时，对于要启动的实例，可能需要考虑以下要求：
+ AMI 的 AWS 区域，因为 AMI ID 在每个区域中都是唯一的。
+ 操作系统（例如，Linux 或 Windows）。
+ 架构（例如，32 位、64 位或 64 位 ARM）。
+ 根卷类型（例如，Amazon EBS 或实例存储）。
+ 提供商（例如，亚马逊云科技）。
+ 其他软件（例如，SQL Server）。

------
#### [ Console ]

您可以在使用启动实例向导时从 AMI 列表中进行选择，也可以使用**映像**页面在所有可用的 AMI 中进行搜索。

**使用启动实例向导查找快速启动 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航栏，选择您在其中启动实例的区域。您可以选择向您提供的任何区域，无需理会您身处的位置。AMI ID 在每个 AWS 区域中都是唯一的。

1. 从控制台控制面板中，选择**启动实例**。

1. 在**应用程序和操作系统映像（亚马逊机器映像）**下，选择**快速启动**，选择适用于实例的操作系统 (OS)，然后在**亚马逊机器映像（AMI）**中，从列表中选择一个常用的 AMI。如果您没有看到想要使用的 AMI，请选择 **Browser more AMIs**（浏览更多 AMI）以浏览完整的 AMI 目录。有关更多信息，请参阅 [应用程序和操作系统映像（亚马逊机器映像）](ec2-instance-launch-parameters.md#liw-ami)。

**使用 AMI 页面查找 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航栏，选择您在其中启动实例的区域。您可以选择向您提供的任何区域，无需理会您身处的位置。AMI ID 在每个 AWS 区域中都是唯一的。

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

1. （可选）使用筛选条件和搜索选项，将显示的 AMI 列表范围限定为仅能查看符合您的标准的 AMI。

   例如，要列出 AWS 提供的所有 AMI，请选择**公有映像**。然后使用搜索选项进一步缩小显示的 AMI 列表的范围。选择 **Search**（搜索）栏，然后从菜单中选择 **Owner alias**（拥有者别名），然后选择 **=** 运算符，最后选择值 **amazon**。要查找与特定平台（例如 Linux 或 Windows）匹配的 AMI，请再次选择**搜索**栏以选择**平台**，然后选择 **=** 运算符，从提供的列表中选择操作系统。

1. （可选）选择**首选项**图标，以选择要显示的映像属性，例如根卷类型。或者，可以从列表中选择 AMI，然后在 **Details**（详细信息）选项卡中查看其属性。

1. 选择 AMI 之前，请确认它是由实例存储支持还是由 Amazon EBS 支持并了解此差异的影响，这十分重要。有关更多信息，请参阅 [根卷类型](ComponentsAMIs.md#storage-for-the-root-device)。

1. 要从此 AMI 启动一个实例，请选择此实例，然后选择**从映像启动实例**。有关使用控制台启动实例的更多信息，请参阅 [使用控制台中的启动实例向导来启动 EC2 实例](ec2-launch-instance-wizard.md)。如果您没有准备好立即启动实例，请记下 AMI ID 以供将来使用。

------
#### [ AWS CLI ]

使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令查找符合要求的 AMI。默认情况下，此命令会返回所有公有 AMI、由您拥有的 AMI 以及与您共享的 AMI。

**查找由 Amazon 拥有的 AMI**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令和 `--owners` 选项。

```
aws ec2 describe-images --owners amazon
```

**查找 Windows AMI**  
添加以下筛选条件，从而仅显示 Windows AMI。

```
--filters "Name=platform,Values=windows"
```

**查找 EBS-backed AMI**  
添加以下筛选条件，从而仅显示 Amazon EBS-backed AMI。

```
--filters "Name=root-device-type,Values=ebs"
```

------
#### [ PowerShell ]

使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet 查找符合要求的 AMI。默认情况下，此 cmdlet 会返回所有公有 AMI、由您拥有的 AMI 或与您共享的 AMI。

**查找由 Amazon 拥有的 AMI**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) 命令和 `-Owner` 参数。

```
Get-EC2Image -Owner amazon
```

**查找 Windows AMI**  
添加以下筛选条件，从而仅显示 Windows AMI。

```
-Filter @{Name="platform"; Values="windows"}
```

有关更多示例，请参阅《AWS Tools for PowerShell 用户指南》中的 [Find an Amazon Machine Image Using Windows PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-ec2-get-amis.html)**。

------

**相关资源**

有关特定操作系统的 AMI 的更多信息，请参阅以下内容：
+ Amazon Linux 2023 –《*Amazon Linux 2023 用户指南*》中的 [AL2023 on Amazon EC2](https://docs.aws.amazon.com/linux/al2023/ug/ec2.html)
+ Ubuntu – *Canonical Ubuntu 网站*上的 [Amazon EC2 AMI Locator](https://cloud-images.ubuntu.com/locator/ec2/)
+ RHEL – Red Hat 网站上的 [Red Hat Enterprise Linux Images (AMI) Available on Amazon Web Services (AWS)](https://access.redhat.com/solutions/15356)
+ Windows 服务器：[AWS Windows AMI 参考](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html)

有关您可以在 AWS Marketplace 上订阅的 AMI 的信息，请参阅 [AWS Marketplace 中适用于 Amazon EC2 实例的付费 AMI](paid-amis.md)。

有关使用 Systems Manager 帮助用户找到启动实例时应使用的最新 AMI 的信息，请参阅以下内容：
+ [使用 Systems Manager 参数引用 AMI](using-systems-manager-parameter-to-find-AMI.md)
+ [使用 Systems Manager 公共参数引用最新的 AMI](finding-an-ami-parameter-store.md)

# 使用 Systems Manager 参数引用 AMI
<a name="using-systems-manager-parameter-to-find-AMI"></a>

在 Amazon EC2 控制台中使用 EC2 启动实例向导启动实例时，您可以从列表中选择 AMI，也可以选择指向 AMI ID 的 AWS Systems Manager 参数（如此部分中所述）。如果您使用自动化代码启动实例，则可以指定 Systems Manager 参数而不是 AMI ID。

Systems Manager 参数是客户定义的键/值对，您可以在 Systems Manager Parameter Store 中创建该键/值对。Parameter Store 提供了一个中央存储来对应用程序配置值进行外部化。有关更多信息，请参阅 *AWS Systems Manager 用户指南*中的 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

创建指向 AMI ID 的参数时，请确保将数据类型指定为 `aws:ec2:image`。指定此数据类型可确保在创建或修改参数时，将参数值作为 AMI ID 进行验证。有关更多信息，请参阅 *AWS Systems Manager 用户指南*中[对亚马逊机器映像 ID 的原生参数支持](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-ec2-aliases.html)。

**Topics**
+ [

## 使用案例
](#systems-manager-parameter-use-case)
+ [

## 权限
](#systems-manager-permissions)
+ [

## 限制
](#AMI-systems-manager-parameter-limitations)
+ [

## 使用 Systems Manager 参数启动实例
](#systems-manager-parameter-launch-instance)

## 使用案例
<a name="systems-manager-parameter-use-case"></a>

当您使用 Systems Manager 参数指向 AMI ID 时，您的用户在启动实例时可以更轻松地选择正确的 AMI。Systems Manager 参数还可以简化自动化代码的维护。

**用户使用更简单**

如果您需要使用特定 AMI 启动实例并且该 AMI 定期更新，我们建议您要求用户选择 Systems Manager 参数来查找 AMI。要求用户选择 Systems Manager 参数可确保使用最新的 AMI 启动实例。

例如，您的组织中可能会每个月创建一个新版本的 AMI，其中具有最新操作系统和应用程序修补程序。同时，您要求用户使用最新版本的 AMI 启动实例。为确保用户使用最新版本，您可以创建指向正确 AMI ID 的 Systems Manager 参数（例如 `golden-ami`）。每次创建新版本的 AMI 时，您需要更新参数中的 AMI ID 值，以使其始终指向最新 AMI。您的用户不需要了解对 AMI 的定期更新，因为他们每次都会继续选择相同的 Systems Manager 参数。为您的 AMI 使用 Systems Manager 参数可让他们更轻松地选择正确的 AMI 来启动实例。

**简化自动化代码维护**

如果您使用自动化代码启动实例，则可以指定 Systems Manager 参数而不是 AMI ID。如果创建了新版本的 AMI，您可以更改参数中的 AMI ID 值，以使其指向最新 AMI。每次创建新版本的 AMI 时，都不需要修改引用该参数的自动化代码。这样做简化了自动化的维护，有助于降低部署成本。

**注意**  
当您更改 Systems Manager 参数指向的 AMI ID 时，正在运行的实例不受影响。

## 权限
<a name="systems-manager-permissions"></a>

如果您在启动实例向导中使用指向 AMI ID 的 Systems Manager 参数，则必须将以下权限添加到您的 IAM 策略：
+ `ssm:DescribeParameters`：授予查看和选择 Systems Manager 参数的权限。
+ `ssm:GetParameters`：授予检索 Systems Manager 参数值的权限。

您还可以限制对特定 Systems Manager 参数的访问权限。有关更多信息以及示例 IAM 策略，请参阅 [示例：使用 EC2 启动实例向导](iam-policies-ec2-console.md#ex-launch-wizard)。

## 限制
<a name="AMI-systems-manager-parameter-limitations"></a>

AMI 和 Systems Manager 参数特定于区域。要跨区域使用相同的 Systems Manager 参数名称，请在各个区域中创建具有相同名称的 Systems Manager 参数（例如，`golden-ami`）。在每个区域中，将 Systems Manager 参数指向该区域的 AMI。

参数名称区分大小写。只有在参数是层次结构的一部分时，参数名称才需要使用反斜杠，例如，`/amis/production/golden-ami`。如果参数不是层次结构的一部分，您可以省略反斜杠。

## 使用 Systems Manager 参数启动实例
<a name="systems-manager-parameter-launch-instance"></a>

启动实例时，您可以不指定 AMI ID，而选择指定指向某个 AMI ID 的 Systems Manager 参数。

要以编程方式指定参数，请使用以下语法，其中 `resolve:ssm` 是标准前缀，`parameter-name` 是唯一参数名称。

```
resolve:ssm:parameter-name
```

Systems Manager 参数具有版本支持。参数的每个迭代将分配一个唯一的版本号。您可以按如下方式引用参数的版本，其中 `version` 是唯一版本号。默认情况下，未指定版本时将使用参数的最新版本。

```
resolve:ssm:parameter-name:version
```

要使用 AWS 提供的公有参数启动实例，请参阅[使用 Systems Manager 公共参数引用最新的 AMI](finding-an-ami-parameter-store.md)。

------
#### [ Console ]

**使用 Systems Manager 参数查找 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航栏，选择您在其中启动实例的区域。您可以选择向您提供的任何区域，无需理会您身处的位置。

1. 从控制台控制面板中，选择**启动实例**。

1. 在**应用程序和操作系统镜像（Amazon 机器映像）**下，选择**浏览其他 AMI**。

1. 选择搜索栏右侧的箭头按钮，然后选择 **Search by Systems Manager parameter**（按 Systems Manager 参数搜索）。

1. 对于 **Systems Manager 参数 (Systems Manager 参数)**，请选择一个参数。相应的 AMI ID 将显示在 **Currently resolves to**（当前解析为）下方。

1. 选择**搜索**。与 AMI ID 匹配的 AMI 将显示在列表中。

1. 从列表中选择 AMI，然后选择**选择**。

有关使用启动实例向导启动实例的更多信息，请参阅 [使用控制台中的启动实例向导来启动 EC2 实例](ec2-launch-instance-wizard.md)。

------
#### [ AWS CLI ]

**使用 Systems Manager 参数启动实例**  
使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令和 `--image-id` 选项。此示例使用名为 **golden-ami** 的 Systems Manager 参数来指定 AMI ID。

```
--image-id resolve:ssm:/golden-ami
```

您可以为 Systems Manager 参数创建若干版本。以下示例指定了 **golden-ami** 参数的版本 2。

```
--image-id resolve:ssm:/golden-ami:2
```

------
#### [ PowerShell ]

**使用 Systems Manager 参数启动实例**  
将 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 与 `-ImageId` 参数结合使用。此示例使用名为 **golden-ami** 的 Systems Manager 参数来指定 AMI ID。

```
-ImageId "resolve:ssm:/golden-ami"
```

您可以为 Systems Manager 参数创建若干版本。以下示例指定了 **golden-ami** 参数的版本 2。

```
-ImageId "resolve:ssm:/golden-ami:2"
```

------

# 使用 Systems Manager 公共参数引用最新的 AMI
<a name="finding-an-ami-parameter-store"></a>

AWS Systems Manager 为 AWS 维护的公有 AMI 提供公有参数。您可以在启动实例时使用公有参数来确保使用最新 AMI。例如，公有参数 `/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-arm64` 在所有区域中均可用，并且始终指向给定区域中适用于 arm64 架构的最新版本 Amazon Linux 2023 AMI。

在以下路径中提供公有参数：
+ **Linux** – `/aws/service/ami-amazon-linux-latest`
+ **Windows** – `/aws/service/ami-windows-latest`

有关更多信息，请参阅《AWS Systems Manager 用户指南》**中的[使用公共参数](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-public-parameters.html)。

## 列出 Amazon Linux AMI
<a name="list-ami-amazon-linux-latest"></a>

------
#### [ AWS CLI ]

**列出当前 AWS 区域中的 Linux AMI**  
使用以下 [get-parameters-by-path](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-parameters-by-path.html) 命令。`--path` 参数的值因 Linux AMI 而异。

```
aws ssm get-parameters-by-path \
    --path /aws/service/ami-amazon-linux-latest \
    --query "Parameters[].Name"
```

------
#### [ PowerShell ]

**列出当前 AWS 区域中的 Linux AMI**  
使用 [Get-SSMParametersByPath](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-SSMParametersByPath.html) cmdlet。

```
Get-SSMParametersByPath `
    -Path "/aws/service/ami-amazon-linux-latest" | `
    Sort-Object Name | Format-Table Name
```

------

## 列出 Windows AMI
<a name="list-ami-windows-latest"></a>

------
#### [ AWS CLI ]

**列出当前 AWS 区域中的 Windows AMI**  
使用以下 [get-parameters-by-path](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-parameters-by-path.html) 命令。`--path` 参数的值因 Windows AMI 而异。

```
aws ssm get-parameters-by-path \
    --path /aws/service/ami-windows-latest \
    --query "Parameters[].Name"
```

------
#### [ PowerShell ]

**列出当前 AWS 区域中的 Windows AMI**  
使用 [Get-SSMParametersByPath](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-SSMParametersByPath.html) cmdlet。

```
Get-SSMParametersByPath `
    -Path "/aws/service/ami-windows-latest" | `
    Sort-Object Name | Format-Table Name
```

------

## 使用公有参数启动实例
<a name="launch-instance-public-parameter"></a>

要在启动实例时指定此公有参数，请使用以下语法 `resolve:ssm:public-parameter`，其中 `resolve:ssm` 是标准前缀，`public-parameter` 是公有参数的路径和名称。

------
#### [ AWS CLI ]

**使用公有参数启动实例**  
使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令和 `--image-id` 选项。此示例为该映像 ID 指定了一个 Systems Manager 公有参数，以使用最新版本的 Amazon Linux 2023 AMI 启动实例

```
--image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
```

------
#### [ PowerShell ]

**使用公有参数启动实例**  
将 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 与 `-ImageId` 参数结合使用。此示例为该映像 ID 指定了一个 Systems Manager 公有参数，以使用最新版本适用于 Windows Server 2022 的 AMI 启动实例。

```
-ImageId "resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base"
```

------

有关使用 Systems Manager 参数的更多示例，请参阅 [Query for the latest Amazon Linux AMI IDs Using AWS Systems Manager Parameter Store](https://aws.amazon.com/blogs/compute/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/) 和 [Query for the Latest Windows AMI Using AWS Systems Manager Parameter Store](https://aws.amazon.com/blogs/mt/query-for-the-latest-windows-ami-using-systems-manager-parameter-store/)。

# AWS Marketplace 中适用于 Amazon EC2 实例的付费 AMI
<a name="paid-amis"></a>

*付费 AMI* 是在 AWS Marketplace 中列出销售的 AMI。AWS Marketplace 是一个在线商店，您可以从中购买在 AWS 上运行的软件，包括可用来启动 EC2 实例的 AMI。AWS Marketplace AMI 分为各种类别（如开发人员工具），您可以根据自己的要求查找产品。有关 AWS Marketplace 的更多信息，请参阅 [AWS Marketplace](https://aws.amazon.com/marketplace) 网站。

您可以在 AWS Marketplace 中从第三方购买 AMI，包括具有 Red Hat 等组织的服务合同的 AMI。您还可以创建 AMI 并在 AWS Marketplace 中将其出售给其他 Amazon EC2 用户。如果遵循一些简单的指导，为公共使用构建安全、可靠、可用的 AMI 的过程可以很简单。有关如何创建和使用共享 AMI 的信息，请参阅[了解 Amazon EC2 中共享 AMI 的使用情况](sharing-amis.md)。

从付费 AMI 启动实例与从任何其他 AMI 启动实例的方式相同。不需要额外参数。实例根据 AMI 拥有者设置的费率以及相关 Web 服务的标准使用费（例如，在 Amazon EC2 中运行 m5.small 实例类型的小时费率）来收费。还可能需要支付其他税款。付费 AMI 拥有者可以确认是否使用该付费 AMI 启动特定实例。

**重要**  
Amazon DevPay 不再接受新的卖家或产品。AWS Marketplace 现在是通过 AWS 销售软件和服务的统一电子商务平台。有关如何从 AWS Marketplace 部署和销售软件的信息，请参阅[在 AWS Marketplace 中出售](https://aws.amazon.com/marketplace/partners/management-tour)。AWS Marketplace 支持受 Amazon EBS 支持的 AMI。

**Topics**
+ [

## 在 AWS Marketplace 中销售您的 AMI
](#selling-your-ami)
+ [

# 查找付费 AMI
](using-paid-amis-finding-paid-ami.md)
+ [

# 在 AWS Marketplace 中购买付费 AMI
](using-paid-amis-purchasing-paid-ami.md)
+ [

# 从您的实例中检索 AWS Marketplace 产品代码
](get-product-code.md)
+ [

# 为支持的 AWS Marketplace 产品使用付费支持
](using-paid-amis-support.md)
+ [

## 付费和支持 AMI 的账单
](#using-paid-amis-bills)
+ [

# 管理您的 AWS Marketplace 订阅
](marketplace-manage-subscriptions.md)

## 在 AWS Marketplace 中销售您的 AMI
<a name="selling-your-ami"></a>

您可以使用 AWS Marketplace 销售 AMI。AWS Marketplace 提供组织有序的购物体验。此外，AWS Marketplace 还支持 AWS 功能，如 Amazon EBS-backed AMI、预留实例和竞价型实例。

有关如何在 AWS Marketplace 中出售 AMI 的信息，请参阅[在 AWS Marketplace 中出售](https://aws.amazon.com/marketplace/partners/management-tour)。

# 查找付费 AMI
<a name="using-paid-amis-finding-paid-ami"></a>

付费 AMI 是可供购买的亚马逊机器映像（AMI）。付费 AMI 也有产品代码。您可以查找可通过 AWS Marketplace 购买的 AMI。

------
#### [ Console ]

**查找付费 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 对于第一个筛选条件，选择**公有映像**。

1. 请执行以下操作之一：
   + 如果您知道产品代码，请选择 **Product code**（产品代码），再选择 **=**，然后输入产品代码。
   + 如果您不知道产品代码，请在搜索栏中指定以下筛选条件：**所有者别名=aws-marketplace**。根据需要指定其他筛选条件。

1. 保存 AMI 的 ID。

------
#### [ AWS CLI ]

**查找付费 AMI**  
使用以下 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images --owners aws-marketplace
```

输出中包含大量映像。您可以通过指定筛选条件来帮助确定所需的 AMI。找到 AMI 后，请在以下命令中指定其 ID 来获取产品代码。

```
aws ec2 describe-images \
    --image-ids ami-0abcdef1234567890 \
    --query Images[*].ProductCodes[].ProductCodeId
```

下面是示例输出。

```
[
    "cdef1234abc567def8EXAMPLE"
]
```

如果您知道产品代码，可以按产品代码筛选结果。此示例返回具有指定产品代码的最新 AMI。

```
aws ec2 describe-images \
    --filters "Name=product-code,Values=cdef1234abc567def8EXAMPLE" \
    --query "sort_by(Images, &CreationDate)[-1].[ImageId]"
```

------
#### [ PowerShell ]

**查找付费 AMI**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
Get-EC2Image -Owner aws-marketplace
```

输出中包含大量映像。您可以通过指定筛选条件来帮助确定所需的 AMI。找到 AMI 后，请在以下命令中指定其 ID 来获取产品代码。

```
(Get-EC2Image -ImageId ami-0abcdef1234567890).ProductCodes
```

下面是示例输出。

```
ProductCodeId             ProductCodeType
-------------             ---------------
cdef1234abc567def8EXAMPLE marketplace
```

如果您知道产品代码，可以按产品代码筛选结果。此示例返回具有指定产品代码的最新 AMI。

```
(Get-EC2Image -Owner aws-marketplace -Filter @{"Name"="product-code";"Value"="cdef1234abc567def8EXAMPLE"} | sort CreationDate -Descending | Select-Object -First 1).ImageId
```

------

# 在 AWS Marketplace 中购买付费 AMI
<a name="using-paid-amis-purchasing-paid-ami"></a>

必须先注册（购买）付费 AMI，然后才能使用该 AMI 启动 Amazon EC2 实例。

通常情况下，付费 AMI 的卖方会为您提供 AMI 的相关信息，包括其价格以及购买网站链接。单击该链接时，首先会提示您登录 AWS，然后可以购买 AMI。

## 使用控制台购买付费 AMI
<a name="purchase-paid-ami-console"></a>

可以使用 Amazon EC2 启动向导购买付费 AMI。有关更多信息，请参阅[从 AWS Marketplace AMI 中启动 Amazon EC2 实例](launch-marketplace-console.md)。

## 使用 AWS Marketplace 订阅产品
<a name="subscribe-to-paid-ami"></a>

要使用 AWS Marketplace，必须拥有 AWS 账户。要从 AWS Marketplace 产品启动实例，必须注册以使用 Amazon EC2 服务，并且必须订阅从中启动实例的产品。您可以使用以下方法之一在 AWS Marketplace 中订阅产品：
+ **AWS Marketplace 网站**：您可以使用一键部署功能快速启动预配置的软件。有关更多信息，请参阅 [AMI-based products in AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-server-products.html)。
+ **Amazon EC2 启动向导**：您可以直接从向导搜索 AMI 并启动实例。有关更多信息，请参阅 [从 AWS Marketplace AMI 中启动 Amazon EC2 实例](launch-marketplace-console.md)。

# 从您的实例中检索 AWS Marketplace 产品代码
<a name="get-product-code"></a>

可以使用实例元数据检索实例的 AWS Marketplace 产品代码。如果实例具有产品代码，则 Amazon EC2 将返回产品代码。有关检索元数据的更多信息，请参阅 [访问 EC2 实例的实例元数据](instancedata-data-retrieval.md)。

------
#### [ IMDSv2 ]

**Linux**  
在 Linux 实例上运行以下命令。

```
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
    && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/product-codes
```

**Windows**  
在 Windows 实例上运行以下 cmdlet。

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
    -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} `
    -Method GET -Uri http://169.254.169.254/latest/meta-data/product-codes
```

------
#### [ IMDSv1 ]

**Linux**  
在 Linux 实例上运行以下命令。

```
curl http://169.254.169.254/latest/meta-data/product-codes
```

**Windows**  
在 Windows 实例上运行以下命令。

```
Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/product-codes
```

------

# 为支持的 AWS Marketplace 产品使用付费支持
<a name="using-paid-amis-support"></a>

Amazon EC2 还使开发人员可以为软件（或派生 AMI）提供支持。开发人员可以创建您可注册使用的支持产品。在注册支持产品的过程中，开发人员会为您提供产品代码，您必须将该代码与您自己的 AMI 关联起来。这样，开发人员就能确认您的实例有获取支持的权限。此外，还能确保您在运行产品实例时，按照开发人员指定的产品使用条款付费。

**限制**
+ 设置产品代码属性后，将不能更改或移除该属性。
+ 不能将支持产品用于预留实例。通常情况下，您需按支持产品卖方指定的价格付费。

------
#### [ AWS CLI ]

**将产品代码关联到 AMI**  
使用 [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 命令。

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --product-codes "cdef1234abc567def8EXAMPLE"
```

------
#### [ PowerShell ]

**将产品代码关联到 AMI**  
使用 [Edit-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html) cmdlet。

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -ProductCode "cdef1234abc567def8EXAMPLE"
```

------

## 付费和支持 AMI 的账单
<a name="using-paid-amis-bills"></a>

在每个月月底，您会收到一封电子邮件，邮件里注明了该月因使用任何付费和受支持的 AMI 所产生的信用卡付费金额情况。这个账单与您的常规 Amazon EC2 账单是分开的。有关更多信息，请参阅 *AWS Marketplace 买家指南*中的[为产品付费](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-paying-for-products.html)。

# 管理您的 AWS Marketplace 订阅
<a name="marketplace-manage-subscriptions"></a>

在 AWS Marketplace 网站上，您可以检查订阅详细信息，查看供应商的使用说明，管理订阅等。

## 查看 订阅详细信息
<a name="check-sub-details"></a>

**检查订阅详细信息**

1.  登录 [AWS Marketplace](https://aws.amazon.com/marketplace)。

1. 选择 **Your Marketplace Account**。

1. 选择 **Manage your software subscriptions**。

1. 会列出当前所有订阅。选择**使用说明**以查看使用产品的特定说明，例如，用于连接到运行中的实例的用户名。

## 取消订阅
<a name="cancel-sub"></a>

**注意**  
取消订阅不会终止使用该 AMI 启动的实例。我们将继续对您正在运行的实例计费，直至其被终止。您必须终止使用该 AMI 启动的所有实例才能停止对该订阅付费。
取消了订阅之后，您无法再从该 AMI 启动任何实例。要再次使用该 AMI，您需要在 AWS Marketplace 网站上或通过 Amazon EC2 控制台中的启动向导重新订阅它。

**取消 AWS Marketplace 订阅**

1. 要停止对订阅计费，请确保您已终止从该订阅运行的所有实例。
**警告**  
**终止实例是永久且不可逆转的。**  
终止一个实例后，您将无法再连接到该实例，而且也无法对其进行恢复操作。被配置为在终止后删除的所有连接的 Amazon EBS 卷也将被永久删除并且无法恢复。实例存储卷中存储的所有数据将永久丢失。有关更多信息，请参阅 [实例终止的工作原理](how-ec2-instance-termination-works.md)。  
在终止实例之前，请务必确保已将需要在终止后保留的所有数据备份到持久存储中。

   1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

   1. 在导航窗格中，选择 **Instances (实例)**。

   1. 选择相应实例，然后依次选择**实例状态**、**终止（删除）实例**。

   1. 当系统提示您确认时，选择**终止（删除）**。

1. 登录到 [AWS Marketplace](https://aws.amazon.com/marketplace)，选择 **Your Marketplace Account（您的 Marketplace 账户）**，然后选择 **Manage your software subscriptions（管理您的软件订阅）**。

1. 选择 **Cancel subscription**。会提示您确认取消。

# Amazon EC2 AMI 生命周期
<a name="ami-lifecycle"></a>

亚马逊机器映像（AMI）包含了设置和启动实例所需的软件配置。在启动实例时，您必须指定 (AMI)。您也可以使用 Amazon 提供的 AMI，也可以创建自己的 AMI。该 AMI 必须位于要从中启动实例的 AWS 区域。

AMI 的生命周期包括创建、复制、弃用、禁用和删除（注销）AMI。

**创建 AMI。**您可以使用 Amazon 提供的 AMI 来启动实例，也可以根据自己的需要创建自定义 AMI。要创建自定义 AMI，请从某个现有的 AMI 启动一个实例，对其进行自定义（例如，安装软件和配置操作系统设置），然后利用该实例创建一个 AMI。任何实例自定义都将保存到此新 AMI 中，从而确保利用您的新 AMI 启动的实例包含这些自定义。

**可认证的 AMI。**要创建支持 EC2 实例认证的 AMI，请参阅[可证明的 AMI](attestable-ami.md)。

**复制 AMI。**您只能在 AMI 所在的 AWS 区域使用该 AMI 启动实例。如果需要在多个区域启动具有相同配置的实例，请将该 AMI 复制到其他区域。

**弃用 AMI。**要将 AMI 标记为已取代或已过时，您可以设置立即弃用或某个未来弃用日期。已弃用的 AMI 会从 AMI 列表中隐藏，但如果用户和服务知道 AMI ID，则可以继续使用已弃用的 AMI。

**禁用 AMI。**要暂时阻止使用 AMI，可以禁用该 AMI。禁用某个 AMI 之后，其无法用于启动新实例。不过，如果您重新启用该 AMI，其可用于再次启动实例。请注意，禁用 AMI 不会影响已经从中启动的现有实例。

**注销（删除）AMI。**不再需要某个 AMI 时，可以将其注销，防止将其用于启动新实例。如果 AMI 符合某个留存规则，则会转移至回收站，并且可在留存期届满之前从回收站还原，但在留存期届满后将被永久删除。如果不符合任何留存规则，则会立即被永久删除。请注意，注销 AMI 不会影响利用该 AMI 启动的现有实例。

**自动化 AMI 生命周期。**您可以使用 Amazon Data Lifecycle Manager 来自动创建、保留、复制、弃用和取消注册 Amazon EBS-backed AMI 及其备份快照。您还可以使用 EC2 Image Builder 自动创建、管理和部署自定义 AMI。有关更多信息，请参阅《Amazon EBS 用户指南》中的 [Automate backups with Amazon Data Lifecycle Manager](https://docs.aws.amazon.com/ebs/latest/userguide/snapshot-lifecycle.html)**和 [EC2 Image Builder 用户指南](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html)。

**Topics**
+ [创建 AMI](creating-an-ami-ebs.md)
+ [

# 创建 Amazon S3 支持的 AMI
](creating-an-ami-instance-store.md)
+ [使用 Windows Sysprep 创建 AMI](ami-create-win-sysprep.md)
+ [复制 AMI](CopyingAMIs.md)
+ [存储和还原 AMI](ami-store-restore.md)
+ [AMI 世系](ami-ancestry.md)
+ [AMI 使用情况](ec2-ami-usage.md)
+ [弃用 AMI](ami-deprecate.md)
+ [禁用 AMI](disable-an-ami.md)
+ [取消注册 AMI](deregister-ami.md)

# 创建 Amazon EBS-backed AMI
<a name="creating-an-ami-ebs"></a>

您可以从 Amazon EC2 实例或从 Amazon EC2 实例的根卷快照创建自己的 Amazon EBS-backed AMI。

要从实例创建 Amazon EBS-backed AMI，请先使用现有的 Amazon EBS-backed AMI 启动一个实例。此 AMI 可以是从 AWS Marketplace 获得的 AMI，可以是使用 [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html) 创建的 AMI，也可以是能够访问的任何其他 AMI。自定义满足特定要求的实例后，创建新的 AMI 并加以注册。然后，即可使用新的 AMI 启动具有自定义项的新实例。

**注意**  
要创建支持 EC2 实例认证的 AMI，请参阅[可证明的 AMI](attestable-ami.md)。

下述过程适用于由加密的 Amazon Elastic Block Store (Amazon EBS) 卷（包括根卷）支持的 Amazon EC2 实例，也适用于未加密卷。

用于 Amazon S3 支持的 AMI 的 AMI 创建过程有所不同。有关更多信息，请参阅 [创建 Amazon S3 支持的 AMI](creating-an-ami-instance-store.md)。

**Topics**
+ [

## 关于从实例创建 AMI 的概述
](#process-creating-an-ami-ebs)
+ [

## 从实例创建 AMI
](#how-to-create-ebs-ami)
+ [

## 从快照创建 AMI
](#creating-launching-ami-from-snapshot)

## 关于从实例创建 AMI 的概述
<a name="process-creating-an-ami-ebs"></a>

以下图表概述了从运行中的 EC2 实例创建 Amazon EBS-backed AMI 的流程：从现有 AMI 开始，启动实例，自定义该实例，从该实例创建新 AMI，并最终启动新 AMI 的实例。图中的数字与以下描述中的数字匹配。

![\[从实例创建 AMI 的工作流程\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/running-instance.png)


**1 – AMI \$11：从现有的 AMI 开始**  
查找类似于您要创建的 AMI 的现有 AMI。这可以是您从 AWS Marketplace 获得的 AMI、您使用 [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html) 创建的 AMI 或您可以访问的任何其他 AMI。您将根据自己的需求自定义此 AMI。  
在图中，**EBS 根卷快照 \$11** 表示 AMI 为 Amazon EBS-backed AMI，并且有关根卷的信息存储在此快照中。

**2 – 从现有 AMI 启动实例**  
配置 AMI 的方法是从您希望作为新 AMI 基础的 AMI 启动实例，然后自定义该实例（在图中以 **3** 表示）。然后，您将创建一个包含自定义项的新 AMI（在图中以 **4** 表示）。

**3 – EC2 实例 \$11：自定义实例**  
连接到您的实例并根据您的需求对其进行自定义。您的新 AMI 将包含这些自定义项。  
您可以对您的实例执行以下任何操作，以便自定义该实例：  
+ 安装软件和应用程序
+ 复制数据
+ 通过删除临时文件和对您的硬盘进行碎片整理来缩短启动时间
+ 附加其他 EBS 卷

**4 – 创建映像**  
当您从实例中创建 AMI 时，Amazon EC2 先切断实例的电源再创建 AMI，以确保创建过程中实例上的所有内容均停止并保持一致状态。如果您确信您的实例处于适合 AMI 创建的一致状态，则可以告知 Amazon EC2 不断电和重启实例。一些文件系统 (例如 XFS) 可以冻结和解冻活动，因此能在不重启实例的情况下安全创建映像。  
在 AMI 创建过程中，Amazon EC2 会创建您实例的根卷和附加到您实例的任何其他 EBS 卷的快照。在[注销 AMI](deregister-ami.md) 并删除快照之前，您需要支付快照的费用。如果有任何附加到实例的卷进行了加密，则新 AMI 只会在支持 Amazon EBS 加密的实例上成功启动。  
根据卷的大小，可能需要几分钟才能完成 AMI 创建过程 (有时长达 24 小时)。您可能会发现先创建卷的快照，然后再创建 AMI 后会更高效。这样，创建 AMI 时就只需创建小的增量快照，且创建过程完成得更快 (快照创建的总时间保持不变)。

**5 – AMI \$12：新 AMI**  
该过程完成之后，您便具有从实例的根卷创建的新 AMI 和快照（**快照 \$12**）。如果除了根卷之外，您还向实例添加了实例存储卷或 EBS 卷，则新 AMI 的块设备映射包含这些卷的信息。  
Amazon EC2 自动为您注册 AMI。

**6 – 从新 AMI 启动实例**  
您可以使用新 AMI 启动实例。

**7 – EC2 实例 \$12：新实例**  
当您使用新 AMI 启动实例时，Amazon EC2 会使用快照为实例的根卷创建新 EBS 卷。如果您在自定义实例时添加了实例存储卷或 EBS 卷，则新 AMI 的块设备映射包含这些卷的信息，并且您从新 AMI 启动的实例的块设备映射自动包含这些卷的信息。新实例的块储存设备映射中指定的实例存储卷是新的，不包含用于创建 AMI 的实例的实例存储卷中的任何数据。EBS 卷上的数据会持久保留。有关更多信息，请参阅[Amazon EC2 实例上卷的块设备映射](block-device-mapping-concepts.md)。  
当您从由 EBS 支持的 AMI 创建新实例时，应该先初始化其根卷及任何额外的 EBS 存储，然后再将其投入生产。有关更多信息，请参阅《Amazon EBS 用户指南》**中的[初始化 Amazon EBS 卷](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-initialize.html)。

## 从实例创建 AMI
<a name="how-to-create-ebs-ami"></a>

如果您有现有实例，则可以通过该实例创建 AMI。

------
#### [ Console ]

**创建 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择要从中创建 AMI 的实例，然后选择 **Actions**（操作）、**Image and templates**（映像和模板）、**Create image**（创建映像）。
**提示**  
如果该选项处于禁用状态，则表明您的实例不是由 Amazon EBS 支持的实例。

1. 在 **Create image**（创建映像）页面上，请指定以下信息：

   1. 对于 **Image name**（映像名称），请输入映像的唯一名称，最多 127 个字符。

   1. 对于 **Image description**（映像描述），输入映像的可选描述，最多 255 个字符。

   1. 对于**重启实例**，请保持选中该复选框（默认），或将其清除。
      + 如果选择**重启实例**，则 Amazon EC2 创建新 AMI 时，会重启该实例，以便其可以在数据处于静态状态时拍摄附加卷的快照，以确保一致的状态。
      + 如果清除**重启实例**，则 Amazon EC2 创建新 AMI 时，不会关闭和重启实例。
**警告**  
如果您清除**重启实例**，则我们无法保证所创建映像的文件系统完整性。

   1. **Instance volumes**（实例卷）– 您可以修改根卷，并添加其他 Amazon EBS 和实例存储卷，如下所示：

      1. 根卷在第一行中定义。
         + 要更改根卷的大小，请在 ** Size (尺寸)** 中输入所需的值。
         + 如果选择 **Delete on Termination (终止时删除)**，则当您终止从此 AMI 创建的实例时，将删除 EBS 卷。如果取消选择 **Delete on Termination (终止时删除)**，则当您终止实例时，不会删除 EBS 卷。有关更多信息，请参阅[实例终止时保留数据](preserving-volumes-on-termination.md)。

      1. 要添加 EBS 卷，请选择 **Add New Volume**（添加新卷）（这将添加一个新行）。对于**存储类型**，选择 **EBS**，并填写行中的字段。当您从新的 AMI 启动实例时，额外的卷会自动附加到该实例。您必须格式化并挂载空卷。您必须挂载基于快照的卷。

      1. 要添加实例存储卷，请参阅 [将实例存储卷添加到 Amazon EC2 AMI](adding-instance-storage-ami.md)。当您从新的 AMI 启动实例时，这些额外的卷会自动初始化并挂载。这些卷不包含您的 AMI 所基于的运行实例的实例存储卷上的数据。

   1. **快照目标**：如果实例卷位于支持 EBS 本地快照的本地区域中，请选择创建 AMI 快照的位置：
      + **AWS 区域**：在卷的本地区域的父区域中创建快照。
      + **AWS 本地区域**：在与卷相同的本地区域中创建快照。
**注意**  
此选项仅在支持 EBS 本地快照的本地区域中出现，并且仅当您的实例是在本地区域中创建时才会出现。如果卷位于某个区域中，则不会出现此选项，快照会自动在与卷相同的区域中创建。有关更多信息，请参阅《Amazon EBS User Guide》**中的 [Local snapshots in Local Zones](https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-localzones.html)。
**重要**  
实例卷的所有快照都必须位于同一位置。验证现有快照的位置。如果任何现有快照的位置与您选择的目标不同，AMI 创建将失败。

   1. **标签** – 您可以使用相同的标签来标记 AMI 和快照，也可以使用不同的标签来标记它们。
      + 要使用*相同*标签标记的 AMI 和快照，请选择 **Tag image and snapshots together (将映像和快照一起标记)**。相同的标签将应用于 AMI 和创建的每个快照。
      + 要使用*不同*的标签标记 AMI 和快照，请选择 **Tag image and snapshots separately (分别标记映像和快照)**。对 AMI 和创建的快照应用了不同的标签。但是，所有快照都获得相同的标签；您不能使用不同的标签来标记每个快照。

      要添加标签，请选择 **Add tag (添加标签)**，然后输入该标签的键和值。对每个标签重复此操作。

   1. 准备好创建 AMI 时，选择 **Create image**（创建映像）。

1. 若要在创建 AMI 时查看其状态，请执行以下操作：

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

   1. 将筛选条件设置为 **Owned by me**（我拥有的），然后在列表中查找您的 AMI。

      最初，状态是 `pending`，但过几分钟就会变成 `available`。

1. （可选）若要查看为新 AMI 创建的快照，请执行以下操作：

   1. 记下您在上一步骤中找到的 AMI ID。

   1. 在导航窗格中，选择**快照**。

   1. 将筛选条件设置为 **Owned by me**（我拥有的），然后在 **Description**（描述）列中查找具有新 AMI ID 的快照。

      您从此 AMI 启动实例时，Amazon EC2 使用此快照创建实例的根卷。

------
#### [ AWS CLI ]

**创建 AMI**  
使用 [create-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-image.html) 命令。

```
aws ec2 create-image \
    --instance-id i-1234567890abcdef0 \
    --name "my-web-server" \
    --description "My web server image" \
    --no-reboot
```

------
#### [ PowerShell ]

**创建 AMI**  
使用 [New-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Image.html) cmdlet。

```
New-EC2Image `
    -InstanceId i-1234567890abcdef0 ` 
    -Name "my-web-server" `
    -Description "My web server image" `
    -NoReboot $true
```

------

## 从快照创建 AMI
<a name="creating-launching-ami-from-snapshot"></a>

如果您有实例根卷的快照，则可以通过此快照创建 AMI。

**注意**  
在大多数情况下，适用于 Windows、Red Hat、SUSE 和 SQL Server 的 AMI 需要在 AMI 上提供正确的许可信息。有关更多信息，请参阅 [了解 AMI 账单信息](ami-billing-info.md)。从快照创建 AMI 时，`RegisterImage` 操作会从快照的元数据获取正确的账单信息，但这需要存在相应的元数据。要验证是否应用了正确的账单信息，请检查新 AMI 上的**平台详细信息**字段。如果该字段为空或不匹配预期的操作系统代码（例如 Windows、Red Hat、SUSE 或 SQL），则 AMI 创建失败，您应丢弃 AMI 并按照[从实例创建 AMI](#how-to-create-ebs-ami)中的说明进行操作。

------
#### [ Console ]

**从快照创建 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**快照**。

1. 选择从中创建 AMI 的快照并选择 **Actions**（操作）、**Create image from snapshot**（从快照创建映像）。

1. 在**从快照创建映像**页面上，请指定以下信息：

   1. 对于 **Image name**（镜像名称），请输入镜像的描述性名称。

   1. 对于 **Description**（描述），请输入镜像的简短描述。

   1. 对于 **Architecture**（架构），请选择镜像架构。对于 32 位选择 **i386**，对于 64 位选择 **x86\$164**，对于 64 位 ARM 选择 **arm64**，或者对于 64 位 macOS 选择 **x86\$164**。

   1. 对于**根设备名称**，请输入要用于根卷的设备名称。有关更多信息，请参阅 [Amazon EC2 实例上卷的设备名称](device_naming.md)。

   1. 对于 **Virtualization type**（虚拟化类型），请选择从此 AMI 启动的实例要使用的虚拟化类型。有关更多信息，请参阅 [虚拟化类型](ComponentsAMIs.md#virtualization_types)。

   1. （仅适用于半虚拟化）对于 **Kernel ID**（内核 ID），选择镜像的操作系统内核。如果您使用的是实例的根卷快照，请选择与原始实例相同的内核 ID。如果您不确定，请使用默认内核。

   1. （仅适用于半虚拟化）对于 **RAM disk ID**（RAM 磁盘 ID），请选择镜像的 RAM 磁盘。如果您选择了一个特定内核，则您可能需要选择带有可支持该内核的驱动程序的某个特定 RAM 磁盘。

   1. 对于**启动模式**，选择映像的启动模式，或者选择**使用默认值**，以便在使用此 AMI 启动实例时，它会以该实例类型支持的启动模式启动。有关更多信息，请参阅 [设置 Amazon EC2 AMI 的启动模式](set-ami-boot-mode.md)。

   1. （可选）在**块设备映射**部分中，自定义根卷并添加其它数据卷。

      对于每个卷，您可以指定大小、类型、性能特征、终止时删除的行为以及加密状态。对于根卷，其大小不能小于快照的大小。对于卷类型，默认选择为通用型 SSD `gp3`。

   1. （可选）在**标签**下，您可以向新的 AMI 添加一个或多个标签。要添加标签，请选择 **Add tag (添加标签)**，然后输入该标签的键和值。对每个标签重复此操作。

   1. 准备好创建 AMI 时，选择 **Create image**（创建映像）。

1. （仅适用于 Windows、Red Hat、SUSE 和 SQL Server）要验证是否应用了正确的账单信息，请检查新 AMI 上的**平台详细信息**字段。如果该字段为空或不匹配预期的操作系统代码（例如 **Windows** 或 **Red Hat**），则 AMI 创建失败，您应丢弃 AMI 并按照[从实例创建 AMI](#how-to-create-ebs-ami)中的说明进行操作。

------
#### [ AWS CLI ]

**使用 AWS CLI 从快照创建 AMI**  
使用 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 命令。

```
aws ec2 register-image \
    --name my-image \
    --root-device-name /dev/xvda \
    --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0db2cf683925d191f}
```

------
#### [ PowerShell ]

**使用 PowerShell 从快照创建 AMI**  
使用 [Register-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet。

```
$block = @{SnapshotId=snap-0db2cf683925d191f}
Register-EC2Image `
    -Name my-image `
    -RootDeviceName /dev/xvda `
    -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block}
```

------

# 创建 Amazon S3 支持的 AMI
<a name="creating-an-ami-instance-store"></a>

您在启动实例时指定的 AMI 决定根卷的类型

要创建 Amazon S3 支持的 Linux AMI，请通过从 Amazon S3 支持的现有 Linux AMI 启动的实例开始进行。根据您自己的需要自定义该实例之后，请捆绑卷并注册新 AMI，您可以使用该 AMI 启动具有这些自定义项的新实例。

您无法创建 Amazon S3 支持的 Windows AMI，因为 Windows AMI 不支持根卷的实例存储。

**重要**  
只有以下实例类型支持将实例存储卷作为根卷，并且需要 Amazon S3 支持的 AMI：C1、C3、D2、I2、M1、M2、M3、R3 和 X1。

用于 Amazon EBS-backed AMI 的 AMI 创建过程有所不同。有关更多信息，请参阅 [创建 Amazon EBS-backed AMI](creating-an-ami-ebs.md)。

**Topics**
+ [

## AMI 创建概述
](#process-creating-an-ami-instance-store)
+ [

## 先决条件
](#bundle-ami-prerequisites)
+ [

## 从 Amazon Linux 实例创建 AMI
](#amazon_linux_instructions)
+ [

# 设置 Amazon EC2 AMI 工具
](set-up-ami-tools.md)
+ [

# Amazon EC2 AMI 工具参考
](ami-tools-commands.md)
+ [

# 将 Amazon S3 支持的 AMI 转换为 EBS-backed AMI
](Using_ConvertingS3toEBS.md)

## AMI 创建概述
<a name="process-creating-an-ami-instance-store"></a>

下图总结了从具有实例存储根卷的实例创建 AMI 的过程。

![\[创建 Amazon S3 支持的 Linux AMI。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami_create_instance_store.png)


首先，从类似于您要创建的 AMI 的 AMI 启动实例。您可以连接到您的实例并进行自定义。根据您的需要设置好实例后，您可以捆绑它。完成捆绑过程需要几分钟的时间。该过程完成之后，您会得到一个捆绑，该捆绑由映像清单 (`image.manifest.xml`) 以及包含根卷模板的文件 (`image.part.`*xx*) 组成。接下来，将该捆绑上传到 Amazon S3 存储桶，然后注册您的 AMI。

**注意**  
要将对象上载到 Amazon S3 支持的 Linux AMI 的 S3 存储桶，必须为该存储桶启用 ACL。否则，Amazon EC2 将无法在要上载的对象上设置 ACL。如果您的目标存储桶使用存储桶拥有者强制执行的 S3 对象所有权设置，则这将不起作用，因为 ACL 已禁用。有关更多信息，请参阅[为您的存储桶控制对象所有权和禁用 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)。

当您使用新 AMI 启动实例时，我们会使用您上传到 Amazon S3 的捆绑为实例创建根卷。Amazon S3 中的捆绑使用的存储空间会使您的账户产生费用，直到将其删除。有关更多信息，请参阅 [取消注册 Amazon EC2 AMI](deregister-ami.md)。

如果除了根卷之外，您还向实例添加实例存储卷，则新 AMI 的块设备映射包含这些卷的信息，并且您从新 AMI 启动的实例的块设备映射自动包含这些卷的信息。有关更多信息，请参阅 [Amazon EC2 实例上卷的块设备映射](block-device-mapping-concepts.md)。

## 先决条件
<a name="bundle-ami-prerequisites"></a>

必须先完成以下任务才能创建 AMI：
+ 安装 AMI 工具。有关更多信息，请参阅[设置 Amazon EC2 AMI 工具](set-up-ami-tools.md)。
+ 安装 AWS CLI。有关更多信息，请参阅 [AWS CLI 入门](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。
+ 请确保您具有用于捆绑的 S3 存储桶，并且您的存储桶已启用 ACL。有关配置 ACL 的更多信息，请参阅 [配置 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/managing-acls.html)。
  + 要使用 AWS 管理控制台创建 S3 存储桶，请打开 Amazon S3 控制台（地址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)），然后选择**创建存储桶**。
  + 要使用 AWS CLI 创建 S3 存储桶，请使用 [mb](https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html) 命令。如果您安装的 AMI 工具版本为 1.5.18 或更高版本，则还可以使用 `ec2-upload-bundle` 命令创建 S3 存储桶。有关更多信息，请参阅 [ec2-upload-bundle](ami-tools-commands.md#ami-upload-bundle)。
+ 确保捆绑包中的文件未在 S3 存储桶中加密。如果您需要对 AMI 进行加密，则可以改用 EBS 支持的 AMI。有关更多信息，请参阅 [将加密与 EBS 支持的 AMI 结合使用](AMIEncryption.md)。
+ 确保您拥有您的 AWS 账户 ID。有关更多信息，请参阅 *AWS 账户管理参考指南*中的[查看 AWS 账户 身份](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html)。
+ 确保您拥有凭证以使用 AWS CLI。有关更多信息，请参阅《AWS Command Line Interface User Guide》**中的 [Authentication and access credentials for the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html)。
+ 确保您拥有 X.509 证书以及相应的私有密钥。
  + 如果您需要创建 X.509 证书，请参阅[管理签名证书](set-up-ami-tools.md#ami-tools-managing-certs)。X.509 证书和私有密钥用于加密和解密您的 AMI。
  + [中国（北京）] 使用 `$EC2_AMITOOL_HOME/etc/ec2/amitools/cert-ec2-cn-north-1.pem` 证书。
  + [AWS GovCloud（美国西部）] 使用 `$EC2_AMITOOL_HOME/etc/ec2/amitools/cert-ec2-gov.pem` 证书。
+ 连接到您的 实例并对其进行自定义。例如，您可以安装软件和应用程序、复制数据、删除临时文件及修改 Linux 配置。

## 从 Amazon Linux 实例创建 AMI
<a name="amazon_linux_instructions"></a>

以下过程介绍如何从运行 Amazon Linux 1 的具有实例存储根卷的实例创建 AMI。它们可能不适用于运行其他 Linux 发行版的实例。

**准备使用 AMI 工具 (仅限 HVM 实例)**

1. AMI 工具需要有 GRUB Legacy，才能正确启动。使用以下命令安装 GRUB：

   ```
   [ec2-user ~]$ sudo yum install -y grub
   ```

1. 使用以下命令安装分区管理程序包：

   ```
   [ec2-user ~]$ sudo yum install -y gdisk kpartx parted
   ```

**从具有实例存储根卷的 Amazon Linux 实例创建 AMI**

此过程假设您满足[先决条件](#bundle-ami-prerequisites)中的先决条件。

在以下示例中，将每个*用户输入占位符*替换为您自己的信息。

1. 将您的凭证上传到您的实例。我们使用这些凭证确保只有您和 Amazon EC2 才能访问您的 AMI。

   1. 在您的实例上为凭证创建临时目录，如下所示：

      ```
      [ec2-user ~]$ mkdir /tmp/cert
      ```

      这使您可以从创建的映像中排除您的凭证。

   1. 使用安全复制工具 (如 [scp](linux-file-transfer-scp.md)) 将 X.509 证书和对应的私有密钥从您的计算机复制到实例上的 `/tmp/cert` 目录。以下 `-i my-private-key.pem` 命令中的 **scp** 选项是您用于通过 SSH 连接到实例的私有密钥，而不是 X.509 私有密钥。例如：

      ```
      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/
      pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem  100%  717     0.7KB/s   00:00
      cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem  100%  685     0.7KB/s   00:00
      ```

   此外，由于这些是纯文本文件，所以您可以在文本编辑器中打开证书和密钥，并将其内容复制到 `/tmp/cert` 中的新文件。

1. <a name="step_with_bundle_path_amazon_linux"></a>通过从您的实例内部运行 [ec2-bundle-vol](ami-tools-commands.md#ami-bundle-vol) 命令，准备捆绑包以便上传到 Amazon S3。请务必指定 `-e` 选项以排除用于存储您的凭证的目录。默认情况下，捆绑过程不包括可能包含敏感信息的文件。这些文件包括 `*.sw`、`*.swo`、`*.swp`、`*.pem`、`*.priv`、`*id_rsa*`、`*id_dsa*` `*.gpg`、`*.jks`、`*/.ssh/authorized_keys` 和 `*/.bash_history`。要包括所有这些文件，请使用 `--no-filter` 选项。要包括其中部分文件，请使用 `--include` 选项。
**重要**  
默认情况下，AMI 捆绑过程在表示根卷的 `/tmp` 目录中创建经过压缩和加密的文件集合。如果您在 `/tmp` 中没有足够的可用磁盘空间来存储捆绑，则需要使用 `-d /path/to/bundle/storage` 选项指定不同的位置来存储捆绑。某些实例会在 `/mnt` 或 `/media/ephemeral0` 上装载您可以使用的临时存储，您还可以创建、连接和挂载新 Amazon EBS 卷以存储捆绑。有关更多信息，请参阅《Amazon EBS 用户指南》**中的[创建 Amazon EBS 卷](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html)。

   1. 您必须以根用户身份运行 **ec2-bundle-vol** 命令。对于大部分命令，您可以使用 **sudo** 获取提升的权限，但是在这种情况下，您应运行 **sudo -E su** 以保留环境变量。

      ```
      [ec2-user ~]$ sudo -E su
      ```

      请注意，在 bash 提示符下现在将您标识为根用户，并且美元符号已替换为哈希标签，表示您现在处于 root Shell 中：

      ```
      [root ec2-user]#
      ```

   1. 要创建 AMI 捆绑，请如下所示运行 [ec2-bundle-vol](ami-tools-commands.md#ami-bundle-vol) 命令：

      ```
      [root ec2-user]# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u 123456789012 -r x86_64 -e /tmp/cert --partition gpt
      ```
**注意**  
对于中国（北京）和 AWS GovCloud（美国西部）区域，请使用 `--ec2cert` 参数并根据[先决条件](#bundle-ami-prerequisites)指定证书。

      创建映像可能需要几分钟时间。该命令完成后，您的 `/tmp` (非默认) 目录会包含捆绑 (`image.manifest.xml` 以及多个 `image.part.`*xx* 文件)。

   1. 从 root Shell 退出。

      ```
      [root ec2-user]# exit
      ```

1. （可选）要添加更多实例存储卷，请在 `image.manifest.xml` 文件中为您的 AMI 编辑块储存设备映射。有关更多信息，请参阅[Amazon EC2 实例上卷的块设备映射](block-device-mapping-concepts.md)。

   1. 创建 `image.manifest.xml` 文件的备份。

      ```
      [ec2-user ~]$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
      ```

   1. 重新设置 `image.manifest.xml` 文件的格式，使其更易于阅读和编辑。

      ```
      [ec2-user ~]$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
      ```

   1. 使用文本编辑器编辑 `image.manifest.xml` 中的块储存设备映射。以下示例显示了 `ephemeral1` 实例存储卷的一个新条目。
**注意**  
有关排除的文件的列表，请参阅[ec2-bundle-vol](ami-tools-commands.md#ami-bundle-vol)。

      ```
          <block_device_mapping>
            <mapping>
              <virtual>ami</virtual>
              <device>sda</device>
            </mapping>
            <mapping>
              <virtual>ephemeral0</virtual>
              <device>sdb</device>
            </mapping>
            <mapping>
              <virtual>ephemeral1</virtual>
              <device>sdc</device>
            </mapping>
            <mapping>
              <virtual>root</virtual>
              <device>/dev/sda1</device>
            </mapping>
          </block_device_mapping>
      ```

   1. 保存 `image.manifest.xml` 文件并退出文本编辑器。

1. 要将捆绑上传到 Amazon S3，请如下所示运行 [ec2-upload-bundle](ami-tools-commands.md#ami-upload-bundle) 命令。

   ```
   [ec2-user ~]$ ec2-upload-bundle -b amzn-s3-demo-bucket/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
   ```
**重要**  
要在US East (N. Virginia)之外的区域中注册 AMI，则必须指定带 `--region` 选项的目标区域和目标区域中已存在的存储桶路径或可在目标区域中创建的唯一存储桶路径。

1. （可选）将捆绑上传到 Amazon S3 之后，您可以使用以下 `/tmp` 命令将捆绑从实例上的 **rm** 目录中删除：

   ```
   [ec2-user ~]$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
   ```
**重要**  
如果您在 `-d /path/to/bundle/storage` 中使用 [Step 2](#step_with_bundle_path_amazon_linux) 选项指定了路径，请使用该路径，而不是 `/tmp`。

1. 要注册您的 AMI，请按以下所示运行 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 命令。

   ```
   [ec2-user ~]$ aws ec2 register-image --image-location amzn-s3-demo-bucket/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
   ```
**重要**  
如果您先前为 [ec2-upload-bundle](ami-tools-commands.md#ami-upload-bundle) 命令指定了某个区域，请为该命令再次指定该区域。

# 设置 Amazon EC2 AMI 工具
<a name="set-up-ami-tools"></a>

您可以使用 AMI 工具创建和管理 Amazon S3 支持的 Linux AMI。要使用这些工具，必须在 Linux 实例上安装它们。AMI 工具可作为 RPM 提供，也为不支持 RPM 的 Linux 发行版提供 .zip 格式的文件。

**使用 RPM 设置 AMI 工具**

1. 使用您的 Linux 发行版的程序包管理器 (如 yum) 安装 Ruby。例如：

   ```
   [ec2-user ~]$ sudo yum install -y ruby
   ```

1. 使用 wget 或 curl 等工具下载 RPM 文件。例如：

   ```
   [ec2-user ~]$ wget https://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
   ```

1. 使用以下命令验证 RPM 文件的签名：

   ```
   [ec2-user ~]$ rpm -K ec2-ami-tools.noarch.rpm
   ```

   上述命令应指示该文件的 SHA1 和 MD5 哈希值是 `OK.`如果该命令指示这些哈希值是 `NOT OK`，请使用以下命令查看该文件的标头 SHA1 和 MD5 哈希值：

   ```
   [ec2-user ~]$ rpm -Kv ec2-ami-tools.noarch.rpm
   ```

   然后，将您的文件的标头 SHA1 和 MD5 哈希值与以下经验证的 AMI 工具哈希值进行比较，以确认文件的真实性：
   + 标头 SHA1：a1f662d6f25f69871104e6a62187fa4df508f880
   + MD5：9faff05258064e2f7909b66142de6782

   如果您的文件的标头 SHA1 和 MD5 哈希值与经验证的 AMI 工具哈希值相匹配，请继续下一步。

1. 使用以下命令安装 RPM：

   ```
   [ec2-user ~]$ sudo yum install ec2-ami-tools.noarch.rpm
   ```

1. 使用 [ec2-ami-tools-version](ami-tools-commands.md#ami-tools-version) 命令验证您的 AMI 工具安装。

   ```
   [ec2-user ~]$ ec2-ami-tools-version
   ```
**注意**  
如果您收到一个加载错误，例如“cannot load such file -- ec2/amitools/version (LoadError)”(无法加载此类文件 -- ec2/amitools/version (LoadError))，请完成下一步骤以将 AMI 工具安装的位置添加到 `RUBYLIB` 路径。

1. （可选）如果您在上一步中收到了错误，则将您的 AMI 工具的安装位置添加到您的 `RUBYLIB` 路径中。

   1. 运行以下命令以确定要添加的路径。

      ```
      [ec2-user ~]$ rpm -qil ec2-ami-tools | grep ec2/amitools/version
      /usr/lib/ruby/site_ruby/ec2/amitools/version.rb
      /usr/lib64/ruby/site_ruby/ec2/amitools/version.rb
      ```

      在以上示例中，以前加载错误中的丢失文件位于 `/usr/lib/ruby/site_ruby` 和 `/usr/lib64/ruby/site_ruby`。

   1. 将上一步的位置添加到您的 `RUBYLIB` 路径中。

      ```
      [ec2-user ~]$ export RUBYLIB=$RUBYLIB:/usr/lib/ruby/site_ruby:/usr/lib64/ruby/site_ruby
      ```

   1. 使用 [ec2-ami-tools-version](ami-tools-commands.md#ami-tools-version) 命令验证您的 AMI 工具安装。

      ```
      [ec2-user ~]$ ec2-ami-tools-version
      ```

**使用 .zip 文件设置 AMI 工具**

1. 使用您的 Linux 发行版的程序包管理器安装 Ruby 并解压缩，例如 **apt-get**。例如：

   ```
   [ec2-user ~]$ sudo apt-get update -y && sudo apt-get install -y ruby unzip
   ```

1. 使用 wget 或 curl 等工具下载 .zip 文件。例如：

   ```
   [ec2-user ~]$ wget https://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip
   ```

1. 将文件解压缩到合适的安装目录，如 `/usr/local/ec2`。

   ```
   [ec2-user ~]$ sudo mkdir -p /usr/local/ec2
   $ sudo unzip ec2-ami-tools.zip -d /usr/local/ec2
   ```

   请注意，.zip 文件包含文件夹 ec2-ami-tools-*x*.*x*.*x*，其中 *x*.*x*.*x* 是工具的版本号（例如，`ec2-ami-tools-1.5.7`）。

1. 将 `EC2_AMITOOL_HOME` 环境变量设置为工具的安装目录。例如：

   ```
   [ec2-user ~]$ export EC2_AMITOOL_HOME=/usr/local/ec2/ec2-ami-tools-x.x.x
   ```

1. 将工具添加到您的 `PATH` 环境变量。例如：

   ```
   [ec2-user ~]$ export PATH=$EC2_AMITOOL_HOME/bin:$PATH
   ```

1. 您可以使用 [ec2-ami-tools-version](ami-tools-commands.md#ami-tools-version) 命令验证您的 AMI 工具安装。

   ```
   [ec2-user ~]$ ec2-ami-tools-version
   ```

## 管理签名证书
<a name="ami-tools-managing-certs"></a>

AMI 工具中的某些命令需要签名证书 (也称为 X.509 证书)。您必须创建证书，然后将其上传到 AWS。例如，您可以使用第三方工具 (例如 OpenSSL) 创建证书。

**创建签名证书**

1. 安装和配置 OpenSSL。

1. 使用 `openssl genrsa` 命令创建私有密钥，并将输出保存到 `.pem` 文件。我们建议您创建 2048 或 4096 位 RSA 密钥。

   ```
   openssl genrsa 2048 > private-key.pem
   ```

1. 使用 `openssl req` 命令生成证书。

   ```
   openssl req -new -x509 -nodes -sha256 -days 365 -key private-key.pem -outform PEM -out certificate.pem
   ```

要将证书上传到 AWS，请使用 [upload-signing-certificate](https://docs.aws.amazon.com/cli/latest/reference/iam/upload-signing-certificate.html) 命令。

```
aws iam upload-signing-certificate --user-name user-name --certificate-body file://path/to/certificate.pem
```

要列出用户的证书，请使用 [list-signing-certificates](https://docs.aws.amazon.com/cli/latest/reference/iam/list-signing-certificates.html) 命令：

```
aws iam list-signing-certificates --user-name user-name
```

要对用户禁用或重新启用签名证书，请使用 [update-signing-certificate](https://docs.aws.amazon.com/cli/latest/reference/iam/update-signing-certificate.html) 命令。以下命令可禁用证书：

```
aws iam update-signing-certificate --certificate-id OFHPLP4ZULTHYPMSYEX7O4BEXAMPLE --status Inactive --user-name user-name
```

要删除证书，请使用 [delete-signing-certificate](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-signing-certificate.html) 命令：

```
aws iam delete-signing-certificate --user-name user-name --certificate-id OFHPLP4ZULTHYPMSYEX7O4BEXAMPLE
```

# Amazon EC2 AMI 工具参考
<a name="ami-tools-commands"></a>

您可以使用 AMI 工具命令创建和管理 Amazon S3 支持的 Linux AMI。要设置这些工具，请参阅[设置 Amazon EC2 AMI 工具](set-up-ami-tools.md)。

有关访问密钥的信息，请参阅《IAM 用户指南》**中的[管理 IAM 用户的访问密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)。

**Topics**
+ [

## ec2-ami-tools-version
](#ami-tools-version)
+ [

## ec2-bundle-image
](#ami-bundle-image)
+ [

## ec2-bundle-vol
](#ami-bundle-vol)
+ [

## ec2-delete-bundle
](#ami-delete-bundle)
+ [

## ec2-download-bundle
](#ami-download-bundle)
+ [

## ec2-migrate-manifest
](#ami-migrate-manifest)
+ [

## ec2-unbundle
](#ami-unbundle)
+ [

## ec2-upload-bundle
](#ami-upload-bundle)
+ [

## AMI 工具的常用选项
](#common-args-ami)

## ec2-ami-tools-version
<a name="ami-tools-version"></a>

### 描述
<a name="ami-tools-version-description"></a>

描述 AMI 工具的版本。

### 语法
<a name="ami-tools-version-request"></a>

**ec2-ami-tools-version**

### 输出
<a name="ami-tools-version-output"></a>

版本信息。

### 示例
<a name="ami-tools-version-response"></a>

此示例命令显示所用 AMI 工具的版本信息。

```
[ec2-user ~]$ ec2-ami-tools-version
1.5.2 20071010
```

## ec2-bundle-image
<a name="ami-bundle-image"></a>

### 描述
<a name="bundle-image-description"></a>

通过回环文件中创建的操作系统映像创建 Amazon S3 支持的 Linux AMI。

### 语法
<a name="bundle-image-request"></a>

****ec2-bundle-image** -c *path* -k *path* -u *account* -i *path* [-d *path*] [--ec2cert *path*] [-r *architecture*] [--productcodes *code1*,*code2*,...] [-B *mapping*] [-p *prefix*]** 

### 选项
<a name="bundle-image-parameters"></a>

`-c, --cert` *路径*  
用户的 PEM 编码 RSA 公有密钥凭证文件。  
必需：是

`-k, --privatekey` *路径*  
指向 PEM 编码 RSA 密钥文件的路径。您需要指定此密钥解开此捆绑包，因此，请将其保存在安全的地方。请注意，不需要在您的 AWS 账户中注册该密钥。  
必需：是

`-u, --user ` *账户*  
用户的 AWS 账户 ID (不包含破折号)。  
必需：是

`-i, --image` *路径*  
指向待捆绑映像的路径。  
必需：是

`-d, --destination` *路径*  
要在其中创建捆绑的目录。  
默认值：`/tmp`  
必需：否

`--ec2cert` *路径*  
用于加密映像清单的 Amazon EC2 X.509 公有密钥凭证的路径。  
`us-gov-west-1` 和 `cn-north-1` 区域使用非默认公有密钥凭证，必须随该选项指定该证书的路径。该证书的路径因 AMI 工具的安装方法而异。对于 Amazon Linux，证书位于 `/opt/aws/amitools/ec2/etc/ec2/amitools/`。如果您将来自 RPM 或 ZIP 文件的 AMI 工具安装在了 [设置 Amazon EC2 AMI 工具](set-up-ami-tools.md) 中，则证书位于 `$EC2_AMITOOL_HOME/etc/ec2/amitools/`。  
必需：仅限 `us-gov-west-1` 和 `cn-north-1` 区域。

`-r, --arch` *架构*  
映像架构。如果您不在命令行上提供架构，则会在绑定开始时提示您输入架构。  
有效值：`i386` \$1 `x86_64`  
必需：否

`--productcodes`*code1,code2,...*  
在注册时附加到映像的产品代码，用逗号隔开。  
必需：否

`-B, --block-device-mapping` *映射*  
定义块储存设备向此 AMI 的实例公开的方式 (如果其实例类型支持指定的设备)。  
指定键值对的逗号分隔列表，每个键是虚拟名称，每个值是相应的设备名称。虚拟名称包括：  
+ `ami` — 实例所看到的根文件系统设备
+ `root` — 内核所看到的根文件系统设备
+ `swap` — 实例所看到的交换设备
+ `ephemeralN` — 第 N 个实例存储卷
必需：否

`-p, --prefix` *prefix*  
捆绑的 AMI 文件的文件名前缀。  
默认：映像文件的名称。例如，如果映像路径为 `/var/spool/my-image/version-2/debian.img`，则默认前缀为 `debian.img`。  
必需：否

`--kernel` *kernel\$1id*  
已淘汰。使用 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 设置内核。  
必需：否

`--ramdisk` *ramdisk\$1id*  
已淘汰。使用 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 设置 RAM 磁盘 (若需要)。  
必需：否

### 输出
<a name="bundle-image-output"></a>

描述捆绑过程的阶段和状态的状态消息。

### 示例
<a name="bundle-image-response"></a>

此示例从回环文件中所创建的操作系统映像创建捆绑的 AMI。

```
[ec2-user ~]$ ec2-bundle-image -k pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u 111122223333 -i image.img -d bundled/ -r x86_64
Please specify a value for arch [i386]: 
Bundling image file...
Splitting bundled/image.gz.crypt...
Created image.part.00
Created image.part.01
Created image.part.02
Created image.part.03
Created image.part.04
Created image.part.05
Created image.part.06
Created image.part.07
Created image.part.08
Created image.part.09
Created image.part.10
Created image.part.11
Created image.part.12
Created image.part.13
Created image.part.14
Generating digests for each part...
Digests generated.
Creating bundle manifest...
ec2-bundle-image complete.
```

## ec2-bundle-vol
<a name="ami-bundle-vol"></a>

### 描述
<a name="bundle-vol-description"></a>

通过对实例根卷的副本进行压缩、加密和签名来创建 Amazon S3 支持的 Linux AMI。

Amazon EC2 将尝试从实例继承产品代码、内核设置、RAM 磁盘设置和块储存设备映射。

默认情况下，捆绑过程不包括可能包含敏感信息的文件。这些文件包括 `*.sw`、`*.swo`、`*.swp`、`*.pem`、`*.priv`、`*id_rsa*`、`*id_dsa*` `*.gpg`、`*.jks`、`*/.ssh/authorized_keys` 和 `*/.bash_history`。要包括所有这些文件，请使用 `--no-filter` 选项。要包括其中部分文件，请使用 `--include` 选项。

有关更多信息，请参阅 [创建 Amazon S3 支持的 AMI](creating-an-ami-instance-store.md)。

### 语法
<a name="bundle-vol-request"></a>

****ec2-bundle-vol** -c *path* -k *path* -u *account* [-d *path*] [--ec2cert *path*] [-r *architecture*] [--productcodes *code1*,*code2*,...] [-B *mapping*] [--all] [-e *directory1*,*directory2*,...] [-i *file1*,*file2*,...] [--no-filter] [-p *prefix*] [-s *size*] [--[no-]inherit] [-v *volume*] [-P *type*] [-S *script*] [--fstab *path*] [--generate-fstab] [--grub-config *path*]** 

### 选项
<a name="bundle-vol-parameters"></a>

`-c, --cert` *路径*  
用户的 PEM 编码 RSA 公有密钥凭证文件。  
必需：是

`-k, --privatekey ` *路径*   
用户的 PEM 编码 RSA 密钥文件的路径。  
必需：是

`-u, --user` *账户*  
用户的 AWS 账户 ID (不包含破折号)。  
必需：是

`-d, --destination` *destination*  
要在其中创建捆绑的目录。  
默认值：`/tmp`  
必需：否

`--ec2cert` *路径*  
用于加密映像清单的 Amazon EC2 X.509 公有密钥凭证的路径。  
`us-gov-west-1` 和 `cn-north-1` 区域使用非默认公有密钥凭证，必须随该选项指定该证书的路径。该证书的路径因 AMI 工具的安装方法而异。对于 Amazon Linux，证书位于 `/opt/aws/amitools/ec2/etc/ec2/amitools/`。如果您将来自 RPM 或 ZIP 文件的 AMI 工具安装在了 [设置 Amazon EC2 AMI 工具](set-up-ami-tools.md) 中，则证书位于 `$EC2_AMITOOL_HOME/etc/ec2/amitools/`。  
必需：仅限 `us-gov-west-1` 和 `cn-north-1` 区域。

`-r, --arch ` *架构*  
映像架构。如果您不在命令行上提供架构，则会在绑定开始时提示您提供架构。  
有效值：`i386` \$1 `x86_64`  
必需：否

`--productcodes`*code1,code2,...*  
在注册时附加到映像的产品代码，用逗号隔开。  
必需：否

`-B, --block-device-mapping` *映射*  
定义块储存设备向此 AMI 的实例公开的方式 (如果其实例类型支持指定的设备)。  
指定键值对的逗号分隔列表，每个键是虚拟名称，每个值是相应的设备名称。虚拟名称包括：  
+ `ami` — 实例所看到的根文件系统设备
+ `root` — 内核所看到的根文件系统设备
+ `swap` — 实例所看到的交换设备
+ `ephemeralN` — 第 N 个实例存储卷
必需：否

`-a, --all`  
捆绑所有目录，包括远程装载的文件系统上的目录。  
必需：否

`-e, --exclude `*directory1,directory2,...*  
要从捆绑操作中排除的绝对目录路径和文件的列表。此参数覆盖 `--all` 选项。指定排除时，随此参数列出的目录和子目录将不会随卷捆绑。  
必需：否

`-i, --include `*file1,file2,...*  
要在捆绑操作中包含的文件的列表。因为指定的文件可能包含敏感信息，若不指定则会从 AMI 中排除。  
必需：否

`--no-filter`  
如果指定，则我们不会因为文件可能包含敏感信息而将其从 AMI 排除。  
必需：否

`-p, --prefix ` *prefix*  
捆绑的 AMI 文件的文件名前缀。  
默认值：`image`  
必需：否

`-s, --size` *size*  
要创建的映像文件的大小，以 MB (1024 \$1 1024 字节) 为单位。最大大小为 10240 MB。  
默认值：10240  
必需：否

`--[no-]inherit`  
指示映像是否应当继承实例的元数据 (默认为继承)。如果启用 `--inherit` 但实例元数据不可访问，则捆绑将失败。  
必需：否

`-v, --volume ` *体积*  
要从中创建捆绑的装载卷的绝对路径。  
默认值：根目录 (/)  
必需：否

`-P, --partition` *type*  
指示磁盘映像是否应使用分区表。如果不指定分区表类型，则默认使用卷的父块储存设备上使用的类型 (如果适用)，否则默认为 `gpt`。  
有效值：`mbr` \$1`gpt` \$1`none`  
必需：否

`-S, --script` *脚本*  
将在捆绑前运行的自定义脚本。该脚本必须获得一个参数，即卷的装载点。  
必需：否

`--fstab` *路径*  
要捆绑到映像中的 fstab 的路径。如果未指定，Amazon EC2 将捆绑 /etc/fstab。  
必需：否

`--generate-fstab`  
使用 Amazon EC2 提供的 fstab 捆绑卷。  
必需：否

`--grub-config`  
将捆绑到映像中的备用 GRUB 配置文件的路径。默认情况下，`ec2-bundle-vol` 预计克隆的映像上存在 `/boot/grub/menu.lst` 或 `/boot/grub/grub.conf`。该选项可让您指定备用 GRUB 配置文件的路径，将会复制该文件以覆盖默认值 (若存在)。  
必需：否

`--kernel` *kernel\$1id*  
已淘汰。使用 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 设置内核。  
必需：否

`--ramdisk`*ramdisk\$1id*  
已淘汰。使用 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 设置 RAM 磁盘 (若需要)。  
必需：否

### 输出
<a name="bundle-vol-output"></a>

描述捆绑的阶段和状态的状态消息。

### 示例
<a name="bundle-vol-response"></a>

此示例通过对本机根文件系统进行压缩、加密和签名创建捆绑的 AMI。

```
[ec2-user ~]$ ec2-bundle-vol -d /mnt -k pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u 111122223333 -r x86_64
  Copying / into the image file /mnt/image...
  Excluding:
       sys
       dev/shm
       proc
       dev/pts
       proc/sys/fs/binfmt_misc
       dev
       media
       mnt
       proc
       sys
       tmp/image
       mnt/img-mnt
  1+0 records in
  1+0 records out
  mke2fs 1.38 (30-Jun-2005)
  warning: 256 blocks unused.

  Splitting /mnt/image.gz.crypt...
  Created image.part.00
  Created image.part.01
  Created image.part.02
  Created image.part.03
  ...
  Created image.part.22
  Created image.part.23
  Generating digests for each part...
  Digests generated.
  Creating bundle manifest...
  Bundle Volume complete.
```

## ec2-delete-bundle
<a name="ami-delete-bundle"></a>

### 描述
<a name="delete-bundle-description"></a>

从 Amazon S3 存储中删除指定的捆绑。删除捆绑后，您不能从相应的 AMI 启动实例。

### 语法
<a name="delete-bundle-request"></a>

****ec2-delete-bundle** -b *bucket* -a *access\$1key\$1id* -s *secret\$1access\$1key* [-t *token*] [--url *url*] [--region *region*] [--sigv *version*] [-m *path*] [-p *prefix*] [--clear] [--retry] [-y]** 

### 选项
<a name="delete-bundle-parameters"></a>

`-b, --bucket `*存储桶*  
包含捆绑的 AMI 的 Amazon S3 存储桶的名称，后跟可选的以“/”分隔的路径前缀  
必需：是

`-a, --access-key` *access\$1key\$1id*  
AWS 访问密钥 ID。  
必需：是

`-s, --secret-key` *secret\$1access\$1key*  
AWS 秘密访问密钥。  
必需：是

`-t, --delegation-token` *token*  
传递到 AWS 请求的委托令牌。有关更多信息，请参阅《IAM 用户指南》**中的[临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)。  
必需：仅当使用临时安全凭证时是必需的。  
默认：`AWS_DELEGATION_TOKEN` 环境变量的值 (若已设置)。

`--region`*区域*  
要在请求签名中使用的区域。  
默认值：`us-east-1`  
必需：若使用签名版本 4 则必需

`--sigv`*版本*  
对请求进行签名时要使用的签名版本。  
有效值：`2` \$1 `4`  
默认值：`4`  
必需：否

`-m, --manifest`*path*  
清单文件的路径。  
必需：您必须指定 `--prefix` 或 `--manifest`。

`-p, --prefix` *prefix*  
捆绑的 AMI 文件名前缀。请提供完整前缀。例如，如果前缀是 image.img，请使用 `-p image.img` 而不是 `-p image`。  
必需：您必须指定 `--prefix` 或 `--manifest`。

`--clear`  
删除指定的捆绑之后删除 Amazon S3 存储桶 (若为空)。  
必需：否

`--retry`  
在所有 Amazon S3 错误后自动重试，每个操作最多五次。  
必需：否

`-y, --yes`  
自动假定所有提示的回答为 yes。  
必需：否

### 输出
<a name="delete-bundle-output"></a>

Amazon EC2 显示状态消息以指示删除过程的阶段和状态。

### 示例
<a name="delete-bundle-response"></a>

此示例从 Amazon S3 删除捆绑。

```
[ec2-user ~]$ ec2-delete-bundle -b amzn-s3-demo-bucket -a your_access_key_id -s your_secret_access_key
Deleting files:
amzn-s3-demo-bucket/image.manifest.xml
amzn-s3-demo-bucket/image.part.00
amzn-s3-demo-bucket/image.part.01
amzn-s3-demo-bucket/image.part.02
amzn-s3-demo-bucket/image.part.03
amzn-s3-demo-bucket/image.part.04
amzn-s3-demo-bucket/image.part.05
amzn-s3-demo-bucket/image.part.06
Continue? [y/n]
y
Deleted amzn-s3-demo-bucket/image.manifest.xml
Deleted amzn-s3-demo-bucket/image.part.00
Deleted amzn-s3-demo-bucket/image.part.01
Deleted amzn-s3-demo-bucket/image.part.02
Deleted amzn-s3-demo-bucket/image.part.03
Deleted amzn-s3-demo-bucket/image.part.04
Deleted amzn-s3-demo-bucket/image.part.05
Deleted amzn-s3-demo-bucket/image.part.06
ec2-delete-bundle complete.
```

## ec2-download-bundle
<a name="ami-download-bundle"></a>

### 描述
<a name="download-bundle-description"></a>

从 Amazon S3 存储下载指定的 Amazon S3 支持的 Linux AMIs。

### 语法
<a name="download-bundle-request"></a>

****ec2-download-bundle** -b *bucket* -a *access\$1key\$1id* -s *secret\$1access\$1key* -k *path* [--url *url*] [--region *region*] [--sigv *version*] [-m *file*] [-p *prefix*] [-d *directory*] [--retry]** 

### 选项
<a name="download-bundle-parameters"></a>

`-b, --bucket` *存储桶*  
捆绑所在的 Amazon S3 存储桶的名称，后跟可选的以“/”分隔的路径前缀。  
必需：是

`-a, --access-key` *access\$1key\$1id*  
AWS 访问密钥 ID。  
必需：是

`-s, --secret-key` *secret\$1access\$1key*  
AWS 秘密访问密钥。  
必需：是

`-k, --privatekey` *路径*  
用于解密清单的私有密钥。  
必需：是

`--url` *url*  
Amazon S3 服务 URL。  
默认值：`https://s3.amazonaws.com/`  
必需：否

`--region` *region*  
要在请求签名中使用的区域。  
默认值：`us-east-1`  
必需：若使用签名版本 4 则必需

`--sigv` *version*  
对请求进行签名时要使用的签名版本。  
有效值：`2` \$1 `4`  
默认值：`4`  
必需：否

`-m, --manifest` *file*  
清单文件的名称 (无路径)。我们建议您指定清单 (`-m`) 或前缀 (`-p`)。  
必需：否

`-p, --prefix ` *prefix*  
捆绑的 AMI 文件的文件名前缀。  
默认值：`image`  
必需：否

`-d, --directory ` *directory*  
保存下载的捆绑的目录。该目录必须存在。  
默认：当前工作目录。  
必需：否

 `--retry`   
在所有 Amazon S3 错误后自动重试，每个操作最多五次。  
必需：否

### 输出
<a name="download-bundle-output"></a>

将显示指示下载过程各个阶段的状态消息。

### 示例
<a name="download-bundle-response"></a>

此示例创建 `bundled` 目录（使用 Linux **mkdir** 命令）并从 `amzn-s3-demo-bucket` Amazon S3 存储桶下载捆绑。

```
[ec2-user ~]$ mkdir bundled
[ec2-user ~]$ ec2-download-bundle -b amzn-s3-demo-bucket/bundles/bundle_name -m image.manifest.xml -a your_access_key_id -s your_secret_access_key -k pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -d mybundle
Downloading manifest image.manifest.xml from amzn-s3-demo-bucket to mybundle/image.manifest.xml ...
Downloading part image.part.00 from amzn-s3-demo-bucket/bundles/bundle_name to mybundle/image.part.00 ...
Downloaded image.part.00 from amzn-s3-demo-bucket
Downloading part image.part.01 from amzn-s3-demo-bucket/bundles/bundle_name to mybundle/image.part.01 ...
Downloaded image.part.01 from amzn-s3-demo-bucket
Downloading part image.part.02 from amzn-s3-demo-bucket/bundles/bundle_name to mybundle/image.part.02 ...
Downloaded image.part.02 from amzn-s3-demo-bucket
Downloading part image.part.03 from amzn-s3-demo-bucket/bundles/bundle_name to mybundle/image.part.03 ...
Downloaded image.part.03 from amzn-s3-demo-bucket
Downloading part image.part.04 from amzn-s3-demo-bucket/bundles/bundle_name to mybundle/image.part.04 ...
Downloaded image.part.04 from amzn-s3-demo-bucket
Downloading part image.part.05 from amzn-s3-demo-bucket/bundles/bundle_name to mybundle/image.part.05 ...
Downloaded image.part.05 from amzn-s3-demo-bucket
Downloading part image.part.06 from amzn-s3-demo-bucket/bundles/bundle_name to mybundle/image.part.06 ...
Downloaded image.part.06 from amzn-s3-demo-bucket
```

## ec2-migrate-manifest
<a name="ami-migrate-manifest"></a>

### 描述
<a name="migrate-manifest-description"></a>

修改 Amazon S3 支持的 Linux AMI（例如，其证书、内核和 RAM 磁盘）以使其支持其他区域。

### 语法
<a name="migrate-manifest-request"></a>

****ec2-migrate-manifest** -c *path* -k *path* -m *path* \$1(-a *access\$1key\$1id* -s *secret\$1access\$1key* --region *region*) \$1 (--no-mapping)\$1 [--ec2cert *ec2\$1cert\$1path*] [--kernel *kernel-id*] [--ramdisk *ramdisk\$1id*]** 

### 选项
<a name="migrate-manifest-parameters"></a>

`-c, --cert` *路径*  
用户的 PEM 编码 RSA 公有密钥凭证文件。  
必需：是

`-k, --privatekey` *路径*  
用户的 PEM 编码 RSA 密钥文件的路径。  
必需：是

`--manifest` *路径*  
清单文件的路径。  
必需：是

`-a, --access-key` *access\$1key\$1id*  
AWS 访问密钥 ID。  
必需：若使用自动映射则必需。

`-s, --secret-key ` *secret\$1access\$1key*  
AWS 秘密访问密钥。  
必需：若使用自动映射则必需。

`--region` *region*  
要在映射文件中查找的区域。  
必需：若使用自动映射则必需。

`--no-mapping`  
禁用内核和 RAM 磁盘的自动映射。  
 迁移期间，Amazon EC2 会将清单文件中的内核和 RAM 磁盘替换为目标区域指定的内核和 RAM 磁盘。除非提供了 `--no-mapping` 参数，否则 `ec2-migrate-bundle` 便可能使用 `DescribeRegions` 和 `DescribeImages` 操作执行自动映射。  
必需：若您不提供用于自动映射的 `-a`、`-s` 和 `--region` 选项，则必需。

`--ec2cert` *路径*  
用于加密映像清单的 Amazon EC2 X.509 公有密钥凭证的路径。  
`us-gov-west-1` 和 `cn-north-1` 区域使用非默认公有密钥凭证，必须随该选项指定该证书的路径。该证书的路径因 AMI 工具的安装方法而异。对于 Amazon Linux，证书位于 `/opt/aws/amitools/ec2/etc/ec2/amitools/`。如果您将来自 ZIP 文件的 AMI 工具安装在 [设置 Amazon EC2 AMI 工具](set-up-ami-tools.md) 中，则证书位于 `$EC2_AMITOOL_HOME/etc/ec2/amitools/`。  
必需：仅限 `us-gov-west-1` 和 `cn-north-1` 区域。

`--kernel` *kernel\$1id*  
要选择的内核的 ID。  
我们建议您使用 PV-GRUB 而不是内核和 RAM 磁盘。有关更多信息，请参阅《Amazon Linux 2 User Guide》**中的 [User provided kernels](https://docs.aws.amazon.com/linux/al2/ug/UserProvidedKernels.html)。
必需：否

`--ramdisk` *ramdisk\$1id*  
供选择的 RAM 磁盘的 ID。  
我们建议您使用 PV-GRUB 而不是内核和 RAM 磁盘。有关更多信息，请参阅《Amazon Linux 2 User Guide》**中的 [User provided kernels](https://docs.aws.amazon.com/linux/al2/ug/UserProvidedKernels.html)。
必需：否

### 输出
<a name="migrate-manifest-output"></a>

描述捆绑过程的阶段和状态的状态消息。

### 示例
<a name="migrate-manifest-response"></a>

此示例将 `my-ami.manifest.xml` 清单中指定的 AMI 从美国复制到欧洲。

```
[ec2-user ~]$ ec2-migrate-manifest --manifest my-ami.manifest.xml --cert cert-HKZYKTAIG2ECMXYIBH3HXV4ZBZQ55CLO.pem --privatekey pk-HKZYKTAIG2ECMXYIBH3HXV4ZBZQ55CLO.pem --region eu-west-1 

Backing up manifest...
Successfully migrated my-ami.manifest.xml It is now suitable for use in eu-west-1.
```

## ec2-unbundle
<a name="ami-unbundle"></a>

### 描述
<a name="unbundle-description"></a>

从 Amazon S3 支持的 Linux AMI 重新创建捆绑。

### 语法
<a name="unbundle-request"></a>

****ec2-unbundle** -k *path* -m *path* [-s *source\$1directory*] [-d *destination\$1directory*]** 

### 选项
<a name="unbundle-parameters"></a>

`-k, --privatekey` *路径*  
您的 PEM 编码 RSA 密钥文件的路径。  
必需：是

`-m, --manifest` *路径*  
清单文件的路径。  
必需：是

`-s, --source` *source\$1directory*  
包含捆绑的目录。  
默认：当前目录。  
必需：否

`-d, --destination` *destination\$1directory*  
将 AMI 解绑到的目录。目标目录必须存在。  
默认：当前目录。  
必需：否

### 示例
<a name="unbundle-response"></a>

此 Linux 和 UNIX 示例解绑 `image.manifest.xml` 文件中指定的 AMI。

```
[ec2-user ~]$ mkdir unbundled
$ ec2-unbundle -m mybundle/image.manifest.xml -k pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -s mybundle -d unbundled
$ ls -l unbundled
total 1025008
-rw-r--r-- 1 root root 1048578048 Aug 25 23:46 image.img
```

### 输出
<a name="unbundle-output"></a>

将显示指示解绑过程各个阶段的状态消息。

## ec2-upload-bundle
<a name="ami-upload-bundle"></a>

### 描述
<a name="upload-bundle-description"></a>

将 Amazon S3 支持的 Linux AMI 的捆绑上载到 Amazon S3，并在上载的对象上设置相应的访问控制列表（ACL）。有关更多信息，请参阅 [创建 Amazon S3 支持的 AMI](creating-an-ami-instance-store.md)。

**注意**  
要将对象上载到 Amazon S3 支持的 Linux AMI 的 S3 存储桶，必须为该存储桶启用 ACL。否则，Amazon EC2 将无法在要上载的对象上设置 ACL。如果您的目标存储桶使用存储桶拥有者强制执行的 S3 对象所有权设置，则这将不起作用，因为 ACL 已禁用。有关更多信息，请参阅[为您的存储桶控制对象所有权和禁用 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)。

### 语法
<a name="upload-bundle-request"></a>

****ec2-upload-bundle** -b *bucket* -a *access\$1key\$1id* -s *secret\$1access\$1key* [-t *token*] -m *path* [--url *url*] [--region *region*] [--sigv *version*] [--acl *acl*] [-d *directory*] [--part *part*] [--retry] [--skipmanifest]** 

### 选项
<a name="upload-bundle-parameters"></a>

`-b, --bucket` *存储桶*  
用于存储捆绑的 Amazon S3 存储桶的名称，后跟可选的以“/”分隔的路径前缀。如果存储桶不存在，则创建一个 (若存储桶名称可用)。此外，如果存储桶不存在且 AMI 工具版本为 1.5.18 或更高版本，则此命令会为存储桶设置 ACL。  
必需：是

`-a, --access-key` *access\$1key\$1id*  
您的 AWS 访问密钥 ID。  
必需：是

`-s, --secret-key` *secret\$1access\$1key*  
您的 AWS 秘密访问密钥。  
必需：是

`-t, --delegation-token` *token*  
传递到 AWS 请求的委托令牌。有关更多信息，请参阅《IAM 用户指南》**中的[临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)。  
必需：仅当使用临时安全凭证时是必需的。  
默认：`AWS_DELEGATION_TOKEN` 环境变量的值 (若已设置)。

`-m, --manifest` *路径*  
清单文件的路径。清单文件是在捆绑过程中创建的，可以在包含捆绑的目录中找到。  
必需：是

`--url` *url*  
已淘汰。请使用 `--region` 选项，除非您的存储桶被限制到 `EU` 位置 (且不是 `eu-west-1`)。`--location` 标记是确定该特定位置限制的唯一途径。  
Amazon S3 终端节点服务 URL。  
默认值：`https://s3.amazonaws.com/`  
必需：否

`--region` *region*  
要在请求签名中为目标 S3 存储桶使用的区域。  
+ 如果存储桶不存在，您也没有指定区域，则该工具将创建无位置限制的存储桶（在 `us-east-1` 中）。
+ 如果存储桶不存在，而您指定了区域，则该工具将在指定区域创建存储桶。
+ 如果存储桶存在，而您没有指定区域，则该工具将使用存储桶的位置。
+ 如果存储桶存在，并且您指定 `us-east-1` 为区域，则该工具将使用存储桶的实际位置而不会显示任何错误消息，并将覆盖任何现有的匹配文件。
+ 如果存储桶存在，并且您指定与存储桶的实际位置不符的区域（非 `us-east-1`），则该工具将报错退出。
如果您的存储桶被限制到 `EU` 位置 (不是 `eu-west-1`)，请改用 `--location` 标记。`--location` 标记是确定该特定位置限制的唯一途径。  
默认值：`us-east-1`  
必需：若使用签名版本 4 则必需

`--sigv` *version*  
对请求进行签名时要使用的签名版本。  
有效值：`2` \$1 `4`  
默认值：`4`  
必需：否

`--acl` *acl*  
捆绑的映像的访问控制列表策略。  
有效值：`public-read` \$1 `aws-exec-read`  
默认值：`aws-exec-read`  
必需：否

`-d, --directory` *directory*  
包含捆绑的 AMI 段的目录。  
默认：包含清单文件的目录 (参阅 `-m` 选项)。  
必需：否

`--part` *part*  
开始上传指定的段及所有后续段。例如：`--part 04`。  
必需：否

`--retry`  
在所有 Amazon S3 错误后自动重试，每个操作最多五次。  
必需：否

`--skipmanifest`  
不上传清单。  
必需：否

`--location` *位置*  
已淘汰。请使用 `--region` 选项，除非您的存储桶被限制到 `EU` 位置 (且不是 `eu-west-1`)。`--location` 标记是确定该特定位置限制的唯一途径。  
目标 Amazon S3 存储桶的位置限制。如果存储桶存在，而您指定的位置与存储桶的实际位置不符，则该工具将报错退出。如果存储桶存在，而您没有指定位置，则该工具将使用存储桶的位置。如果存储桶不存在，而您指定了位置，则该工具将在指定位置创建存储桶。如果存储桶不存在，您也没有指定位置，则该工具将创建无位置限制的存储桶 (在 `us-east-1` 中)。  
默认：如果指定 `--region`，则将位置设置为该指定区域。如果未指定 `--region`，则位置默认为 `us-east-1`。  
必需：否

### 输出
<a name="upload-bundle-output"></a>

Amazon EC2 显示状态消息以指示上传过程的阶段的状态。

### 示例
<a name="upload-bundle-response"></a>

此示例上传 `image.manifest.xml` 清单所指定的捆绑。

```
[ec2-user ~]$ ec2-upload-bundle -b amzn-s3-demo-bucket/bundles/bundle_name -m image.manifest.xml -a your_access_key_id -s your_secret_access_key
Creating bucket...
Uploading bundled image parts to the S3 bucket amzn-s3-demo-bucket ...
Uploaded image.part.00
Uploaded image.part.01
Uploaded image.part.02
Uploaded image.part.03
Uploaded image.part.04
Uploaded image.part.05
Uploaded image.part.06
Uploaded image.part.07
Uploaded image.part.08
Uploaded image.part.09
Uploaded image.part.10
Uploaded image.part.11
Uploaded image.part.12
Uploaded image.part.13
Uploaded image.part.14
Uploading manifest ...
Uploaded manifest.
Bundle upload completed.
```

## AMI 工具的常用选项
<a name="common-args-ami"></a>

大多数 AMI 工具接受以下可选参数。

`--help, -h`  
显示帮助消息。

`--version`  
显示版本和版权声明。

`--manual`  
显示手动输入。

`--batch`  
以批处理模式运行，不显示交互提示。

`--debug`  
显示对故障排除可能有帮助的信息。

# 将 Amazon S3 支持的 AMI 转换为 EBS-backed AMI
<a name="Using_ConvertingS3toEBS"></a>

您可以将拥有的 Amazon S3 支持的 Linux AMI 转换为 Amazon EBS 支持的 Linux AMI。

**重要**  
您无法转换不属于自己的 AMI。

**将 Amazon S3 支持的 AMI 转换为 Amazon EBS-backed AMI**

1. 从 Amazon EBS-backed AMI 启动 Amazon Linux 实例。有关更多信息，请参阅 [使用控制台中的启动实例向导来启动 EC2 实例](ec2-launch-instance-wizard.md)。Amazon Linux 实例预先安装了 AWS CLI 和 AMI 工具。

1. 上传您用于将 Amazon S3 支持的 AMI 捆绑到实例的 X.509 私有密钥。我们使用此密钥确保只有您和 Amazon EC2 才能访问您的 AMI。

   1. 在您的实例上为 X.509 私有密钥创建临时目录，如下所示：

      ```
      [ec2-user ~]$ mkdir /tmp/cert
      ```

   1. 使用安全复制工具 (如 `/tmp/cert`scp[) 将您的 X.509 私有密钥从您的计算机复制到您实例上的 ](linux-file-transfer-scp.md) 目录。以下命令中的 *my-private-key* 参数是您用于通过 SSH 连接到实例的私有密钥。例如：

      ```
      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/
      pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem  100%  717     0.7KB/s   00:00
      ```

1. 配置环境变量以使用 AWS CLI。有关更多信息，请参阅 [Environment variables](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)。

   1. （推荐）为您的 AWS 访问密钥、私有密钥和会话令牌设置环境变量。

      ```
      [ec2-user ~]$ export AWS_ACCESS_KEY_ID=your_access_key_id
      [ec2-user ~]$ export AWS_SECRET_ACCESS_KEY=your_secret_access_key
      [ec2-user ~]$ export AWS_SESSION_TOKEN=your_session_token
      ```

   1. 为您的 AWS 访问密钥和私有密钥设置环境变量。

      ```
      [ec2-user ~]$ export AWS_ACCESS_KEY_ID=your_access_key_id
      [ec2-user ~]$ export AWS_SECRET_ACCESS_KEY=your_secret_access_key
      ```

1. 为新 AMI 准备 Amazon Elastic Block Store (Amazon EBS) 卷。

   1. 使用 [create-volume](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-volume.html) 命令在您的实例所在的同一可用区中创建空 EBS 卷。记下命令输出中的卷 ID。
**重要**  
 此 EBS 卷不小于原始实例存储根卷。

      ```
      aws ec2 create-volume \
          --size 10 \
          --region us-west-2 \
          --availability-zone us-west-2b
      ```

   1. 使用 [attach-volume](https://docs.aws.amazon.com/cli/latest/reference/ec2/attach-volume.html) 命令将该卷附加到 Amazon EBS 支持的实例。

      ```
      aws ec2 attach-volume \
          --volume-id vol-01234567890abcdef \
          --instance-id i-1234567890abcdef0 \
          --region us-west-2
      ```

1. 创建用于捆绑的文件夹。

   ```
   [ec2-user ~]$ mkdir /tmp/bundle
   ```

1. 使用 `/tmp/bundle` 命令将由实例存储支持的 AMI 的捆绑下载到 [ec2-download-bundle](ami-tools-commands.md#ami-download-bundle)。

   ```
   [ec2-user ~]$ ec2-download-bundle -b amzn-s3-demo-bucket/bundle_folder/bundle_name -m image.manifest.xml -a $AWS_ACCESS_KEY_ID -s $AWS_SECRET_ACCESS_KEY --privatekey /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -d /tmp/bundle
   ```

1. 使用 [ec2-unbundle](ami-tools-commands.md#ami-unbundle) 命令从捆绑重新构建映像文件。

   1. 将目录更改为捆绑文件夹。

      ```
      [ec2-user ~]$ cd /tmp/bundle/
      ```

   1. 运行 [ec2-unbundle](ami-tools-commands.md#ami-unbundle) 命令。

      ```
      [ec2-user bundle]$ ec2-unbundle -m image.manifest.xml --privatekey /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem
      ```

1. 将文件从未捆绑的映像复制到新 EBS 卷。

   ```
   [ec2-user bundle]$ sudo dd if=/tmp/bundle/image of=/dev/sdb bs=1M
   ```

1. 探测所有未捆绑的新分区的卷。

   ```
   [ec2-user bundle]$ sudo partprobe /dev/sdb1
   ```

1. 列出块储存设备以查找要装载的设备名称。

   ```
   [ec2-user bundle]$ lsblk
   NAME         MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
   /dev/sda    202:0    0   8G  0 disk
   └─/dev/sda1 202:1    0   8G  0 part /
   /dev/sdb    202:80   0  10G  0 disk
   └─/dev/sdb1 202:81   0  10G  0 part
   ```

   在此示例中，要装载的分区是 `/dev/sdb1`，但您的设备名称可能有所不同。如果您的卷未分区，则要装载的设备类似于 `/dev/sdb` (没有设备分区尾部数字)。

1. 为新 EBS 卷创建装载点并装载该卷。

   ```
   [ec2-user bundle]$ sudo mkdir /mnt/ebs
   [ec2-user bundle]$ sudo mount /dev/sdb1 /mnt/ebs
   ```

1. 使用您常用的文本编辑器（如 `/etc/fstab` 或 **vim**）在 EBS 卷上打开 **nano** 文件，然后删除实例存储（临时）卷的所有条目。因为 EBS 卷装载在 `/mnt/ebs` 上，所以 `fstab` 文件位于 `/mnt/ebs/etc/fstab` 处。

   ```
   [ec2-user bundle]$ sudo nano /mnt/ebs/etc/fstab
   #
   LABEL=/     /           ext4    defaults,noatime  1   1
   tmpfs       /dev/shm    tmpfs   defaults        0   0
   devpts      /dev/pts    devpts  gid=5,mode=620  0   0
   sysfs       /sys        sysfs   defaults        0   0
   proc        /proc       proc    defaults        0   0
   /dev/sdb        /media/ephemeral0       auto    defaults,comment=cloudconfig    0       2
   ```

   在本示例中，应删除最后一行。

1. 从实例中卸载和分离该卷。

   ```
   [ec2-user bundle]$ sudo umount /mnt/ebs
   [ec2-user bundle]$ aws ec2 detach-volume --volume-id vol-01234567890abcdef --region us-west-2
   ```

1. 按如下所示从新 EBS 卷创建 AMI。

   1. 创建新 EBS 卷的快照。

      ```
      [ec2-user bundle]$ aws ec2 create-snapshot --region us-west-2 --description "your_snapshot_description" --volume-id vol-01234567890abcdef
      ```

   1. 检查快照是否完整。

      ```
      [ec2-user bundle]$ aws ec2 describe-snapshots --region us-west-2 --snapshot-id snap-0abcdef1234567890
      ```

   1. 使用 `aki` 命令标识在原始 AMI 上使用的处理器架构、虚拟化类型和内核映像 (**describe-images**)。对于此步骤，您需要 Amazon S3 支持的原始 AMI 的 AMI ID。

      ```
      [ec2-user bundle]$ aws ec2 describe-images --region us-west-2 --image-id ami-0abcdef1234567890 --output text
      IMAGES	x86_64	amazon/amzn-ami-pv-2013.09.2.x86_64-s3	ami-8ef297be	amazon	available	public	machine	aki-fc8f11cc	instance-store	paravirtual	xen
      ```

      在此示例中，架构是 `x86_64`，内核映像 ID 是 `aki-fc8f11cc`。在以下步骤中使用这些值。如果上面命令的输出还列出 `ari` ID，请记下该 ID。

   1. 使用新 EBS 卷的快照 ID 和上一步中得到的值注册新 AMI。如果前一命令输出列出了 `ari` ID，请通过 `--ramdisk-id ari_id` 将其包括在后续命令中。

      ```
      [ec2-user bundle]$ aws ec2 register-image --region us-west-2 --name your_new_ami_name --block-device-mappings DeviceName=device-name,Ebs={SnapshotId=snap-0abcdef1234567890} --virtualization-type paravirtual --architecture x86_64 --kernel-id aki-fc8f11cc --root-device-name device-name
      ```

1. (可选) 测试了您可以从新 AMI 启动实例之后，您可以删除为此过程创建的 EBS 卷。

   ```
   aws ec2 delete-volume --volume-id vol-01234567890abcdef
   ```

# 使用 Windows Sysprep 创建 Amazon EC2 AMI
<a name="ami-create-win-sysprep"></a>

Microsoft 系统准备（简称 Windows Sysprep）工具会创建操作系统的通用版本，可在捕获新映像之前删除实例特定的系统配置。

我们建议您使用 [EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html) 自动创建、管理和部署自定义、安全且最新的“黄金”服务器映像，这些映像是预先安装的，并预配置了软件和设置。

您还可以使用 Windows Sysprep 通过以下 Windows 启动代理创建标准化 AMI：EC2Launch v2、EC2Launch 和 EC2Config。

**重要**  
不要使用 Windows Sysprep 创建实例备份。Windows Sysprep 会删除系统特定的信息；删除这些信息可能会对实例备份造成意外结果。

要排查 Windows Sysprep 问题，请参阅[排查 Amazon EC2 Windows 实例的 Sysprep 问题](sysprep-troubleshoot.md)。

**Topics**
+ [

## Windows Sysprep 阶段
](#sysprep-phases)
+ [

## 开始前的准备工作
](#sysprep-begin)
+ [将 Windows Sysprep 与 EC2Launch v2 结合使用](sysprep-using-ec2launchv2.md)
+ [将 Windows Sysprep 与 EC2Launch 结合使用](ec2launch-sysprep.md)
+ [将 Windows Sysprep 与 EC2Config 结合使用](sysprep-using.md)

## Windows Sysprep 阶段
<a name="sysprep-phases"></a>

Windows Sysprep 会经历以下阶段：
+ **一般化**：Sysprep 工具删除映像特定的信息和配置。例如，Windows Sysprep 会删除安全标识符（SID）、计算机名称、事件日志和特定驱动程序，等等。完成这一阶段后，操作系统 (OS) 即准备就绪，可以创建 AMI。
**注意**  
使用 Windows 启动代理运行 Windows Sysprep 时，系统会阻止删除驱动程序，因为 `PersistAllDeviceInstalls` 在默认情况下设置为 true。
+ **专门化**：即插即用功能会扫描计算机并为检测到的所有设备安装驱动程序。Sysprep 工具会生成操作系统要求，如计算机名称和 SID。您可以选择在这一阶段运行命令。
+ **全新体验 (OOBE)**：系统运行 Windows 安装程序的一个简化版本并要求您输入系统语言、时区和注册组织等信息。使用 Windows 启动运行 Windows Sysprep 时，应答文件会自动执行这一阶段。

## 开始前的准备工作
<a name="sysprep-begin"></a>
+ 执行 Windows Sysprep 前，建议删除所有本地用户账户及所有账户配置文件，而不是将在其下方运行 Windows Sysprep 的单个管理员账户。如果使用其他账户和配置文件执行 Windows Sysprep，可能会产生意外行为，包括配置文件数据丢失或完成 Sysprep 失败。
+ 了解有关 [Sysprep 概览](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/sysprep--system-preparation--overview)的更多信息。
+ 了解 [Sysprep Support for Server Roles](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/sysprep-support-for-server-roles)。

# 使用 Windows Sysprep 和 EC2Launch v2 创建 AMI
<a name="sysprep-using-ec2launchv2"></a>

当您从安装了 EC2Launch v2 代理的实例创建映像时，EC2Launch v2 会在准备映像时执行特定的任务。这包括使用 Windows Sysprep。有关更多信息，请参阅 [Windows Sysprep 阶段](ami-create-win-sysprep.md#sysprep-phases)。

**Topics**
+ [

## Windows Sysprep 操作
](#sysprep-actions-ec2launchv2)
+ [

## Sysprep 之后
](#sysprep-post-ec2launchv2)
+ [

## 使用 EC2Launch v2 运行 Windows Sysprep
](#sysprep-gui-procedure-ec2launchv2)

## Windows Sysprep 操作
<a name="sysprep-actions-ec2launchv2"></a>

在准备映像的过程中，Windows Sysprep 和 EC2Launch v2 会执行以下操作。

1. 当您在 **EC2Launch 设置**对话框中选择**使用 Sysprep 关闭**时，系统会运行 `ec2launch sysprep` 命令。

1. EC2Launch v2 通过读取 `unattend.xml` 的注册表值来编辑 `HKEY_USERS\.DEFAULT\Control Panel\International\LocaleName` 文件的内容。该文件位于以下目录中：`C:\ProgramData\Amazon\EC2Launch\sysprep`。

1. 系统运行 `BeforeSysprep.cmd`。该命令创建一个注册表项，如下所示：

   **reg add "HKEY\$1LOCAL\$1MACHINE\$1SYSTEM\$1CurrentControlSet\$1Control\$1Terminal Server" /v fDenyTSConnections /t REG\$1DWORD /d 1 /f**

   该注册表项禁用 RDP 连接，直到它们重新启用。禁用 RDP 连接是必需的安全措施，因为在 Windows Sysprep 运行之后的第一个启动会话过程中，在短时间内，RDP 允许连接并且管理员密码为空。

1. EC2Launch v2 服务通过运行以下命令来调用 Windows Sysprep：

   **sysprep.exe /oobe /generalize /shutdown /unattend: "C:\$1ProgramData\$1Amazon\$1EC2Launch\$1sysprep\$1unattend.xml"**

### 一般化阶段
<a name="sysprep-generalize-ec2launchv2"></a>
+ EC2Launch v2 删除特定于映像的信息和配置，如计算机名称和 SID。如果实例是域的成员，则会从域中将其删除。`unattend.xml` 应答文件包含影响这一阶段的以下设置：
  + **PersistAllDeviceInstalls**：此设置防止 Windows 安装程序删除和重新配置设备，这可加快映像准备过程，因为 Amazon AMI 需要运行特定驱动程序，而这些驱动程序的重新检测需要花费一些时间。
  + **DoNotCleanUpNonPresentDevices**：此设置为当前不存在的设备保留即插即用信息。
+ Windows Sysprep 在准备创建 AMI 时会关闭操作系统。系统会启动新实例或启动原始实例。

### 专门化阶段
<a name="sysprep-specialize-ec2launchv2"></a>

系统生成特定于操作系统的要求，如计算机名称和 SID。系统还会根据您在 `unattend.xml` 应答文件中指定的配置执行以下操作。
+ **CopyProfile**：Windows Sysprep 可以配置为删除所有用户配置文件，包括内置管理员配置文件。此设置保留内置管理员账户，这样，您对该账户进行的所有自定义设置就都可以转移到新映像。默认值为 `True`。

  **CopyProfile** 将默认配置文件替换为现有本地管理员配置文件。运行 Windows Sysprep 后登录的所有账户在首次登录时都会收到该配置文件的副本及其内容。

  如果您没有要转移到新映像的特定用户配置文件自定义设置，请将此设置更改为 `False`。Windows Sysprep 会删除所有用户配置文件；此举可以节省时间和磁盘空间。
+ **TimeZone**：默认情况下，时区设置为协调世界时 (UTC)。
+ **顺序 1 同步命令**：系统运行以下命令，以启用管理员账户并指定密码要求。

  ```
  net user Administrator /ACTIVE:YES /LOGONPASSWORDCHG:NO /EXPIRES:NEVER /PASSWORDREQ:YES
  ```
+ **顺序 2 同步命令**：系统加密管理员密码。如果未配置 `setAdminAccount` 任务，则此安全措施可防止实例在 Windows Sysprep 完成后处于可访问状态。

  系统会从本地启动代理目录 (`C:\Program Files\Amazon\EC2Launch\`) 运行以下命令。

  ```
  EC2Launch.exe internal randomize-password --username Administrator
  ```
+ 要启用远程桌面连接，系统会将终端服务器 `fDenyTSConnections` 注册表项设置为 false。

### OOBE 阶段
<a name="sysprep-oobe-ec2launchv2"></a>

1. 系统使用 EC2Launch v2 应答文件指定以下配置：
   + `<InputLocale>en-US</InputLocale>`
   + `<SystemLocale>en-US</SystemLocale>`
   + `<UILanguage>en-US</UILanguage>`
   + `<UserLocale>en-US</UserLocale>`
   + `<HideEULAPage>true</HideEULAPage>`
   + `<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>`
   + `<ProtectYourPC>3</ProtectYourPC>`
   + `<BluetoothTaskbarIconEnabled>false</BluetoothTaskbarIconEnabled>`
   + `<TimeZone>UTC</TimeZone>`
   + `<RegisteredOrganization>Amazon.com</RegisteredOrganization>`
   + `<RegisteredOwner>EC2</RegisteredOwner>`
**注意**  
在一般化和专门化阶段，EC2Launch v2 会监控操作系统的状态。如果 EC2Launch v2 检测到操作系统处于 Sysprep 阶段，则会将以下消息发布到系统日志：  
正在配置 Windows。SysprepState=IMAGE\$1STATE\$1UNDEPLOYABLE

1. 系统运行 EC2Launch v2。

## Sysprep 之后
<a name="sysprep-post-ec2launchv2"></a>

Windows Sysprep 完成后，EC2Launch v2 会将以下消息发送到控制台输出：

```
Windows sysprep configuration complete.
```

EC2Launch v2 随后执行以下操作：

1. 读取 `agent-config.yml` 文件的内容并运行配置的任务。

1. 执行 `preReady` 阶段的所有任务。

1. 完成后，将 `Windows is ready` 消息发送到实例系统日志。

1. 执行 `PostReady` 阶段的所有任务。

有关 EC2Launch v2 的更多信息，请参阅[使用 EC2Launch v2 代理在 EC2 Windows 实例启动期间执行任务](ec2launch-v2.md)。

## 使用 EC2Launch v2 运行 Windows Sysprep
<a name="sysprep-gui-procedure-ec2launchv2"></a>

按照以下过程，结合使用 Windows Sysprep 与 EC2Launch v2 来创建标准化 AMI。

1. 在 Amazon EC2 控制台中，查找要复制的 AMI。

1. 启动并连接到您的 Windows 实例。

1. 自定义设置

   1. 在 Windows **开始**菜单中，搜索并选择 **Amazon EC2Launch 设置**。有关 Amazon **EC2Launch 设置**对话框中的选项和设置的更多信息，请参阅 [配置 Windows 实例的 EC2Launch v2 设置](ec2launch-v2-settings.md)。

   1. 如果您进行了更改，请选择**保存**后再关闭。

1. 选择**使用 Sysprep 关闭**或**不使用 Sysprep 关闭**。

如果系统询问您是否想运行 Windows Sysprep 并关闭该实例，请单击**是**。EC2Launch v2 会运行 Windows Sysprep。然后，您退出实例，实例关闭。如果您在 Amazon EC2 控制台中查看**实例**页面，实例状态会从 `Running` 变为 `Stopping`，再变为 `Stopped`。此时，从该实例创建一个 AMI 是安全的。

您可以使用以下命令从命令行中手动调用 Windows Sysprep 工具：

```
"%programfiles%\amazon\ec2launch\ec2launch.exe" sysprep --shutdown=true
```

# 使用 Windows Sysprep 和 EC2Launch 创建 AMI
<a name="ec2launch-sysprep"></a>

当您从安装了 EC2Launch 代理的实例创建映像时，EC2Launch 会在准备映像时执行特定的任务。这包括使用 Windows Sysprep。有关更多信息，请参阅 [Windows Sysprep 阶段](ami-create-win-sysprep.md#sysprep-phases)。

EC2Launch 为 Windows Sysprep 提供一个默认应答文件和批处理文件，来自动执行并保护 AMI 上的映像准备过程。您可以选择性地修改这些文件。这些文件默认位于以下目录：`C:\ProgramData\Amazon\EC2-Windows\Launch\Sysprep`。

**重要**  
不要使用 Windows Sysprep 创建实例备份。Windows Sysprep 会删除系统特定的信息。如果您删除此信息，可能会给实例备份带来意想不到的后果。

**Topics**
+ [

## 用于 Windows Sysprep 的 EC2Launch 应答文件和批处理文件
](#ec2launch-sysprep-answer-batch)
+ [

## 使用 EC2Launch 运行 Windows Sysprep
](#ec2launch-sysprep-running)
+ [

## 在启动自定义 AMI 时更新 Server 2016 及更高版本的元数据/KMS 路由
](#update-metadata-KMS)

## 用于 Windows Sysprep 的 EC2Launch 应答文件和批处理文件
<a name="ec2launch-sysprep-answer-batch"></a>

用于 Windows Sysprep 的 EC2Launch 应答文件和批处理文件包括：

`Unattend.xml`  
这是默认应答文件。如果您运行 `SysprepInstance.ps1` 或者在用户界面中选择 **ShutdownWithSysprep**，系统会从该文件中读取设置。

`BeforeSysprep.cmd`  
自定义此批处理文件，以便在 EC2Launch 运行 Windows Sysprep 前执行命令。

`SysprepSpecialize.cmd`  
自定义此批处理文件，以便在 Windows Sysprep 专门化阶段期间运行命令。

## 使用 EC2Launch 运行 Windows Sysprep
<a name="ec2launch-sysprep-running"></a>

在 Windows Server 2016 及更高版本的完整安装（带有桌面体验）上，可以通过手动方式使用 EC2Launch 运行 Windows Sysprep，也可以通过 **EC2Launch Settings** 应用程序运行 Windows Sysprep。

**使用 EC2Launch Settings 应用程序运行 Windows Sysprep**

1. 在 Amazon EC2 控制台中，找到或创建 Windows Server 2016 或更高版本 AMI。

1. 从该 AMI 中启动 Windows 实例。

1. 连接到您的 Windows 实例并对其进行自定义。

1. 搜索并运行 **EC2LaunchSettings** 应用程序。默认情况下它位于以下内容：`C:\ProgramData\Amazon\EC2-Windows\Launch\Settings`。  
![\[EC2 Launch Settings 应用程序\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ec2launch-sysprep.png)

1. 根据需要选中或清除选项。这些设置存储在 `LaunchConfig.json` 文件中。

1. 对于 **Administrator Password**，请执行以下操作之一：
   + 选择 **Random**。EC2Launch 生成一个密码并使用用户的密钥对其进行加密。系统会在实例启动后禁用此设置，以便在重新启动或停止再启动实例后该密码仍然存在。
   + 选择 **Specify** 并键入一个符合系统要求的密码。该密码以明文方式存储在 `LaunchConfig.json` 文件中，并且在 Windows Sysprep 设置管理员密码时会被删除。如果现在就关闭，则会立即设置密码。EC2Launch 使用用户的密钥对密码进行加密。
   + 选择 **DoNothing** 并在 `unattend.xml` 文件中指定密码。如果未在 `unattend.xml` 中指定密码，管理员账户会被禁用。

1. 选择 **Shutdown with Sysprep (使用 Sysprep 关闭)**。

**使用 EC2Launch 手动运行 Windows Sysprep**

1. 在 Amazon EC2 控制台中找到或创建您要复制的 Windows Server 2016 或更高版本数据中心版 AMI。

1. 启动并连接到您的 Windows 实例。

1. 自定义实例。

1. 在 `LaunchConfig.json` 文件中指定设置。默认情况下，该文件位于 `C:\ProgramData\Amazon\EC2-Windows\Launch\Config` 目录中。

   对于 `adminPasswordType`，请指定下列值之一：  
`Random`  
EC2Launch 生成一个密码并使用用户的密钥对其进行加密。系统会在实例启动后禁用此设置，以便在重新启动或停止再启动实例后该密码仍然存在。  
`Specify`  
EC2Launch 使用您在 `adminPassword` 中指定的密码。如果密码不满足系统要求，EC2Launch 会生成随机密码。该密码以明文方式存储在 `LaunchConfig.json` 文件中，并且在 Windows Sysprep 设置管理员密码时会被删除。EC2Launch 使用用户的密钥对密码进行加密。  
`DoNothing`  
EC2Launch 使用您在 `unattend.xml` 文件中指定的密码。如果未在 `unattend.xml` 中指定密码，管理员账户会被禁用。

1. (可选) 在 `unattend.xml` 和其他配置文件中指定设置。如果您计划参与安装，则无需在这些文件中进行更改。这些文件默认位于以下目录：`C:\ProgramData\Amazon\EC2-Windows\Launch\Sysprep`。

1. 在 Windows PowerShell 中，运行 `./InitializeInstance.ps1 -Schedule`。默认情况下，该脚本位于以下目录中：`C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts`。该脚本安排实例在下次启动期间初始化。您必须先运行此脚本，然后再在下一个步骤中运行 `SysprepInstance.ps1` 脚本。

1. 在 Windows PowerShell 中，运行 `./SysprepInstance.ps1`。默认情况下，该脚本位于以下目录中：`C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts`。

您会退出实例并且实例会关闭。如果您在 Amazon EC2 控制台中查看**实例**页面，实例状态会从 `Running` 变为 `Stopping`，然后变为 `Stopped`。此时，从该实例创建 AMI 是安全的。

## 在启动自定义 AMI 时更新 Server 2016 及更高版本的元数据/KMS 路由
<a name="update-metadata-KMS"></a>

要在启动自定义 AMI 时更新 Server 2016 及更高版本的元数据/KMS 路由，请执行下列操作之一：
+ 运行 EC2LaunchSettings GUI (C:\$1ProgramData\$1Amazon\$1EC2-Windows\$1Launch\$1Settings\$1Ec2LaunchSettings.exe)，并选择相应选项以便在使用 Windows Sysprep 的情况下关闭。
+ 在创建 AMI 之前，运行 EC2LaunchSettings，并在未使用 Windows Sysprep 的情况下关闭。这会将 EC2 启动初始化任务设置为在下次引导时运行，从而根据实例的子网设置路由。
+ 在从 [PowerShell](ec2launch-config.md#ec2launch-inittasks) 创建 AMI 之前，手动重新计划 EC2 启动初始化任务。
**重要**  
在重新计划任务之间记录默认的密码重置行为。
+ 要在发生 Windows 激活失败或与实例元数据通信失败的正在运行的实例上更新路由，请参阅[“无法激活 Windows”](common-messages.md#activate-windows)。

# 使用 Windows Sysprep 和 EC2Config 创建 AMI
<a name="sysprep-using"></a>

当您从安装了 EC2Config 服务的实例创建映像时， EC2Config 会在准备映像时执行特定的任务。这包括使用 Windows Sysprep。有关更多信息，请参阅 [Windows Sysprep 阶段](ami-create-win-sysprep.md#sysprep-phases)。

**Topics**
+ [

## Windows Sysprep 操作
](#sysprep-actions)
+ [

## Sysprep 之后
](#sysprep-post)
+ [

## 使用 EC2Config 服务运行 Windows Sysprep
](#sysprep-gui-procedure)

## Windows Sysprep 操作
<a name="sysprep-actions"></a>

在准备映像的过程中，Windows Sysprep 和 EC2Config 服务会执行以下操作。

1. 在 **EC2 服务属性**对话框中选择**使用 Sysprep 关闭**时，系统会运行 **ec2config.exe -sysprep** 命令。

1. EC2Config 服务读取 `BundleConfig.xml` 文件的内容。默认情况下，该文件位于以下目录中：`C:\Program Files\Amazon\Ec2ConfigService\Settings`。

    `BundleConfig.xml` 文件包含以下设置：您可以更改这些设置：
   + **AutoSysprep**：指明是否自动使用 Windows Sysprep。如果从 EC2 Service Properties 对话框运行 Windows Sysprep，则无需更改此值。默认值为 `No`。
   + **SetRDPCertificate**：为远程桌面服务器设置自签名证书。这样，您可以安全地使用远程桌面协议 (RDP) 连接到实例。如果新实例应使用证书，请将该值更改为 `Yes`。此设置不适用于 Windows Server 2012 实例，因为这些操作系统会生成自己的证书。默认值为 `No`。
   + **SetPasswordAfterSysprep**：在新启动的实例上设置随机密码，使用用户启动密钥对其加密，并将加密密码输出到控制台。如果新实例不应设置为随机加密密码，请将该值更改为 `No`。默认值为 `Yes`。
   +  **PreSysprepRunCmd**：要运行的命令的位置。默认情况下，该命令位于以下目录中：`C:\Program Files\Amazon\Ec2ConfigService\Scripts\BeforeSysprep.cmd`。

1. 系统运行 `BeforeSysprep.cmd`。该命令创建一个注册表项，如下所示：

   ```
   reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 1 /f
   ```

   该注册表项禁用 RDP 连接，直到它们重新启用。禁用 RDP 连接是必需的安全措施，因为在 Windows Sysprep 运行之后的第一个启动会话过程中，在短时间内，RDP 允许连接并且管理员密码为空。

1. EC2Config 服务通过运行以下命令来调用 Windows Sysprep：

   ```
   sysprep.exe /unattend: "C:\Program Files\Amazon\Ec2ConfigService\sysprep2008.xml" /oobe /generalize /shutdown
   ```

### 一般化阶段
<a name="sysprep-generalize"></a>
+ 该工具删除特定于映像的信息和配置 (如计算机名称和 SID)。如果实例是域的成员，则会从域中将其删除。`sysprep2008.xml` 应答文件包含影响这一阶段的以下设置：
  + **PersistAllDeviceInstalls**：此设置防止 Windows 安装程序删除和重新配置设备，这可加快映像准备过程，因为 Amazon AMI 需要运行特定驱动程序，而这些驱动程序的重新检测需要花费一些时间。
  + **DoNotCleanUpNonPresentDevices**：此设置为当前不存在的设备保留即插即用信息。
+ Windows Sysprep 在准备创建 AMI 时会关闭操作系统。系统会启动新实例或启动原始实例。

### 专门化阶段
<a name="sysprep-specialize"></a>

系统生成特定于操作系统的要求，如计算机名称和 SID。系统还根据您在 sysprep2008.xml 应答文件中指定的配置来执行以下操作。
+ **CopyProfile**：Windows Sysprep 可以配置为删除所有用户配置文件，包括内置管理员配置文件。此设置保留内置管理员账户，这样，您对该账户进行的所有自定义都可转移到新映像。默认值是 True。

  **CopyProfile** 将默认配置文件替换为现有本地管理员配置文件。运行 Windows Sysprep 后登录的所有账户在首次登录时都会收到该配置文件的副本及其内容。

  如果您没有要转移到新映像的特定用户配置文件自定义设置，请将此设置更改为 False。Windows Sysprep 会删除所有用户配置文件；此举可以节省时间和磁盘空间。
+ **TimeZone**：默认情况下，时区设置为协调世界时 (UTC)。
+ **顺序 1 同步命令**：系统运行以下命令，以启用管理员账户并指定密码要求。

  **net user Administrator /ACTIVE:YES /LOGONPASSWORDCHG:NO /EXPIRES:NEVER /PASSWORDREQ:YES**
+ **顺序 2 同步命令**：系统加密管理员密码。如果未启用 ec2setpassword 设置，则此安全措施可防止实例在 Windows Sysprep 完成后处于可访问状态。

  C:\$1Program Files\$1Amazon\$1Ec2ConfigService\$1ScramblePassword.exe" -u Administrator
+ **顺序 3 同步命令**：系统运行以下命令：

  C:\$1Program Files\$1Amazon\$1Ec2ConfigService\$1Scripts\$1SysprepSpecializePhase.cmd

   该命令添加以下注册表项，用于重新启用 RDP：

  reg add "HKEY\$1LOCAL\$1MACHINE\$1SYSTEM\$1CurrentControlSet\$1Control\$1Terminal Server" /v fDenyTSConnections /t REG\$1DWORD /d 0 /f

### OOBE 阶段
<a name="sysprep-oobe"></a>

1. 通过使用 EC2Config 服务应答文件，系统指定以下配置：
   + <InputLocale>en-US</InputLocale>
   + <SystemLocale>en-US</SystemLocale>
   + <UILanguage>en-US</UILanguage>
   + <UserLocale>en-US</UserLocale>
   + <HideEULAPage>true</HideEULAPage>
   + <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
   + <NetworkLocation>Other</NetworkLocation>
   + <ProtectYourPC>3</ProtectYourPC>
   + <BluetoothTaskbarIconEnabled>false</BluetoothTaskbarIconEnabled>
   + <TimeZone>UTC</TimeZone>
   + <RegisteredOrganization>Amazon.com</RegisteredOrganization>
   + <RegisteredOwner>Amazon</RegisteredOwner>
**注意**  
在一般化和专门化阶段期间，EC2Config 服务监控操作系统的状态。如果 EC2Config 检测到操作系统处于 Sysprep 阶段，则会将以下消息发布到系统日志：  
EC2ConfigMonitorState: 0 Windows is being configured. SysprepState=IMAGE\$1STATE\$1UNDEPLOYABLE

1. OOBE 阶段完成后，系统将 从以下位置运行 `SetupComplete.cmd`：`C:\Windows\Setup\Scripts\SetupComplete.cmd`。在 2015 年 4 月之前的 Amazon 公用 AMI 中，此文件为空，不对映像运行任何操作。在 2015 年 4 月之后的公开 AMI 中，此文件包含以下值：**call "C:\$1Program Files\$1Amazon\$1Ec2ConfigService\$1Scripts\$1PostSysprep.cmd"**。

1. 系统运行 `PostSysprep.cmd`，执行以下操作：
   + 将本地管理员密码设置为不过期。如果密码已过期，管理员可能无法登录。
   + 设置 MSSQLServer 机器名称 (如果已安装)，以便该名称与 AMI 同步。

## Sysprep 之后
<a name="sysprep-post"></a>

Windows Sysprep 完成后，EC2Config 服务会将以下消息发送到控制台输出：

```
Windows sysprep configuration complete.
			Message: Sysprep Start
			Message: Sysprep End
```

EC2Config 随后执行以下操作：

1. 读取 config.xml 文件的内容并列出所有已启用的插件。

1. 同时执行所有“Windows 就绪之前”插件。
   + Ec2SetPassword
   + Ec2SetComputerName
   + Ec2InitializeDrives
   + Ec2EventLog
   + Ec2ConfigureRDP
   + Ec2OutputRDPCert
   + Ec2SetDriveLetter
   + Ec2WindowsActivate
   + Ec2DynamicBootVolumeSize

1. 完成之后，将“Windows 准备就绪”消息发送到实例系统日志。

1. 同时运行所有“Windows 就绪之后”插件。
   + Amazon CloudWatch Logs 
   + UserData
   + AWS Systems Manager (Systems Manager) 

有关 Windows 插件的更多信息，请参阅[使用 EC2Config 服务在 EC2 旧版 Windows 操作系统实例启动期间执行任务](ec2config-service.md)。

## 使用 EC2Config 服务运行 Windows Sysprep
<a name="sysprep-gui-procedure"></a>

按照以下过程，结合使用 Windows Sysprep 与 EC2Config 服务来创建标准化 AMI。

1. 在 Amazon EC2 控制台中，查找或[创建](creating-an-ami-ebs.md)要复制的 AMI。

1. 启动并连接到您的 Windows 实例。

1. 对它进行自定义。

1. 在 EC2Config 服务应答文件中指定配置设置：

   `C:\Program Files\Amazon\Ec2ConfigService\sysprep2008.xml`

1. 在 Windows **开始**菜单中，选择**所有程序**，然后选择 **EC2ConfigService Settings**。

1. 在 **Ec2 Service Properties** 对话框中选择 **Image** 选项卡。有关 Ec2 Service Properties 对话框中的选项和设置的更多信息，请参阅 [Ec2 服务属性](ec2config-service.md)。

1. 选择管理员密码选项，然后选择 **Shutdown with Sysprep** 或 **Shutdown without Sysprep**。EC2Config 会根据您选择的密码选项编辑设置文件。
   + **随机**：EC2Config 生成一个密码，使用用户的密钥加密，并向控制台显示加密的密码。我们会在首次启动后禁用此设置，以便在重启或停止再启动实例后该密码仍然存在。
   + **指定**：密码以非加密格式（明文）存储在 Windows Sysprep 应答文件中。下一次运行 Windows Sysprep 时，即会设置管理员密码。如果现在就关闭，则会立即设置密码。服务再次启动时，则会删除管理员密码。务必要记住此密码，因为以后无法将其取回。
   + **保持现有**：运行 Windows Sysprep 或重新启动 EC2Config 时，管理员账户的现有密码不变。务必要记住此密码，因为以后无法将其取回。

1. 选择 **OK**。

如果系统询问您是否想运行 Windows Sysprep 并关闭该实例，请单击**是**。您会看到 EC2Config 运行 Windows Sysprep。然后，您会退出实例并且实例会关闭。如果您在 Amazon EC2 控制台中查看 **Instances (实例)** 页面，实例状态会从 `Running` 变为 `Stopping`，然后最终变为 `Stopped`。此时，从该实例创建一个 AMI 是安全的。

您可以使用以下命令从命令行中手动调用 Windows Sysprep 工具：

```
"%programfiles%\amazon\ec2configservice\"ec2config.exe -sysprep"" 
```

**注意**  
如果您的 CMD Shell 已在 C:\$1Program Files\$1Amazon\$1EC2ConfigService\$1 目录中，则命令中不需要双引号。

但是，请务必确保 `Ec2ConfigService\Settings` 文件夹中指定的 XML 文件选项正确无误，否则您可能无法连接到实例。有关设置文件的更多信息，请参阅 [EC2Config 设置文件](ec2config-service.md#UsingConfigXML_WinAMI)。有关配置 Windows Sysprep 并从命令行中运行它的示例，请参阅 `Ec2ConfigService\Scripts\InstallUpdates.ps1`。

# 复制 Amazon EC2 AMI
<a name="CopyingAMIs"></a>

如果需要跨多个区域统一配置 Amazon EC2 实例，您可以将单个亚马逊机器映像（AMI）作为模板来启动所有实例。但由于 AMI 属于区域特定的资源，要在特定 AWS 区域中启动实例，该 AMI 必须位于该区域。因此，要在多个区域使用相同的 AMI，必须将其从源区域复制到每个目标区域。

用于复制 AMI 的方法取决于您是*在同一[分区](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#partition)内*跨区域复制，还是*跨不同分区*复制：
+ **跨区域复制** – *在同一分区内*跨区域复制 AMI，例如，在商业分区内跨区域复制。本主题中介绍的就是这种复制方法。
+ **跨分区复制** – 将 AMI *从一个分区复制到另一个分区*，例如，从商业分区复制到 AWS GovCloud (US) 分区。有关此复制方法的更多信息，请参阅[存储和还原 AMI允许的 AMI](ami-store-restore.md)。
+ **跨账户复制** – 创建由其他 AWS 账户[与您的 AWS 账户共享](sharingamis-explicit.md)的 AMI 的副本。本主题中介绍的就是这种复制方法。

对于跨区域和跨账户 AMI 复制，完成复制操作需要的时间为尽力完成的时间。如果需要控制完成时间，您可以指定一个介于 15 分钟到 48 小时之间的完成时限，从而确保在所需的时限内复制 AMI。基于时间的 AMI 复制操作会产生额外的费用。有关更多信息，请参阅《Amazon EBS 用户指南》中的 [Time-based copies](https://docs.aws.amazon.com/ebs/latest/userguide/time-based-copies.html)**。

**Topics**
+ [

## 注意事项
](#copy-ami-considerations)
+ [

## 成本
](#copy-ami-costs)
+ [

# 授予复制 Amazon EC2 AMI 的权限
](copy-ami-permissions.md)
+ [

## 复制 AMI
](#ami-copy-steps)
+ [

## 停止待处理的 AMI 复制操作
](#ami-copy-stop)
+ [

# Amazon EC2 AMI 复制工作原理
](how-ami-copy-works.md)

## 注意事项
<a name="copy-ami-considerations"></a>
+ **复制 AMI 的权限** – 您可以使用 IAM 策略授予或拒绝用户复制 AMI 的权限。从 2024 年 10 月 28 日开始，您可以为源 AMI 上的 `CopyImage` 操作指定资源级权限。新 AMI 的资源级权限与以前一样可用。
+ **启动权限和 Amazon S3 存储桶权限** – AWS 不会将启动权限或 Amazon S3 存储桶权限从源 AMI 复制到新 AMI。复制操作完成之后，您可以将启动许可和 Amazon S3 存储桶权限应用于新的 AMI。
+ **标签** – 您只能复制附加到源 AMI 的用户定义的 AMI 标签。不会复制系统标签（前缀为 `aws:`）和由其他 AWS 账户 附加的用户定义标签。复制 AMI 时，您可以向新 AMI 及其备份快照附加新标签。
+ **基于时间的 AMI 复制配额** – 达到*累积快照复制吞吐量配额*后，后续基于时间的 AMI 复制请求将会失败。有关更多信息，请参阅《Amazon EBS 用户指南》中的 [Quotas for time-based copies](https://docs.aws.amazon.com/ebs/latest/userguide/time-based-copies.html#time-based-copies-quota)**。
+ **支持的源-目标复制** – 源 AMI 的位置决定您是否可以复制它以及新 AMI 允许的目标：
  + 如果源 AMI 位于某个区域，您可以在该区域内复制它，或者将其复制到另一个区域、与该区域关联的 Outpost 或该区域的本地区域。
  + 如果源 AMI 位于某个本地区域，您可以在该本地区域内复制它，或者将其复制到该本地区域的父区域或具有相同父区域的某些其他本地区域。
  + 如果源 AMI 位于某个 Outpost 上，则您无法复制它。
+ **源和目标的 CLI 参数** – 使用 CLI 时，支持通过以下参数来指定要复制的 AMI 的源位置和新 AMI 的目标。请注意，复制操作必须在目标区域中启动；如果省略 `--region` 参数，则目标将采用 AWS CLI 设置中配置的默认区域。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/CopyingAMIs.html)

## 成本
<a name="copy-ami-costs"></a>

如果未指定完成时间，则复制 AMI 不会产生任何费用。而基于时间的 AMI 复制操作会产生额外的费用。有关更多信息，请参阅《Amazon EBS 用户指南》中的 [Time-based copies](https://docs.aws.amazon.com/ebs/latest/userguide/time-based-copies.html#time-based-copies-pricing)**。

将会收取标准的存储和数据传输费。如果您复制由 EBS 支持的 AMI，则任何其他 EBS 快照的存储将会产生费用。

# 授予复制 Amazon EC2 AMI 的权限
<a name="copy-ami-permissions"></a>

要复制 EBS-backed AMI 或 Amazon S3 支持的 AMI，您需要以下 IAM 权限：
+ `ec2:CopyImage` – 复制 AMI。对于 EBS-backed AMI，它还授予复制 AMI 支持快照的权限。
+ `ec2:CreateTags` – 标记目标 AMI。对于 EBS-backed AMI，它还授予标记目标 AMI 支持快照的权限。

如果您要复制由实例存储支持的 AMI，则需要以下*额外的* IAM 权限：
+ `s3:CreateBucket` – 在目标区域为新的 AMI 创建 S3 存储桶
+ `s3:PutBucketOwnershipControls` – 为新创建的 S3 存储桶启用 ACL，以便可以使用 `aws-exec-read` [标准 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl) 写入对象
+ `s3:GetBucketAcl` – 读取源存储桶的 ACL
+ `s3:ListAllMyBuckets` – 在目标区域为 AMI 查找现有 S3 存储桶
+ `s3:GetObject` – 读取源存储桶中的对象
+ `s3:PutObject` – 将对象写入目标存储桶
+ `s3:PutObjectAcl` – 将新对象的权限写入目标存储桶

**注意**  
从 2024 年 10 月 28 日开始，您可以为源 AMI 上的 `CopyImage` 操作指定资源级权限。目标 AMI 的资源级权限与以前一样可用。有关更多信息，请参阅《*服务授权参考*》中的 [Amazon EC2 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html#amazonec2-actions-as-permissions)下的表中的 **CopyImage**。

## 用于复制 EBS-backed AMI 并标记目标 AMI 和快照的 IAM policy 示例
<a name="permissions-to-copy-ebs-backed-ami"></a>

以下示例策略授予您复制任何 EBS-backed AMI 并标记目标 AMI 及其支持快照的权限。

**注意**  
从 2024 年 10 月 28 日开始，您可以在 `Resource` 元素中指定快照。有关更多信息，请参阅《*服务授权参考*》中的 [Amazon EC2 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html#amazonec2-actions-as-permissions)下的表中的 **CopyImage**。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "PermissionToCopyAllImages",
        "Effect": "Allow",
        "Action": [
            "ec2:CopyImage",
            "ec2:CreateTags"
        ],
        "Resource": [
            "arn:aws:ec2:*::image/*",
            "arn:aws:ec2:*::snapshot/*"
        ]
    }]
}
```

------

## 用于复制 EBS-backed AMI 但拒绝标记新快照的 IAM policy 示例
<a name="permissions-to-copy-ebs-backed-ami-but-deny-tagging-new-snapshots"></a>

当您获取 `ec2:CopySnapshot` 权限时，系统会自动授予 `ec2:CopyImage` 权限。可以明确拒绝标记新的支持快照的权限，从而覆盖 `ec2:CreateTags` 操作的 `Allow` 效果。

以下示例策略授予您复制任何 EBS-backed AMI 但拒绝您标记目标 AMI 的新支持快照的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": [
                "ec2:CopyImage",
                "ec2:CreateTags"
            ],
            "Resource": [
                "arn:aws:ec2:*::image/*",
                "arn:aws:ec2:*::snapshot/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": "ec2:CreateTags",
            "Resource": "arn:aws:ec2:::snapshot/*"
        }
    ]
}
```

------

## 用于复制 Amazon S3 支持的 AMI 并标记目标 AMI 的 IAM 策略示例
<a name="permissions-to-copy-instance-store-backed-ami"></a>

以下示例策略授予您将指定源存储桶中任何 Amazon S3 支持的 AMI 复制到指定区域并标记目标 AMI 的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Sid": "PermissionToCopyAllImages",
            "Effect": "Allow",
            "Action": [
                "ec2:CopyImage",
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:*::image/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket",
                "s3:GetBucketAcl",
                "s3:PutObjectAcl",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::amis-for-111122223333-in-us-east-2-hash"
            ]
        }
    ]
}
```

------

要查找 AMI 源存储桶的 Amazon Resource Name (ARN)，请访问 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，打开 Amazon EC2 控制台，在导航窗格中选择 **AMIs (AMI)**，然后在 **Source (源)** 列中找到该存储桶名称。

**注意**  
仅在您首次将 Amazon S3 支持的 AMI 复制到单个区域时，才需要 `s3:CreateBucket` 权限。在此之后，将使用已在该区域中创建的 Amazon S3 存储桶来存储您将来复制到该区域的所有 AMIs。

## 复制 AMI
<a name="ami-copy-steps"></a>

您可以复制您自己拥有的 AMI，也可以复制其他账户与您共享的 AMI。有关支持的源和目标组合，请参阅[注意事项](#copy-ami-considerations)。

------
#### [ Console ]

**复制 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从控制台导航栏中，选择包含 AMI 的区域。

1. 在导航窗格中，选择 **AMI** 以显示区域中可供您使用的 AMI 列表。

1. 如果看不到您要复制的 AMI，请选择其他筛选条件。您可以按 AMI **我拥有的**、**私有映像**、**公共映像**和**禁用映像**进行筛选。

1. 选择要复制的 AMI，然后选择**操作**、**复制 AMI**。

1. 在**复制亚马逊机器映像（AMI）**页面上，指定以下信息：

   1. **AMI copy name**（AMI 副本名称）：新 AMI 的名称。您可以在名称中包含操作系统信息，因为 Amazon EC2 在显示有关 AMI 的详细信息时不提供该信息。

   1. **Description**（描述）：默认情况下，描述包括源 AMI 的相关信息，以便您能区分副本和原本。您可以按需更改此描述。

   1. **Destination Region**（目标区域）：在其中复制 AMI 的区域。有关更多信息，请参阅[跨区域复制](how-ami-copy-works.md#copy-amis-across-regions)和[跨账户复制](how-ami-copy-works.md#copy-ami-across-accounts)。

   1. **复制标签**：选中此复选框可在复制 AMI 时包含用户定义的 AMI 标签。不会复制系统标签（前缀为 `aws:`）和由其他 AWS 账户 附加的用户定义标签。

   1. **基于时间的复制**：您可以指定复制操作是在特定时限内完成还是尽力完成，如下所示：
      + 要在特定时限内完成复制，请执行以下操作：
        + 选择**启用基于时间的复制**。
        + 对于**完成时限**，输入允许执行复制操作的分钟数（以 15 分钟为增量）。此完成期限将会应用到与该 AMI 关联的所有快照。

          有关更多信息，请参阅《Amazon EBS 用户指南》中的 [Time-based copies](https://docs.aws.amazon.com/ebs/latest/userguide/time-based-copies.html)**。
      + 要尽力完成复制，请执行以下操作：
        + 保持取消选择**启用基于时间的复制**。

   1. （仅限 EBS-backed AMI）**加密 AMI 副本的 EBS 快照**：选择此复选框可加密目标快照，或使用不同的密钥对它们进行重新加密。如果启用默认加密，**加密 AMI 副本的 EBS 快照**复选框处于选中状态，无法清除。有关更多信息，请参阅 [加密和复制](how-ami-copy-works.md#ami-copy-encryption)。

   1. （仅限 EBS-backed AMI）**KMS 密钥**：用于加密目标快照的 KMS 密钥。

   1. **标签**：您可以使用相同的标签来标记新的 AMI 和新快照，也可以使用不同的标签来标记它们。
      + 要使用*相同*标签标记新的 AMI 和新快照，请选择**将映像和快照一起标记**。相同的标签将应用于新的 AMI 和创建的每个快照。
      + 要使用*不同*的标签标记新的 AMI 和新的快照，请选择**分别标记映像和快照**。对新的 AMI 和创建的快照应用了不同的标签。但是，请注意，创建的所有新快照都获得相同的标签；您不能使用不同的标签来标记每个新快照。

      要添加标签，请选择 **Add tag (添加标签)**，然后输入该标签的键和值。对每个标签重复此操作。

   1. 准备好复制 AMI 时，选择**复制 AMI**。

      新 AMI 的初始状态是 `Pending`。当状态为 `Available` 时，AMI 复制操作完成。

------
#### [ AWS CLI ]

**将 AMI 从一个区域复制到另一个区域**  
使用 [copy-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/copy-image.html) 命令。您必须指定源和目标区域。您可以使用 `--source-region` 参数指定源区域。您可以使用 `--region` 参数指定目标区域（或者省略此参数以采用 AWS CLI 设置中配置的默认区域）。

```
aws ec2 copy-image \
    --source-image-id ami-0abcdef1234567890 \
    --source-region us-west-2 \
    --name my-ami \
    --region us-east-1
```

要在复制期间加密目标快照，您必须指定以下额外的参数：`--encrypted` 和 `--kms-key-id`。

**将 AMI 从区域复制到本地区域**  
使用 [copy-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/copy-image.html) 命令。必须指定源和目标。您可以使用 `--source-region` 参数指定源区域。可以使用 `--destination-availability-zone` 参数指定目标本地区域（可以改用 `--destination-availability-zone-id`）。请注意，只能将 AMI 从一个区域复制到同一区域内的本地区域。

```
aws ec2 copy-image \
    --source-image-id ami-0abcdef1234567890 \
    --source-region cn-north-1 \
    --destination-availability-zone cn-north-1-pkx-1a \
    --name my-ami \
    --region cn-north-1
```

**将 AMI 从本地区域复制到区域**  
使用 [copy-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/copy-image.html) 命令。必须指定源和目标。您可以使用 `--source-region` 参数指定源区域。使用 `--region` 参数指定目标区域（或者省略此参数以采用 AWS CLI 设置中配置的默认区域）。源本地区域是根据指定源 AMI ID 的位置采用的。请注意，只能将 AMI 从本地区域复制到其父区域。

```
aws ec2 copy-image \
    --source-image-id ami-0abcdef1234567890 \
    --source-region cn-north-1 \
    --name my-ami \
    --region cn-north-1
```

**将 AMI 从一个本地区域复制到另一个本地区域**  
使用 [copy-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/copy-image.html) 命令。必须指定源和目标。可以使用 `--source-region` 参数指定本地区域的源区域。可以使用 `--destination-availability-zone` 参数指定目标本地区域（可以改用 `--destination-availability-zone-id`）。源本地区域是根据指定源 AMI ID 的位置采用的。使用 `--region` 参数指定目标本地区域的父区域（或者省略此参数以采用 AWS CLI 设置中配置的默认区域）。

```
aws ec2 copy-image \
    --source-image-id ami-0abcdef1234567890 \
    --source-region cn-north-1 \
    --destination-availability-zone cn-north-1-pkx-1a \
    --name my-ami \
    --region cn-north-1
```

------
#### [ PowerShell ]

**将 AMI 从一个区域复制到另一个区域**  
使用 [Copy-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Copy-EC2Image.html) cmdlet。您必须指定源和目标区域。您可以使用 `-SourceRegion` 参数指定源区域。您可以使用 `-Region` 参数或 [Set-AWSDefaultRegion](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-installing-specifying-region.html) cmdlet 指定目标区域。

```
Copy-EC2Image `
    -SourceImageId ami-0abcdef1234567890 `
    -SourceRegion us-west-2 `
    -Name my-ami `
    -Region us-east-1
```

要在复制期间加密目标快照，您必须指定以下额外的参数：`-Encrypted` 和 `-KmsKeyId`。

**将 AMI 从区域复制到本地区域**  
使用 [Copy-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Copy-EC2Image.html) cmdlet。必须指定源和目标。您可以使用 `-SourceRegion` 参数指定源区域。可以使用 `-DestinationAvailabilityZone` 参数指定目标本地区域（可以改用 `-DestinationAvailabilityZoneId`）。请注意，只能将 AMI 从一个区域复制到同一区域内的本地区域。

```
Copy-EC2Image `
    -SourceImageId ami-0abcdef1234567890 `
    -SourceRegion cn-north-1 `
    -DestinationAvailabilityZone cn-north-1-pkx-1a `
    -Name my-ami `
    -Region cn-north-1
```

**将 AMI 从本地区域复制到区域**  
使用 [Copy-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Copy-EC2Image.html) cmdlet。必须指定源和目标。您可以使用 `-SourceRegion` 参数指定源区域。使用 `-Region` 参数或 [Set-AWSDefaultRegion](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-installing-specifying-region.html) cmdlet 指定目标区域。源本地区域是根据指定源 AMI ID 的位置采用的。请注意，只能将 AMI 从本地区域复制到其父区域。

```
Copy-EC2Image `
    -SourceImageId ami-0abcdef1234567890 `
    -SourceRegion cn-north-1 `
    -Name my-ami `
    -Region cn-north-1
```

**将 AMI 从一个本地区域复制到另一个本地区域**  
使用 [Copy-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Copy-EC2Image.html) cmdlet。必须指定源和目标。可以使用 `-SourceRegion` 参数指定本地区域的源区域。可以使用 `-DestinationAvailabilityZone` 参数指定目标本地区域（可以改用 `-DestinationAvailabilityZoneId`）。源本地区域是根据指定源 AMI ID 的位置采用的。使用 `-Region` 参数或 [Set-AWSDefaultRegion](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-installing-specifying-region.html) cmdlet 指定目标本地区域的父区域。

```
Copy-EC2Image `
    -SourceImageId ami-0abcdef1234567890 `
    -SourceRegion cn-north-1 `
    -DestinationAvailabilityZone cn-north-1-pkx-1a `
    -Name my-ami `
    -Region cn-north-1
```

------

## 停止待处理的 AMI 复制操作
<a name="ami-copy-stop"></a>

您可以使用以下过程停止待处理的 AMI 复制。

------
#### [ Console ]

**停止 AMI 复制操作**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 从导航栏中，从区域选择器中选择目标区域。

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

1. 选择要停止复制的 AMI，然后选择**操作**、**取消注册 AMI**。

1. 当系统要求您确认时，选择 **Deregister AMI**（取消注册 AMI）。

------
#### [ AWS CLI ]

**停止 AMI 复制操作**  
使用 [deregister-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/deregister-image.html) 命令。

```
aws ec2 deregister-image --image-id ami-0abcdef1234567890
```

------
#### [ PowerShell ]

**使用以下方法停止 AMI 复制操作**  
使用 [Unregister-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Unregister-EC2Image.html) cmdlet。

```
Unregister-EC2Image -ImageId ami-0abcdef1234567890
```

------

# Amazon EC2 AMI 复制工作原理
<a name="how-ami-copy-works"></a>

复制源 AMI 将生成完全相同但独立的新 AMI（我们也称之为*目标* AMI）。目标 AMI 有自己的唯一 AMI ID。您可以更改或注销源 AMI，这不会对目标 AMI 产生任何影响。反之亦然。

对于 EBS-backed AMI，每个支持快照将会复制到完全相同但独立的目标快照。如果您将 AMI 复制到新区域，则快照是完整的（非增量）副本。如果您加密未加密的备份快照或将其加密到新 KMS 密钥，则快照是完整（非增量）副本。后续的 AMI 复制操作会生成备份快照的增量副本。

**Topics**
+ [

## 跨区域复制
](#copy-amis-across-regions)
+ [

## 跨账户复制
](#copy-ami-across-accounts)
+ [

## 基于时间的 AMI 复制操作
](#ami-time-based)
+ [

## 加密和复制
](#ami-copy-encryption)

## 跨区域复制
<a name="copy-amis-across-regions"></a>

跨不同地理位置复制 AMI 具有以下优势：
+ 一致的全球部署：通过将 AMI 从一个区域复制到另一个区域，您可以根据相同的 AMI 在不同的区域中启动一致的实例。
+ 可扩展性：无论用户身处何处，您都可以更轻松地设计和构建能满足他们需求的全球应用程序。
+ 性能：您可以通过分发您的应用程序以及找到较接近您用户的应用程序的关键组件来提高性能。您还可以利用区域特定的功能，例如，实例类型或其他 AWS 服务。
+ 高可用性：您可以跨 AWS 区域设计和部署应用程序以提高可用性。

下图显示源 AMI、在不同的区域中复制的两个 AMI 以及从它们中启动的 EC2 实例之间的关系。从 AMI 中启动实例时，该实例位于 AMI 所在的区域中。如果您更改源 AMI，并希望在目标区域中的 AMIs 上反映这些更改，您必须将源 AMI 重新复制到目标区域中。

![\[在不同区域中复制的 AMI\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami_copy.png)


在首次将 Amazon S3 支持的 AMI 复制到一个区域时，我们为复制到该区域的 AMI 创建一个 Amazon S3 存储桶。复制到该区域的所有 Amazon S3 支持的 AMI 存储在该存储桶中。存储桶名称具有以下格式：amis-for-*account*-in-*region*-*hash*。例如：`amis-for-123456789012-in-us-east-2-yhjmxvp6`。

**先决条件**  
在复制 AMI 之前，您必须确保更新源 AMI 的内容以支持在不同的区域中运行。例如，您应更新任何数据库连接字符串或相似的应用程序配置数据，以指向适当的资源。否则，从目标区域上的新 AMI 中启动的实例可能仍会使用源区域中的资源，这可能会影响性能和成本。

**限制**
+ 目标区域限制为 300 个并发 AMI 复制操作。这也适用于基于时间的 AMI 复制操作。
+ 您无法将半虚拟化（PV）AMI 复制到不支持 PV AMI 的区域。有关更多信息，请参阅 [虚拟化类型](ComponentsAMIs.md#virtualization_types)。

## 跨账户复制
<a name="copy-ami-across-accounts"></a>

如果[与您的 AWS 账户 共享](sharingamis-explicit.md)另一 AWS 账户 的 AMI，您可以复制共享的 AMI。这称为跨账户复制。与您共享的 AMI 就是源 AMI。复制源 AMI 时，即创建了一个新的 AMI。新的 AMI 通常称为目标 AMI。

**AMI 成本**
+ 对于共享 AMI，共享 AMI 的账户要支付该区域的存储费用。
+ 如果您复制了与您的账户共享的 AMI，则您就是账户中目标 AMI 的所有者。
  + 源 AMI 的所有者需要支付标准 Amazon EBS 或 Amazon S3 传输费用。
  + 您需要支付目标区域中的目标 AMI 存储费用。

**资源权限**  
要复制其他账户与您共享的 AMI，源 AMI 的所有者必须授予您对支持该 AMI 的存储的读取权限，而不仅限于该 AMI 本身的权限。存储是关联的 EBS 快照（用于 Amazon EBS-backed AMI）或关联的 S3 存储桶（用于 Amazon S3 支持的 AMI）。如果共享 AMI 具有加密快照，则拥有者必须同时与您共享一个或多个密钥。有关授予资源权限的更多信息，对于 EBS 快照，请参阅《Amazon EBS 用户指南》**中的 [Share an Amazon EBS snapshot with other AWS 账户](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modifying-snapshot-permissions.html)；对于 S3 存储桶，请参阅《Amazon S3 用户指南》**中的 [Amazon S3 的身份和访问管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-iam.html)。

**注意**  
附加到源 AMI 的标签不会跨账户复制到目标 AMI。

## 基于时间的 AMI 复制操作
<a name="ami-time-based"></a>

当您为具有单个关联快照的 EBS 支持的 AMI 启动基于时间的 AMI 复制操作时，其行为方式将与**单个基于时间的快照复制操作**相同，并且具有相同的吞吐量限制。

当您为具有多个关联快照的 EBS 支持的 AMI 启动基于时间的 AMI 复制操作时，其行为方式将与**并发基于时间的快照复制操作**相同，并且具有相同的吞吐量限制。每个关联的快照都会导致一个单独的快照复制请求，并且每个请求都会占用您的累积快照复制吞吐量配额。您指定的完成期限将应用于每个关联的快照。

有关更多信息，请参阅《Amazon EBS 用户指南》中的 [Time-based copies](https://docs.aws.amazon.com/ebs/latest/userguide/time-based-copies.html)**。

## 加密和复制
<a name="ami-copy-encryption"></a>

下表显示了各种 AMI 复制场景的加密支持。尽管可以复制未加密快照来生成加密快照，但是不能复制加密快照来生成未加密快照。


| 场景 | 描述 | 支持 | 
| --- | --- | --- | 
| 1 | 未加密到未加密 | 是 | 
| 2 | 已加密到已加密 | 是 | 
| 3 | 未加密到已加密 | 是 | 
| 4 | 已加密到未加密 | 否 | 

**注意**  
在 `CopyImage` 操作期间加密仅适用于 Amazon EBS-backed AMI。由于 Amazon S3 支持的 AMI 不使用快照，因此您不能使用复制来更改其加密状态。

当您复制 AMI 而不指定加密参数时，默认情况下将复制备份快照及其原始加密状态。因此，如果源 AMI 由未加密的快照支持，则生成的目标快照也将处于未加密状态。同样，如果源 AMI 的快照已加密，则生成的目标快照也将使用相同的 AWS KMS 密钥进行加密。对于多个快照支持的 AMI，每个目标快照都会保留其对应源快照的加密状态。

要在 AMI 复制期间更改目标备份快照的加密状态，可以指定加密参数。以下示例显示非默认情况，其中使用 `CopyImage` 操作指定加密参数来更改目标 AMI 的加密状态。

**将未加密的源 AMI 复制到加密目标 AMI**

在这种情况下，由未加密根快照支持的 AMI 会复制到带加密根快照的 AMI。`CopyImage` 操作将使用两个加密参数（包括一个客户托管密钥）调用。因此，根快照的加密状态发生变化，这样目标 AMI 由与原快照具有相同数据的根快照支持，但使用指定的密钥进行加密。在两个 AMI 中，您都会产生快照的存储成本，以及从任一 AMI 启动的任何实例的费用。

**注意**  
启用默认加密与将 AMI 中所有快照的 `Encrypted` 参数设置为 `true` 具有相同的效果。

![\[即时复制 AMI 并加密快照\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami-to-ami-convert.png)


设置 `Encrypted` 参数会加密此实例的单个快照。如果您未指定 `KmsKeyId` 参数，会使用默认客户托管密钥来加密快照副本。

有关复制带加密快照的 AMIs 的更多信息，请参阅[将加密与 EBS 支持的 AMI 结合使用](AMIEncryption.md)。

# 使用 S3 存储和还原 AMI
<a name="ami-store-restore"></a>

您可以将亚马逊机器映像（AMI）存储在 Amazon S3 存储桶中、将 AMI 复制到另一个 S3 存储桶，然后从 S3 存储桶还原它。通过使用 S3 存储桶存储和还原 AMI，您可以将 AMI 从一个 AWS 分区复制到另一个分区，例如，从主商业分区到 AWS GovCloud (US) 分区。您还可以通过将 AMI 存储在 S3 存储桶中为其创建存档副本。

支持使用 S3 存储和还原 AMI 的 API 是 `CreateStoreImageTask`、`DescribeStoreImageTasks` 和 `CreateRestoreImageTask`。

`CopyImage` 是推荐用于在 AWS 分区*内*复制 AMI 的 API。但是，`CopyImage` 无法将 AMI 复制到*另一个*分区。

有关 AWS 分区的信息，请参阅 *IAM 用户指南*中 [Amazon 资源名称(ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)页面上的*分区*。

**警告**  
在 AWS 分区或 AWS 区域之间移动数据时，请确保遵守所有适用法律和业务要求，包括但不限于任何适用的政府法规和数据驻留要求。

**Topics**
+ [

## 使用案例
](#use-cases)
+ [

## 限制
](#ami-store-restore-limitations)
+ [

## 成本
](#store-restore-costs)
+ [

# AMI 存储和还原的工作原理
](store-restore-how-it-works.md)
+ [

# 创建存储映像任务
](work-with-ami-store-restore.md)

## 使用案例
<a name="use-cases"></a>

**Topics**
+ [

### 在 AWS 分区之间复制 AMI
](#copy-to-partition)
+ [

### 制作 AMI 的存档副本
](#archival-copies)

### 在 AWS 分区之间复制 AMI
<a name="copy-to-partition"></a>

通过使用 S3 存储桶存储和还原 AMI，您可以将 AMI 从一个 AWS 分区复制到另一个分区，或从一个 AWS 区域复制到另一个区域。在以下示例中，您可将 AMI 从主商业分区复制到 AWS GovCloud (US) 分区，尤其是从 `us-east-2` 区域复制到 `us-gov-east-1` 区域。

要将 AMI 从一个分区复制到另一个分区，请执行以下步骤：
+ 使用 `CreateStoreImageTask` 将 AMI 存储在当前区域内的 S3 存储桶中。在此示例中，S3 存储桶位于 `us-east-2` 中。
+ 使用 `DescribeStoreImageTasks` 监控存储任务的进度。任务完成后，对象将在 S3 存储桶中可见。
+ 使用您选择的程序将存储的 AMI 对象复制到目标分区中的 S3 存储桶。在此示例中，S3 存储桶位于 `us-gov-east-1` 中。
**注意**  
由于每个分区均需要不同的 AWS 凭证，因此无法将 S3 对象从一个分区直接复制到另一个分区。跨分区复制 S3 对象的过程不在本文档的讨论范围之内。我们提供以下复制过程作为示例，但您必须使用符合安全要求的复制过程。  
要跨分区复制某一 AMI，复制过程可能非常简单，如下所示：从源存储桶[下载对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)到中间主机（例如，EC2 实例或笔记本电脑），然后从中间主机[上传对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)到目标存储桶。对于该过程的每个阶段，请对分区使用 AWS 凭证。
要实现更持久的使用，请考虑开发一个管理副本的应用程序（可能使用 S3 [分段下载和上传](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)）。
+ 使用 `CreateRestoreImageTask` 从目标分区中的 S3 存储桶还原 AMI。在此示例中，S3 存储桶位于 `us-gov-east-1` 中。
+ 通过对需要检查其状态何时变为可用的 AMI 进行描述来监控还原任务的进度。您还可以通过描述快照来监控构成所还原 AMI 的快照的进度百分比。

### 制作 AMI 的存档副本
<a name="archival-copies"></a>

您可以通过将 AMI 存储在 S3 存储桶中为其创建存档副本。AMI 被打包到 S3 内的单个对象中，所有 AMI 元数据（不包括共享信息）都作为存储 AMI 的一部分得到保留。AMI 数据将作为存储流程的一部分进行压缩。由于 AMI 包含可轻松压缩的数据，因此 S3 中的对象较小。为了降低成本，您可以使用更便宜的 S3 存储套餐。有关更多信息，请参阅 [Amazon S3 存储类](https://aws.amazon.com/s3/storage-classes/)和 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)

## 限制
<a name="ami-store-restore-limitations"></a>
+ 要存储 AMI，您的 AWS 账户必须拥有该 AMI 及其快照的所有权，或者该 AMI 及其快照必须[直接与您的账户共享](sharingamis-explicit.md)。如果 AMI 仅[公开共享](sharingamis-intro.md)，则无法存储。
+ 使用这些 API 只能存储由 EBS 支持的 AMI。
+ 不支持半虚拟化 (PV) AMI。
+ 可存储的 AMI 的大小（压缩前）限制为 5,000 GB。
+ 存储映像请求的配额：1200 GB 的存储工作（快照数据）正在进行中。
+ 还原映像请求的配额：600 GB 的还原工作（快照数据）正在进行中。
+ 在存储任务的持续时间内，不得删除快照，执行存储的 IAM 委托人必须有权访问快照，否则存储流程将会失败。
+ 您不能在同一 S3 存储桶中创建 AMI 的多个副本。
+ 存储在 S3 存储桶中的 AMI 无法使用其原始 AMI ID 进行还原。您可以使用 [AMI 别名](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-ec2-aliases.html)来缓解这种情况。
+ 目前，仅支持使用 AWS Command Line Interface、AWS 开发工具包和 Amazon EC2 API 存储和还原 API。您无法使用 Amazon EC2 控制台存储和还原 AMI。

## 成本
<a name="store-restore-costs"></a>

使用 S3 存储和还原 AMI 时，您需要为存储和还原 API 使用的服务以及数据传输付费。API 使用 S3 和 EBS Direct API（由这些 API 在内部使用以访问快照数据）。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)和 [Amazon EBS 定价](https://aws.amazon.com/ebs/pricing/)。

# AMI 存储和还原的工作原理
<a name="store-restore-how-it-works"></a>

要使用 S3 存储和还原 AMI，请使用以下 API：
+ `CreateStoreImageTask` – 将 AMI 存储在 S3 存储桶中
+ `DescribeStoreImageTasks` – 提供 AMI 存储任务的进度
+ `CreateRestoreImageTask` – 从 S3 存储桶还原 AMI

**Topics**
+ [

## CreateStoreImageTask
](#CreateStoreImageTask)
+ [

## DescribeStoreImageTasks
](#DescribeStoreImageTasks)
+ [

## CreateRestoreImageTask
](#CreateRestoreImageTask)
+ [

## 文件路径
](#file-paths-in-s3)

## CreateStoreImageTask
<a name="CreateStoreImageTask"></a>

`CreateStoreImageTask` API 将 AMI 作为单个对象存储在 S3 存储桶中。

API 创建一个任务，从 AMI 及其快照中读取所有数据，然后使用 [S3 分段上传](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)将数据存储在 S3 对象中。API 获取 AMI 的所有组件，包括大多数非区域特定的 AMI 元数据以及 AMI 中包含的所有 EBS 快照，然后将它们打包到 S3 内的单个对象中。数据将作为上传流程的一部分进行压缩，以减少 S3 中使用的空间量，因此 S3 中的对象可能小于 AMI 中快照大小总和。

如果调用此 API 的账户有可见的 AMI 和快照标签，则会保留它们。

S3 中的对象的 ID 与 AMI 的相同，但带有 `.bin` 扩展名。以下数据还作为 S3 对象上的 S3 元数据标签存储：AMI 名称、AMI 描述、AMI 注册日期、AMI 拥有者账户以及存储操作的时间戳。

完成任务所需的时间取决于 AMI 的大小。它还取决于有多少其他任务正在进行，因为任务需要排队。您可以通过调用 `DescribeStoreImageTasks` API 跟踪任务的进度。

所有正在进行的 AMI 的大小总和限制为每个账户 1200 GB 的 EBS 快照数据。进一步的任务创建将被拒绝，直到正在进行的任务低于限制。例如，如果当前正在存储快照数据为 200 GB 的 AMI 和另一个快照数据为 400 GB 的 AMI，则将接受另一个请求，因为正在进行的总量为 600 GB，低于限制。但是，如果当前正在存储的单个 AMI 的快照数据为 1200 GB，则在任务完成之前，进一步的任务都将被拒绝。

## DescribeStoreImageTasks
<a name="DescribeStoreImageTasks"></a>

`DescribeStoreImageTasks` API 描述 AMI 存储任务的进度。您可以描述指定 AMI 的任务。如果未指定 AMI，则会获得过去 31 天内处理的所有存储映像任务的分页列表。

对于每个 AMI 任务，响应会指示任务是 `InProgress`、`Completed` 还是 `Failed`。对于任务 `InProgress`，响应会将估计进度显示为百分比值。

任务按反向的时间顺序列出。

目前，只能查看上个月的任务。

## CreateRestoreImageTask
<a name="CreateRestoreImageTask"></a>

`CreateRestoreImageTask` API 启动一个任务，该任务可从先前使用 `CreateStoreImageTask` 请求创建的 S3 对象还原 AMI。

执行还原任务的区域可以与执行存储任务的区域相同，也可以不同。

要从中还原 AMI 对象的 S3 存储桶必须位于请求执行还原任务的相同区域中。AMI 将在此区域中还原。

AMI 将使用其元数据还原，例如与存储的 AMI 值对应的名称、描述和块储存设备映射。名称对该账户在该区域中的 AMI 必须唯一。如果未提供名称，则新 AMI 获得的名称与原始 AMI 的名称相同。AMI 获得在还原流程中生成的新 AMI ID。

完成 AMI 还原任务所需的时间取决于 AMI 的大小。它还取决于有多少其他任务正在进行，因为任务需要排队。您可以通过描述 AMI ([describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html)) 或其 EBS 快照 ([describe-snapshots](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html)) 来查看任务的进度。如果任务失败，AMI 和快照将移至失败状态。

所有正在进行的 AMI 的大小总和限制为每个账户的 EBS 快照数据 600 GB（根据还原后的大小）。进一步的任务创建将被拒绝，直到正在进行的任务低于限制。

## 文件路径
<a name="file-paths-in-s3"></a>

您可以通过以下方式在存储和恢复 AMI 时使用文件路径：
+ 在 S3 中存储 AMI 时，可以将文件路径添加到存储桶名称中。在内部，系统将路径与存储桶名称分开，然后将路径添加到为存储 AMI 而生成的对象密钥中。完整的对象路径显示在 API 调用的响应中。
+ 在恢复 AMI 时，由于对象密钥参数可用，可以将路径添加到对象键值的开头。

**示例：带有附加文件路径的存储桶名称**  
存储 AMI 时，请在存储桶名称后指定文件路径。

```
amzn-s3-demo-bucket/path1/path2
```

以下是结果对象键。

```
path1/path2/ami-0abcdef1234567890.bin
```

还原 AMI 时，请指定存储桶名称和对象键。有关示例，请参阅 [创建存储映像任务](work-with-ami-store-restore.md#create-store-image-task)。

# 创建存储映像任务
<a name="work-with-ami-store-restore"></a>

将 AMI 存储在 S3 存储桶中时，将创建存储映像任务。您可以使用存储映像任务来监控该过程的进度和结果。

**Topics**
+ [

## 保护您的 AMI
](#securing-amis)
+ [

## 使用 S3 存储和还原 AMI 的权限
](#ami-s3-permissions)
+ [

## 创建存储映像任务
](#create-store-image-task)
+ [

## 创建还原映像任务
](#create-restore-image-task)

## 保护您的 AMI
<a name="securing-amis"></a>

务必确保 S3 存储桶配置有足够的安全性来保护 AMI 的内容，并确保只要 AMI 对象仍保留在存储桶中，安全性将保持不变。如果无法做到这一点，建议不要使用这些 API。确保不允许对 S3 存储桶进行公开访问。我们建议为存储 AMI 的 S3 存储桶启用[服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)，但不是必需要求。

有关如何为 S3 存储桶设置适当的安全设置的信息，请查看以下安全主题：
+ [阻止对 Amazon S3 存储的公有访问](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html)
+ [设置 Amazon S3 存储桶的默认服务器端加密行为](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html)
+ [我可以使用哪个 S3 桶策略来遵守 AWS Config 规则 s3-bucket-ssl-requests-only？](https://repost.aws/knowledge-center/s3-bucket-policy-for-config-rule)
+ [启用 Amazon S3 服务器访问日志记录](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html)

当 AMI 快照复制到 S3 对象时，将通过 TLS 连接复制数据。您可以使用加密快照存储 AMI，但是快照会作为存储流程的一部分进行解密。

## 使用 S3 存储和还原 AMI 的权限
<a name="ami-s3-permissions"></a>

如果您的 IAM 主体将使用 Amazon S3 来存储或还原 AMI，则需要向其授予所需权限。

以下示例策略包括允许 IAM 委托人执行存储和还原任务需要的所有操作。

此外，您还可以创建向主体授予仅访问指定资源权限的 IAM policy。如需了解更多示例策略，请参阅《IAM 用户指南**》中的 [AWS 资源的访问管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/access.html)。

**注意**  
如果构成 AMI 的快照已加密，或者账户默认启用了加密功能，您的 IAM 主体必须具有使用 KMS 密钥的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectTagging",
                "s3:AbortMultipartUpload",
                "ebs:CompleteSnapshot",
                "ebs:GetSnapshotBlock",
                "ebs:ListChangedBlocks",
                "ebs:ListSnapshotBlocks",
                "ebs:PutSnapshotBlock",
                "ebs:StartSnapshot",
                "ec2:CreateStoreImageTask",
                "ec2:DescribeStoreImageTasks",
                "ec2:CreateRestoreImageTask",
                "ec2:GetEbsEncryptionByDefault",
                "ec2:DescribeTags",
                "ec2:CreateTags"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## 创建存储映像任务
<a name="create-store-image-task"></a>

要将 AMI 存储在 S3 存储桶中，首先要创建存储映像任务。完成任务所需的时间取决于 AMI 的大小。您可以跟踪该任务的进度，直到其成功或失败。

------
#### [ AWS CLI ]

**创建存储映像任务**  
使用 [create-store-image-task](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-store-image-task.html) 命令。

```
aws ec2 create-store-image-task \
    --image-id ami-0abcdef1234567890 \
    --bucket amzn-s3-demo-bucket
```

下面是示例输出。

```
{
  "ObjectKey": "ami-0abcdef1234567890.bin"
}
```

**描述存储映像任务的进度**  
使用 [describe-store-image-tasks](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-store-image-tasks.html) 命令。

```
aws ec2 describe-store-image-tasks \
    --image-ids ami-0abcdef1234567890 \
    --query StoreImageTaskResults[].StoreTaskState \
    --output text
```

下面是示例输出。

```
InProgress
```

------
#### [ PowerShell ]

**创建存储映像任务**  
使用 [New-EC2StoreImageTask](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2StoreImageTask.html) cmdlet。

```
New-EC2StoreImageTask `
    -ImageId ami-0abcdef1234567890 `
    -Bucket amzn-s3-demo-bucket
```

下面是示例输出。

```
ObjectKey         : ami-0abcdef1234567890.bin
```

**描述存储映像任务的进度**  
使用 [Get-EC2StoreImageTask](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2StoreImageTask.html) cmdlet。

```
(Get-EC2StoreImageTask -ImageId ami-0abcdef1234567890).StoreTaskState
```

下面是示例输出。

```
InProgress
```

------

## 创建还原映像任务
<a name="create-restore-image-task"></a>

必须为还原的 AMI 指定名称。名称对该账户在该区域中的 AMI 必须唯一。还原的 AMI 将获得一个新 AMI ID。

------
#### [ AWS CLI ]

**创建恢复映像任务**  
使用 [create-restore-image-task](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-restore-image-task.html) 命令。

```
aws ec2 create-restore-image-task \
    --object-key ami-0abcdef1234567890.bin \
    --bucket amzn-s3-demo-bucket \
    --name "my-restored-ami"
```

下面是示例输出。

```
{
   "ImageId": "ami-1234567890abcdef0"
}
```

------
#### [ PowerShell ]

**创建恢复映像任务**  
使用 [New-EC2RestoreImageTask](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2RestoreImageTask.html) cmdlet。

```
New-EC2RestoreImageTask `
    -ObjectKey ami-0abcdef1234567890.bin `
    -Bucket amzn-s3-demo-bucket `
    -Name "my-restored-ami"
```

下面是示例输出。

```
ImageId         : ami-1234567890abcdef0
```

------

# 使用 AMI 世系跟踪 AMI 的源
<a name="ami-ancestry"></a>

AMI 世系通过返回所有原级 AMI 的 ID 和区域来帮助您跟踪 AMI 的源。当您创建或复制 AMI 时，新 AMI 会保留其源（父）AMI 的 ID 和区域。这使您能够跟踪 AMI 的链，直至根 AMI。

**主要优势**

使用 AMI 世系可以帮助您：
+ 跟踪 AMI 衍生品以确保符合内部策略。
+ 当在原级 AMI 中发现安全问题时，识别潜在易受攻击的 AMI。
+ 在多个区域保持 AMI 源的可见性。

**Topics**
+ [

## AMI 世系的工作原理
](#how-ami-ancestry-works)
+ [

## 注意事项
](#ami-ancestry-conditions)
+ [

## 查看 AMI 世系
](#view-ami-ancestry)
+ [

## 识别源 AMI
](#identify-source-ami-used-to-create-new-ami)

## AMI 世系的工作原理
<a name="how-ami-ancestry-works"></a>

AMI 世系识别用于创建指定 AMI 的父 AMI、父级的父级，依此类推，直至根 AMI。下面将介绍操作方式：
+ 每个 AMI 都会显示其源（父）AMI 的 ID 和区域。
+ 从所选 AMI 开始，世系条目列表按顺序显示每个父 AMI。
+ 世系条目列表可以追溯到根 AMI。根 AMI 可以是以下任一项：
  + 来自[经过验证的提供商](sharing-amis.md#verified-ami-provider)的公共 AMI（由其所有者别名标识，即 `amazon` 或 `aws-marketplace`）。
  + 没有记录的原级的 AMI。例如，当使用 [RegisterImage](creating-an-ami-ebs.md#creating-launching-ami-from-snapshot) 直接从一组快照创建 AMI 时，与从实例创建 AMI 时不同，此时没有要跟踪的源 AMI。
  + 一个 AMI，其源 AMI 来自不同的[分区](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#partition)。
  + 列表中的第 50 个 AMI。世系列表中最多可以包含 50 个 AMI。

## 注意事项
<a name="ami-ancestry-conditions"></a>
+ 源 AMI 的 ID 和区域仅适用于使用 [CreateImage](creating-an-ami-ebs.md#how-to-create-ebs-ami)、[CopyImage](CopyingAMIs.md#ami-copy-steps) 或 [CreateRestoreImageTask](store-restore-how-it-works.md#CreateRestoreImageTask) 创建的 AMI。
+ 对于使用 [CreateImage](creating-an-ami-ebs.md#how-to-create-ebs-ami) 创建的 AMI（从实例创建 AMI），源 AMI ID 是用于启动实例的 AMI 的 ID。
+ 源 AMI 信息不适用于：
  + 使用 [RegisterImage](creating-an-ami-ebs.md#creating-launching-ami-from-snapshot) 创建的 AMI，因为它们是根据快照创建的。
  + 对于一些较旧 AMI。
+ 在以下情况下会保留源 AMI 信息：
  + 跨多个区域复制 AMI。
  + 源 AMI 已被注销（删除）。
  + 您无权访问源 AMI。
+ 每个世系列表最多只能包含 50 个 AMI。

## 查看 AMI 世系
<a name="view-ami-ancestry"></a>

您可以使用以下方法查看 AMI 的世系。

------
#### [ Console ]

**查看 AMI 的世系**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择一个 AMI，然后选择 **AMI 世系**选项卡。

1. **AMI 世系条目**表列出了世系列表中的所有 AMI。
   + **AMI ID**：世系列表中每个 AMI 的标识符。表中的第一个条目是选定的 AMI，后面是其原级。
   + **源 AMI ID**：创建 **AMI ID** 列中的 AMI 所依据的 AMI 的 ID。破折号（**-**）表示 AMI 世系列表的结尾。
   + **源 AMI 区域**：源 AMI 所在的 AWS 区域。
   + **世系等级**：世系列表中的位置，其中：
     + **0（输入 AMI）**表示您想知道其世系的所选 AMI。
     + 数字越大，显示的原级更老。
     + ***n*（原始 AMI）**表示根 AMI，数字表示世系列表可以追溯的层级深度。
   + **创建日期**：AMI 的创建时间，采用 UTC 格式。
   + **所有者别名**：AMI 所有者的别名（例如 `amazon`）。破折号（**-**）表示 AMI 没有所有者别名。

------
#### [ AWS CLI ]

**查看 AMI 的世系**  
使用 [get-image-ancestry](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-image-ancestry.html) 命令并指定 AMI ID。

```
aws ec2 get-image-ancestry \
    --image-id ami-1111111111EXAMPLE \
    --region us-east-1
```

下面是示例输出。输出按照世系顺序列出 AMI：第一个条目是指定的（输入）AMI，后面依次是其父级、父级的父级，依此类推，直到根 AMI。

```
{
    "ImageAncestryEntries": [
        {
            "CreationDate": "2025-01-17T18:37:50.000Z",
            "ImageId": "ami-1111111111EXAMPLE", // Input AMI
            "SourceImageId": "ami-2222222222EXAMPLE",
            "SourceImageRegion": "us-east-1"

        },
        {
            "CreationDate": "2025-01-17T18:37:50.000Z",
            "ImageId": "ami-2222222222EXAMPLE", // Parent AMI
            "SourceImageId": "ami-3333333333EXAMPLE",
            "SourceImageRegion": "us-east-1"
        },
        ...
        {
            "CreationDate": "2025-01-17T18:37:50.000Z",
            "ImageId": "ami-8888888888EXAMPLE", // Root AMI
            "ImageOwnerAlias": "aws-marketplace",
            "SourceImageId": "ami-9999999999EXAMPLE",
            "SourceImageRegion": "us-east-2"
        }
    ]
}
```

------
#### [ PowerShell ]

**查看 AMI 的世系**  
使用 [Get-EC2ImageAncestry](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageAncestry.html) cmdlet。

```
Get-EC2ImageAncestry -ImageId ami-1111111111EXAMPLE
```

下面是示例输出。输出按照世系顺序列出 AMI：第一个条目是指定的（输入）AMI，后面依次是其父级、父级的父级，依此类推，直到根 AMI。

```
ImageAncestryEntries : {
    @{
        CreationDate = "2025-01-17T18:37:50.000Z"
        ImageId = "ami-1111111111EXAMPLE"    # Input AMI
        SourceImageId = "ami-2222222222EXAMPLE"
        SourceImageRegion = "us-east-1"
    },
    @{
        CreationDate = "2025-01-17T18:37:50.000Z"
        ImageId = "ami-2222222222EXAMPLE"    # Parent AMI
        SourceImageId = "ami-3333333333EXAMPLE"
        SourceImageRegion = "us-east-1"
    },
    ...
    @{
        CreationDate = "2025-01-17T18:37:50.000Z"
        ImageId = "ami-8888888888EXAMPLE"    # Root AMI
        ImageOwnerAlias = "aws-marketplace"
        SourceImageId = "ami-9999999999EXAMPLE"
        SourceImageRegion = "us-east-2"
    }
}
```

------

## 识别源 AMI
<a name="identify-source-ami-used-to-create-new-ami"></a>

如果您只需要识别用于创建某个 AMI 的直接父级（源）AMI，则可以使用以下方法。

------
#### [ Console ]

**识别用于创建所选 AMI 的源 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择 AMI 以查看其详细信息。

   源 AMI 信息显示在下面的字段中：**源 AMI ID** 和**源 AMI 区域**

------
#### [ AWS CLI ]

**识别用于创建指定 AMI 的源 AMI**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --region us-east-1 \
    --image-ids ami-0abcdef1234567890 \
    --query "Images[].{ID:SourceImageId,Region:SourceImageRegion}"
```

下面是示例输出。

```
[
    {
        "ID": "ami-0abcdef1234567890",
        "Region": "us-west-2"
    }
}
```

------
#### [ PowerShell ]

**识别用于创建指定 AMI 的源 AMI**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
Get-EC2Image -ImageId ami-0abcdef1234567890 | Select SourceImageId, SourceImageRegion
```

下面是示例输出。

```
SourceImageId           SourceImageRegion
-------------           -----------------
ami-0abcdef1234567890 us-west-2
```

------

# 管理和监控 AMI 使用情况
<a name="ec2-ami-usage"></a>

AWS 提供了多种功能来帮助您有效地管理和监控 AMI 使用情况。您可以跟踪哪些账户正在使用共享 AMI，确定 AMI 的上次使用时间，以及发现 AWS 账户中哪些资源正在引用特定的 AMI。

下表概括介绍了用于管理和监控 AMI 使用情况的功能：


| 功能 | 使用案例 | 主要优势 | 
| --- | --- | --- | 
| [AMI 使用情况报告](your-ec2-ami-usage.md) | 了解哪些 AWS 账户正在使用您的 AMI 以及每个 AMI 的使用量。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ec2-ami-usage.html)  | 
| [上次使用的跟踪](ami-last-launched-time.md) | 检查上次使用 AMI 的时间。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ec2-ami-usage.html)  | 
| [AMI 引用检查](ec2-ami-references.md) | 确保 AWS 资源使用最新的合规 AMI。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ec2-ami-usage.html)  | 

**Topics**
+ [

# 查看 AMI 使用情况
](your-ec2-ami-usage.md)
+ [

# 检查上次使用 Amazon EC2 AMI 的时间
](ami-last-launched-time.md)
+ [

# 识别引用指定 AMI 的资源
](ec2-ami-references.md)

# 查看 AMI 使用情况
<a name="your-ec2-ami-usage"></a>

如果与其他 AWS 账户共享 Amazon 系统映像 (AMI)（无论是与特定 AWS 账户、组织、组织单元 (OU) 还是公开），可以通过创建 AMI 使用情况报告来了解这些 AMI 的使用情况。这些报告可让您了解以下内容：
+ 哪些 AWS 账户正在 EC2 实例或启动模板中使用您的 AMI
+ 引用每个 AMI 的 EC2 实例或启动模板数量

AMI 使用情况报告可帮助您更有效地管理 AMI，方式如下：
+ 识别引用 AMI 的 AWS 账户和资源类型，以便您可以安全地取消注册或禁用 AMI。
+ 识别未使用的 AMI 以取消注册，从而降低存储成本。
+ 识别最常用的 AMI。

**Topics**
+ [

## AMI 使用情况报告的工作原理
](#how-ami-usage-reports-work)
+ [

## 创建 AMI 使用情况报告
](#create-ami-usage-reports)
+ [

## 查看 AMI 使用情况报告
](#view-ami-usage-reports)
+ [

## 删除 AMI 使用情况报告
](#delete-ami-usage-reports)
+ [

## 报告配额
](#ami-usage-report-quotas)

## AMI 使用情况报告的工作原理
<a name="how-ami-usage-reports-work"></a>

在创建 AMI 使用情况报告时，可以指定：
+ 要报告的 AMI。
+ 要检查的 AWS 账户（特定账户或所有账户）。
+ 要检查的资源类型（EC2 实例、启动模板或两者）。
+ 对于启动模板，要检查的版本数（默认为最新 20 个版本）。

Amazon EC2 为每个 AMI 创建一份单独的报告。每份报告都提供：
+ 使用 AMI 的 AWS 账户列表。
+ 按每个账户的资源类型划分的引用 AMI 的资源计数。请注意，对于启动模板，如果在启动模板的多个版本中引用了某个 AMI，则计数仅为 1。

**重要**  
当您生成 AMI 使用情况报告时，它可能不包含最新的活动。过去 24 小时的实例活动和过去几天的启动模板活动可能不会出现在报告中。

Amazon EC2 会在报告创建 30 天后自动删除该报告。您可以从 EC2 控制台下载报告以在本地保留。

## 创建 AMI 使用情况报告
<a name="create-ami-usage-reports"></a>

要查看 AMI 的使用情况，您必须首先创建 AMI 使用情况报告，指定要报告的账户和资源类型。报告创建完成后，您可以查看报告的内容。您也可以从 EC2 控制台下载报告。

------
#### [ Console ]

**创建 AMI 使用情况报告**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择一个 AMI，然后选择**操作**、**AMI 使用情况**、**查看我的 AMI 使用情况**。

1. 在**创建我的 AMI 使用情况报告**页面上，执行下列操作：

   1. 对于**资源类型**，选择一个或多个要报告的资源类型。

   1. 对于**账户 ID**，执行下列操作之一：
      + 选择**指定账户 ID**，然后为要报告的每个账户选择**添加账户 ID**。
      + 选择**包括所有帐户**以报告所有帐户。

   1. 选择**创建我的 AMI 使用情况报告**。

1. 在 AMI 页面上，选择**我的 AMI 使用情况**选项卡。

1. 选择一个报告 ID 来查看其详细信息。

------
#### [ AWS CLI ]

**为账户列表创建 AMI 使用情况报告**  
使用带以下必需参数的 [create-image-usage-report](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-image-usage-report.html) 命令：
+ `--image-id` – 要报告的 AMI 的 ID。
+ `--resource-types` – 要检查的资源类型。在下面的示例中，要检查的资源类型是 EC2 实例和启动模板。此外，还指定要检查的启动模板版本的数量 (`version-depth=100`)。

 要报告特定账户，请使用 `--account-ids` 参数指定要报告的每个账户的 ID。

```
aws ec2 create-image-usage-report \
    --image-id ami-0abcdef1234567890 \
    --account-ids 111122223333 444455556666 123456789012 \
    --resource-types ResourceType=ec2:Instance \
      'ResourceType=ec2:LaunchTemplate,ResourceTypeOptions=[{OptionName=version-depth,OptionValues=100}]'
```

**创建所有账户的 AMI 使用情况报告**  
要使用指定 AMI 报告所有账户，请使用相同的命令，但省略 `--account-ids` 参数。

```
aws ec2 create-image-usage-report \
    --image-id ami-0abcdef1234567890 \
    --resource-types ResourceType=ec2:Instance \
      'ResourceType=ec2:LaunchTemplate,ResourceTypeOptions=[{OptionName=version-depth,OptionValues=100}]'
```

下面是示例输出。

```
{
    "ReportId": "amiur-00b877d192f6b02d0"
}
```

**监控报告创建状态**  
使用 [describe-image-usage-reports](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-usage-reports.html) 命令并指定报告 ID。

```
aws ec2 describe-image-usage-reports --report-ids amiur-00b877d192f6b02d0
```

下面是示例输出。`State` 字段的初始值为 `pending`。为了能够查看报告条目，状态必须为 `available`。

```
{
    "ImageUsageReports": [
        {
            "ImageId": "ami-0e9ae3dc21c2b3a64",
            "ReportId": "amiur-abcae3dc21c2b3999",
            "ResourceTypes": [
                {"ResourceType": "ec2:Instance"}
            ],
            "State": "pending",
            "CreationTime": "2025-09-29T13:27:12.322000+00:00",
            "ExpirationTime": "2025-10-28T13:27:12.322000+00:00"
        }
    ]
}
```

------
#### [ PowerShell ]

**为账户列表创建 AMI 使用情况报告**  
使用带以下必需参数的 [New-EC2ImageUsageReport](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2ImageUsageReport.html) cmdlet：
+ `-ImageId` – 要报告的 AMI 的 ID。
+ `-ResourceType` – 要检查的资源类型。在下面的示例中，要检查的资源类型是 EC2 实例和启动模板。此外，还指定要检查的启动模板版本的数量 (`'version-depth' = 100`)。

 要报告特定账户，请使用 `-AccountId` 参数指定要报告的每个账户的 ID。

```
New-EC2ImageUsageReport `
    -ImageId ami-0abcdef1234567890 `
    -AccountId 111122223333 444455556666 123456789012 `
    -ResourceType @(
        @{ResourceType = 'ec2:Instance'},
        @{ResourceType = 'ec2:LaunchTemplate'ResourceTypeOptions = @{'version-depth' = 100}
        })
```

**创建所有账户的 AMI 使用情况报告**  
要使用指定 AMI 报告所有账户，请使用相同的命令，但省略 `-AccountId` 参数。

```
New-EC2ImageUsageReport `
    -ImageId ami-0abcdef1234567890 `
    -ResourceType @(
        @{ResourceType = 'ec2:Instance'},
        @{ResourceType = 'ec2:LaunchTemplate'ResourceTypeOptions = @{'version-depth' = 100}
        })
```

下面是示例输出。

```
ReportId
--------
amiur-00b877d192f6b02d0
```

**监控报告创建状态**  
使用 [Get-EC2ImageUsageReport](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageUsageReport.html) 命令并指定报告 ID。

```
Get-EC2ImageUsageReport -ReportId amiur-00b877d192f6b02d0
```

下面是示例输出。`State` 字段的初始值为 `pending`。为了能够查看报告条目，状态必须为 `available`。

```
ImageUsageReports
-----------------
{@{ImageId=ami-0e9ae3dc21c2b3a64; ReportId=amiur-abcae3dc21c2b3999; ResourceTypes=System.Object[]; State=pending; CreationTime=2025-09-29; ExpirationTime=2025-10-28}}
```

------

## 查看 AMI 使用情况报告
<a name="view-ami-usage-reports"></a>

可以查看过去 30 天内为 AMI 创建的所有使用情况报告。Amazon EC2 会在报告创建 30 天后自动删除该报告。

对于每个报告，您可以查看正在使用 AMI 的 AWS 账户，并且对于每个帐户，可以按资源类型查看引用 AMI 的资源计数。您还可以查看启动报告创建的时间。仅当报告处于**完成**（控制台）或 `available` (AWS CLI) 状态时，此信息才可用。

**重要**  
当您生成 AMI 使用情况报告时，它可能不包含最新的活动。过去 24 小时的实例活动和过去几天的启动模板活动可能不会出现在报告中。

------
#### [ Console ]

**查看 AMI 使用情况报告**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择 AMI。

1. 选择**我的使用情况报告**选项卡。

   报告列表显示：
   + 过去 30 天内为选定 AMI 生成的所有报告。
   + 对于每个报告，**报告启动时间**列显示创建报告的日期。

1. 选择报告的 ID 以查看其内容。

1. 要返回 AMI 详细信息页面上的**我的使用情况报告**选项卡，请选择**查看此 AMI 的所有报告**。

------
#### [ AWS CLI ]

**列出指定 AMI 的所有 AMI 使用情况报告**  
使用 [describe-image-usage-reports](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-usage-reports.html) 命令并指定 AMI 的 ID 以获取其报告列表。

```
aws ec2 describe-image-usage-reports --image-ids ami-0abcdef1234567890
```

下面是示例输出。每个报告 ID 都与扫描的资源类型以及报告创建和到期日期一起列出。您可以使用此信息来识别您想要查看其条目的报告。

```
{
  "ImageUsageReports": [
    {
      "ImageId": "ami-0abcdef1234567890",
      "ReportId": "amiur-1111111111111111",
      "ResourceTypes": [
        {
          "ResourceType": "ec2:Instance"
        }
      ],
      "State": "available",
      "CreationTime": "2025-09-29T13:27:12.322000+00:00",
      "ExpirationTime": "2025-10-28T13:27:12.322000+00:00",
      "Tags": []
    },
    {
      "ImageId": "ami-0abcdef1234567890",
      "ReportId": "amiur-22222222222222222",
      "ResourceTypes": [
        {
          "ResourceType": "ec2:Instance"
        },
        {
          "ResourceType": "ec2:LaunchTemplate"
        }
      ],
      "State": "available",
      "CreationTime": "2025-10-01T13:27:12.322000+00:00",
      "ExpirationTime": "2025-10-30T13:27:12.322000+00:00",
      "Tags": []
    }
  ],
  "NextToken": "opaque"
}
```

**查看指定 AMI 的 AMI 使用情况报告的内容**  
使用 [describe-image-usage-report-entries](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-usage-report-entries.html) 命令并指定 AMI 的 ID。响应会返回指定 AMI 的所有报告，显示使用过 AMI 的账户及其资源计数。

```
aws ec2 describe-image-usage-report-entries --image-ids ami-0abcdef1234567890
```

下面是示例输出。

```
{
  "ImageUsageReportEntries": [
    {
      "ImageId": "ami-0abcdef1234567890",
      "ResourceType": "ec2:Instance",
      "AccountId": "123412341234",
      "UsageCount": 15,
      "ReportCreationTime": "2025-09-29T13:27:12.322000+00:00",
      "ReportId": "amiur-1111111111111111"
    },
    {
      "ImageId": "ami-0abcdef1234567890",
      "ResourceType": "ec2:Instance",
      "AccountId": "123412341234",
      "UsageCount": 2,
      "ReportCreationTime": "2025-10-01T13:27:12.322000+00:00",
      "ReportId": "amiur-22222222222222222"
    },
    {
      "ImageId": "ami-0abcdef1234567890",
      "ResourceType": "ec2:Instance",
      "AccountId": "001100110011",
      "UsageCount": 39,
      "ReportCreationTime": "2025-10-01T13:27:12.322000+00:00",
      "ReportId": "amiur-22222222222222222"
    }
  ],
  "NextToken": "opaque"
}
```

**查看指定报告的 AMI 使用情况报告的内容**  
使用 [describe-image-usage-report-entries](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-usage-report-entries.html) 命令并指定报告的 ID。响应会返回指定报告的所有条目，显示使用过 AMI 的账户及其资源计数。

```
aws ec2 describe-image-usage-report-entries --report-ids amiur-11111111111111111
```

下面是示例输出。

```
{
  "ImageUsageReportEntries": [
    {
      "ImageId": "ami-0abcdef1234567890",
      "ResourceType": "ec2:Instance",
      "AccountId": "123412341234",
      "UsageCount": 15,
      "ReportCreationTime": "2025-09-29T13:27:12.322000+00:00",
      "ReportId": "amiur-11111111111111111"
    },
    {
      "ImageId": "ami-0abcdef1234567890",
      "ResourceType": "ec2:LaunchTemplate",
      "AccountId": "123412341234",
      "UsageCount": 4,
      "ReportCreationTime": "2025-09-29T13:27:12.322000+00:00",
      "ReportId": "amiur-11111111111111111"
    },
    {
      "ImageId": "ami-0abcdef1234567890",
      "ResourceType": "ec2:LaunchTemplate",
      "AccountId": "001100110011",
      "UsageCount": 2,
      "ReportCreationTime": "2025-09-29T13:27:12.322000+00:00",
      "ReportId": "amiur-11111111111111111"
    }
  ],
  "NextToken": "opaque"
}
```

------
#### [ PowerShell ]

**列出指定 AMI 的所有 AMI 使用情况报告**  
使用 [Get-EC2ImageUsageReport](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageUsageReport.html) cmdlet 并指定 AMI 的 ID 以获取其报告列表。

```
Get-EC2ImageUsageReport -ImageId ami-0abcdef1234567890
```

下面是示例输出。每个报告 ID 都与扫描的资源类型以及报告创建和到期日期一起列出。您可以使用此信息来识别您想要查看其条目的报告。

```
@{
    ImageUsageReports = @(
        @{
            ImageId = "ami-0abcdef1234567890"
            ReportId = "amiur-1111111111111111"
            ResourceTypes = @(
                @{
                    ResourceType = "ec2:Instance"
                }
            )
            State = "available"
            CreationTime = "2025-09-29T13:27:12.322000+00:00"
            ExpirationTime = "2025-10-28T13:27:12.322000+00:00"
        },
        @{
            ImageId = "ami-0abcdef1234567890"
            ReportId = "amiur-22222222222222222"
            ResourceTypes = @(
                @{
                    ResourceType = "ec2:Instance"
                }
            )
            State = "available"
            CreationTime = "2025-09-30T13:27:12.322000+00:00"
            ExpirationTime = "2025-10-29T13:27:12.322000+00:00"
        },
        @{
            ImageId = "ami-0abcdef1234567890"
            ReportId = "amiur-33333333333333333"
            ResourceTypes = @(
                @{
                    ResourceType = "ec2:Instance"
                }
            )
            State = "available"
            CreationTime = "2025-10-01T13:27:12.322000+00:00"
            ExpirationTime = "2025-10-30T13:27:12.322000+00:00"
        }
    )
    NextToken = "opaque"
}
```

**查看指定 AMI 的 AMI 使用情况报告的内容**  
使用 [Get-EC2ImageUsageReportEntry](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageUsageReportEntry.html) cmdlet 并指定 AMI 的 ID。响应会返回指定 AMI 的所有报告，显示使用过 AMI 的账户及其资源计数。

```
Get-EC2ImageUsageReportEntry -ImageId ami-0abcdef1234567890
```

下面是示例输出。

```
ImageUsageReportEntries : {@{
    ImageId = "ami-0abcdef1234567890"
    ResourceType = "ec2:Instance"
    AccountId = "123412341234"
    UsageCount = 15
    ReportCreationTime = "2025-09-29T13:27:12.322000+00:00"
    ReportId = "amiur-1111111111111111"
    }, @{
    ImageId = "ami-0abcdef1234567890"
    ResourceType = "ec2:Instance"
    AccountId = "123412341234"
    UsageCount = 7
    ReportCreationTime = "2025-09-30T13:27:12.322000+00:00"
    ReportId = "amiur-22222222222222222"
    }...}
NextToken : opaque
```

**查看指定报告的 AMI 使用情况报告的内容**  
使用 [Get-EC2ImageUsageReportEntry](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageUsageReportEntry.html) cmdlet 并指定报告的 ID。响应会返回指定报告的所有条目，显示使用过 AMI 的账户及其资源计数。

```
Get-EC2ImageUsageReportEntry -ReportId amiur-11111111111111111
```

下面是示例输出。

```
ImageUsageReportEntries : {@{
    ImageId = "ami-0abcdef1234567890"
    ResourceType = "ec2:Instance"
    AccountId = "123412341234"
    UsageCount = 15
    ReportCreationTime = "2025-09-29T13:27:12.322000+00:00"
    ReportId = "amiur-11111111111111111"
    }, @{
    ImageId = "ami-0abcdef1234567890"
    ResourceType = "ec2:LaunchTemplate"
    AccountId = "123412341234"
    UsageCount = 4
    ReportCreationTime = "2025-09-29T13:27:12.322000+00:00"
    ReportId = "amiur-11111111111111111"
    }, @{
    ImageId = "ami-0abcdef1234567890"
    ResourceType = "ec2:LaunchTemplate"
    AccountId = "************"
    UsageCount = 2
    ReportCreationTime = "2025-09-29T13:27:12.322000+00:00"
    ReportId = "amiur-11111111111111111"
    }}
NextToken : opaque
```

------

## 删除 AMI 使用情况报告
<a name="delete-ami-usage-reports"></a>

Amazon EC2 会在报告创建 30 天后自动删除该报告。您可以在此之前手动将其删除。

------
#### [ Console ]

**删除 AMI 使用情况报告**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择 AMI。

1. 选择**我的 AMI 使用情况**选项卡。

1. 选择要删除的报告旁边的选项按钮，然后选择**删除**。

------
#### [ AWS CLI ]

**删除 AMI 使用情况报告**  
使用 [delete-image-usage-report](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-image-usage-report.html) 命令并指定报告的 ID。

```
aws ec2 delete-image-usage-report --report-id amiur-0123456789abcdefg
```

------
#### [ PowerShell ]

**删除 AMI 使用情况报告**  
使用 [Remove-EC2ImageUsageReport](https://docs.aws.amazon.com/powershell/latest/reference/items/Remove-EC2ImageUsageReport.html) cmdlet 并指定报告的 ID。

```
Remove-EC2ImageUsageReport -ReportId amiur-0123456789abcdefg
```

------

## 报告配额
<a name="ami-usage-report-quotas"></a>

以下配额适用于创建 AMI 使用情况报告。限额按 AWS 区域应用。


| 说明 | 配额 | 
| --- | --- | 
| 每个 AWS 账户正在进行 (pending) 的 AMI 使用情况报告 | 2000 | 
| 每个 AMI 正在进行 (pending) 的 AMI 使用情况报告 | 1 | 

# 检查上次使用 Amazon EC2 AMI 的时间
<a name="ami-last-launched-time"></a>

Amazon EC2 会自动跟踪 AMI 上次被用于启动实例的日期和时间。如果您的 AMI 已经很长时间没有用于启动实例，请考虑该 AMI 是否适合[注销](deregister-ami.md)或[弃用](ami-deprecate.md)。

**注意事项**
+ 在使用 AMI 启动实例时，使用情况报告会有 24 小时的延迟。
+ 您必须是 AMI 的所有者才能获取上次启动的时间。
+ AMI 使用情况数据自 2017 年 4 月起可用。

------
#### [ Console ]

**查看 AMI 的上次启动时间**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航窗格中，选择 **AMI**。

1. 从筛选栏中选择 **Owned by me**（我拥有的）。

1. 选中该 AMI 对应的复选框。

1. 在**详细信息**选项卡上，找到**上次启动时间**。

------
#### [ AWS CLI ]

**通过描述 AMI 来查看上次启动时间**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。如果输出中不存在 `LastLaunchedTime`，则请确认您拥有该 AMI。

```
aws ec2 describe-images \
    --image-id ami-0abcdef1234567890 \
    --query Images[].LastLaunchedTime \
    --output text
```

下面是示例输出。

```
2025-02-17T20:22:19Z
```

**查看 AMI 的上次启动时间属性**  
使用 [describe-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-attribute.html) 命令。您必须是指定 AMI 的所有者。

```
aws ec2 describe-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --attribute lastLaunchedTime \
    --query LastLaunchedTime.Value \
    --output text
```

下面是示例输出。

```
2025-02-17T20:22:19Z
```

------
#### [ PowerShell ]

**通过描述 AMI 来查看上次启动时间**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。如果输出中不存在 `LastLaunchedTime`，则请确认您拥有该 AMI。

```
(Get-EC2Image -ImageId ami-0abcdef1234567890).LastLaunchedTime
```

下面是示例输出。

```
2025-02-17T20:22:19Z
```

**查看 AMI 的上次启动时间属性**  
使用 [Get-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageAttribute.html) cmdlet。您必须是指定 AMI 的所有者。

```
(Get-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute LastLaunchedTime).LastLaunchedTime
```

下面是示例输出。

```
2025-02-17T20:22:19Z
```

------

# 识别引用指定 AMI 的资源
<a name="ec2-ami-references"></a>

您可以识别引用指定亚马逊机器映像（AMI）的 AWS 资源，无论 AMI 是公共的还是私有的，也无论它们的所有者是谁。这种可见性可帮助您确保资源使用最新的合规 AMI。

**主要优势**

检查 AMI 引用可以帮助您：
+ 审核您账户中 AMI 的使用情况。
+ 检查引用特定 AMI 的位置。
+ 通过更新资源以引用最新的 AMI 来保持合规性。

 

**Topics**
+ [

## 支持的资源
](#ec2-ami-references-supported-resources)
+ [

## AMI 引用检查的工作原理
](#how-ami-references-works)
+ [

## 所需的 IAM 权限
](#ami-references-required-permissions)
+ [

## 检查 AMI 引用的步骤
](#ami-reference-procedures)

## 支持的资源
<a name="ec2-ami-references-supported-resources"></a>

可在以下位置检查 AMI 引用：
+ EC2 实例
+ 启动模板
+ SSM 参数
+ Image Builder 映像配方
+ Image Builder 容器配方

## AMI 引用检查的工作原理
<a name="how-ami-references-works"></a>

**基础操作**

运行 AMI 引用调查时，您可以：
+ 指定要检查的 AMI。
+ 选择要扫描的资源类型。
+ 接收引用指定 AMI 的资源列表。

**资源类型选择**

在控制台中，选择要扫描的资源类型。

在 CLI 中，使用以下一个或两个 CLI 参数指定要扫描的资源类型：
+ `IncludeAllResourceTypes`：扫描所有支持的资源类型。
+ `ResourceTypes`：扫描指定的资源类型。

**响应范围界定**

您可以使用 `ResourceTypes` 参数自定义 `ResourceTypeOptions` 值，从而限定 EC2 实例和启动模板的响应范围。控制台和 `IncludeAllResourceTypes` 参数都使用默认选项值。当 `ResourceTypes` 和 `IncludeAllResourceTypes` 一起使用时，`ResourceTypes` 选项值优先于默认值。

以下是默认值：


| 资源类型 | 范围界定选项 (`OptionName`) | 用途 | `OptionValue` 和控制台的默认值 | 
| --- | --- | --- | --- | 
| EC2 实例 | state-name | 按实例状态筛选 | pending、running、shutting-down、terminated、stopping、stopped（所有状态） | 
| 启动模板 | version-depth | 指定要检查的启动模板版本数（从最新版本开始） | 10（最新版本） | 

## 所需的 IAM 权限
<a name="ami-references-required-permissions"></a>

要使用 DescribeImageReferences API 来识别引用指定 AMI 的资源，您需要以下 IAM 权限来描述资源：
+ `ec2:DescribeInstances`
+ `ec2:DescribeLaunchTemplates`
+ `ec2:DescribeLaunchTemplateVersions`
+ `ssm:DescribeParameters`
+ `ssm:GetParameters`
+ `imagebuilder:ListImageRecipes`
+ `imagebuilder:ListContainerRecipes`
+ `imagebuilder:GetContainerRecipe`

**使用 DescribeImageReferences API 的 IAM 策略示例**  
以下示例策略授予您使用 DescribeImageReferences API 的权限，其中包括描述 EC2 实例、启动模板、Systems Manager 参数、Image Builder 映像配方和 Image Builder 容器配方的权限。

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

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "ec2:DescribeImageReferences",
			"Resource": "*"
		},
		{
			"Effect": "Allow",
			"Action": [
				"ec2:DescribeInstances",
				"ec2:DescribeLaunchTemplates",
				"ec2:DescribeLaunchTemplateVersions",
				"ssm:DescribeParameters",
				"ssm:GetParameters",
				"imagebuilder:ListImageRecipes",
				"imagebuilder:ListContainerRecipes",
				"imagebuilder:GetContainerRecipe"
			],
			"Resource": "*",
			"Condition": {
				"ForAnyValue:StringEquals": {
					"aws:CalledVia": [
						"ec2-images.amazonaws.com"
					]
				}
			}
		}
	]
}
```

------

**重要**  
我们强烈建议您使用 AWS 托管策略 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ImageReferencesAccessPolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ImageReferencesAccessPolicy.html)，而不是自行创建策略。创建仅提供所需权限的自定义 IAM 策略需要时间和专业知识，并且随着新资源类型推出，需要更新。  
`AmazonEC2ImageReferencesAccessPolicy` 托管策略：  
授予使用 DescribeImageReferences API 所需的所有权限（包括描述 EC2 实例、启动模板、Systems Manager 参数以及 Image Builder 容器和映像配方的权限）。
在新的资源类型可用时自动支持它们（在使用 `IncludeAllResourceTypes` 参数时尤其重要）。
您可以将 `AmazonEC2ImageReferencesAccessPolicy` 策略附加到 IAM 身份（用户、组和角色）。  
要查看此策略中包含的权限，请参阅《*AWS 托管式策略参考*》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ImageReferencesAccessPolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ImageReferencesAccessPolicy.html)。

## 检查 AMI 引用的步骤
<a name="ami-reference-procedures"></a>

使用以下过程确定哪些 AWS 资源正在引用指定的 AMI。

------
#### [ Console ]

**识别引用指定 AMI 的资源**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择一个或多个 AMI 来检查引用。

1. 选择**操作**、**AMI 使用情况**、**查看引用的资源**。

1. 在**查看引用所选 AMI 的资源**页面上：

   1. 对于**资源类型**，选择一种或多种资源类型。

   1. 选择**查看资源**。

1. 此时将出现**引用所选 AMI 的资源**部分。该列表显示引用指定 AMI 的资源。每行提供以下信息：
   + **AMI ID** – 所引用 AMI 的 ID。
   + **资源类型** – 引用 AMI 的资源的资源类型。
   + **资源 ID** – 引用 AMI 的资源的 ID。

------
#### [ AWS CLI ]

**检查特定资源类型的 AMI 引用**  
使用带有 `--resource-types` 参数的 [describe-image-references](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-references.html) cmdlet。以下示例检查 EC2 实例（按实例状态限定范围）、启动模板（限定范围为最新 20 个启动模板版本）以及其他特定资源类型。

```
aws ec2 describe-image-references \
    --image-ids ami-0abcdef1234567890 ami-1234567890abcdef0 \
    --resource-types \
        'ResourceType=ec2:Instance,ResourceTypeOptions=[{OptionName=state-name,OptionValues=[running,pending]}]' \
        'ResourceType=ec2:LaunchTemplate,ResourceTypeOptions=[{OptionName=version-depth,OptionValues=[20]}]' \
        'ResourceType=ssm:Parameter' \
        'ResourceType=imagebuilder:ImageRecipe' \
        'ResourceType=imagebuilder:ContainerRecipe'
```

下面是示例输出。

```
{
    "ImageReferences": [
        {
            "ImageId": "ami-0abcdef1234567890",
            "ResourceType": "ec2:Instance",
            "Arn": "arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0"
        },
        {
            "ImageId": "ami-1234567890abcdef0",
            "ResourceType": "ec2:LaunchTemplate",
            "Arn": "arn:aws:ec2:us-east-1:123456789012:launch-template/lt-1234567890abcdef0"
        }
    ]
}
```

**检查所有支持的资源类型的 AMI 引用**  
使用带 `--include-all-resource-types` 参数的 [describe-image-references](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-references.html) cmdlet。

```
aws ec2 describe-image-references \
    --image-ids ami-0abcdef1234567890 ami-1234567890abcdef0 \
    --include-all-resource-types
```

**检查所有支持的资源类型和特定选项的 AMI 引用**  
使用带 `--include-all-resource-types` 和 `--resource-types` 参数的 [describe-image-references](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-references.html) cmdlet。此示例检查所有资源类型，同时将 EC2 实例的响应范围限定为正在运行或待处理的实例。

```
aws ec2 describe-image-references \
    --image-ids ami-0abcdef1234567890 ami-1234567890abcdef0 \
    --include-all-resource-types \
    --resource-types 'ResourceType=ec2:Instance,ResourceTypeOptions=[{OptionName=state-name,OptionValues=[running,pending]}]'
```

------
#### [ PowerShell ]

**检查特定资源类型的 AMI 引用**  
使用带 `-ResourceType` 参数的 [Get-EC2ImageReference](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageReference.html) cmdlet。以下示例检查 EC2 实例（按实例状态限定范围）、启动模板（限定范围为最新 20 个启动模板版本）以及其他特定资源类型。

```
Get-EC2ImageReference `
    -ImageId 'ami-0abcdef1234567890', 'ami-1234567890abcdef0' `
    -ResourceType @(
        @{
            ResourceType = 'ec2:Instance'
            ResourceTypeOptions = @(
                @{
                    OptionName = 'state-name'
                    OptionValues = @('running', 'pending')
                }
            )
        },
        @{
            ResourceType = 'ec2:LaunchTemplate'
            ResourceTypeOptions = @(
                @{
                    OptionName = 'version-depth'
                    OptionValues = @('20')
                }
            )
        },
        @{
            ResourceType = 'ssm:Parameter'
        },
        @{
            ResourceType = 'imagebuilder:ImageRecipe'
        },
        @{
            ResourceType = 'imagebuilder:ContainerRecipe'
        }
    )
```

**检查所有支持的资源类型的 AMI 引用**  
使用带 `-IncludeAllResourceTypes` 参数的 [Get-EC2ImageReference](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageReference.html) cmdlet。

```
Get-EC2ImageReference `
    -ImageId 'ami-0abcdef1234567890', 'ami-1234567890abcdef0' `
    -IncludeAllResourceTypes
```

**检查所有支持的资源类型和特定选项的 AMI 引用**  
使用带 `-IncludeAllResourceTypes` 和 `-ResourceType` 参数的 [Get-EC2ImageReference](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageReference.html) cmdlet。此示例检查所有资源类型，同时将 EC2 实例的响应范围限定为正在运行或待处理的实例。

```
Get-EC2ImageReference `
    -ImageId 'ami-0abcdef1234567890', 'ami-1234567890abcdef0' `
    -IncludeAllResourceTypes `
    -ResourceType @(
        @{
            ResourceType = 'ec2:Instance'
            ResourceTypeOptions = @(
                @{
                    OptionName = 'state-name'
                    OptionValues = @('running', 'pending')
                }
            )
        }
    )
```

------

# 弃用 Amazon EC2 AMI
<a name="ami-deprecate"></a>

您可以弃用 AMI，以表明该 AMI 已过期且不应使用。您还可以为 AMI 指定未来弃用日期，表明 AMI 何时过期。例如，您可能会弃用不再主动维护的 AMI，或是已被较新版本取代的 AMI。默认情况下，已弃用的 AMI 不会显示在 AMI 列表中，防止新用户使用过期的 AMI。但是，现有用户和启动服务（如启动模板和 Auto Scaling 组）可以通过指定其 ID 来继续使用已弃用的 AMI。要删除 AMI 以便使用户和服务无法使用，您必须[取消注册](deregister-ami.md)。

AMI 弃用后：
+ 对于 AMI 用户，已弃用的 AMI 不会显示在 [DescribeImages](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html) API 调用中，除非您指定其 ID 或要求必须显示已弃用的 AMI。AMI 拥有者可继续在 [DescribeImages](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html) API 调用中看到已弃用的 AMI。
+ 对于 AMI 用户，已弃用的 AMI 无法通过 EC2 控制台进行选择。例如，已弃用的 AMI 不会出现在启动实例向导的 AMI 目录中。AMI 拥有者可继续在 EC2 控制台中看到已弃用的 AMI。
+ 对于 AMI 用户，如果您知道已弃用的 AMI 的 ID，则可以通过 API、CLI 或开发工具包继续使用已弃用的 AMI 启动实例。
+ 启动服务（如启动模板和 Auto Scaling 组）可以继续引用已弃用的 AMI。
+ 使用随后被弃用的 AMI 启动的 EC2 实例不会受到影响，可以停止、启动和重新启动。

您可以弃用私有和公用 AMI。

**Topics**
+ [

## 成本
](#ami-deprecate-costs)
+ [

## 注意事项
](#ami-deprecate-limitations)
+ [

## 弃用 AMI
](#deprecate-ami)
+ [

## 描述已弃用的 AMI
](#describe-deprecate-ami)
+ [

## 取消 AMI 弃用
](#cancel-deprecate-ami)

## 成本
<a name="ami-deprecate-costs"></a>

当您弃用 AMI 时，不会删除该 AMI。AMI 拥有者须继续为 AMI 的快照付费。要停止支付快照费用，AMI 拥有者必须通过[取消注册](deregister-ami.md)删除 AMI。

## 注意事项
<a name="ami-deprecate-limitations"></a>
+ 要弃用 AMI，您必须是 AMI 的拥有者。
+ 最近未用于启动实例的 AMI 可能需要弃用或注销。有关更多信息，请参阅 [检查上次使用 Amazon EC2 AMI 的时间](ami-last-launched-time.md)。
+ 您可以创建 Amazon Data Lifecycle Manager EBS-backed AMI 策略，以自动执行 EBS-backed AMI 的弃用。有关更多信息，请参阅 [Create AMI lifecycle policies](https://docs.aws.amazon.com/ebs/latest/userguide/ami-policy.html)。
+ 默认情况下，所有公用 AMI 的弃用日期设置为自 AMI 创建日期起的两年。您可以将弃用日期设置为早于两年。要取消弃用日期，或将弃用移至未来某一日期，您必须通过仅[将 AMI 与特定 AWS 账户共享](sharingamis-explicit.md)来将其设为私有。

## 弃用 AMI
<a name="deprecate-ami"></a>

您可以在特定日期和时间弃用 AMI。您必须是该 AMI 的所有者。

弃用日期的上限为从当前日期起 10 年，但公有 AMI 除外，其上限为自创建之日起 2 年。不能指定某个过去的日期。

------
#### [ Console ]

**在特定日期弃用 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航器中选择 **AMI**。

1. 从筛选栏中选择 **Owned by me**（我拥有的）。

1. 选取相应 AMI，然后选择 **Actions**（操作）、**Manage AMI Deprecation**（管理 AMI 弃用）。您可以选择多个 AMI，一次性为多个 AMI 设置同一弃用日期。

1. 选择**启用**复选框，然后输入弃用日期和时间。

1. 选择**保存**。

------
#### [ AWS CLI ]

**在特定日期弃用 AMI**  
使用 [enable-image-deprecation](https://docs.aws.amazon.com/cli/latest/reference/ec2/enable-image-deprecation.html) 命令。如果指定以秒为单位的值，Amazon EC2 会将秒四舍五入到最近的分钟数。

```
aws ec2 enable-image-deprecation \
    --image-id ami-0abcdef1234567890 \
    --deprecate-at "2025-04-15T13:17:12.000Z"
```

------
#### [ PowerShell ]

**在特定日期弃用 AMI**  
使用 [Enable-EC2ImageDeprecation](https://docs.aws.amazon.com/powershell/latest/reference/items/Enable-EC2ImageDeprecation.html) cmdlet。如果指定以秒为单位的值，Amazon EC2 会将秒四舍五入到最近的分钟数。

```
Enable-EC2ImageDeprecation `
    -ImageId ami-0abcdef1234567890 `
    -DeprecateAt 2025-04-15T13:17:12.000Z
```

------

## 描述已弃用的 AMI
<a name="describe-deprecate-ami"></a>

您可以查看 AMI 的弃用日期和时间，以及按弃用日期筛选 AMI。

------
#### [ Console ]

**查看 AMI 的弃用日期**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航器中选择 **AMIs**，然后选择相应 AMI。

1. 检查**弃用时间**字段（如果选中 AMI 旁边的复选框，则它位于**详细信息**选项卡上）。该字段将显示 AMI 的弃用日期和时间。如果该字段为空，表示该 AMI 未遭弃用。

**按弃用日期筛选 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航器中选择 **AMI**。

1. 从筛选栏中选择 **Owned by me**（我拥有的）或 **Private images**（私有映像）（私有映像包括与您共享的 AMI 以及您拥有的 AMI）。

1. 在搜索栏中输入 **Deprecation time**（输入字母时会出现 **Deprecation time**（弃用时间）筛选器），然后选择运算符以及日期和时间。

------
#### [ AWS CLI ]

当您描述所有 AMI 时，结果会因您是 AMI 用户还是 AMI 拥有者而异。
+ **AMI 用户** – 默认情况下，当您描述所有 AMI 时，结果会排除与您共享但不属于您的已弃用 AMI。要在结果中包括已弃用的 AMI，请指定 `--include-deprecated` 选项。
+ **AMI 所有者** – 当您描述所有 AMI 时，结果将包含您拥有的所有 AMI，包括已弃用的 AMI。您不能使用 `--no-include-deprecated` 选项来排除自己拥有的已弃用 AMI。

**在描述某个账户的所有 AMI 时包含已弃用 AMI**  
使用以下 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images 
    --owners 123456789012 \   
    --include-deprecated
```

**描述您账户中的已弃用 AMI**  
使用以下 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --owners self \
    --query "Images[?DeprecationTime!=null].ImageId" \
    --output text
```

下面是示例输出。

```
ami-0abcdef1234567890
```

**描述 AMI 的弃用日期**  
使用以下 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。如果输出中不存在 `DeprecationTime`，则表示该 AMI 未被弃用，也未设置为在某个未来日期弃用。

```
aws ec2 describe-images \
    --image-ids ami-0abcdef1234567890 \
    --query Images[].DeprecationTime \
    --output text
```

下面是示例输出。

```
2025-05-01T00:00:00.000Z
```

------
#### [ PowerShell ]

**列出您账户中的已弃用 AMI**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
(Get-EC2Image -Owner self | Where-Object {$_.DeprecationTime -ne $null}).ImageId
```

下面是示例输出。

```
ami-0abcdef1234567890
```

**描述 AMI 的弃用日期**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。如果输出中不存在 `DeprecationTime`，则表示该 AMI 未被弃用，也未设置为在某个未来日期弃用。

```
(Get-EC2Image -ImageId ami-0abcdef1234567890).DeprecationTime
```

下面是示例输出。

```
2025-05-01T00:00:00.000Z
```

------

## 取消 AMI 弃用
<a name="cancel-deprecate-ami"></a>

您可以取消弃用某个 AMI，这将移除弃用日期和时间。您必须是 AMI 拥有者才能执行此过程。

------
#### [ Console ]

**取消弃用 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航器中选择 **AMI**。

1. 从筛选栏中选择 **Owned by me**（我拥有的）。

1. 选取相应 AMI，然后选择 **Actions**（操作）、**Manage AMI Deprecation**（管理 AMI 弃用）。您可以选择多个 AMI，一次性取消对多个 AMI 的弃用。

1. 清除**启用**复选框，然后选择**保存**。

------
#### [ AWS CLI ]

**取消弃用 AMI**  
使用以下 [disable-image-deprecation](https://docs.aws.amazon.com/cli/latest/reference/ec2/disable-image-deprecation.html) 命令。

```
aws ec2 disable-image-deprecation --image-id ami-0abcdef1234567890
```

------
#### [ PowerShell ]

**取消弃用 AMI**  
使用 [Disable-EC2ImageDeprecation](https://docs.aws.amazon.com/powershell/latest/reference/items/Disable-EC2ImageDeprecation.html) cmdlet。

```
Disable-EC2ImageDeprecation -ImageId ami-0abcdef1234567890
```

------

# 禁用 Amazon EC2 AMI
<a name="disable-an-ami"></a>

您可以禁用 AMI，以防止系统将其用于实例启动。您无法从已禁用的 AMI 启动新实例。您可以重新启用已禁用的 AMI，使其可以再次用于实例启动。

您可以禁用私有和公用 AMI。

禁用由 EBS 支持的 AMI 后，如果该 AMI 的使用频率很少，但需要长期留存，则可以将其关联的快照归档以降低其存储成本。有关更多信息，请参阅《Amazon EBS 用户指南》**中的[归档 Amazon EBS 快照](https://docs.aws.amazon.com/ebs/latest/userguide/snapshot-archive.html)。

**Topics**
+ [

## AMI 禁用的工作原理
](#how-disable-ami-works)
+ [

## 成本
](#ami-disable-costs)
+ [

## 先决条件
](#ami-disable-prerequisites)
+ [

## 所需的 IAM 权限
](#ami-disable-iam-permissions)
+ [

## 禁用 AMI
](#disable-ami)
+ [

## 描述已禁用的 AMI
](#describe-disabled-ami)
+ [

## 重新启用已禁用的 AMI
](#re-enable-a-disabled-ami)

## AMI 禁用的工作原理
<a name="how-disable-ami-works"></a>

**警告**  
禁用 AMI 会移除其所有启动权限。

**当 AMI 被禁用时：**
+ AMI 的状态会更改为 `disabled`。
+ 无法共享已禁用的 AMI。如果 AMI 为公用性质或以前共享过，则会将其设为私有。如果与 AWS 账户、组织或组织单位共享了 AMI，则它们将无法访问已禁用的 AMI。
+ 默认情况下，已禁用的 AMI 不会出现在 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html) API 调用中。
+ 禁用的 AMI 不会在**我拥有的**控制台筛选条件下显示。要查找已禁用的 AMI，请使用**已禁用的映像**控制台筛选条件。
+ 已禁用的 AMI 不可在 EC2 控制台中选择用于实例启动。例如，已禁用的 AMI 不会出现在启动实例向导的 AMI 目录中，创建启动模板时也不会显示。
+ 启动服务（如启动模板和自动扩缩组）可以继续引用已禁用的 AMI。从已禁用的 AMI 发起的后续实例启动将失败，因此我们建议更新启动模板和自动扩缩组，使其仅引用可用的 AMI。
+ 之前使用随后被禁用的 AMI 启动的 EC2 实例不会受到影响，可以停止、启动和重新启动。
+ 无法删除与已禁用的 AMI 关联的快照。尝试删除关联的快照会导致 `snapshot is currently in use` 错误。

**重新启用 AMI 时：**
+ AMI 的状态将更改为 `available`，可用于启动实例。
+ AMI 可以共享。
+ 在 AMI 被禁用后失去对其的访问权限的 AWS 账户、组织和组织单位不会自动重新获得访问权限，但可以再次与它们共享 AMI。

## 成本
<a name="ami-disable-costs"></a>

当您禁用 AMI 时，不会删除该 AMI。如果 AMI 是 EBS-backed AMI，则您需要继续为 AMI 的 EBS 快照付费。如果您想保留此类 AMI，则可以通过归档快照来降低存储成本。有关更多信息，请参阅《Amazon EBS 用户指南》**中的[归档 Amazon EBS 快照](https://docs.aws.amazon.com/ebs/latest/userguide/snapshot-archive.html)。如果您不想保留此类 AMI 及其快照，则必须取消注册相关 AMI 并删除相应快照。有关更多信息，请参阅 [取消注册 AMI](deregister-ami.md)。

## 先决条件
<a name="ami-disable-prerequisites"></a>

要禁用或重新启用 AMI，您必须是 AMI 的所有者。

## 所需的 IAM 权限
<a name="ami-disable-iam-permissions"></a>

要禁用和重新启用 AMI，您必须拥有以下 IAM 权限：
+ `ec2:DisableImage`
+ `ec2:EnableImage`

## 禁用 AMI
<a name="disable-ami"></a>

您可以使用 EC2 控制台或 AWS Command Line Interface（AWS CLI）禁用 AMI。您必须是 AMI 拥有者才能执行此过程。

------
#### [ Console ]

**要禁用 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航窗格中，选择 **AMI**。

1. 从筛选栏中选择 **Owned by me**（我拥有的）。

1. 选择 AMI，然后依次选择**操作**和**禁用 AMI**。您可以同时选择多个 AMI，一并将其禁用。

1. 在**禁用 AMI**窗口中，选择**禁用 AMI**。

------
#### [ AWS CLI ]

**要禁用 AMI**  
使用以下 [https://docs.aws.amazon.com/cli/latest/reference/ec2/disable-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/disable-image.html) 命令。

```
aws ec2 disable-image --image-id ami-0abcdef1234567890
```

------
#### [ PowerShell ]

**禁用 AMI**  
使用 [Disable-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Disable-EC2Image.html) cmdlet。

```
Disable-EC2Image -ImageId ami-0abcdef1234567890
```

------

## 描述已禁用的 AMI
<a name="describe-disabled-ami"></a>

您可以在 EC2 控制台中或使用 AWS CLI 查看已禁用的 AMI。

您必须是 AMI 所有者才能查看已禁用的 AMI。由于已禁用的 AMI 被设为私有，因此如果您不是所有者，则无法对其进行查看。

------
#### [ Console ]

**要查看已禁用的 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航窗格中，选择 **AMI**。

1. 从筛选栏中选择**已禁用的映像**。  
![\[“已禁用的映像”筛选器。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami-filter-by-disabled-images.png)

------
#### [ AWS CLI ]

默认情况下，当您描述所有 AMI 时，已禁用的 AMI 不会包含在结果中。要在结果中包含已禁用的 AMI，请指定 `--include-disabled` 选项。如果 AMI 已被禁用，则该 AMI 的 `State` 字段将为 `disabled`。

**在描述某个账户的所有 AMI 时包含已禁用 AMI**  
使用以下 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --owners 123456789012 \
    --include-disabled
```

**列出您账户中的已禁用 AMI**  
使用以下 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --owners self \
    --include-disabled \
    --filters Name=state,Values=disabled \
    --query Images[].ImageId \
    --output text
```

下面是示例输出。

```
ami-0abcdef1234567890
```

**描述 AMI 的状态**  
使用以下 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。如果输出中不存在 `DeprecationTime`，则表示该 AMI 未被弃用，也未设置为在某个未来日期弃用。

```
aws ec2 describe-images \
    --image-ids ami-0abcdef1234567890 \
    --query Images[].State \
    --output text
```

下面是示例输出。

```
disabled
```

------
#### [ PowerShell ]

默认情况下，当您描述所有 AMI 时，已禁用的 AMI 不会包含在结果中。要在结果中包含已禁用的 AMI，请指定 `-IncludeDisabled` 参数。如果 AMI 已被禁用，则该 AMI 的 `State` 字段将为 `disabled`。

**列出您账户中的已禁用 AMI**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
(Get-EC2Image `
    -Owner self `
    -IncludeDisabled $true | Where-Object {$_.State -eq "disabled"}).ImageId
```

下面是示例输出。

```
ami-0abcdef1234567890
```

**描述 AMI 的状态**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
(Get-EC2Image -ImageId ami-0abcdef1234567890).State.Value
```

下面是示例输出。

```
disabled
```

------

## 重新启用已禁用的 AMI
<a name="re-enable-a-disabled-ami"></a>

您可以重新启用已禁用的 AMI。您必须是 AMI 拥有者才能执行此过程。

------
#### [ Console ]

**要重新启用已禁用的 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航窗格中，选择 **AMI**。

1. 从筛选栏中选择**已禁用的映像**。

1. 选择 AMI，然后依次选择**操作**、**启用 AMI**。您可以同时选择多个 AMI，一并将其重新启用。

1. 在**启用 AMI**窗口中，选择**启用**。

------
#### [ AWS CLI ]

**要重新启用已禁用的 AMI**  
使用以下 [https://docs.aws.amazon.com/cli/latest/reference/ec2/enable-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/enable-image.html) 命令。

```
aws ec2 enable-image --image-id ami-0abcdef1234567890
```

------
#### [ PowerShell ]

**要重新启用已禁用的 AMI**  
使用 [Enable-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Enable-EC2Image.html) cmdlet。

```
Enable-EC2Image -ImageId ami-0abcdef1234567890
```

------

# 取消注册 Amazon EC2 AMI
<a name="deregister-ami"></a>

取消注册 AMI 时，Amazon EC2 会将其永久删除。取消注册 AMI 之后，便无法将其用于启动新实例。使用完 AMI 之后，可以考虑将其取消注册。

为防止意外或恶意取消注册 AMI，您可以开启[取消注册保护](ami-deregistration-protection.md)。如果您意外取消注册了 EBS-backed AMI，则可以使用[回收站](https://docs.aws.amazon.com/ebs/latest/userguide/recycle-bin.html)将其还原，但仅限在允许的期限内可以还原，并且该期限届满后 AMI 将被永久删除。

注销 AMI 时，您可以选择同时删除其关联的快照。如果一个快照关联到多个 AMI，则即使指定删除，系统也不会将该快照删除，但该 AMI 仍会被注销。任何未删除的快照都将继续产生存储费用。

取消注册 AMI 不会影响从该 AMI 启动的任何实例。您可以继续使用这些实例。默认情况下，注销 AMI 也不会影响在 AMI 创建过程中创建的任何快照。您需要继续按这些实例和快照的存储成本支付使用费。因此，为避免产生不必要的成本，我们建议您终止任何不需要的实例并删除任何不需要的快照。您可以在注销过程中自动删除快照，也可以在注销后手动删除快照。有关更多信息，请参阅 [避免因未使用的资源产生的成本](#delete-unneeded-resources-to-avoid-unnecessary-costs)。

对于从随后取消注册的 AMI 启动的实例，您仍然可以使用 `describe-instance-image-metadata` AWS CLI 命令查看有关 AMI 的一些高级信息。有关更多信息，请参阅 [describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html)。

**Topics**
+ [

## 注意事项
](#deregister-ami-considerations)
+ [

## 取消注册 AMI
](#deregister-an-ami)
+ [

## 避免因未使用的资源产生的成本
](#delete-unneeded-resources-to-avoid-unnecessary-costs)
+ [

# Amazon EC2 AMI 取消注册保护
](ami-deregistration-protection.md)

## 注意事项
<a name="deregister-ami-considerations"></a>
+ 您无法取消注册不属于您账户所有的 AMI。
+ 您无法使用 Amazon EC2 注销由 AWS Backup 服务管理的 AMI。而是应该使用 AWS Backup 删除备份文件库中相应的恢复点。有关更多信息，请参阅 *AWS Backup 开发人员指南*中的[删除备份](https://docs.aws.amazon.com/aws-backup/latest/devguide/deleting-backups.html)。

## 取消注册 AMI
<a name="deregister-an-ami"></a>

您可以注销 EBS-backed AMI 和 Amazon S3 支持的 AMI。对于 EBS-backed AMI，您可以选择同时删除关联的快照。但如果一个快照还关联了其他 AMI，则即使指定删除，系统也不会将其删除。

------
#### [ Console ]

**取消注册 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在筛选条件栏中，选择**我拥有的**可列出可用的 AMI，选择**已禁用的映像**可列出已禁用的 AMI。

1. 选择要取消注册的 AMI。

1. 选择 **Actions**（操作）、**Deregister AMI**（取消注册 AMI）。

1. （可选）要在注销过程中删除关联的快照，请选中**删除关联的快照**复选框。
**注意**  
如果一个快照还关联了其他 AMI，则即使选中了该复选框，系统也不会将其删除。

1. 选择**注销 AMI**。

   控制台可能需要几分钟才能从列表中删除该 AMI。选择 **Refresh** 以刷新状态。

------
#### [ AWS CLI ]

**取消注册 AMI**  
使用以下 [deregister-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/deregister-image.html) 命令。

```
aws ec2 deregister-image --image-id ami-0abcdef1234567890
```

**注销 AMI 并删除其关联的快照**  
使用以下 [deregister-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/deregister-image.html) 命令并指定 `--delete-associated-snapshots` 参数。请注意，如果一个快照还关联了其他 AMI，则即使指定了此参数，系统也不会将其删除。

```
aws ec2 deregister-image \
    --image-id ami-0abcdef1234567890 \
    --delete-associated-snapshots
```

------
#### [ PowerShell ]

**取消注册 AMI**  
使用 [Unregister-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Unregister-EC2Image.html) cmdlet。

```
Unregister-EC2Image -ImageId ami-0abcdef1234567890
```

**注销 AMI 并删除其关联的快照**  
使用 [Unregister-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Unregister-EC2Image.html) cmdlet 并指定 `-DeleteAssociatedSnapshots` 参数。请注意，如果一个快照还关联了其他 AMI，则即使指定了此参数，系统也不会将其删除。

```
Unregister-EC2Image `
    -ImageId ami-0abcdef1234567890 `
    -DeleteAssociatedSnapshots
```

------

## 避免因未使用的资源产生的成本
<a name="delete-unneeded-resources-to-avoid-unnecessary-costs"></a>

默认情况下，注销 AMI 不会删除与该 AMI 关联的所有资源。这些资源包括 EBS-backed AMI 的快照以及在 Amazon S3 中 Amazon S3 支持的 AMI 的文件。取消注册某个 AMI 时，您也不会终止或停止从该 AMI 启动的任何实例。

存储快照和文件将继续产生费用，任何正在运行的实例都将产生费用。

为避免产生此类不必要的费用，我们建议您删除任何不再需要的资源。

**EBS 支持的 AMI**
+ 在注销 AMI 的同时删除关联的快照。有关更多信息，请参阅 [取消注册 AMI](#deregister-an-ami)。
+ 如果注销 AMI 但未删除其关联的快照，则可以手动[删除快照](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-deleting-snapshot.html#ebs-delete-snapshot)。创建 AMI 期间创建的实例根卷快照采用以下描述格式：

  ```
  Created by CreateImage(i-1234567890abcdef0) for ami-0abcdef1234567890
  ```
+ 如果您不再需要利用该 AMI 启动的实例，则可以将其[停止](Stop_Start.md#starting-stopping-instances)或[终止](terminating-instances.md#terminating-instances-console)。要列出实例，请按 AMI 的 ID 进行筛选。

**Amazon S3 支持的 AMI**
+ 使用 [ec2-delete-bundle](ami-tools-commands.md#ami-delete-bundle)（AMI 工具）命令删除 Amazon S3 中的捆绑包。
+ 如果删除捆绑包后 Amazon S3 存储桶为空，并且该存储桶不再有进一步的用途，您可以[删除存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。
+ 如果您不再需要利用该 AMI 启动的实例，则可以将其[终止](terminating-instances.md#terminating-instances-console)。要列出实例，请按 AMI 的 ID 进行筛选。

# Amazon EC2 AMI 取消注册保护
<a name="ami-deregistration-protection"></a>

您可以在 AMI 上开启*取消注册保护*，以防止意外或恶意删除。开启取消注册保护后，任何用户都无法取消注册该 AMI，无论其 IAM 权限如何。如果要取消注册该 AMI，则必须首先关闭其上的取消注册保护。

在 AMI 上开启取消注册保护时，您可以选择包含 24 小时的冷却时间。此冷却时间是取消注册保护在您关闭后仍然有效的时间。在此冷却时间内，该 AMI 无法取消注册。冷却时间结束后，可以取消注册该 AMI。

所有现有和新的 AMI 都会默认关闭取消注册保护。

## 开启取消注册保护
<a name="enable-deregistration-protection"></a>

使用以下过程开启取消注册保护。

------
#### [ Console ]

**开启注销保护**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在筛选条件栏中，选择**我拥有的**可列出可用的 AMI，选择**已禁用的映像**可列出已禁用的 AMI。

1. 选择要开启取消注册保护的 AMI，然后选择**操作**、**管理 AMI 注销保护**。

1. 在**管理 AMI 取消注册保护**对话框中，您可以在带冷却时间或不带冷却时间的情况下开启取消注册保护。请选择以下选项之一：
   + **启用并包含 24 小时的冷却时间** – 有冷却时间，取消注册保护关闭后 24 小时内无法取消注册 AMI。
   + **启用但无冷却时间** – 无冷却时间，取消注册保护关闭后可以立即取消注册 AMI。

1. 选择**保存**。

------
#### [ AWS CLI ]

**开启注销保护**  
使用 [enable-image-deregistration-protection](https://docs.aws.amazon.com/cli/latest/reference/ec2/enable-image-deregistration-protection.html) 命令。要启用可选的冷却时间，请添加 `--with-cooldown` 选项。

```
aws ec2 enable-image-deregistration-protection \
    --image-id ami-0abcdef1234567890 \
    --with-cooldown
```

------
#### [ PowerShell ]

**开启注销保护**  
使用 [Enable-EC2ImageDeregistrationProtection](https://docs.aws.amazon.com/powershell/latest/reference/items/Enable-EC2ImageDeregistrationProtection.html) cmdlet。要启用可选的冷却时间，请将 `-WithCooldown` 参数设置为 `true`。

```
Enable-EC2ImageDeregistrationProtection `
    -ImageId ami-0abcdef1234567890 `
    -WithCooldown $true
```

------

## 关闭取消注册保护
<a name="disable-deregistration-protection"></a>

使用以下过程关闭取消注册保护。

如果您在为 AMI 开启取消注册保护时选择了包含 24 小时冷却时间的选项，则在您关闭取消注册保护后，您将无法立即取消注册 AMI。此冷却时间为 24 小时，是取消注册保护在您关闭后仍然有效的时间。在此冷却时间内，该 AMI 无法取消注册。冷却时间结束后，可以取消注册该 AMI。

------
#### [ Console ]

**关闭注销保护**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在筛选条件栏中，选择**我拥有的**可列出可用的 AMI，选择**已禁用的映像**可列出已禁用的 AMI。

1. 选择要关闭取消注册保护的 AMI，然后选择**操作**、**管理 AMI 取消注册保护**。

1. 在**管理 AMI 取消注册保护**对话框中，选择**禁用**。

1. 选择**保存**。

------
#### [ AWS CLI ]

**关闭注销保护**  
使用 [disable-image-deregistration-protection](https://docs.aws.amazon.com/cli/latest/reference/ec2/disable-image-deregistration-protection.html) 命令。

```
aws ec2 disable-image-deregistration-protection --image-id ami-0abcdef1234567890
```

------
#### [ PowerShell ]

**关闭注销保护**  
使用 [Disable-EC2ImageDeregistrationProtection](https://docs.aws.amazon.com/powershell/latest/reference/items/Disable-EC2ImageDeregistrationProtection.html) cmdlet。

```
Disable-EC2ImageDeregistrationProtection -ImageId ami-0abcdef1234567890
```

------

# 使用 Amazon EC2 启动模式的实例启动行为
<a name="ami-boot"></a>

电脑启动时，它运行的第一个软件负责初始化平台并为操作系统执行特定于平台的操作提供界面。

在 Amazon EC2 中，支持启动模式软件的两种变体包括：统一可扩展固件接口（UEFI）和传统 BIOS。

**AMI 上可能的启动模式参数**  
AMI 可以具有以下任一启动模式参数值：`uefi`、`legacy-bios` 或 `uefi-preferred`。AMI 启动模式参数是可选项。对于不带启动模式参数的 AMI，从这些 AMI 启动的实例将使用实例类型的默认启动模式值。

**AMI 启动模式参数的用途**  
AMI 启动模式参数向 Amazon EC2 发出信号，指明启动实例时要使用哪种启动模式。当启动模式参数设置为 `uefi` 时，EC2 将尝试在 UEFI 上启动实例。如果操作系统未配置为支持 UEFI，则实例启动可能失败。

**UEFI Preferred 启动模式参数**  
您可以使用 `uefi-preferred` 启动模式参数创建同时支持 UEFI 和传统 BIOS 的 AMI。当启动模式参数设置为 `uefi-preferred` 并且实例类型支持 UEFI 时，实例会在 UEFI 上启动。如果实例类型不支持 UEFI，实例会在传统 BIOS 上启动。

**警告**  
UEFI 安全启动等部分功能仅适用于在 UEFI 上启动的实例。将 `uefi-preferred` AMI 启动模式参数与不支持 UEFI 的实例类型结合使用时，实例将以传统 BIOS 启动，并禁用 UEFI 相关功能。如果您依赖于 UEFI 相关功能的可用性，请将 AMI 启动模式参数设置为 `uefi`。

**实例类型的默认启动模式**
+ Graviton 实例类型：UEFI
+ Intel 和 AMD 实例类型：传统 BIOS

**区域支持**  
Wavelength 区中不支持 UEFI 启动。

**Topics**
+ [

# 在 UEFI 启动模式下启动 EC2 实例的要求
](launch-instance-boot-mode.md)
+ [

# 确定 Amazon EC2 AMI 的启动模式参数
](ami-boot-mode.md)
+ [

# 确定 EC2 实例类型支持的启动模式
](instance-type-boot-mode.md)
+ [

# 确定 EC2 实例的启动模式
](instance-boot-mode.md)
+ [

# 确定 EC2 实例操作系统的启动模式
](os-boot-mode.md)
+ [

# 设置 Amazon EC2 AMI 的启动模式
](set-ami-boot-mode.md)
+ [

# Amazon EC2 实例的 UEFI 变量
](uefi-variables.md)
+ [

# 适用于 Amazon EC2 实例的 UEFI 安全启动
](uefi-secure-boot.md)

# 在 UEFI 启动模式下启动 EC2 实例的要求
<a name="launch-instance-boot-mode"></a>

实例的启动模式由 AMI 的配置、其中包含的操作系统和实例类型决定。要在 UEFI 启动模式下启动实例，必须满足以下要求。

**AMI**  
AMI 必须按如下方式为 UEFI 配置：  
+ **操作系统** – AMI 中包含的操作系统必须配置为使用 UEFI；否则，实例启动将失败。有关更多信息，请参阅 [确定 EC2 实例操作系统的启动模式](os-boot-mode.md)。
+ **AMI 启动模式参数** – AMI 的启动模式参数必须设置为 `uefi` 或 `uefi-preferred`。有关更多信息，请参阅 [确定 Amazon EC2 AMI 的启动模式参数](ami-boot-mode.md)。
**Linux** – 以下 Linux AMI 支持 UEFI：  
+ Amazon Linux 2023
+ Amazon Linux 2（仅适用于 Graviton 实例类型）
至于其他 Linux AMI，则必须[配置 AMI](set-ami-boot-mode.md)，通过 [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/) 导入 AMI，或通过 [CloudEndure](https://docs.cloudendure.com/) 导入 AMI。  
**Windows**：以下 Windows AMI 支持 UEFI：  
+ Windows\$1Server-2025-\$1（带有 `BIOS-` 名称前缀的 AMI 除外）
+ TPM-Windows\$1Server-2022-English-Full-Base
+ TPM-Windows\$1Server-2022-English-Core-Base
+ TPM-Windows\$1Server-2019-English-Full-Base
+ TPM-Windows\$1Server-2019-English-Core-Base
+ TPM-Windows\$1Server-2016-English-Full-Base
+ TPM-Windows\$1Server-2016-English-Core-Base

**实例类型**  
所有基于 AWS Nitro System 构建的实例都支持 UEFI 和传统 BIOS，下列实例除外：裸机实例、DL1、G4ad、P4、u-3tb1、u-6tb1、u-9tb1、u-12tb1、u-18tb1、u-24tb1 和 VT1。有关更多信息，请参阅 [确定 EC2 实例类型支持的启动模式](instance-type-boot-mode.md)。

下表显示，实例的启动模式（由**生成的实例启动模式**列表示）由 AMI 的启动模式参数（第 1 列）、AMI 中包含的操作系统的启动模式配置（第 2 列）和实例类型的启动模式支持（第 3 列）共同决定。


| AMI 启动模式参数 | 操作系统启动模式配置 | 实例类型启动模式支持 | 生成的实例启动模式 | 
| --- | --- | --- | --- | 
| UEFI | UEFI | UEFI | UEFI | 
| 传统 BIOS | 传统 BIOS | 传统 BIOS | 传统 BIOS | 
| UEFI Preferred | UEFI | UEFI | UEFI | 
| UEFI Preferred | UEFI | UEFI 和传统 BIOS | UEFI | 
| UEFI Preferred | 传统 BIOS | 传统 BIOS | 传统 BIOS | 
| UEFI Preferred | 传统 BIOS | UEFI 和传统 BIOS | 传统 BIOS | 
| 未指定启动模式 – ARM | UEFI | UEFI | UEFI | 
| 未指定启动模式 – x86 | 传统 BIOS | UEFI 和传统 BIOS | 传统 BIOS | 

# 确定 Amazon EC2 AMI 的启动模式参数
<a name="ami-boot-mode"></a>

AMI 启动模式参数是可选项。AMI 可以具有以下任一启动模式参数值：`uefi`、`legacy-bios` 或 `uefi-preferred`。

某些 AMI 没有启动模式参数。如果 AMI 没有启动模式参数，从 AMI 启动的实例将使用实例类型的默认值，在 Graviton 上使用 `uefi`，并在 Intel 和 AMD 实例类型上使用 `legacy-bios`。

------
#### [ Console ]

**确定 AMI 的启动模式参数**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **AMI**，然后选择 AMI。

1. 检查**启动模式**字段。
   + 值 **uefi** 表示 AMI 支持 UEFI。
   + 值 **uefi-preferred** 表示 AMI 同时支持 UEFI 和传统 BIOS。
   + 如果没有值，从 AMI 启动的实例将使用实例类型的默认值。

**在启动实例时确定 AMI 的启动模式参数**  
使用启动实例向导启动实例时，请在选择 AMI 的步骤中检查**启动模式**字段。有关更多信息，请参阅 [应用程序和操作系统映像（亚马逊机器映像）](ec2-instance-launch-parameters.md#liw-ami)。

------
#### [ AWS CLI ]

**确定 AMI 的启动模式参数**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令确定 AMI 的启动模式。

```
aws ec2 describe-images \
    --region us-east-1 \
    --image-id ami-0abcdef1234567890 \
    --query Images[].BootMode \
    --output text
```

下面是示例输出。

```
uefi
```

输出中的值 `uefi` 表示 AMI 支持 UEFI。值 `uefi-preferred` 表示 AMI 同时支持 UEFI 和传统 BIOS。如果没有值，从 AMI 启动的实例将使用实例类型的默认值。

------
#### [ PowerShell ]

**确定 AMI 的启动模式参数**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet 确定 AMI 的启动模式。

```
Get-EC2Image -Region us-east-1 `
    -ImageId ami-0abcdef1234567890 | Format-List Name, BootMode, TpmSupport
```

下面是示例输出。

```
Name       : TPM-Windows_Server-2016-English-Full-Base-2023.05.10
BootMode   : uefi
TpmSupport : v2.0
```

输出中的值 `BootMode` 表示 AMI 的启动模式。值 `uefi` 表示 AMI 支持 UEFI。值 `uefi-preferred` 表示 AMI 同时支持 UEFI 和传统 BIOS。如果没有值，从 AMI 启动的实例将使用实例类型的默认值。

------

# 确定 EC2 实例类型支持的启动模式
<a name="instance-type-boot-mode"></a>

您可以确定实例类型支持的启动模式。

Amazon EC2 控制台不会显示实例类型支持的启动模式。

------
#### [ AWS CLI ]

使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令确定实例类型支持的启动模式。`--query` 参数筛选输出以仅返回支持的启动模式。

以下示例显示，指定的实例类型同时支持 UEFI 和传统 BIOS 启动模式。

```
aws ec2 describe-instance-types \
    --instance-types m5.2xlarge \
    --query "InstanceTypes[*].SupportedBootModes"
```

下面是示例输出。

```
[
    [
        "legacy-bios",
        "uefi"
    ]
]
```

以下示例显示 `t2.xlarge` 仅支持传统 BIOS。

```
aws ec2 describe-instance-types \
    --instance-types t2.xlarge \
    --query "InstanceTypes[*].SupportedBootModes"
```

下面是示例输出。

```
[
    [
        "legacy-bios"
    ]
]
```

------
#### [ PowerShell ]

使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) cmdlet 确定实例类型支持的启动模式。

以下示例显示 `m5.2xlarge` 支持 UEFI 和传统 BIOS 启动模式。

```
Get-EC2InstanceType -InstanceType m5.2xlarge | Format-List InstanceType, SupportedBootModes
```

下面是示例输出。

```
InstanceType       : m5.2xlarge
SupportedBootModes : {legacy-bios, uefi}
```

以下示例显示 `t2.xlarge` 仅支持传统 BIOS。

```
Get-EC2InstanceType -InstanceType t2.xlarge | Format-List InstanceType, SupportedBootModes
```

下面是示例输出。

```
InstanceType       : t2.xlarge
SupportedBootModes : {legacy-bios}
```

------

**确定支持 UEFI 的实例类型**  
您可以确定支持 UEFI 的实例类型。Amazon EC2 控制台不会显示实例类型是否支持 UEFI。

------
#### [ AWS CLI ]

可用的实例类型因 AWS 区域 而异。要查看某个区域中支持 UEFI 的可用实例类型，请使用 [describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令。包括 `--filters` 参数以将结果范围限定为支持 UEFI 的实例类型，并包括 `--query` 参数以将输出范围限定为 `InstanceType` 的值。

```
aws ec2 describe-instance-types \
    --filters Name=supported-boot-mode,Values=uefi \
    --query "InstanceTypes[*].[InstanceType]" --output text | sort
```

------
#### [ PowerShell ]

可用的实例类型因 AWS 区域 而异。要查看某个区域中支持 UEFI 的可用实例类型，请使用 [Get-EC2InstanceType](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) cmdlet。

```
Get-EC2InstanceType | `
	Where-Object {$_.SupportedBootModes -Contains "uefi"} | `
	Sort-Object InstanceType | `
	Format-Table InstanceType -GroupBy CurrentGeneration
```

------

**确定支持 UEFI 安全启动并保留非易失性变量的实例类型**  
裸机实例不支持 UEFI 安全启动和非易失性变量，因此这些示例将它们从输出中排除。有关 UEFI 安全启动的信息，请参阅 [适用于 Amazon EC2 实例的 UEFI 安全启动](uefi-secure-boot.md)。

------
#### [ AWS CLI ]

使用 [describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令，并从输出中排除裸机实例。

```
aws ec2 describe-instance-types \
    --filters Name=supported-boot-mode,Values=uefi Name=bare-metal,Values=false \
    --query "InstanceTypes[*].[InstanceType]" \
    --output text | sort
```

------
#### [ PowerShell ]

使用 [Get-EC2InstanceType](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) cmdlet，并从输出中排除裸机实例。

```
Get-EC2InstanceType | `
    Where-Object { `
        $_.SupportedBootModes -Contains "uefi" -and `
        $_.BareMetal -eq $False
        } | `
    Sort-Object InstanceType  | `
    Format-Table InstanceType, SupportedBootModes, BareMetal, `
        @{Name="SupportedArchitectures"; Expression={$_.ProcessorInfo.SupportedArchitectures}}
```

------

# 确定 EC2 实例的启动模式
<a name="instance-boot-mode"></a>

实例的启动模式会在 Amazon EC2 控制台中的**启动模式**字段中，通过 AWS CLI 中的 `currentInstanceBootMode` 参数显示。

启动实例时，其启动模式参数的值由启动该实例所用的 AMI 的启动模式参数的值决定，如下所示：
+ 启动模式参数为 `uefi` 的 AMI 会创建 `currentInstanceBootMode` 参数为 `uefi` 的实例。
+ 启动模式参数为 `legacy-bios` 的 AMI 会创建 `currentInstanceBootMode` 参数为 ` legacy-bios` 的实例。
+ 如果实例类型支持 UEFI，则启动模式参数为 `uefi-preferred` 的 AMI 会创建 `currentInstanceBootMode` 参数为 `uefi` 的实例；否则将创建 `currentInstanceBootMode` 参数为 `legacy-bios` 的实例。
+ 没有启动模式参数值的 AMI 会创建参数值为 `currentInstanceBootMode` 的实例，该值取决于 AMI 架构是 ARM 还是 x86，以及实例类型支持哪种启动模式。Graviton 实例类型上的默认启动模式为 `uefi`，而 Intel 和 AMD 实例类型上的默认启动模式为 `legacy-bios`。

------
#### [ Console ]

**确定实例的启动模式**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**，然后选择您的实例。

1. 在**详细信息**选项卡上，检查**启动模式**字段。

------
#### [ AWS CLI ]

**确定实例的启动模式**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令确定实例的启动模式。您还可以确定用于创建实例的 AMI 的启动模式。

```
aws ec2 describe-instances \
    --region us-east-1 \
    --instance-ids i-1234567890abcdef0 \
    --query Reservations[].Instances[].BootMode \
    --output text
```

下面是示例输出。

```
uefi
```

------
#### [ PowerShell ]

**确定实例的启动模式**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet 确定实例的启动模式。您还可以确定用于创建实例的 AMI 的启动模式。

```
(Get-EC2Instance `
    -InstanceId i-1234567890abcdef0).Instances | Format-List BootMode, CurrentInstanceBootMode, InstanceType, ImageId
```

下面是示例输出。

```
BootMode                : uefi
CurrentInstanceBootMode : uefi
InstanceType            : c5a.large
ImageId                 : ami-0abcdef1234567890
```

------

# 确定 EC2 实例操作系统的启动模式
<a name="os-boot-mode"></a>

AMI 的启动模式指导 Amazon EC2 使用哪种启动模式来启动实例。要查看实例的操作系统是否配置为 UEFI，需要通过 SSH（Linux 实例）或 RDP（Windows 实例）连接到实例。

请使用适用于您实例操作系统的说明。

## Linux
<a name="os-boot-mode-linux"></a>

**要确定实例操作系统的启动模式**

1. [使用 SSH 连接到 Linux 实例](connect-linux-inst-ssh.md)。

1. 要查看操作系统的启动模式，请尝试以下任一操作：
   + 运行如下命令。

     ```
     [ec2-user ~]$ sudo /usr/sbin/efibootmgr
     ```

     在 UEFI 启动模式下启动的实例的预期输出

     ```
     BootCurrent: 0001
     Timeout: 0 seconds
     BootOrder: 0000,0001
     Boot0000* UiApp
     Boot0001* UEFI Amazon Elastic Block Store vol-xyz
     ```
   + 运行以下命令以验证 `/sys/firmware/efi` 目录是否存在。仅当实例使用 UEFI 启动时，此目录才会存在。如果此目录不存在，该命令将返回 `Legacy BIOS Boot Detected`。

     ```
     [ec2-user ~]$ [ -d /sys/firmware/efi ] && echo "UEFI Boot Detected" || echo "Legacy BIOS Boot Detected"
     ```

     在 UEFI 启动模式下启动的实例的预期输出

     ```
     UEFI Boot Detected
     ```

     在传统 BIOS 启动模式下启动的实例的预期输出

     ```
     Legacy BIOS Boot Detected
     ```
   + 运行以下命令以验证 EFI 是否出现在 `dmesg` 输出中。

     ```
     [ec2-user ~]$ dmesg | grep -i "EFI"
     ```

     在 UEFI 启动模式下启动的实例的预期输出

     ```
     [    0.000000] efi: Getting EFI parameters from FDT:
     [    0.000000] efi: EFI v2.70 by EDK II
     ```

## Windows
<a name="os-boot-mode-windows"></a>

**要确定实例操作系统的启动模式**

1. [使用 RDP 连接到 Windows 实例](connecting_to_windows_instance.md)。

1. 转到**系统信息**并检查 **BIOS 模式**行。  
![\[显示所选 BIOS 模式行的系统信息窗口。BIOS 模式的值为 Legacy。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/BIOS-mode-win.png)

# 设置 Amazon EC2 AMI 的启动模式
<a name="set-ami-boot-mode"></a>

默认情况下，AMI 会继承用于创建 AMI 的 EC2 实例的启动模式。例如，如果从传统 BIOS 上运行的 EC2 实例创建 AMI，则新 AMI 的启动模式为 `legacy-bios`。如果从启动模式为 `uefi-preferred` 的 EC2 实例创建 AMI，则新 AMI 的启动模式为 `uefi-preferred`。

注册 AMI 时，可以将 AMI 的启动模式设置为 `uefi`、`legacy-bios` 或 `uefi-preferred`。

当 AMI 启动模式设置为 `uefi-preferred` 时，实例将按如下方式启动：
+ 对于同时支持 UEFI 和传统 BIOS 的实例类型（例如 `m5.large`），实例通过 UEFI 启动。
+ 对于仅支持传统 BIOS 的实例类型（例如 `m4.large`），实例通过传统 BIOS 启动。

如果将 AMI 启动模式设置为 `uefi-preferred`，则操作系统必须支持同时启动 UEFI 和传统 BIOS 的功能。

要将现有的基于传统 BIOS 的实例转换为 UEFI，或将现有的基于 UEFI 的实例转换为传统 BIOS，必须首先修改实例的卷和操作系统以支持选定的启动模式。然后，创建该卷的快照。首先，从快照创建 AMI。

**注意事项**
+ 设置 AMI 启动模式参数不会自动将操作系统配置为指定的启动模式。您必须首先对实例的卷和操作系统进行适当的修改，以支持通过选定的启动模式启动。否则，生成的 AMI 将不可用。例如，如果要将基于传统 BIOS 的 Windows 实例转换为 UEFI，则可以使用 Microsoft 的 [MBR2GPT](https://learn.microsoft.com/en-us/windows/deployment/mbr-to-gpt) 工具将系统磁盘从 MBR 转换为 GPT。所需的修改是特定于操作系统的。有关更多信息，请参阅操作系统的手册。
+ 无法使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 命令或 [https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet 创建同时支持 [NitroTPM](nitrotpm.md) 和 UEFI Preferred 的 AMI。
+ UEFI 安全启动等部分功能仅适用于在 UEFI 上启动的实例。将 `uefi-preferred` AMI 启动模式参数与不支持 UEFI 的实例类型结合使用时，实例将以传统 BIOS 启动，并禁用 UEFI 相关功能。如果您依赖于 UEFI 相关功能的可用性，请将 AMI 启动模式参数设置为 `uefi`。

------
#### [ AWS CLI ]

**设置 AMI 的启动模式**

1. 对实例的卷和操作系统进行适当的修改，以支持通过选定的启动模式启动。所需的修改是特定于操作系统的。有关更多信息，请参阅操作系统的手册。
**警告**  
如果不执行此步骤，AMI 将无法使用。

1. 要查找实例的卷 ID，请使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令。您将在下一步中创建此卷的快照。

   ```
   aws ec2 describe-instances \
       --instance-ids i-1234567890abcdef0 \
       --query Reservations[].Instances[].BlockDeviceMappings
   ```

   下面是示例输出。

   ```
   [
       [
           {
               "DeviceName": "/dev/xvda",
               "Ebs": {
                   "AttachTime": "2024-07-11T01:05:51+00:00",
                   "DeleteOnTermination": true,
                   "Status": "attached",
                   "VolumeId": "vol-1234567890abcdef0"
               }
           }
       ]
   ]
   ```

1. 要创建卷的快照，请使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshot.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshot.html) 命令。使用上一步中的卷 ID。

   ```
   aws ec2 create-snapshot \
       --volume-id vol-01234567890abcdef \
       --description "my snapshot"
   ```

   下面是示例输出。

   ```
   {
       "Description": "my snapshot",
       "Encrypted": false,
       "OwnerId": "123456789012",
       "Progress": "",
       "SnapshotId": "snap-0abcdef1234567890",
       "StartTime": "",
       "State": "pending",
       "VolumeId": "vol-01234567890abcdef",
       "VolumeSize": 30,
       "Tags": []
   }
   ```

1. 等到快照状态为 `completed` 后，继续执行下一步。要获取快照状态，请将 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html) 命令与上一步中的快照 ID 结合使用。

   ```
   aws ec2 describe-snapshots \
       --snapshot-ids snap-0abcdef1234567890 \
       --query Snapshots[].State \
       --output text
   ```

   下面是示例输出。

   ```
   completed
   ```

1. 要创建新的 AMI，请使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 命令。使用 **CreateSnapshot** 输出中 `SnapshotId` 的值。
   + 要将启动模式设置为 UEFI，请添加 `--boot-mode` 参数，并指定值 `uefi`。

     ```
     aws ec2 register-image \
        --description "my image" \
        --name "my-image" \
        --block-device-mappings "DeviceName=/dev/sda1,Ebs={SnapshotId=snap-0abcdef1234567890,DeleteOnTermination=true}" \
        --root-device-name /dev/sda1 \
        --virtualization-type hvm \
        --ena-support \
        --boot-mode uefi
     ```
   + 要将启动模式设置为 `uefi-preferred`，请将 `--boot-mode` 的值设置为 `uefi-preferred`

     ```
     aws ec2 register-image \
        --description "my description" \
        --name "my-image" \
        --block-device-mappings "DeviceName=/dev/sda1,Ebs={SnapshotId=snap-0abcdef1234567890,DeleteOnTermination=true}" \
        --root-device-name /dev/sda1 \
        --virtualization-type hvm \
        --ena-support \
        --boot-mode uefi-preferred
     ```

1. （可选）要验证新创建的 AMI 是否具有您指定的启动模式，请使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

   ```
   aws ec2 describe-images \
       --image-id ami-1234567890abcdef0 \
       --query Images[].BootMode \
       --output text
   ```

   下面是示例输出。

   ```
   uefi
   ```

------
#### [ PowerShell ]

**设置 AMI 的启动模式**

1. 对实例的卷和操作系统进行适当的修改，以支持通过选定的启动模式启动。所需的修改是特定于操作系统的。有关更多信息，请参阅操作系统的手册。
**警告**  
如果不执行此步骤，AMI 将无法使用。

1. 要查找实例的卷 ID，请使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet。

   ```
   (Get-EC2Instance `
       -InstanceId i-1234567890abcdef0).Instances.BlockDeviceMappings.Ebs
   ```

   下面是示例输出。

   ```
   AssociatedResource  : 
   AttachTime          : 7/11/2024 1:05:51 AM
   DeleteOnTermination : True
   Operator            : 
   Status              : attached
   VolumeId            : vol-01234567890abcdef
   ```

1. 要创建卷的快照，请使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Snapshot.html](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Snapshot.html) cmdlet。使用上一步中的卷 ID。

   ```
   New-EC2Snapshot `
       -VolumeId vol-01234567890abcdef `
       -Description "my snapshot"
   ```

   下面是示例输出。

   ```
   AvailabilityZone          : 
   Description               : my snapshot
   Encrypted                 : False
   FullSnapshotSizeInBytes   : 0
   KmsKeyId                  : 
   OwnerId                   : 123456789012
   RestoreExpiryTime         : 
   SnapshotId                : snap-0abcdef1234567890
   SseType                   : 
   StartTime                 : 4/25/2025 6:08:59 PM
   State                     : pending
   StateMessage              : 
   VolumeId                  : vol-01234567890abcdef
   VolumeSize                : 30
   ```

1. 等到快照状态为 `completed` 后，继续执行下一步。要获取快照状态，请将 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html) cmdlet 与上一步中的快照 ID 结合使用。

   ```
   (Get-EC2Snapshot `
       -SnapshotId snap-0abcdef1234567890).State.Value
   ```

   下面是示例输出。

   ```
   completed
   ```

1. 要创建新的 AMI，请使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet。使用 **New-EC2Snapshot** 输出中 `SnapshotId` 的值。
   + 要将启动模式设置为 UEFI，请添加 `-BootMode` 参数，并指定值 `uefi`。

     ```
     $block = @{SnapshotId=snap-0abcdef1234567890}
     Register-EC2Image ` 
        -Description "my image" `
        -Name "my-image" `
        -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block} `
        -RootDeviceName /dev/xvda `
        -EnaSupport $true `
        -BootMode uefi
     ```
   + 要将启动模式设置为 `uefi-preferred`，请将 `-BootMode` 的值设置为 `uefi-preferred`

     ```
     $block = @{SnapshotId=snap-0abcdef1234567890}
     Register-EC2Image ` 
        -Description "my image" `
        -Name "my-image" `
        -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block} `
        -RootDeviceName /dev/xvda `
        -EnaSupport $true `
        -BootMode uefi-preferred
     ```

1. （可选）要验证新创建的 AMI 是否具有您指定的启动模式，请使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

   ```
   (Get-EC2Image `
       -ImageId ami-1234567890abcdef0).BootMode.Value
   ```

   下面是示例输出。

   ```
   uefi
   ```

------

# Amazon EC2 实例的 UEFI 变量
<a name="uefi-variables"></a>

当您启动实例且其启动模式设置为 UEFI 时，将为变量创建键值存储。UEFI 和实例操作系统可以使用该键值存储来存储 UEFI 变量。

启动加载程序和操作系统使用 UEFI 变量来配置早期系统启动。它们允许操作系统管理启动过程的某些设置（例如启动顺序）或管理 UEFI 安全启动的密钥。

**警告**  
可以连接到实例的任何人（以及可能在实例上运行的任何软件），或者有权在实例上使用 [GetInstanceUefiData](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceUefiData.html) API 的任何人都可以读取变量。您绝不应将敏感数据（例如密码或个人身份信息）存储在 UEFI 变量存储中。

**UEFI 变量持久性**
+ 对于在 2022 年 5 月 10 日或之前启动的实例，UEFI 变量会在重启或停止时擦除。
+ 对于在 2022 年 5 月 11 日或之后启动的实例，标记为非易失性的 UEFI 变量将在重启和停止/启动时保留。
+ 裸机实例不会在实例停止/启动操作中保留 UEFI 非易失性变量。

# 适用于 Amazon EC2 实例的 UEFI 安全启动
<a name="uefi-secure-boot"></a>

UEFI 安全启动构建在 Amazon EC2 长期以来的安全启动过程之上，并提供了额外的深度防御功能，可以帮助客户保护软件免受重新引导过程中持续存在的威胁。它确保实例只启动使用了加密密钥签名的软件。密钥存储在 [UEFI 非易失性变量存储](uefi-variables.md)的密钥数据库中。UEFI 安全启动可防止未经授权地修改实例启动流程。

**Topics**
+ [

# 如何将 UEFI 安全启动与 Amazon EC2 实例配合使用
](how-uefi-secure-boot-works.md)
+ [

# Amazon EC2 上 UEFI 安全启动的要求
](launch-instance-with-uefi-sb.md)
+ [

# 验证 Amazon EC2 实例是否启用了 UEFI 安全启动
](verify-uefi-secure-boot.md)
+ [

# 使用自定义 UEFI 安全启动密钥创建 Linux AMI
](create-ami-with-uefi-secure-boot.md)
+ [

# 为 UEFI 安全启动创建 AWS 二进制 blob
](aws-binary-blob-creation.md)

# 如何将 UEFI 安全启动与 Amazon EC2 实例配合使用
<a name="how-uefi-secure-boot-works"></a>

UEFI 安全启动是 UEFI 中指定的一项功能，它提供了有关启动链状态的验证。它旨在确保固件自初始化后只执行经过加密验证的 UEFI 二进制文件。这些二进制文件包括 UEFI 驱动程序和主启动加载程序以及链加载组件。

UEFI 安全启动指定了四个密钥数据库，这些数据库在信任链中使用。数据库存储在 UEFI 变量存储中。

信任链如下所示：

**平台密钥（PK）数据库**  
PK 数据库是信任根。它包含一个公有 PK 密钥，该密钥在信任链中用于更新密钥交换密钥（KEK）数据库。  
要更改 PK 数据库，必须拥有私有 PK 密钥才能签署更新请求。这包括通过写入空 PK 密钥来删除 PK 数据库。

**密钥交换密钥（KEK）数据库**  
KEK 数据库是信任链中用于更新签名（db）和拒绝列表（dbx）数据库的公有 KEK 密钥的列表。  
要更改公有 KEK 数据库，必须拥有私有 PK 密钥才能签署更新请求。

**签名（db）数据库**  
db 数据库是信任链中用于验证所有 UEFI 启动二进制文件的公有密钥和哈希值的列表。  
要更改 db 数据库，必须拥有私有 PK 密钥或私有 KEK 密钥中的任何一个才能签署更新请求。

**签名拒绝列表（dbx）数据库**  
dbx 数据库是不受信任的公有密钥和二进制哈希的列表，在信任链中用作吊销文件。  
dbx 数据库始终优先于所有其他密钥数据库。  
要更改 dbx 数据库，必须拥有私有 PK 密钥或私有 KEK 密钥中的任何一个才能签署更新请求。  
UEFI 论坛在 [https://uefi.org/revocationlistfile](https://uefi.org/revocationlistfile) 为许多已知不良的二进制文件和证书维护了公开可用的 dbx。

**重要**  
UEFI 安全启动在任何 UEFI 二进制文件上强制执行签名验证。要允许在 UEFI 安全启动中执行 UEFI 二进制文件，请使用上述任何私有 db 密钥对其进行签名。

默认情况下，UEFI 安全启动处于禁用状态，且系统处于 `SetupMode`。当系统处于 `SetupMode` 时，所有密钥变量都可以在没有加密签名的情况下进行更新。设置 PK 后，启用 UEFI 安全启动并退出 SetupMode。

# Amazon EC2 上 UEFI 安全启动的要求
<a name="launch-instance-with-uefi-sb"></a>

当您使用支持的 AMI 和支持的实例类型[启动 Amazon EC2 实例](LaunchingAndUsingInstances.md)时，该实例将根据其 UEFI 安全启动数据库自动验证 UEFI 启动二进制文件。无需其他配置。您还可以在启动后在实例上配置 UEFI 安全启动。

**注意**  
UEFI 安全启动可以保护您的实例及其操作系统免受启动流程修改的影响。如果从启用了 UEFI 安全引导的源 AMI 创建新的 AMI，并在复制过程中修改了某些参数，如更改了 AMI 中的 `UefiData`，则可以禁用 UEFI 安全引导。

**Topics**
+ [

## 支持的 AMI
](#uefi-amis)
+ [

## 支持的实例类型
](#uefi-instance)

## 支持的 AMI
<a name="uefi-amis"></a>

**Linux AMI**  
要启动 Linux 实例，Linux AMI 必须启用 UEFI 安全引导。

从 AL2023 2023.1 版本开始，Amazon Linux 支持 UEFI 安全启动。但是，默认 AMI 中不会启用 UEFI 安全启动。有关更多信息，请参阅《AL2023 User Guide》**中的 [UEFI Secure Boot](https://docs.aws.amazon.com/linux/al2023/ug/uefi-secure-boot.html)。旧版本的 Amazon Linux AMI 不会为 UEFI 安全启动启用。要使用受支持的 AMI，您必须在自己的 Linux AMI 上执行多个配置步骤。有关更多信息，请参阅 [使用自定义 UEFI 安全启动密钥创建 Linux AMI](create-ami-with-uefi-secure-boot.md)。

**Windows AMI**  
要启动 Windows 实例，Windows AMI 必须启用 UEFI 安全引导。要查找使用 Microsoft 密钥为 UEFI 安全启动预先配置的 AWS Windows AMI，请参阅《AWS Windows AMIs Reference》**中的 [Find Windows Server AMIs configured with NitroTPM and UEFI Secure Boot](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/ami-windows-tpm.html#ami-windows-tpm-find)。

目前，我们不支持使用 [import-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/import-image.html) 命令导入包含 UEFI 安全启动的 Windows。

## 支持的实例类型
<a name="uefi-instance"></a>

所有支持 UEFI 的虚拟化实例类型也支持 UEFI 安全启动。有关支持 UEFI 安全引导的实例类型，请参阅 [UEFI 启动模式的要求](launch-instance-boot-mode.md)。

**注意**  
裸机实例类型不支持 UEFI 安全启动。

# 验证 Amazon EC2 实例是否启用了 UEFI 安全启动
<a name="verify-uefi-secure-boot"></a>

您可以使用以下过程确定 Amazon EC2 是否启用了 UEFI 安全启动。

## Linux 实例
<a name="verify-uefi-secure-boot-linux"></a>

您可以使用 `mokutil` 实用程序验证 Linux 实例是否启用了 UEFI 安全启动。如果实例上未安装 `mokutil`，则必须进行安装。有关 Amazon Linux 2 的安装说明，请参阅 [Find and install software packages on an Amazon Linux 2 instance](https://docs.aws.amazon.com/linux/al2/ug/find-install-software.html)。有关其他 Linux 发行版，请参阅特定于该版本的文档。

**验证 Linux 实例是否启用了 UEFI 安全启动**  
连接到您的实例并在终端窗口中作为 `root` 运行以下命令。

```
mokutil --sb-state 
```

下面是示例输出。
+ 如果启用了 UEFI 安全启动，则输出包含 `SecureBoot enabled`。
+ 如果未启用 UEFI 安全启动，则输出将包含 `SecureBoot disabled` 或 `Failed to read SecureBoot`。

## Windows 实例
<a name="verify-uefi-secure-boot-windows"></a>

**验证 Windows 实例是否启用了 UEFI 安全启动**

1. 连接到您的实例。

1. 打开 msinfo32 工具。

1. 检查 **Secure Boot State**（安全启动状态）字段。如果启用了 UEFI 安全启动，则该值为**支持**，如下图所示。  
![\[系统信息中的安全启动状态。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/secure-boot-state-win.png)

您还可以使用 Windows PowerShell Cmdlet `Confirm-SecureBootUEFI` 来检查安全启动状态。有关 cmdlet 的更多信息，请参阅 Microsoft 文档中的 [Confirm-SecureBootUEFI](https://learn.microsoft.com/en-us/powershell/module/secureboot/confirm-securebootuefi)。

# 使用自定义 UEFI 安全启动密钥创建 Linux AMI
<a name="create-ami-with-uefi-secure-boot"></a>

这些说明向您展示如何使用 UEFI 安全启动和定制私有密钥创建 Linux AMI。从 AL2023 2023.1 版本开始，Amazon Linux 支持 UEFI 安全启动。有关更多信息，请参阅《*Amazon Linux 2023 用户指南*》中的 [UEFI Secure Boot on AL2023](https://docs.aws.amazon.com/linux/al2023/ug/uefi-secure-boot.html)。

**重要**  
以下过程**仅供高级用户使用**。您必须对 SSL 和 Linux 发行版启动流程有足够的了解才能使用这些步骤。

**先决条件**
+ 将使用以下工具：
  + OpenSSL – [https://www.openssl.org/](https://www.openssl.org/)
  + efivar – [https://github.com/rhboot/efivar](https://github.com/rhboot/efivar)
  + efitools – [https://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git/](https://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git/)
  + [get-instance-uefi-data](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) 命令
+ 您的 Linux 实例必须使用支持 UEFI 启动模式的 Linux AMI 启动，并且存在非易失性数据。

在 `SetupMode` 中创建了没有 UEFI 安全启动密钥的新创建的实例，从而使您能够注册自己的密钥。有些 AMI 预先配置了 UEFI 安全启动，您无法更改现有密钥。如果要更改密钥，您必须基于原始 AMI 创建新 AMI。

有两种方法可以在变量存储中传播密钥，这些方法在后面的选项 A 和选项 B 中进行说明。选项 A 描述了如何在实例内执行此操作，以模仿真实硬件的流程。选项 B 描述了如何创建二进制 Blob，然后在创建 AMI 时将其作为 base64 编码文件传递。对于这两种选项，您必须首先创建三个密钥对，它们将用于信任链。

**Topics**
+ [

## 任务 1：创建密钥对
](#uefi-secure-boot-create-three-key-pairs)
+ [

## 任务 2 - 选项 A：从实例内向变量存储添加密钥
](#uefi-secure-boot-optionA)
+ [

## 任务 2 - 选项 B：创建包含预填充变量存储的二进制 blob
](#uefi-secure-boot-optionB)

## 任务 1：创建密钥对
<a name="uefi-secure-boot-create-three-key-pairs"></a>

UEFI 安全启动基于在信任链中使用的以下三个密钥数据库：平台密钥（PK）、密钥交换密钥（KEK）和签名数据库（db）。¹

在实例上创建每个密钥。要以对 UEFI 安全启动标准有效的格式准备公钥，请为每个密钥创建一个证书。`DER` 定义 SSL 格式（格式的二进制编码）。然后，您将每个证书转换为 UEFI 签名列表，这是 UEFI 安全启动所理解的二进制格式。最后，使用相关密钥签署每个证书。

**Topics**
+ [

### 准备创建密钥对
](#uefisb-prepare-to-create-key-pairs)
+ [

### 密钥对 1：创建平台密钥（PK）
](#uefisb-create-key-pair-1)
+ [

### 密钥对 2：创建密钥交换密钥（KEK）
](#uefisb-create-key-pair-2)
+ [

### 密钥对 3：创建签名数据库（db）
](#uefisb-create-key-pair-3)
+ [

### 用私有密钥签署启动映像（内核）
](#uefi-secure-boot-sign-kernel)

### 准备创建密钥对
<a name="uefisb-prepare-to-create-key-pairs"></a>

在创建密钥对之前，请创建用于密钥生成的全局唯一标识符（GUID）。

1. [连接到实例。](connect.md)

1. 在 Shell 提示符中运行以下命令。

   ```
   uuidgen --random > GUID.txt
   ```

### 密钥对 1：创建平台密钥（PK）
<a name="uefisb-create-key-pair-1"></a>

PK 是 UEFI 安全启动实例的信任根。私有 PK 用于更新 KEK，这反过来又可以用来将授权密钥添加到签名数据库（db）。

X.509 标准用于创建密钥对。有关标准的信息，请参阅 *Wikipedia* 上的 [X.509](https://en.wikipedia.org/wiki/X.509)。

**要创建 PK**

1. 创建密钥。您必须将变量命名为 `PK`。

   ```
   openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=Platform key/" -out PK.crt
   ```

   指定了以下参数：
   + `-keyout PK.key` – 私有密钥文件。
   + `-days 3650` – 证书的有效天数。
   + `-out PK.crt` – 用于创建 UEFI 变量的证书。
   + `CN=Platform key` – 密钥的公用名（CN）。您可以输入您自己企业的名称而不是*平台密钥*。

1. 创建证书。

   ```
   openssl x509 -outform DER -in PK.crt -out PK.cer
   ```

1. 将证书转换为 UEFI 签名列表。

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
   ```

1. 使用私有 PK（自签名）签署 UEFI 签名列表。

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
   ```

### 密钥对 2：创建密钥交换密钥（KEK）
<a name="uefisb-create-key-pair-2"></a>

私有 KEK 用于向 db 添加密钥，该数据库是要在系统上启动的授权签名列表。

**要创建 KEK**

1. 创建密钥。

   ```
   openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
   ```

1. 创建证书。

   ```
   openssl x509 -outform DER -in KEK.crt -out KEK.cer
   ```

1. 将证书转换为 UEFI 签名列表。

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
   ```

1. 使用私有 PK 签署签名列表。

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
   ```

### 密钥对 3：创建签名数据库（db）
<a name="uefisb-create-key-pair-3"></a>

db 列表包含授权在系统上启动的授权密钥。要修改列表，需要私有 KEK。启动映像将使用此步骤中创建的私有密钥签名。

**要创建 db**

1. 创建密钥。

   ```
   openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
   ```

1. 创建证书。

   ```
   openssl x509 -outform DER -in db.crt -out db.cer
   ```

1. 将证书转换为 UEFI 签名列表。

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
   ```

1. 用私有 KEK 签署签名列表。

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
   ```

### 用私有密钥签署启动映像（内核）
<a name="uefi-secure-boot-sign-kernel"></a>

对于 Ubuntu 22.04，以下映像需要签名。

```
/boot/efi/EFI/ubuntu/shimx64.efi
/boot/efi/EFI/ubuntu/mmx64.efi
/boot/efi/EFI/ubuntu/grubx64.efi
/boot/vmlinuz
```

**要签署映像**  
使用以下语法签署映像。

```
sbsign --key db.key --cert db.crt --output /boot/vmlinuz /boot/vmlinuz
```

**注意**  
您必须签署所有新内核。*`/boot/vmlinuz`* 通常会将符号链接到上次安装的内核。

请参阅您的发行版的文档以了解启动链和所需映像。

¹ 感谢 ArchWiki 社区所做的所有工作。创建 PK、创建 KEK、创建数据库和签署映像的命令来自[创建密钥](https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#Creating_keys)，由 ArchWiki 维护团队和/或 ArchWiki 贡献者撰写。

## 任务 2 - 选项 A：从实例内向变量存储添加密钥
<a name="uefi-secure-boot-optionA"></a>

创建了[三个密钥对](#uefi-secure-boot-create-three-key-pairs)后，您可以通过完成以下步骤连接到实例并从实例内将密钥添加到变量存储中。或者，完成[任务 2 - 选项 B：创建包含预填充变量存储的二进制 blob](#uefi-secure-boot-optionB)中的步骤。

**Topics**
+ [

### 步骤 1：启动将支持 UEFI 安全启动的实例
](#step1-launch-uefi-sb)
+ [

### 步骤 2：配置实例以支持 UEFI 安全启动
](#step2-launch-uefi-sb)
+ [

### 步骤 3：从实例创建 AMI
](#step3-launch-uefi-sb)

### 步骤 1：启动将支持 UEFI 安全启动的实例
<a name="step1-launch-uefi-sb"></a>

当您使用以下先决条件[启动实例](LaunchingAndUsingInstances.md)时，该实例将准备好配置为支持 UEFI 安全启动。您只能在启动时在实例上启用对 UEFI 安全启动的支持；无法在以后启用它。

**先决条件**
+ **AMI** – Linux AMI 必须支持 UEFI 启动模式。要验证 AMI 是否支持 UEFI 启动模式，AMI 启动模式参数必须为 **uefi**。有关更多信息，请参阅 [确定 Amazon EC2 AMI 的启动模式参数](ami-boot-mode.md)。

  请注意，AWS 仅提供配置为支持基于 Graviton 实例类型的 UEFI 的 Linux AMI。AWS 当前不提供支持 UEFI 启动模式的 x86\$164 Linux AMI。您可以配置自己的 AMI 以支持所有架构的 UEFI 启动模式。若要配置自己的 AMI 以支持 UEFI 启动模式，您必须在自己的 AMI 上执行多个配置步骤。有关更多信息，请参阅 [设置 Amazon EC2 AMI 的启动模式](set-ami-boot-mode.md)。
+ **实例类型** – 许多支持 UEFI 的虚拟化实例类型也支持 UEFI 安全启动。裸机实例类型不支持 UEFI 安全启动。有关支持 UEFI 安全引导的实例类型，请参阅 [UEFI 启动模式的要求](launch-instance-boot-mode.md)。
+ 在 UEFI 安全启动发布后启动您的实例。只有在 2022 年 5 月 10 日（UEFI 安全启动发布时）之后启动的实例才能支持 UEFI 安全启动。

启动实例后，您可以通过检查是否存在 UEFI 数据来验证它是否已准备好配置为支持 UEFI 安全启动（换句话说，您可以继续[步骤 2](#step2-launch-uefi-sb)）。UEFI 数据的存在表明非易失性数据是持久的。

**验证您的实例是否已为步骤 2 做好准备**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) 命令并指定实例 ID。

```
aws ec2 get-instance-uefi-data --instance-id i-1234567890abcdef0
```

如果输出中存在 UEFI 数据，则实例已准备好进入步骤 2。如果输出为空，则无法将实例配置为支持 UEFI 安全启动。如果您的实例在 UEFI 安全启动支持可用之前启动，则可能会发生这种情况。启动新实例，然后重试。

### 步骤 2：配置实例以支持 UEFI 安全启动
<a name="step2-launch-uefi-sb"></a>

#### 在实例上的 UEFI 变量存储中注册密钥对
<a name="step2a-launch-uefi-sb"></a>

**警告**  
您必须在注册密钥*之后*签署启动映像，否则您将无法启动实例。

创建签名的 UEFI 签名列表后（`PK`、`KEK` 和 `db`），必须将它们注册到 UEFI 固件中。

只有在以下情况下才能写入 `PK` 变量：
+ 尚未注册 PK，当 `SetupMode` 变量为 `1` 时即表明这一点。使用以下命令检查此内容。输出为 `1` 或 `0`。

  ```
  efivar -d -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SetupMode 
  ```
+ 新 PK 由现有 PK 的私有密钥签名。

**在 UEFI 变量存储中注册密钥**  
以下命令必须在实例上运行。

如果启用了 SetupMode（值为 `1`），您可以通过在实例上运行以下命令注册密钥：

```
[ec2-user ~]$ efi-updatevar -f db.auth db
```

```
[ec2-user ~]$ efi-updatevar -f KEK.auth KEK
```

```
[ec2-user ~]$ efi-updatevar -f PK.auth PK
```

**验证 UEFI 安全启动是否已启用**  
要验证 UEFI 安全启动是否已启用，请遵照 [验证 Amazon EC2 实例是否启用了 UEFI 安全启动](verify-uefi-secure-boot.md) 中的步骤。

现在，您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) CLI 命令导出 UEFI 变量存储，或者继续执行下一步并签署启动映像，以重新启动到启用了 UEFI 安全启动的实例中。

### 步骤 3：从实例创建 AMI
<a name="step3-launch-uefi-sb"></a>

要从实例创建 AMI，您可以使用控制台或 `CreateImage` API、CLI 或开发工具包。有关控制台说明，请参阅 [创建 Amazon EBS-backed AMI](creating-an-ami-ebs.md)。有关 API 说明，请参阅 [CreateImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html)。

**注意**  
`CreateImage` API 会自动将实例的 UEFI 变量存储复制到 AMI。控制台会使用 `CreateImage` API。使用此 AMI 启动实例后，实例将具有相同的 UEFI 变量存储。

## 任务 2 - 选项 B：创建包含预填充变量存储的二进制 blob
<a name="uefi-secure-boot-optionB"></a>

创建了[三个密钥对](#uefi-secure-boot-create-three-key-pairs)后，您可以创建一个二进制 blob，其中包含含有 UEFI 安全启动密钥的预填充变量存储。或者，完成[任务 2 - 选项 A：从实例内向变量存储添加密钥](#uefi-secure-boot-optionA)中的步骤。

**警告**  
您必须先签署您的启动映像，*然后*才能注册密钥，否则您将无法启动实例。

**Topics**
+ [

### 步骤 1：创建新的变量存储或更新现有变量存储
](#uefi-secure-boot-create-or-update-variable)
+ [

### 步骤 2：在 AMI 创建时上传二进制 blob
](#uefi-secure-boot-upload-binary-blob-on-ami-creation)

### 步骤 1：创建新的变量存储或更新现有变量存储
<a name="uefi-secure-boot-create-or-update-variable"></a>

您可以使用 python-uefivars 工具*离线*创建变量存储，而不需要正在运行的实例。该工具可以从您的密钥中创建一个新的变量存储。该脚本目前支持 EDK2 格式、AWS 格式，以及使用更高级别的工具更容易编辑的 JSON 表示法。

**在没有运行实例的情况下离线创建变量存储**

1. 通过以下链接下载该工具。

   ```
   https://github.com/awslabs/python-uefivars
   ```

1. 通过运行以下命令从密钥创建新的变量存储。这将在 *your\$1binary\$1blob*.bin 中创建 base64 编码的二进制 blob。该工具还通过 `-I` 参数支持更新二进制 blob。

   ```
   ./uefivars.py -i none -o aws -O your_binary_blob.bin -P PK.esl -K KEK.esl --db db.esl --dbx dbx.esl
   ```

### 步骤 2：在 AMI 创建时上传二进制 blob
<a name="uefi-secure-boot-upload-binary-blob-on-ami-creation"></a>

使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 传递 UEFI 变量存储数据。对于 `--uefi-data` 参数，指定您的二进制 blob，对于 `--boot-mode` 参数，请指定 `uefi`。

```
aws ec2 register-image \
    --name uefi_sb_tpm_register_image_test \
    --uefi-data $(cat your_binary_blob.bin) \
    --block-device-mappings "DeviceName=/dev/sda1,Ebs= {SnapshotId=snap-0123456789example,DeleteOnTermination=true}" \
    --architecture x86_64 \
    --root-device-name /dev/sda1 \
    --virtualization-type hvm \
    --ena-support \
    --boot-mode uefi
```

# 为 UEFI 安全启动创建 AWS 二进制 blob
<a name="aws-binary-blob-creation"></a>

您可以使用以下步骤在 AMI 创建期间自定义 UEFI 安全启动变量。这些步骤中使用的 KEK 截止到 2021 年 9 月。如果 Microsoft 更新 KEK，您必须使用最新的 KEK。

**要创建 AWS 二进制 blob**

1. 创建一个空的 PK 签名列表。

   ```
   touch empty_key.crt
   cert-to-efi-sig-list empty_key.crt PK.esl
   ```

1. 下载 KEK 证书。

   ```
   https://go.microsoft.com/fwlink/?LinkId=321185
   ```

1. 将 KEK 证书包装在 UEFI 签名列表中（`siglist`）。

   ```
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK.esl MicCorKEKCA2011_2011-06-24.crt 
   ```

1. 下载 Microsoft 的 db 证书。

   ```
   https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt
   https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt
   ```

1. 生成 db 签名列表。

   ```
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt
   cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl
   ```

1. Unified Extensible Firmware Interface Forum 不再提供 DBX 文件。这些文件现在由 Microsoft 在 GitHub 上提供。请从 Microsoft 安全启动更新存储库下载最新的 DBX 更新，网址为 [https://github.com/microsoft/secureboot\$1objects](https://github.com/microsoft/secureboot_objects)。

1. 解压已签名的更新二进制文件。

   使用下面的脚本内容创建 `SplitDbxContent.ps1`。或者，也可以使用 `Install-Script -Name SplitDbxContent` 从 [PowerShell Gallery](https://www.powershellgallery.com/packages/SplitDbxContent/1.0) 安装脚本。

   ```
   <#PSScriptInfo
    
   .VERSION 1.0
    
   .GUID ec45a3fc-5e87-4d90-b55e-bdea083f732d
    
   .AUTHOR Microsoft Secure Boot Team
    
   .COMPANYNAME Microsoft
    
   .COPYRIGHT Microsoft
    
   .TAGS Windows Security
    
   .LICENSEURI
    
   .PROJECTURI
    
   .ICONURI
    
   .EXTERNALMODULEDEPENDENCIES
    
   .REQUIREDSCRIPTS
    
   .EXTERNALSCRIPTDEPENDENCIES
    
   .RELEASENOTES
   Version 1.0: Original published version.
    
   #>
   
   <#
   .DESCRIPTION
    Splits a DBX update package into the new DBX variable contents and the signature authorizing the change.
    To apply an update using the output files of this script, try:
    Set-SecureBootUefi -Name dbx -ContentFilePath .\content.bin -SignedFilePath .\signature.p7 -Time 2010-03-06T19:17:21Z -AppendWrite'
   .EXAMPLE
   .\SplitDbxAuthInfo.ps1 DbxUpdate_x64.bin
   #>
   
   
   # Get file from script input
   $file  = Get-Content -Encoding Byte $args[0]
   
   # Identify file signature
   $chop = $file[40..($file.Length - 1)]
   if (($chop[0] -ne 0x30) -or ($chop[1] -ne 0x82 )) {
       Write-Error "Cannot find signature"
       exit 1
   }
   
   # Signature is known to be ASN size plus header of 4 bytes
   $sig_length = ($chop[2] * 256) + $chop[3] + 4
   $sig = $chop[0..($sig_length - 1)]
   
   if ($sig_length -gt ($file.Length + 40)) {
       Write-Error "Signature longer than file size!"
       exit 1
   }
   
   # Content is everything else
   $content = $file[0..39] + $chop[$sig_length..($chop.Length - 1)]
   
   # Write signature and content to files
   Set-Content -Encoding Byte signature.p7 $sig
   Set-Content -Encoding Byte content.bin $content
   ```

   使用该脚本解压缩已签名的 DBX 文件。

   ```
   PS C:\Windows\system32> SplitDbxContent.ps1 .\dbx.bin
   ```

   这会生成两个文件：`signature.p7` 和 `content.bin`。在下一步中使用 `content.bin`。

1. 使用 `uefivars.py` 脚本构建 UEFI 变量存储。

   ```
   ./uefivars.py -i none -o aws -O uefiblob-microsoft-keys-empty-pk.bin -P ~/PK.esl -K ~/MS_Win_KEK.esl --db ~/MS_db.esl  --dbx ~/content.bin 
   ```

1. 检查二进制 blob 和 UEFI 变量存储。

   ```
   ./uefivars.py -i aws -I uefiblob-microsoft-keys-empty-pk.bin -o json | less
   ```

1. 您可以通过再次将 blob 传递给同一个工具来更新它。

   ```
   ./uefivars.py -i aws -I uefiblob-microsoft-keys-empty-pk.bin -o aws -O uefiblob-microsoft-keys-empty-pk.bin -P ~/PK.esl -K ~/MS_Win_KEK.esl --db ~/MS_db.esl  --dbx ~/content.bin
   ```

   预期输出

   ```
   Replacing PK
   Replacing KEK
   Replacing db
   Replacing dbx
   ```

# 将加密与 EBS 支持的 AMI 结合使用
<a name="AMIEncryption"></a>

由 Amazon EBS 快照支持的 AMI 可以利用 Amazon EBS 加密。可以将数据和根卷的快照加密并附加到 AMI。在启动实例和复制映像时，您可以包含 EBS 完全加密支持。在提供了 AWS KMS 的所有区域中，支持在这些操作中使用加密参数。

从 AMIs 中启动带加密 EBS 卷的 EC2 实例的方式与其他实例相同。另外，从未加密 EBS 快照支持的 AMI 中启动实例时，您可以在启动过程中将部分或全部卷加密。

与 EBS 卷相似，可使用默认 AWS KMS key 或您指定的客户托管密钥加密 AMI 中的快照。在所有情况下，您都必须拥有使用所选 KMS 密钥 的权限。

带加密快照的 AMI 可以跨 AWS 账户共享。有关更多信息，请参阅[了解 Amazon EC2 中共享 AMI 的使用情况](sharing-amis.md)。

**Topics**
+ [

## 启动实例场景
](#AMI-encryption-launch)
+ [

## 映像复制场景
](#AMI-encryption-copy)

## 启动实例场景
<a name="AMI-encryption-launch"></a>



Amazon EC2 实例是通过 AWS 管理控制台 或者直接使用 Amazon EC2 API 或 CLI，使用 `RunInstances` 操作以及通过块储存设备映射提供的参数在 AMI 中启动的。有关更多信息，请参阅 [Amazon EC2 实例上卷的块设备映射](block-device-mapping-concepts.md)。有关通过 AWS CLI 控制数据块设备映射的示例，请参阅[启动、列出和终止 EC2 实例](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-ec2-instances.html)。

如果不使用显式加密参数，在默认情况下，`RunInstances` 操作会在从 AMI 的源快照中还原 EBS 卷时保持这些快照的现有加密状态。如果启用默认加密，从 AMI 中（无论使用加密还是未加密的快照）创建的所有卷都会被加密。如果在默认情况下并未启用加密，则实例保持 AMI 的加密状态。

您也可以启动实例，同时通过提供加密参数来对结果卷应用新的加密状态。因此，会观察到以下行为：

**启动时不指定加密参数**
+ 未加密快照会还原为未加密卷，除非已在默认情况下启用加密，那么所有新创建的所有卷都将加密。
+ 您拥有的加密快照会还原为使用相同 KMS 密钥 加密的卷。
+ 您未拥有的加密快照（例如，与您共享了 AMI）会还原到由您的 AWS 账户的默认 KMS 密钥加密的卷。

可以通过提供加密参数覆盖默认行为。可用参数包括 `Encrypted` 和 `KmsKeyId`。仅设置 `Encrypted` 参数会得到以下结果：

**已设置 `Encrypted`，但未指定 `KmsKeyId` 时的实例启动行为**
+ 未加密快照会还原到由您的 AWS 账户的默认 KMS 密钥加密的 EBS 卷。
+ 您拥有的加密快照会还原到由相同 KMS 密钥 加密的 EBS 卷。（也就是说，`Encrypted` 参数没有影响。）
+ 您未拥有的加密快照（即，与您共享了 AMI）会还原到由您的 AWS 账户的默认 KMS 密钥加密的卷。（也就是说，`Encrypted` 参数没有影响。）

如果同时设置 `Encrypted` 和 `KmsKeyId` 参数，可以为加密操作指定非默认 KMS 密钥。会实现以下行为：

**同时设置 `Encrypted` 和 `KmsKeyId` 的实例**
+ 未加密快照会还原到由指定 KMS 密钥 加密的 EBS 卷。
+ 加密快照还原为未使用原始 KMS 密钥 加密，而是使用指定 KMS 密钥 加密的 EBS 卷。

提交 `KmsKeyId` 但没有同时设置 `Encrypted` 参数会导致错误。

以下部分提供使用非默认加密参数从 AMI 中启动实例的示例。在以下每个场景中，提供给 `RunInstances` 操作的参数会导致在使用快照还原卷的过程中加密状态发生变化。

有关使用控制台从 AMI 启动实例的信息，请参阅 [启动 Amazon EC2 实例](LaunchingAndUsingInstances.md)。

### 在启动过程中加密卷
<a name="launch1"></a>

在该示例中，使用未加密快照支持的 AMI 启动带加密 EBS 卷的 EC2 实例。

![\[启动实例并对卷进行动态加密。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami-launch-convert.png)


仅使用 `Encrypted` 参数的结果是对该实例中的卷行加密。提供 `KmsKeyId` 参数是可选的。如果未指定 KMS 密钥 ID，会使用 AWS 账户的默认 KMS 密钥加密卷。要使用您拥有的不同 KMS 密钥 加密卷，请提供 `KmsKeyId` 参数。

### 在启动过程中重新加密卷
<a name="launch2"></a>

在该示例中，使用加密快照支持的 AMI 启动带有由新 KMS 密钥 加密的 EBS 卷的 EC2 实例。

![\[启动实例并重新对卷进行动态加密。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami-launch-encrypted.png)


如果您拥有 AMI 且未提供加密参数，则生成的实例具有由与快照相同的 KMS 密钥 加密的卷。如果 AMI 是与他人共享而不是由您拥有，且您未提供加密参数，则由您的默认 KMS 密钥 对卷进行加密。如果按所示提供加密参数，则会由指定 KMS 密钥 对卷进行加密。

### 在启动过程中更改多个卷的加密状态
<a name="launch3"></a>

在这一更为复杂的示例中，会使用多个快照（分别具有自己的加密状态）支持的 AMI 启动带有新加密卷和重新加密卷的 EC2 实例。

![\[在启动过程中加密和重新加密多个卷。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami-launch-mixed.png)


在这种情况下，会为 `RunInstances` 操作提供用于各个源快照的加密参数。在指定所有可用的加密参数后，无论您是否拥有 AMI，结果实例都相同。

## 映像复制场景
<a name="AMI-encryption-copy"></a>

可通过 AWS 管理控制台 或者直接使用 Amazon EC2 API 或 CLI，使用 `CopyImage` 操作复制 Amazon EC2 AMI。

如果不使用显式加密参数，在默认情况下，`CopyImage` 操作会在复制 AMI 的源快照时保持这些快照的现有加密状态。您也可以复制 AMI，同时通过提供加密参数来对其关联的 EBS 快照应用新的加密状态。因此，会观察到以下行为：

**复制时不指定加密参数**
+ 未加密快照会复制为另一个未加密快照，除非已在默认情况下启用加密，那么所有新创建的快照都将加密。
+ 您拥有的加密快照会复制为使用相同 KMS 密钥 加密的快照。
+ 您未拥有的加密快照（例如，与您共享了 AMI）会复制为由您的 AWS 账户的默认 KMS 密钥加密的快照。

可以通过提供加密参数覆盖以上所有默认行为。可用参数包括 `Encrypted` 和 `KmsKeyId`。仅设置 `Encrypted` 参数会得到以下结果：

**已设置 `Encrypted`，但未指定 `KmsKeyId` 时的复制映像行为**
+ 未加密快照会复制为由 AWS 账户的默认 KMS 密钥加密的快照。
+ 加密快照会复制为由相同 KMS 密钥 加密的快照。（也就是说，`Encrypted` 参数没有影响。）
+ 您未拥有的加密快照（即，与您共享了 AMI）会复制为由您的 AWS 账户的默认 KMS 密钥加密的卷。（也就是说，`Encrypted` 参数没有影响。）

通过同时设置 `Encrypted` 和 `KmsKeyId` 参数，可以为加密操作指定客户托管的 KMS 密钥。会实现以下行为：

**同时设置 `Encrypted` 和 `KmsKeyId` 时的复制映像行为**
+ 未加密快照会复制为由指定 KMS 密钥 加密的快照。
+ 加密快照会复制为未使用原始 KMS 密钥 加密，而是使用指定 KMS 密钥 加密的快照。

提交 `KmsKeyId` 但没有同时设置 `Encrypted` 参数会导致错误。

以下部分提供使用非默认加密参数复制 AMI，导致更改加密状态的示例。

有关使用控制台的说明，请参阅 [复制 Amazon EC2 AMI](CopyingAMIs.md)。

### 在复制过程中将未加密映像加密
<a name="copy-unencrypted-to-encrypted"></a>

在这种情况下，由未加密根快照支持的 AMI 会复制到带加密根快照的 AMI。`CopyImage` 操作将使用两个加密参数（包括一个客户托管密钥）调用。因此，根快照的加密状态发生变化，这样目标 AMI 由与原快照具有相同数据的根快照支持，但使用指定的密钥进行加密。在两个 AMI 中，您都会产生快照的存储成本，以及从任一 AMI 启动的任何实例的费用。

**注意**  
启用默认加密与将 AMI 中所有快照的 `Encrypted` 参数设置为 `true` 具有相同的效果。

![\[即时复制 AMI 并加密快照\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami-to-ami-convert.png)


设置 `Encrypted` 参数会加密此实例的单个快照。如果您未指定 `KmsKeyId` 参数，会使用默认客户托管密钥来加密快照副本。

**注意**  
您也可以复制带多个快照的映像，并单独配置每个快照的加密状态。

# 了解 Amazon EC2 中共享 AMI 的使用情况
<a name="sharing-amis"></a>

*共享 AMI* 是开发人员创建并可供其他人员使用的 AMI。要开始使用 Amazon EC2，最简单的方法之一是使用共享 AMI，您可以从中获得所需的组件，然后添加自定义内容。您还可以创建自己的 AMI 并与他人共享。

使用共享 AMI 需自行承担风险。Amazon 不保证其他 Amazon EC2 用户共享的 AMI 的完整性或安全性。因此，您应该像处理其他您可能会考虑在自己的数据中心部署的外来代码一样处理共享 AMI，对其执行适当的功能调查。我们建议您从可信来源（例如经过验证的提供者）获取 AMI。

## 经过验证的提供商
<a name="verified-ami-provider"></a>

在 Amazon EC2 控制台中，将 Amazon 或经过验证的 Amazon 合作伙伴拥有的公有 AMI 标记为**经过验证的提供商**。

您也可以使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) AWS CLI 命令标识来自经过验证的提供商的公共 AMI。Amazon 或经过验证的合作伙伴拥有的公共映像具有一个别名拥有者，即 `amazon`、`aws-backup-vault` 或 `aws-marketplace`。在 CLI 输出中，将为 `ImageOwnerAlias` 显示这些值。其他用户不能对其 AMI 使用别名。这使您可以轻松查找来自 Amazon 或经过验证的合作伙伴的 AMI。

要成为经过验证的提供商，您必须在 AWS Marketplace 上注册成为卖方。在注册后，您可以在 AWS Marketplace 上列出您的 AMI。有关更多信息，请参阅*《AWS Marketplace 卖方指南》*中的[以卖方身份开始使用](https://docs.aws.amazon.com/marketplace/latest/userguide/user-guide-for-sellers.html)和[基于 AMI 的产品](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-products.html)。

**Topics**
+ [

## 经过验证的提供商
](#verified-ami-provider)
+ [

# 查找用于 Amazon EC2 实例的共享 AMI
](usingsharedamis-finding.md)
+ [

# 准备使用适用于 Linux 的共享 AMI
](usingsharedamis-confirm.md)
+ [

# 使用“允许的 AMI”控制在 Amazon EC2 中对 AMI 的发现和使用
](ec2-allowed-amis.md)
+ [

# 将您的 AMI 设为可在 Amazon EC2 中公开使用
](sharingamis-intro.md)
+ [

# 了解 AMI 的屏蔽公共访问
](block-public-access-to-amis.md)
+ [

# 与组织和组织单位共享 AMI
](share-amis-with-organizations-and-OUs.md)
+ [

# 与特定 AWS 账户共享 AMI
](sharingamis-explicit.md)
+ [

# 取消与您的 AWS 账户 共享 AMI
](cancel-sharing-an-AMI.md)
+ [

# 创建共享 Linux AMI 的建议
](building-shared-amis.md)

**如果您正在寻找有关其他主题的信息**
+ 有关创建 AMI 的信息，请参阅 [创建 Amazon S3 支持的 AMI](creating-an-ami-instance-store.md) 或 [创建 Amazon EBS-backed AMI](creating-an-ami-ebs.md)。
+ 有关在 AWS Marketplace 中构建、交付和维护应用程序的信息，请参阅 [AWS Marketplace 文档](https://docs.aws.amazon.com/marketplace/)。

# 查找用于 Amazon EC2 实例的共享 AMI
<a name="usingsharedamis-finding"></a>

您可使用 Amazon EC2 控制台或命令行查找与您的 Amazon EC2 实例一起使用的共享 AMI。

AMI 是一种区域性资源。在搜索共享 AMI（公有或私有）时，必须在共享此 AMI 的同一区域中进行搜索。要使 AMI 能够在其他区域使用，请将该 AMI 复制到该区域，然后进行共享。有关更多信息，请参阅 [复制 Amazon EC2 AMI](CopyingAMIs.md)。

------
#### [ Console ]

控制台提供了一个 AMI 筛选条件字段。您也可以使用**搜索**字段中提供的筛选条件来确定搜索范围。

**查找共享 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在第一个筛选条件中，选择以下选项之一：
   + **私有映像** – 列出共享给您的所有 AMI。
   + **公有映像** – 列出所有公有 AMI。

1. （可选）要仅显示 Amazon 提供的公有映像，请选择**搜索**字段，然后从菜单选项中选择**所有者别名**，再选择 **=**，然后选择 **amazon**。

1. （可选）添加筛选条件，将搜索范围限定为符合您要求的 AMI。

**查找来自[经过验证的提供商](sharing-amis.md#verified-ami-provider)的共享公共 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **AMI Catalog**（AMI 目录）。

1. 选择**社区 AMI**。

1. 在**优化结果**窗格中，选择**经过验证的提供商**。**经过验证的提供商**标签指示相关 AMI 是由 Amazon 或经过验证的合作伙伴提供。

------
#### [ AWS CLI ]

使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令列出 AMI。可以将该列表范围确定为所需的 AMI 类型，如以下示例所示。

**列出所有公用 AMI**  
以下命令将列出所有公用 AMI，包括您拥有的所有公用 AMI。

```
aws ec2 describe-images --executable-users all
```

**列出拥有显式启动许可的 AMI**  
以下命令列出您对其拥有显式启动许可的 AMI。此列表不包括您拥有的任何 AMI。

```
aws ec2 describe-images --executable-users self
```

**列出经过验证的提供商拥有的 AMI**  
以下命令将列出[经过验证的提供商](sharing-amis.md#verified-ami-provider)拥有的 AMI。经过验证的提供商（Amazon 或经过验证的合作伙伴）拥有的公共 AMI 具有一个别名拥有者，它将在账户字段中显示为 `amazon`、`aws-backup-vault` 或 `aws-marketplace`。这可帮助您轻松查找来自经过验证的提供商的 AMI。其他用户不能对其 AMI 使用别名。

```
aws ec2 describe-images \
    --owners amazon aws-marketplace \
    --query 'Images[*].[ImageId]' \
    --output text
```

**列出账户拥有的 AMI**  
以下命令列出指定 AWS 账户 拥有的 AMI。

```
aws ec2 describe-images --owners 123456789012
```

**使用筛选条件确定 AMI 的范围**  
要减少显示的 AMI 数量，请使用筛选条件只列出您感兴趣的 AMI 类型。例如，使用以下筛选条件可以只显示 EBS 支持的 AMI。

```
--filters "Name=root-device-type,Values=ebs"
```

------
#### [ PowerShell ]

使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet（Tools for Windows PowerShell）列出 AMI。可以将该列表范围确定为所需的 AMI 类型，如以下示例所示。

**列出所有公用 AMI**  
以下命令将列出所有公用 AMI，包括您拥有的所有公用 AMI。

```
Get-EC2Image -ExecutableUser all
```

**列出拥有显式启动许可的 AMI**  
以下命令列出您对其拥有显式启动许可的 AMI。此列表不包括您拥有的任何 AMI。

```
Get-EC2Image -ExecutableUser self
```

**列出经过验证的提供商拥有的 AMI**  
以下命令将列出[经过验证的提供商](sharing-amis.md#verified-ami-provider)拥有的 AMI。经过验证的提供商（Amazon 或经过验证的合作伙伴）拥有的公共 AMI 具有一个别名拥有者，它将在账户字段中显示为 `amazon`、`aws-backup-vault` 或 `aws-marketplace`。这可帮助您轻松查找来自经过验证的提供商的 AMI。其他用户不能对其 AMI 使用别名。

```
Get-EC2Image -Owner amazon aws-marketplace
```

**列出账户拥有的 AMI**  
以下命令列出指定 AWS 账户 拥有的 AMI。

```
Get-EC2Image -Owner 123456789012
```

**使用筛选条件确定 AMI 的范围**  
要减少显示的 AMI 数量，请使用筛选条件只列出您感兴趣的 AMI 类型。例如，使用以下筛选条件可以只显示 EBS 支持的 AMI。

```
-Filter @{Name="root-device-type"; Values="ebs"}
```

------

# 准备使用适用于 Linux 的共享 AMI
<a name="usingsharedamis-confirm"></a>

使用适用于 Linux 的共享 AMI 之前，应执行以下步骤以确认没有预安装凭证允许第三方对您的实例进行不希望的访问，并且没有可能将敏感数据传输给第三方的预配置远程登录。查看 AMI 使用的 Linux 发行版的文档以了解有关提高系统安全性的信息。

为了确保您不会在无意中丢失对您的实例的访问，我们建议您启动两个 SSH 会话并将第二个会话保持为打开状态，直到您删除了无法识别的凭证并确认您仍可以使用 SSH 登录您的实例。

1. 标识并禁用任何未经授权的公有 SSH 密钥。该文件中的唯一密钥应是您用于启动 AMI 的密钥。以下命令查找 `authorized_keys` 文件：

   ```
   [ec2-user ~]$ sudo find / -name "authorized_keys" -print -exec cat {} \;
   ```

1. 对根用户禁用基于密码的身份验证。打开 `sshd_config``PermitRootLogin` 文件并编辑 行，如下所示：

   ```
   PermitRootLogin without-password
   ```

   或者，您可以禁用以根用户身份登录实例的功能：

   ```
   PermitRootLogin No
   ```

   重启 sshd 服务。

1. 检查是否有任何其他用户能够登录您的实例。具有超级用户权限的用户尤为危险。删除或锁定任何未知账户的密码。

1. 检查打开的端口以确认您未在使用和运行侦听传入连接的网络服务。

1. 要防止预配置的远程登录，应删除现有配置文件并重启 `rsyslog` 服务。例如：

   ```
   [ec2-user ~]$ sudo rm /etc/rsyslog.conf
   [ec2-user ~]$ sudo service rsyslog restart
   ```

1. 验证所有 cron 作业的合法性。

如果您发现了认为存在安全风险的公用 AMI，请联系 AWS 安全团队。有关更多信息，请参阅 [AWS 安全中心](https://aws.amazon.com/security/)。

# 使用“允许的 AMI”控制在 Amazon EC2 中对 AMI 的发现和使用
<a name="ec2-allowed-amis"></a>

要控制 AWS 账户中的用户对亚马逊机器映像（AMI）的发现和使用，可以使用*允许的 AMI* 功能。您可指定 AMI 要在账户中可见和可用而必须满足的标准。启用该标准后，启动实例的用户将只能看到并有权访问符合指定标准的 AMI。例如，您可以指定可信的 AMI 提供商列表作为标准，只有来自这些提供商的 AMI 才可见并可供使用。

在启用“允许的 AMI”设置之前，您可以启用*审核模式*来预览哪些 AMI 将可见或不可见、可供使用或不可供使用。这有助于您根据需要完善标准，确保只有预期的 AMI 才对账户中的用户可见和可用。此外，使用 [describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html) 命令可查找使用不符合指定标准的 AMI 启动的实例。这些信息可以指导您作出决策，选择是更新启动配置以使用合规的 AMI（例如在启动模板中指定不同的 AMI），还是调整标准来允许这些 AMI。

您可以在账户级别指定“允许的 AMI”设置，可以直接在账户中指定，也可以使用声明式策略进行指定。必须在想要在其中控制 AMI 使用的每个 AWS 区域中配置这些设置。使用声明式策略允许同时将设置应用于多个区域，也可以同时应用于多个账户。当使用声明式策略时，您无法直接在账户中修改设置。本主题介绍如何直接在账户中配置设置。有关使用声明式策略的信息，请参阅《AWS Organizations User Guide》**中的 [Declarative policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

**注意**  
“允许的 AMI”功能仅控制公用 AMI 或与账户共享的 AMI 的发现和使用。它不会限制账户拥有的 AMI。无论设置的条件是什么，您账户中的用户始终可以发现和使用由您的账户创建的 AMI。

**“允许的 AMI”功能的主要优势**
+ **合规与安全**：用户只能发现和使用符合指定标准的 AMI，从而降低使用不合规的 AMI 的风险。
+ **高效管理**：通过减少允许的 AMI 数量，管理其余 AMI 将变得更加轻松高效。
+ **集中式账户级别实施**：直接在账户内或通过声明式策略在账户级别配置“允许的 AMI”设置。这提供了一种集中而高效的方式来控制整个账户的 AMI 使用情况。

**Topics**
+ [

## “允许的 AMI”的工作原理
](#how-allowed-amis-works)
+ [

## 实施“允许的 AMI”的最佳实践
](#best-practice-for-implementing-allowed-amis)
+ [

## 所需的 IAM 权限
](#iam-permissions-for-allowed-amis)
+ [

# 管理“允许的 AMI”设置
](manage-settings-allowed-amis.md)

## “允许的 AMI”的工作原理
<a name="how-allowed-amis-works"></a>

为了控制哪些 AMI 可以在您的账户中发现和使用，您可以定义一组用于评估 AMI 的标准。这些标准由一个或多个 `ImageCriterion` 组成，如下图所示。图后附有说明。

![\[允许的 AMI ImageCriteria 配置层次结构。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami_allowed-amis-imagecriteria.png)


配置分为三个级别：
+ **1**：参数值
  + 多值参数：
    + `ImageProviders`
    + `ImageNames`
    + `MarketplaceProductCodes`

      AMI 匹配参数中的*任意*值即获得允许。

      示例：`ImageProviders` = `amazon` **OR** 账户 `111122223333` **OR** 账户 `444455556666`（参数值的评估逻辑未在图表中显示。）
  + 单值参数：
    + `CreationDateCondition`
    + `DeprecationTimeCondition`
+ **2**：`ImageCriterion`
  + 使用 **AND** 逻辑对多个参数进行分组。
  + AMI 必须匹配 `ImageCriterion` 中的*所有*参数才能获得允许。
  + 示例：`ImageProviders` = `amazon` **AND** `CreationDateCondition` = 300 天或更短
+ **3**：`ImageCriteria`
  + 使用 **OR** 逻辑将多个 `ImageCriterion` 组合在一起。
  + AMI 匹配*任何* `ImageCriterion` 即获得允许。
  + 形成评估 AMI 所依据的完整配置。

**Topics**
+ [

### 允许的 AMI 参数
](#allowed-amis-criteria)
+ [

### 允许的 AMI 配置
](#allowed-amis-json-configuration)
+ [

### 如何评估标准
](#how-allowed-amis-criteria-are-evaluated)
+ [

### 限制
](#allowed-amis-json-configuration-limits)
+ [

### “允许的 AMI”操作
](#allowed-amis-operations)

### 允许的 AMI 参数
<a name="allowed-amis-criteria"></a>

可配置以下参数用于创建 `ImageCriterion`：

`ImageProviders`  
允许其 AMI 的 AMI 提供商。  
有效值是由 AWS 和 AWS 账户 ID 定义的别名，如下所示：  
+ `amazon`：别名，用于标识由 Amazon 或经过验证的提供商创建的 AMI
+ `aws-marketplace`：别名，用于标识由 AWS Marketplace 中经过验证的提供商创建的 AMI
+ `aws-backup-vault`：别名，用于标识位于逻辑上受物理隔离的 AWS Backup 保管库账户中的备份 AMI。如果您使用 AWS Backup 逻辑上受物理隔离的保管库功能，请确保将此别名作为 AMI 提供商包含在内。
+ AWS 账户 ID：一个或多个 12 位 AWS 账户 ID
+ `none`：表示只能发现和使用您的账户创建的 AMI。无法发现和使用公有或共享的 AMI。指定后将无法指定其他标准。

`ImageNames`  
允许的 AMI 名称，使用精确匹配或通配符（`?` 或 `*`）。

`MarketplaceProductCodes`  
允许的 AMI AWS Marketplace 的产品代码。

`CreationDateCondition`  
允许的 AMI 的最大期限。

`DeprecationTimeCondition`  
自弃用允许的 AMI 以来的最长期限。

有关每个标准的有效值和约束，请参阅《Amazon EC2 API Reference》**中的 [ImageCriterionRequest](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImageCriterionRequest.html)。

### 允许的 AMI 配置
<a name="allowed-amis-json-configuration"></a>

“允许的 AMI”的核心配置是定义允许的 AMI 标准的 `ImageCriteria` 配置。以下 JSON 结构显示可以指定的参数：

```
{
    "State": "enabled" | "disabled" | "audit-mode",  
    "ImageCriteria" : [
        {
            "ImageProviders": ["string",...],
            "MarketplaceProductCodes": ["string",...],           
            "ImageNames":["string",...],
            "CreationDateCondition" : {
                "MaximumDaysSinceCreated": integer
            },
            "DeprecationTimeCondition" : {
                "MaximumDaysSinceDeprecated": integer
            }
         },
         ...
}
```

#### ImageCriteria 示例
<a name="allowed-amis-json-configuration-example"></a>

以下 `ImageCriteria` 示例配置四个 `ImageCriterion`。如果 AMI 与其中任何一个 `ImageCriterion` 匹配，则允许使用。有关如何评估标准的信息，请参阅[如何评估标准](#how-allowed-amis-criteria-are-evaluated)。

```
{
    "ImageCriteria": [
        // ImageCriterion 1: Allow AWS Marketplace AMIs with product code "abcdefg1234567890"
        {
            "MarketplaceProductCodes": [
                "abcdefg1234567890"
            ]
        },
        // ImageCriterion 2: Allow AMIs from providers whose accounts are
        // "123456789012" OR "123456789013" AND AMI age is less than 300 days
        {
            "ImageProviders": [
                "123456789012",
                "123456789013"
            ],
            "CreationDateCondition": {
                "MaximumDaysSinceCreated": 300
            }
        },
        // ImageCriterion 3: Allow AMIs from provider whose account is "123456789014" 
        // AND with names following the pattern "golden-ami-*"
        {
            "ImageProviders": [
                "123456789014"
            ],
            "ImageNames": [
                "golden-ami-*"
            ]
        },
        // ImageCriterion 4: Allow AMIs from Amazon or verified providers 
        // AND which aren't deprecated
        {
            "ImageProviders": [
                "amazon"
            ],
            "DeprecationTimeCondition": {
                "MaximumDaysSinceDeprecated": 0
            }
        }
    ]
}
```

### 如何评估标准
<a name="how-allowed-amis-criteria-are-evaluated"></a>

下表说明确定是否允许 AMI 的评估规则，并显示在每个级别如何应用 `AND` 或 `OR` 运算符：


| 评估级别 | 运算符 | 成为允许的 AMI 的要求 | 
| --- | --- | --- | 
| ImageProviders、ImageNames 和 MarketplaceProductCodes 的参数值 | OR | AMI 必须匹配每个参数列表中至少一个值 | 
| ImageCriterion | AND | AMI 必须匹配每个 ImageCriterion 中的所有参数 | 
| ImageCriteria | OR | AMI 必须匹配任何一个 ImageCriterion | 

使用上述评估规则，让我们看看如何将其应用于 [ImageCriteria 示例](#allowed-amis-json-configuration-example)：
+ `ImageCriterion` 1：允许具有 AWS Marketplace 产品代码 `abcdefg1234567890` 的 AMI

  `OR`
+ `ImageCriterion` 2：允许同时符合以下两个标准的 AMI：
  + 由账户 `123456789012` `OR` `123456789013` 拥有
    + `AND`
  + 已在过去 300 天内创建

  `OR`
+ `ImageCriterion` 3：允许同时符合以下两个标准的 AMI：
  + 由账户 `123456789014` 拥有
    + `AND`
  + 以 `golden-ami-*` 模式命名

  `OR`
+ `ImageCriterion` 4：允许同时符合以下两个标准的 AMI：
  + 由 Amazon 发布或经过验证的提供商（通过 `amazon` 别名指定）
    + `AND`
  + 未弃用（自弃用以来的最长天数为 `0`）

### 限制
<a name="allowed-amis-json-configuration-limits"></a>

`ImageCriteria` 最多可以包含：
+ 10 `ImageCriterion`

每个 `ImageCriterion` 最多可以包含：
+ 200 个 `ImageProviders` 值
+ 50 个 `ImageNames` 值 
+ 50 个 `MarketplaceProductCodes` 值 

**限制示例**

使用前面的 [ImageCriteria 示例](#allowed-amis-json-configuration-example)：
+ 有 4 个 `ImageCriterion`。最多可以向请求再添加 6 个，达到 10 个的上限。
+ 在第一个 `ImageCriterion` 中，有 1 个 `MarketplaceProductCodes` 值。最多可以向此 `ImageCriterion` 再添加 49 个值，达到 50 个值的上限。
+ 在第二个 `ImageCriterion` 中，有 2 个 `ImageProviders` 值。最多可以向此 `ImageCriterion` 再添加 198 个值，达到 200 个值的上限。
+ 在第三个 `ImageCriterion` 中，有 1 个 `ImageNames` 值。最多可以向此 `ImageCriterion` 再添加 49 个值，达到 50 个值的上限。

### “允许的 AMI”操作
<a name="allowed-amis-operations"></a>

“允许的 AMI”功能有三种用于管理映像标准的运行状态：**启用**、**禁用**和**审核模式**。您可借助此功能启用或禁用镜像标准，或根据需要对其进行审核。

**已启用**

启用“允许的 AMI”时：
+ 将应用 `ImageCriteria`。
+ 只有允许的 AMI 才能在 EC2 控制台中由使用镜像（例如描述、复制、存储或执行其他使用镜像的操作）的 API 发现。
+ 只能使用允许的 AMI 启动实例。

**已禁用**

禁用“允许的 AMI”时：
+ 不会应用 `ImageCriteria`。
+ 对 AMI 的可发现性或使用不会施加任何限制。

**审核模式**

 在审核模式下：
+ 将应用 `ImageCriteria`，但对 AMI 的可发现性或使用不会施加任何限制。
+ 在 EC2 控制台中，对于每个 AMI，**允许的镜像**字段会显示**是**或**否**，指示在启用“允许的 AMI”时，账户中的用户是否可以发现和使用该 AMI。
+ 在命令行中，`describe-image` 操作的响应包括 `"ImageAllowed": true` 或 `"ImageAllowed": false`，指示在启用“允许的 AMI”时，账户中的用户是否可以发现和使用该 AMI。
+ 在 EC2 控制台中，AMI 目录会在当启用“允许的 AMI”时账户中的用户无法发现或无法使用的 AMI 旁显示**不允许**。

## 实施“允许的 AMI”的最佳实践
<a name="best-practice-for-implementing-allowed-amis"></a>

在实施“允许的 AMI”时，请考虑这些最佳实践，确保平稳过渡并最大限度地减少对 AWS 环境的潜在干扰。

1. **启用审核模式**

   首先在审核模式下启用“允许的 AMI”。此状态允许您查看哪些 AMI 将受到标准的影响，而无需实际限制访问权限，从而提供无风险的评估期。

1. **设置“允许的 AMI”标准**

   仔细确定哪些 AMI 提供商符合贵组织的安全政策、合规性要求和运营需求。
**注意**  
在使用 Amazon ECS 或 Amazon EKS 或 AWS Lambda 托管实例等 AWS 托管服务时，我们建议指定 `amazon` 别名以允许 AWS 创建的 AMI。这些服务依赖于 Amazon 发布的 AMI 来启动实例。  
为任何 AMI 设置 `CreationDateCondition` 限制时均需谨慎。如果设置过于严格的日期条件（例如，AMI 必须少于 5 天），则 AMI（无论是来自 AWS 还是其他提供商）未在指定的时间范围内更新可能会导致实例启动失败。  
我们建议将 `ImageNames` 与 `ImageProviders` 搭配使用，以获得更好的控制和更高的精确度。单独使用 `ImageNames` 可能无法唯一标识 AMI。

1. **检查对预期业务流程的影响**

   您可以通过控制台或 CLI 来识别任何使用不符合指定标准的 AMI 启动的实例。这些信息可以指导您作出决策，选择是更新启动配置以使用合规的 AMI（例如在启动模板中指定不同的 AMI），还是调整标准来允许这些 AMI。

   控制台：使用 [ec2-instance-launched-with-allowed-ami](https://docs.aws.amazon.com/config/latest/developerguide/ec2-instance-launched-with-allowed-ami.html) AWS Config 规则来检查正在运行或已停止的实例是否使用符合“允许的 AMI”标准的 AMI 启动。如果 AMI 不符合“允许的 AMI”标准，则规则为 **NON\$1COMPLIANT**；如果符合，则规则为 **COMPLIANT**。仅当“允许的 AMI”设置为**已启用**或**审核模式**时，规则才会生效。

   CLI：运行 [describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html) 命令并筛选响应，以识别任何使用不符合指定标准的 AMI 启动的实例。

   有关控制台和 CLI 说明，请参阅 [查找利用不允许的 AMI 启动的实例](manage-settings-allowed-amis.md#identify-instances-with-allowed-AMIs)。

1. **启用“允许的 AMI”**

   一旦确认该标准不会对预期的业务流程产生不利影响，请启用“允许的 AMI”。

1. **监控实例启动情况**

   继续监控 AMI 在应用程序和您使用的 AWS 托管服务（例如 Amazon EMR、Amazon ECR、Amazon EKS 和 AWS Elastic Beanstalk）中启动实例的情况。检查是否存在任何意外问题，并对“允许的 AMI”标准进行必要的调整。

1. **试用新 AMI**

   要测试不符合您当前“允许的 AMI”设置的第三方 AMI，AWS 建议采用以下方法：
   + 使用单独的 AWS 账户：创建一个无法访问您关键业务资源的账户。确保未在此账户中启用“允许的 AMI”设置，或明确允许您要测试的 AMI，以便您可以对其进行测试。
   + 在其他 AWS 区域进行测试：使用可使用第三方 AMI 但尚未启用“允许的 AMI”设置的区域。

   这些方法有助于确保在测试新 AMI 时，您的关键业务资源仍然安全。

## 所需的 IAM 权限
<a name="iam-permissions-for-allowed-amis"></a>

要使用“允许的 AMI”功能，您需要以下 IAM 权限：
+ `GetAllowedImagesSettings`
+ `EnableAllowedImagesSettings`
+ `DisableAllowedImagesSettings`
+ `ReplaceImageCriteriaInAllowedImagesSettings`

# 管理“允许的 AMI”设置
<a name="manage-settings-allowed-amis"></a>

您可以管理“允许的 AMI”设置 这些设置按区域和账户生效。

**Topics**
+ [

## 启用“允许的 AMI”
](#enable-allowed-amis-criteria)
+ [

## 设置“允许的 AMI”条件
](#update-allowed-amis-criteria)
+ [

## 禁用“允许的 AMI”
](#disable-allowed-amis-criteria)
+ [

## 获取“允许的 AMI”条件
](#identify-allowed-amis-state-and-criteria)
+ [

## 查找允许的 AMI
](#identify-amis-that-meet-allowed-amis-criteria)
+ [

## 查找利用不允许的 AMI 启动的实例
](#identify-instances-with-allowed-AMIs)

## 启用“允许的 AMI”
<a name="enable-allowed-amis-criteria"></a>

您可以启用“允许的 AMI”并指定“允许的 AMI”条件。我们建议您首先在审计模式中进行此操作，因为此模式可在不实际限制访问权限的情况下显示会受到筛选条件影响的具体 AMI。

------
#### [ Console ]

**启用“允许的 AMI”**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择**允许的 AMI**。

1. 在**允许的 AMI** 选项卡上，选择**管理**。

1. 对于**允许的 AMI 设置**，选择**审计模式**或**启用**。我们建议您首先在审计模式中对筛选条件进行测试，然后再返回此步骤启用“允许的 AMI”。

1. （可选）对于 **AMI 条件**，请输入 JSON 格式的条件。

1. 选择**更新**。

------
#### [ AWS CLI ]

**启用“允许的 AMI”**  
使用 [enable-allowed-images-settings](https://docs.aws.amazon.com/cli/latest/reference/ec2/enable-allowed-images-settings.html) 命令。

```
aws ec2 enable-allowed-images-settings --allowed-images-settings-state enabled
```

要改为启用审计模式，请指定 `audit-mode`，而不是 `enabled`。

```
aws ec2 enable-allowed-images-settings --allowed-images-settings-state audit-mode
```

------
#### [ PowerShell ]

**启用“允许的 AMI”**  
使用 [Enable-EC2AllowedImagesSetting](https://docs.aws.amazon.com/powershell/latest/reference/items/Enable-EC2AllowedImagesSetting.html) cmdlet。

```
Enable-EC2AllowedImagesSetting -AllowedImagesSettingsState enabled
```

要改为启用审计模式，请指定 `audit-mode`，而不是 `enabled`。

```
Enable-EC2AllowedImagesSetting -AllowedImagesSettingsState audit-mode
```

------

## 设置“允许的 AMI”条件
<a name="update-allowed-amis-criteria"></a>

启用“允许的 AMI”后，您可以设置或替换“允许的 AMI”条件。

有关正确的配置和有效值，请参阅[允许的 AMI 配置](ec2-allowed-amis.md#allowed-amis-json-configuration)和[允许的 AMI 参数](ec2-allowed-amis.md#allowed-amis-criteria)。

------
#### [ Console ]

**设置“允许的 AMI”条件**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择**允许的 AMI**。

1. 在**允许的 AMI** 选项卡上，选择**管理**。

1. 对于 **AMI 条件**，请输入 JSON 格式的条件。

1. 选择**更新**。

------
#### [ AWS CLI ]

**设置“允许的 AMI”条件**  
使用 [replace-image-criteria-in-allowed-images-settings](https://docs.aws.amazon.com/cli/latest/reference/ec2/replace-image-criteria-in-allowed-images-settings.html) 命令并指定包含允许的 AMI 标准的 JSON 文件。

```
aws ec2 replace-image-criteria-in-allowed-images-settings --cli-input-json file://file_name.json
```

------
#### [ PowerShell ]

**设置“允许的 AMI”条件**  
使用 [Set-EC2ImageCriteriaInAllowedImagesSetting](https://docs.aws.amazon.com/powershell/latest/reference/items/Set-EC2ImageCriteriaInAllowedImagesSetting.html) cmdlet 并指定包含允许的 AMI 标准的 JSON 文件。

```
$imageCriteria = Get-Content -Path .\file_name.json | ConvertFrom-Json
Set-EC2ImageCriteriaInAllowedImagesSetting -ImageCriterion $imageCriteria
```

------

## 禁用“允许的 AMI”
<a name="disable-allowed-amis-criteria"></a>

您可以按如下所示禁用“允许的 AMI”。

------
#### [ Console ]

**禁用“允许的 AMI”**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择**允许的 AMI**。

1. 在**允许的 AMI** 选项卡上，选择**管理**。

1. 对于**“允许的 AMI”设置**，选择**禁用**。

1. 选择**更新**。

------
#### [ AWS CLI ]

**禁用“允许的 AMI”**  
使用 [disable-allowed-images-settings](https://docs.aws.amazon.com/cli/latest/reference/ec2/disable-allowed-images-settings.html) 命令。

```
aws ec2 disable-allowed-images-settings
```

------
#### [ PowerShell ]

**禁用“允许的 AMI”**  
使用 [Disable-EC2AllowedImagesSetting](https://docs.aws.amazon.com/powershell/latest/reference/items/Disable-EC2AllowedImagesSetting.html) cmdlet。

```
Disable-EC2AllowedImagesSetting
```

------

## 获取“允许的 AMI”条件
<a name="identify-allowed-amis-state-and-criteria"></a>

您可以获取当前“允许的 AMI”设置状态和“允许的 AMI”条件。

------
#### [ Console ]

**获取“允许的 AMI”状态和条件**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择**允许的 AMI**。

1. 在**允许的 AMI** 选项卡上，将**允许的 AMI** 设置为**启用**、**禁用**或**审计模式**。

1. 如果“允许的 AMI”设置状态为**启用**或**审计模式**，则 **AMI 条件**将以 JSON 格式显示 AMI 条件。

------
#### [ AWS CLI ]

**获取“允许的 AMI”状态和条件**  
使用 [get-allowed-images-settings](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-allowed-images-settings.html) 命令。

```
aws ec2 get-allowed-images-settings
```

在以下示例输出中，状态为 `audit-mode`，且已在账户中设置映像标准。

```
{
    "State": "audit-mode",
    "ImageCriteria": [
        {
            "MarketplaceProductCodes": [
                "abcdefg1234567890"
            ]
        },
        {
            "ImageProviders": [
                "123456789012",
                "123456789013"
            ],
            "CreationDateCondition": {
                "MaximumDaysSinceCreated": 300
            }
        },
        {
            "ImageProviders": [
                "123456789014"
            ],
            "ImageNames": [
                "golden-ami-*"
            ]
        },
        {
            "ImageProviders": [
                "amazon"
            ],
            "DeprecationTimeCondition": {
                "MaximumDaysSinceDeprecated": 0
            }
        }
    ],
    "ManagedBy": "account"
}
```

------
#### [ PowerShell ]

**获取“允许的 AMI”状态和条件**  
使用 [Get-EC2AllowedImagesSetting](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2AllowedImagesSetting.html) cmdlet。

```
Get-EC2AllowedImagesSetting | Select-Object `
    State, `
    ManagedBy, `
    @{Name='ImageProviders'; Expression={($_.ImageCriteria.ImageProviders)}}, `
    @{Name='MarketplaceProductCodes'; Expression={($_.ImageCriteria.MarketplaceProductCodes)}}, `
    @{Name='ImageNames'; Expression={($_.ImageCriteria.ImageNames)}}, `
    @{Name='MaximumDaysSinceCreated'; Expression={($_.ImageCriteria.CreationDateCondition.MaximumDaysSinceCreated)}}, `
    @{Name='MaximumDaysSinceDeprecated'; Expression={($_.ImageCriteria.DeprecationTimeCondition.MaximumDaysSinceDeprecated)}}
```

在以下示例输出中，状态为 `audit-mode`，且已在账户中设置映像标准。

```
State      : audit-mode
ManagedBy  : account
ImageProviders            : {123456789012, 123456789013, 123456789014, amazon}
MarketplaceProductCodes   : {abcdefg1234567890}
ImageNames                : {golden-ami-*}
MaximumDaysSinceCreated  : 300
MaximumDaysSinceDeprecated: 0
```

------

## 查找允许的 AMI
<a name="identify-amis-that-meet-allowed-amis-criteria"></a>

您可以查找当前“允许的 AMI”条件允许或不允许的 AMI。

**注意**  
“允许的 AMI”设置必须为“审计模式”。

------
#### [ Console ]

**检查 AMI 是否符合“允许的 AMI”条件**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择 AMI。

1. 在**详细信息**选项卡（如果选中了复选框）或摘要区域（如果选择了 AMI ID）中，找到**允许的镜像**字段。
   + **是** – 此 AMI 符合“允许的 AMI”条件。启用“允许的 AMI”后，您账户中的用户将可使用此 AMI。
   + **否** – 此 AMI 不符合“允许的 AMI”条件。

1. 在导航窗格中，选择 **AMI Catalog**（AMI 目录）。

   标记为**不允许**的 AMI 表示 AMI 不符合“允许的 AMI”标准。禁用“允许的 AMI”时，此 AMI 将对您账户中的用户不可见且不可用。

------
#### [ AWS CLI ]

**检查 AMI 是否符合“允许的 AMI”条件**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --image-id ami-0abcdef1234567890 \
    --query Images[].ImageAllowed \
    --output text
```

下面是示例输出。

```
True
```

**查找符合“允许的 AMI”条件的 AMI**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --filters "Name=image-allowed,Values=true" \
    --max-items 10 \
    --query Images[].ImageId
```

下面是示例输出。

```
ami-000eaaa8be2fd162a
ami-000f82db25e50de8e
ami-000fc21eb34c7a9a6
ami-0010b876f1287d7be
ami-0010b929226fe8eba
ami-0010957836340aead
ami-00112c992a47ba871
ami-00111759e194abcc1
ami-001112565ffcafa5e
ami-0011e45aaee9fba88
```

------
#### [ PowerShell ]

**检查 AMI 是否符合“允许的 AMI”条件**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
(Get-EC2Image -ImageId ami-0abcdef1234567890).ImageAllowed
```

下面是示例输出。

```
True
```

**查找符合“允许的 AMI”条件的 AMI**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
Get-EC2Image `
    -Filter @{Name="image-allows";Values="true"} `
    -MaxResult 10 | `
    Select ImageId
```

下面是示例输出。

```
ami-000eaaa8be2fd162a
ami-000f82db25e50de8e
ami-000fc21eb34c7a9a6
ami-0010b876f1287d7be
ami-0010b929226fe8eba
ami-0010957836340aead
ami-00112c992a47ba871
ami-00111759e194abcc1
ami-001112565ffcafa5e
ami-0011e45aaee9fba88
```

------

## 查找利用不允许的 AMI 启动的实例
<a name="identify-instances-with-allowed-AMIs"></a>

您可以识别使用不符合“允许的 AMI”条件的 AMI 启动的实例。

------
#### [ Console ]

**检查某个实例是否是使用不允许的 AMI 启动的**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 在**详细信息**选项卡的**实例详细信息**下，找到**允许的映像**字段。
   + **是** – 此 AMI 符合“允许的 AMI”条件。
   + **否** – 此 AMI 不符合“允许的 AMI”条件。

------
#### [ AWS CLI ]

**查找使用不允许的 AMI 启动的实例**  
使用 [describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html) 命令和 `image-allowed` 筛选条件。

```
aws ec2 describe-instance-image-metadata \
    --filters "Name=image-allowed,Values=false" \
    --query "InstanceImageMetadata[*].[InstanceId,ImageMetadata.ImageId]" \
    --output table
```

下面是示例输出。

```
--------------------------------------------------
|          DescribeInstanceImageMetadata         |
+----------------------+-------------------------+
|  i-08fd74f3f1595fdbd |  ami-09245d5773578a1d6  |
|  i-0b1bf24fd4f297ab9 |  ami-07cccf2bd80ed467f  |
|  i-026a2eb590b4f7234 |  ami-0c0ec0a3a3a4c34c0  |
|  i-006a6a4e8870c828f |  ami-0a70b9d193ae8a799  |
|  i-0781e91cfeca3179d |  ami-00c257e12d6828491  |
|  i-02b631e2a6ae7c2d9 |  ami-0bfddf4206f1fa7b9  |
+----------------------+-------------------------+
```

------
#### [ PowerShell ]

**查找使用不允许的 AMI 启动的实例**  
使用 [Get-EC2InstanceImageMetadata](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceImageMetadata.html) cmdlet。

```
Get-EC2InstanceImageMetadata `
    -Filter @{Name="image-allowed";Values="false"} | `
    Select InstanceId, @{Name='ImageId'; Expression={($_.ImageMetadata.ImageId)}}
```

下面是示例输出。

```
InstanceId          ImageId
----------          -------
i-08fd74f3f1595fdbd ami-09245d5773578a1d6
i-0b1bf24fd4f297ab9 ami-07cccf2bd80ed467f
i-026a2eb590b4f7234 ami-0c0ec0a3a3a4c34c0
i-006a6a4e8870c828f ami-0a70b9d193ae8a799
i-0781e91cfeca3179d ami-00c257e12d6828491
i-02b631e2a6ae7c2d9 ami-0bfddf4206f1fa7b9
```

------
#### [ AWS Config ]

您可以添加 **ec2-instance-launched-with-allowed-ami** AWS Config 规则，根据自己的要求对其进行配置，然后用来评估您的实例。

有关更多信息，请参阅 *AWS Config 开发人员指南*中的[添加 AWS Config 规则](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_add-rules.html)和 [ec2-instance-launched-with-allowed-ami](https://docs.aws.amazon.com/config/latest/developerguide/ec2-instance-launched-with-allowed-ami.html)。

------

# 将您的 AMI 设为可在 Amazon EC2 中公开使用
<a name="sharingamis-intro"></a>

您可以通过向所有 AWS 账户 共享来公开您的 AMI。

如果您想阻止公开共享您的 AMI，可以启用*阻止 AMI 的公开访问*。这可以阻止任何公开 AMI 的尝试，从而有助于防止未经授权的访问和对 AMI 数据的潜在滥用。请注意，启用阻止公开访问不会影响已经公开提供的 AMI；它们仍然公开可用。有关更多信息，请参阅 [了解 AMI 的屏蔽公共访问](block-public-access-to-amis.md)。

要仅允许特定账户使用您的 AMI 启动实例，请参阅 [与特定 AWS 账户共享 AMI](sharingamis-explicit.md)。

**Topics**
+ [

## 注意事项
](#considerations-for-sharing-public-AMIs)
+ [

## 与所有 AWS 账户共享 AMI（公开共享）
](#share-an-ami-publicly)

## 注意事项
<a name="considerations-for-sharing-public-AMIs"></a>

在将 AMI 设为公用之前，请考虑以下事项。
+ **所有权** – 若要将 AMI 设为公有，您的 AWS 账户 必须拥有 AMI。
+ **区域** – AMI 是一种区域性资源。当您共享 AMI 时，则它只能在您共享该 AMI 的区域使用。要使 AMI 能够在其他区域使用，请将该 AMI 复制到该区域并进行共享。有关更多信息，请参阅 [复制 Amazon EC2 AMI](CopyingAMIs.md)。
+ **阻止公开访问** – 要公开共享 AMI，必须在 AMI 公开共享的每个区域禁用[阻止 AMI 的公开访问](block-public-access-to-amis.md)。公开共享 AMI 后，您可以重新启用阻止 AMI 的公开访问功能，以防止进一步公开共享您的 AMI。
+ **有些 AMI 无法设为公共** – 如果您的 AMI 包含以下组件之一，则无法将其设为公共（但您可以[将 AMI 与特定 AWS 账户 账户共享](sharingamis-explicit.md)）：
  + 加密卷
  + 加密卷的快照
  + 产品代码
+ **避免泄露敏感数据** – 要避免在共享 AMI 时泄露敏感数据，请阅读 [创建共享 Linux AMI 的建议](building-shared-amis.md) 中的安全注意事项并遵循建议的操作。
+ **使用** – 当您共享 AMI 时，用户只能从该 AMI 启动实例。他们无法删除、共享或修改实例。但是，在他们使用您的 AMI 启动实例后，他们可以从其启动的实例创建 AMI。
+ **自动弃用** – 默认情况下，所有公有 AMI 的弃用日期均设置为自 AMI 创建日期起 2 年。您可以将弃用日期设置为早于两年。要取消弃用日期，或将弃用移至未来某一日期，您必须通过仅[将 AMI 与特定 AWS 账户 共享](sharingamis-explicit.md)来将其设为私有。
+ **删除过时的 AMI** – 在公共 AMI 达到其弃用日期后，如果在六个月或更长时间内没有从 AMI 启动任何新实例，则 AWS 最终会删除该公共共享属性，这样过时的 AMI 就不会出现在公共 AMI 列表中。
+ **账单** – 当其他 AWS 账户 使用您的 AMI 启动实例时，您无需付费。使用 AMI 启动实例的账户将为它们启动的实例付费。

## 与所有 AWS 账户共享 AMI（公开共享）
<a name="share-an-ami-publicly"></a>

将 AMI 设为公开后，它将在控制台的**社区 AMI** 中可用，您可以从 EC2 控制台左侧导航器的 **AMI 目录**中访问此 AMI，或者在使用控制台启动实例时访问该 AMI。请注意，将某个 AMI 设置为公用之后，可能需要一点时间 **Community AMIs** 中才会显示该 AMI。

------
#### [ Console ]

**将 AMI 设为公用**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 从列表中选择您的 AMI，然后选择 **Actions**（操作）、**Edit AMI permissions**（编辑 AMI 权限）。

1. 在 **AMI 可用性**下，选择**公开**。

1. 选择**保存更改**。

------
#### [ AWS CLI ]

每个 AMI 都有一个 `launchPermission` 属性，用于控制允许哪些 AWS 账户（包括拥有者账户在内）使用该 AMI 启动实例。通过修改 AMI 的 `launchPermission` 属性，可以将该 AMI 设为公共（这会向所有 AWS 账户 授予启动权限），或仅将其与您指定的 AWS 账户 共享。

可以在具有 AMI 启动许可的账户的列表中添加或删除账户 ID。要将 AMI 设为公有，请指定 `all` 组。公用和显式启动许可都可以指定。

**将 AMI 设为公用**

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 命令可以将 `all` 组添加到指定 AMI 的 `launchPermission` 列表中，如下所示。

   ```
   aws ec2 modify-image-attribute \
       --image-id ami-0abcdef1234567890 \
       --launch-permission "Add=[{Group=all}]"
   ```

1. 要验证 AMI 的启动权限，请使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-attribute.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-attribute.html) 命令。

   ```
   aws ec2 describe-image-attribute \
       --image-id ami-0abcdef1234567890 \
       --attribute launchPermission
   ```

1. （可选）要再次将 AMI 设为私有，请从其启动许可中删除 `all` 组。请注意，AMI 的拥有者始终具有启动许可，因此不受该命令影响。

   ```
   aws ec2 modify-image-attribute \
       --image-id ami-0abcdef1234567890 \
       --launch-permission "Remove=[{Group=all}]"
   ```

------
#### [ PowerShell ]

每个 AMI 都有一个 `launchPermission` 属性，用于控制允许哪些 AWS 账户（包括拥有者账户在内）使用该 AMI 启动实例。通过修改 AMI 的 `launchPermission` 属性，可以将该 AMI 设为公共（这会向所有 AWS 账户 授予启动权限），或仅将其与您指定的 AWS 账户 共享。

可以在具有 AMI 启动许可的账户的列表中添加或删除账户 ID。要将 AMI 设为公有，请指定 `all` 组。公用和显式启动许可都可以指定。

**将 AMI 设为公用**

1. 使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html) 命令可以将 `all` 组添加到指定 AMI 的 `launchPermission` 列表中，如下所示。

   ```
   Edit-EC2ImageAttribute `
       -ImageId ami-0abcdef1234567890 `
       -Attribute launchPermission `
       -OperationType add `
       -UserGroup all
   ```

1. 要验证 AMI 的启动权限，请使用以下 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageAttribute.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageAttribute.html) 命令。

   ```
   Get-EC2ImageAttribute `
       -ImageId ami-0abcdef1234567890 `
       -Attribute launchPermission
   ```

1. （可选）要再次将 AMI 设为私有，请从其启动许可中删除 `all` 组。请注意，AMI 的拥有者始终具有启动许可，因此不受该命令影响。

   ```
   Edit-EC2ImageAttribute `
       -ImageId ami-0abcdef1234567890 `
       -Attribute launchPermission `
       -OperationType remove `
       -UserGroup all
   ```

------

# 了解 AMI 的屏蔽公共访问
<a name="block-public-access-to-amis"></a>

要防止公开共享您的 AMI，请在账户级别启用*屏蔽对 AMI 的公共访问*。

启用阻止公开访问后，任何将 AMI 设为公开的尝试都会被自动阻止。但是，如果您已经有公有 AMI，则其将保持公开可用。

要公开共享 AMI，您必须禁用阻止公开访问。共享完成后，最佳实践是重新启用阻止公开访问功能，以防止意外地公开共享您的 AMI。

**注意**  
此设置是在账户级别配置，可以直接在账户中配置，也可以使用声明式策略进行配置。您必须在要防止公开共享 AMI 的每个 AWS 区域中配置该功能。使用声明式策略可同时将设置应用于多个区域，也可以同时应用于多个账户。当使用声明式策略时，您无法直接在账户中修改设置。本主题介绍如何直接在账户中配置设置。有关使用声明式策略的信息，请参阅《AWS Organizations User Guide》**中的 [Declarative policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

您可以将 IAM 权限限制为管理员用户，这样只有此类用户可启用或禁用阻止 AMI 的公开访问。

**Topics**
+ [

## 默认设置
](#block-public-access-to-amis-default-settings)
+ [

# 管理 AMI 的屏蔽公共访问设置
](manage-block-public-access-for-amis.md)

## 默认设置
<a name="block-public-access-to-amis-default-settings"></a>

根据您的账户是新账户还是现有账户，以及您是否拥有公用 AMI，默认启用或禁用**阻止公开访问 AMI** 设置。下表列出了默认设置：


| AWS 账户 | “阻止公开访问 AMI”默认设置 | 
| --- | --- | 
| 新账户 | 已启用 | 
|  没有公用 AMI 的现有账户¹  | 已启用 | 
|  有一个或多个公用 AMI 的现有账户¹  | 已禁用 | 

¹如果您的账户在 2023 年 7 月 15 日当天或之后拥有一个或多个公用 AMI，那么即使您随后将所有 AMI 设为私有，系统仍会为您的账户默认禁用**阻止公开访问 AMI**。

# 管理 AMI 的屏蔽公共访问设置
<a name="manage-block-public-access-for-amis"></a>

您可以管理 AMI 的屏蔽公共访问设置，以控制其是否可以公开共享。您可以使用 Amazon EC2 控制台或 AWS CLI 来启用、禁用或查看 AMI 的当前屏蔽公共访问状态。

## 查看 AMI 的阻止公共访问状态
<a name="get-block-public-access-state-for-amis"></a>

要查看您的账户中是否禁止公开共享 AMI，您可以查看 AMI 的阻止公开访问状态。您必须在每个希望了解是否阻止 AMI 公开共享的 AWS 区域 中查看此状态。

**所需的权限**  
要获取 AMI 的当前屏蔽公共访问设置，您必须拥有 `GetImageBlockPublicAccessState` IAM 权限。

------
#### [ Console ]

**查看指定区域中 AMI 的阻止公开访问状态**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航栏（位于屏幕顶部）中，选择查看 AMI 的阻止公开访问状态的区域。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择**数据保护和安全**。

1. 在**阻止公开访问 AMI** 下，选中**公开访问**字段。值为**已阻止新的公开共享**或**已允许新的公开共享**。

------
#### [ AWS CLI ]

**要获取 AMI 的阻止公开访问状态**  
使用 [get-image-block-public-access-state](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-image-block-public-access-state.html) 命令。该值为 `block-new-sharing` 或 `unblocked`。

**示例：对于特定区域**

```
aws ec2 get-image-block-public-access-state --region us-east-1
```

`ManagedBy` 字段表示配置了该设置的实体。在本例中，`account` 表示是直接在账户中配置的设置。值为 `declarative-policy` 表示该设置是由声明式策略所配置。有关更多信息，请参阅《AWS Organizations User Guide》**中的 [Declarative policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

```
{
    "ImageBlockPublicAccessState": "block-new-sharing",
    "ManagedBy": "account"
}
```

**示例：对于账户中的所有区域**

```
echo -e "Region   \t Public Access State" ; \
echo -e "-------------- \t ----------------------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 get-image-block-public-access-state \
            --region $region \
            --output text)
        echo -e "$region \t $output" 
    );
done
```

下面是示例输出。

```
Region           Public Access State
--------------   ----------------------
ap-south-1       block-new-sharing
eu-north-1       unblocked
eu-west-3        block-new-sharing
...
```

------
#### [ PowerShell ]

**要获取 AMI 的阻止公开访问状态**  
使用 [Get-EC2ImageBlockPublicAccessState](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageBlockPublicAccessState.html) cmdlet。该值为 `block-new-sharing` 或 `unblocked`。

**示例：对于特定区域**

```
Get-EC2ImageBlockPublicAccessState -Region us-east-1
```

下面是示例输出。

```
block-new-sharing
```

**示例：对于账户中的所有区域**

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
        [PSCustomObject]@{
            Region   = $_
            PublicAccessState = (Get-EC2ImageBlockPublicAccessState -Region $_)
        }
} | `
Format-Table -AutoSize
```

下面是示例输出。

```
Region         PublicAccessState
------         -----------------
ap-south-1     block-new-sharing
eu-north-1     block-new-sharing
eu-west-3      block-new-sharing
...
```

------

## 启用阻止公开访问 AMI
<a name="enable-block-public-access-for-amis"></a>

要防止公开共享您的 AMI，请在账户级别启用阻止公开访问 AMI。您必须在要阻止公开共享 AMI 的每个 AWS 区域 中启用阻止公开访问 AMI。如果您已经有公开 AMI，它们将保持公开状态。

**所需的权限**  
要启用 AMI 的屏蔽公共访问设置，您必须拥有 `EnableImageBlockPublicAccess` IAM 权限。

**注意事项**
+ 最多可能需要 10 分钟来配置此设置。在此期间，如果您描述了公共访问状态，则响应为 `unblocked`。配置完成后，响应将为 `block-new-sharing`。

------
#### [ Console ]

**在指定区域中启用 AMI 的屏蔽公共访问权限**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航栏（位于屏幕顶部）中，选择启用阻止公开访问 AMI 的区域。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择**数据保护和安全**。

1. 在**阻止公开访问 AMI** 下，选择**管理**。

1. 选择**阻止新的公开共享**复选框，然后选择**更新**。

------
#### [ AWS CLI ]

**要启用 AMI 的阻止公开访问**  
使用 [enable-image-block-public-access](https://docs.aws.amazon.com/cli/latest/reference/ec2/enable-image-block-public-access.html) 命令。

**示例：对于特定区域**

```
aws ec2 enable-image-block-public-access \
--region us-east-1 \
--image-block-public-access-state block-new-sharing
```

下面是示例输出。

```
{ 
    "ImageBlockPublicAccessState": "block-new-sharing"
}
```

**示例：对于账户中的所有区域**

```
echo -e "Region   \t Public Access State" ; \
echo -e "-------------- \t ----------------------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 enable-image-block-public-access \
            --region $region \
            --image-block-public-access-state block-new-sharing \
            --output text)
        echo -e "$region \t $output" 
    );
done
```

下面是示例输出。

```
Region           Public Access State
--------------   ----------------------
ap-south-1       block-new-sharing
eu-north-1       block-new-sharing
eu-west-3        block-new-sharing
...
```

------
#### [ PowerShell ]

**要启用 AMI 的阻止公开访问**  
使用 [Enable-EC2ImageBlockPublicAccess](https://docs.aws.amazon.com/powershell/latest/reference/items/Enable-EC2ImageBlockPublicAccess.html) 命令。

**示例：对于特定区域**

```
Enable-EC2ImageBlockPublicAccess `
    -Region us-east-1 `
    -ImageBlockPublicAccessState block-new-sharing
```

下面是示例输出。

```
Value
-----
block-new-sharing
```

**示例：对于账户中的所有区域**

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region            = $_
        PublicAccessState = (
        Enable-EC2ImageBlockPublicAccess `
         -Region $_ `
         -ImageBlockPublicAccessState block-new-sharing)
    }
} | `
Format-Table -AutoSize
```

下面是示例输出。

```
Region         PublicAccessState
------         -----------------
ap-south-1     block-new-sharing
eu-north-1     block-new-sharing
eu-west-3      block-new-sharing
...
```

------

## 禁用阻止公开访问 AMI
<a name="disable-block-public-access-for-amis"></a>

要允许您账户中的用户公开共享您的 AMI，请在账户级别禁用阻止公开访问。在要允许公开共享 AMI 的每个 AWS 区域 中，您都必须禁用阻止公开访问 AMI。

**所需的权限**  
要禁用 AMI 的屏蔽公共访问设置，您必须拥有 `DisableImageBlockPublicAccess` IAM 权限。

**注意事项**
+ 最多可能需要 10 分钟来配置此设置。在此期间，如果您描述了公共访问状态，则响应为 `block-new-sharing`。配置完成后，响应将为 `unblocked`。

------
#### [ Console ]

**在指定区域禁用 AMI 的屏蔽公共访问权限**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航栏（位于屏幕顶部）中，选择禁用阻止公开访问 AMI 的区域。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择**数据保护和安全**。

1. 在**阻止公开访问 AMI** 下，选择**管理**。

1. 清除**阻止新的公开共享**复选框，然后选择**更新**。

1. 提示进行确认时，输入 **confirm**，然后选择**允许公开共享**。

------
#### [ AWS CLI ]

**要禁用 AMI 的阻止公开访问**  
使用 [disable-image-block-public-access](https://docs.aws.amazon.com/cli/latest/reference/ec2/disable-image-block-public-access.html) 命令。

**示例：对于特定区域**

```
aws ec2 disable-image-block-public-access --region us-east-1
```

下面是示例输出。

```
{
   "ImageBlockPublicAccessState": "unblocked"
}
```

**示例：对于账户中的所有区域**

```
echo -e "Region   \t Public Access State" ; \
echo -e "-------------- \t ----------------------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 disable-image-block-public-access \
            --region $region \
            --output text)
        echo -e "$region \t $output" 
    );
done
```

下面是示例输出。

```
Region           Public Access State
--------------   ----------------------
ap-south-1       unblocked
eu-north-1       unblocked
eu-west-3        unblocked
...
```

------
#### [ PowerShell ]

**要禁用 AMI 的阻止公开访问**  
使用 [Disable-EC2ImageBlockPublicAccess](https://docs.aws.amazon.com/powershell/latest/reference/items/Disable-EC2ImageBlockPublicAccess.html) cmdlet。

**示例：对于特定区域**

```
Disable-EC2ImageBlockPublicAccess -Region us-east-1
```

下面是示例输出。

```
Value
-----
unblocked
```

**示例：对于账户中的所有区域**

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region            = $_
        PublicAccessState = (Disable-EC2ImageBlockPublicAccess -Region $_)
    }
} | `
Format-Table -AutoSize
```

下面是示例输出。

```
Region         PublicAccessState
------         -----------------
ap-south-1     unblocked
eu-north-1     unblocked
eu-west-3      unblocked
...
```

------

# 与组织和组织单位共享 AMI
<a name="share-amis-with-organizations-and-OUs"></a>

 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_integrate_services_list.html) 是一项账户管理服务，可让您将多个 AWS 账户 整合到您创建并集中管理的组织中。除了[与特定账户共享 AMI](sharingamis-explicit.md) 之外，您还可以与您创建的企业或企业部门 (OU) 共享 AMI。

组织是指您创建用于整合和集中管理您的 AWS 账户 的实体。您可以以分层树状结构来组织账户，将[根](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#root)放在树顶部，并将[组织单位](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#organizationalunit)嵌套在组织根下。每个账户都可以直接添加到根中，也可以放在层次结构的其中一个 OU 中。有关更多信息，请参阅《AWS 用户指南》[https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html)中的 *AWS Organizations Organizations 术语和概念*。

当您与企业或 OU 共享 AMI 时，所有子账户都可以访问该 AMI。例如，在下图中，AMI 与顶层 OU 共享（由数字 **1** 处的箭头指示）。嵌套在该顶层 OU 下面的所有 OU 和账户（由数字 **2** 处的虚线指示）还可以访问 AMI。组织中的账户和 OU 在虚线之外的账户（由数字 **3** 指示）没有访问该 AMI 的权限，因为它们不是 AMI 共享的 OU 的子级账户。

![\[AMI 与 OU 共享，所有子级 OU 和账户都可以访问 AMI。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ami-share-with-orgs-and-ous.png)


**Topics**
+ [

## 注意事项
](#considerations-org-ou)
+ [

# 获取组织或组织单位的 ARN
](get-org-ou-ARN.md)
+ [

# 允许企业和 OU 使用 KMS 密钥
](allow-org-ou-to-use-key.md)
+ [

# 管理与组织或 OU 共享的 AMI
](share-amis-org-ou-manage.md)

## 注意事项
<a name="considerations-org-ou"></a>

在与特定企业或企业部门共享 AMI 时，请考虑以下事项。
+ **所有权** – 若要共享 AMI，您的 AWS 账户 必须拥有 AMI。
+ **共享限制** – AMI 拥有者可以与任何组织或 OU 共享 AMI，包括他们不是其成员的组织和 OU。

  有关某一区域内可以共享 AMI 的最大实体数量，请参阅 [Amazon EC2 服务限额](https://docs.aws.amazon.com//general/latest/gr/ec2-service.html#limits_ec2)。
+ **标签** – 您无法共享用户定义的标签（附加到 AMI 的标签）。共享 AMI 时，与其共享 AMI 的组织或 OU 中的 AWS 账户 的任何用户均无法使用用户定义的标签。
+ **ARN 格式** – 在命令中指定企业或 OU 时，请确保使用正确的 ARN 格式。如果只指定 ID，例如，如果您仅指定 `o-123example` 或 `ou-1234-5example`，则会出现错误。

  正确的 ARN 格式：
  + 企业 ARN：`arn:aws:organizations::111122223333:organization/organization-id`
  + OU ARN：`arn:aws:organizations::111122223333:ou/organization-id/ou-id`

  其中：
  + *`111122223333`* 举例说明管理账户的 12 位账户 ID。如果您不知道管理账号，您可以描述企业或企业部门以获取 ARN，其中包括管理账号。有关更多信息，请参阅 [获取组织或组织单位的 ARN](get-org-ou-ARN.md)。
  + *`organization-id`* 是企业 ID，例如 `o-123example`。
  + *`ou-id`* 是企业部门 ID，例如 `ou-1234-5example`。

  有关 ARN 格式的更多信息，请参阅 *IAM 用户指南*中的 [Amazon 资源名称(ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)。
+ **加密和密钥** – 您可以共享由未加密和加密快照支持的 AMI。
  + 加密快照必须使用客户托管式密钥加密。您无法共享由使用默认 AWS 托管式密钥加密的快照支持的 AMI。
  + 如果您共享由加密快照支持的 AMI，则必须允许企业或 OU 使用用于加密快照的客户托管式密钥。有关更多信息，请参阅 [允许企业和 OU 使用 KMS 密钥](allow-org-ou-to-use-key.md)。
+ **区域** – AMI 是一种区域性资源。当您共享 AMI 时，则它只能在您共享该 AMI 的区域使用。要使 AMI 能够在其他区域使用，请将该 AMI 复制到该区域并进行共享。有关更多信息，请参阅 [复制 Amazon EC2 AMI](CopyingAMIs.md)。
+ **使用** – 当您共享 AMI 时，用户只能从该 AMI 启动实例。他们无法删除、共享或修改实例。但是，在他们使用您的 AMI 启动实例后，他们可以从其启动的实例创建 AMI。
+ **账单** – 当其他 AWS 账户 使用您的 AMI 启动实例时，您无需付费。使用 AMI 启动实例的账户将为它们启动的实例付费。

# 获取组织或组织单位的 ARN
<a name="get-org-ou-ARN"></a>

企业和企业部门 ARN 包含 12 位数的管理账号。如果您不知道管理账号，您可以描述企业或企业部门以获取每个账号的 ARN。在以下示例中，`123456789012` 是管理账户的账户 ID。

**所需的权限**  
在获得 ARN 之前，您必须拥有描述企业和企业部门的权限。以下示例策略提供了必要权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "organizations:Describe*"
            ],
            "Resource": "*"
        }
    ]
}
```

------

------
#### [ AWS CLI ]

**获取企业的 ARN**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/organizations/describe-organization.html](https://docs.aws.amazon.com/cli/latest/reference/organizations/describe-organization.html) 命令。添加 `--query` 选项将仅返回组织 ARN。

```
aws organizations describe-organization --query 'Organization.Arn'
```

下面是示例输出。

```
"arn:aws:organizations::123456789012:organization/o-1234567abc"
```

**获取企业部门的 ARN**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/organizations/describe-organizational-unit.html](https://docs.aws.amazon.com/cli/latest/reference/organizations/describe-organizational-unit.html) 命令。使用 `--query` 参数将仅返回组织单元 ARN。

```
aws organizations describe-organizational-unit \
    --organizational-unit-id ou-a123-b4567890 \
    --query 'OrganizationalUnit.Arn'
```

下面是示例输出。

```
"arn:aws:organizations::123456789012:ou/o-1234567abc/ou-a123-b4567890"
```

------
#### [ PowerShell ]

**获取企业的 ARN**  
使用 [Get-ORGOrganization](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-ORGOrganization.html) cmdlet。

```
(Get-ORGOrganization).Arn
```

下面是示例输出。

```
arn:aws:organizations::123456789012:organization/o-1234567abc
```

**获取企业部门的 ARN**  
使用 [Get-ORGOrganizationalUnit](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-ORGOrganizationalUnit.html) cmdlet。

```
(Get-ORGOrganizationalUnit -OrganizationalUnitId "ou-a123-b4567890").Arn
```

下面是示例输出。

```
arn:aws:organizations::123456789012:ou/o-1234567abc/ou-a123-b4567890
```

------

# 允许企业和 OU 使用 KMS 密钥
<a name="allow-org-ou-to-use-key"></a>

如果共享由加密快照支持的 AMI，则还须允许组织或组织单位（OU）使用用于加密快照的 KMS 密钥。

**注意**  
加密快照必须使用*客户管理型*密钥加密。您无法共享由使用默认 AWS 托管式密钥加密的快照支持的 AMI。

要控制对 KMS 密钥的访问，可以在[密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgpaths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgpaths) 条件键来仅允许特定主体执行指定操作。主体可以是用户、IAM 角色、联合用户或 AWS 账户根用户。

条件键的使用方式如下：
+ `aws:PrincipalOrgID`：允许属于由指定 ID 表示的组织的任何主体。
+ `aws:PrincipalOrgPaths`：允许属于由指定路径表示的组织单位的任何主体。

要向组织（包括属于该组织的组织单位和账户）授予使用 KMS 密钥的权限，请向密钥策略添加以下语句。

```
{
    "Sid": "Allow access for organization root",
    "Effect": "Allow",
    "Principal": "*",
    "Action": [
        "kms:Describe*",
        "kms:List*",
        "kms:Get*",
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:CreateGrant"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:PrincipalOrgID": "o-123example"
        }
    }
}
```

要向特定组织单位（和属于该组织单位的账户）授予使用 KMS 密钥的权限，您可以使用类似于下列示例的策略。

```
{
        "Sid": "Allow access for specific OUs and their descendants",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "kms:Describe*",
            "kms:List*",
            "kms:Get*",
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:CreateGrant"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:PrincipalOrgID": "o-123example"
            },
            "ForAnyValue:StringLike": {
                "aws:PrincipalOrgPaths": [
                    "o-123example/r-ab12/ou-ab12-33333333/*",
                    "o-123example/r-ab12/ou-ab12-22222222/*"
                ]
            }
        }
}
```

有关更多示例条件语句，请参阅《IAM 用户指南》[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid)中的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgpaths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgpaths) 和 *aws:PrincipalOrgPaths*。

有关跨账户访问的更多信息，请参阅《AWS Key Management Service Developer Guide》**中的 [Allowing users in other accounts to use a KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

# 管理与组织或 OU 共享的 AMI
<a name="share-amis-org-ou-manage"></a>

您可以使用组织和组织部门（OU）来管理 AMI 共享，从而控制其是否可以启动 Amazon EC2 实例。

## 查看共享 AMI 的企业和 OU
<a name="decribe-ami-launch-permissions"></a>

可以查找与 AMI 共享的组织和组织单元。

------
#### [ Console ]

**检查您与哪些组织和组织单位共享了 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在列表中选择您的 AMI，选择 **Permissions**（权限）选项卡，然后向下滚动到 **Shared organizations/OUs**（共享企业/OU）。

   要查找与您共享的 AMI，请参阅[查找用于 Amazon EC2 实例的共享 AMI](usingsharedamis-finding.md)。

------
#### [ AWS CLI ]

**检查您与哪些组织和组织单位共享了 AMI**  
使用带 `launchPermission` 属性的 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-attribute.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-attribute.html) 命令。

```
aws ec2 describe-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --attribute launchPermission
```

以下为响应示例。

```
{
    "ImageId": "ami-0abcdef1234567890",
    "LaunchPermissions": [
        {
            "OrganizationalUnitArn": "arn:aws:organizations::111122223333:ou/o-123example/ou-1234-5example"
        }
    ]
}
```

------
#### [ PowerShell ]

**检查您与哪些组织和组织单位共享了 AMI**  
使用 [Get-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageAttribute.html) cmdlet。

```
Get-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute launchPermission
```

------

## 与组织或 OU 共享 AMI
<a name="share-amis-org-ou"></a>

可以与组织或组织单元共享 AMI。

**注意**  
您不需要为了共享 AMI 而共享 AMI 引用的 Amazon EBS 快照。只需共享 AMI 本身，系统会自动为实例提供访问所引用 EBS 快照的权限，以便启动。不过，您确实需要共享用于对 AMI 引用的快照加密的 KMS 密钥。有关更多信息，请参阅 [允许企业和 OU 使用 KMS 密钥](allow-org-ou-to-use-key.md)。

------
#### [ Console ]

**与企业或 OU 共享 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在列表中选择您的 AMI，然后选择 **Actions**、**然后选择 Edit AMI Permissions**。

1. 在 **AMI availability**（AMI 可用性）下，选择 **Private**（私有）。

1. 在 **Shared organizations/OUs**（共享企业/OU）旁，选择 **Add organization/OU ARN**（添加企业/OU ARN）。

1. 对于 **Organization/OU ARN**（企业/OU ARN），输入要与之共享 AMI 的企业 ARN 或 OU ARN，然后选择 **Share AMI**（共享 AMI）。请注意，您必须指定完整 ARN，而不仅仅是 ID。

   要与多个企业或 OU 共享此 AMI，请重复此步骤，直至您添加完所需全部企业或 OU。

1. 完成后，选择 **Save changes (保存更改)**。

1. （可选）要查看您已共享 AMI 的企业或 OU，请在列表中选择此 AMI，然后选择 **Permissions**（权限）选项卡，然后向下滚动到 **Shared organizations/OUs**（共享企业/OU）。要查找与您共享的 AMI，请参阅[查找用于 Amazon EC2 实例的共享 AMI](usingsharedamis-finding.md)。

------
#### [ AWS CLI ]

**与组织共享 AMI**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 命令，向指定组织授予指定 AMI 的启动权限。

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --launch-permission "Add=[{OrganizationArn=arn:aws:organizations::123456789012:organization/o-123example}]"
```

**与组织单位共享 AMI**  
[modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 命令向指定 OU 授予指定 AMI 的启动许可。请注意，您必须指定完整 ARN，而不仅仅是 ID。

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --launch-permission "Add=[{OrganizationalUnitArn=arn:aws:organizations::123456789012:ou/o-123example/ou-1234-5example}]"
```

------
#### [ PowerShell ]

使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html) 命令（适用于 Windows PowerShell 的工具）共享 AMI，如以下示例所示。

**与企业或 OU 共享 AMI**  
以下命令向指定企业授予指定 AMI 的启动许可。

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute launchPermission `
    -OperationType add `
    -OrganizationArn "arn:aws:organizations::123456789012:organization/o-123example"
```

**停止与企业或 OU 共享 AMI**  
以下命令从指定企业中删除指定 AMI 的启动许可：

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute launchPermission `
    -OperationType remove `
    -OrganizationArn "arn:aws:organizations::123456789012:organization/o-123example"
```

**停止与所有组织、OU 和 AWS 账户 共享 AMI**  
以下命令从指定 AMI 中删除所有公用和显式启动许可。请注意，AMI 的拥有者始终具有启动许可，因此不受该命令影响。

```
Reset-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute launchPermission
```

------

## 停止与组织或 OU 共享 AMI
<a name="stop-sharing-amis-org-ou"></a>

可以停止与组织或组织单元共享 AMI。

**注意**  
如果某个特定账户位于您与之共享 AMI 的企业或 OU 中，则您无法停止与该账户共享 AMI 如果您尝试通过删除账户的启动许可来停止共享 AMI，Amazon EC2 将返回成功消息。但是，AMI 将继续与账户共享。

------
#### [ Console ]

**停止与企业或 OU 共享 AMI**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在列表中选择您的 AMI，然后选择 **Actions**、**然后选择 Edit AMI Permissions**。

1. 在 **Shared organizations/OUs**（共享企业/OU）下，选择要停止共享 AMI 的企业或 OU，然后选择 **Remove selected**（删除所选）。

1. 完成后，选择 **Save changes (保存更改)**。

1. （可选）要确认您已停止与企业或 OU 共享 AMI，请在列表中选择此 AMI，然后选择 **Permissions**（权限）选项卡，然后向下滚动到 **Shared organizations/OUs**（共享企业/OU）。

------
#### [ AWS CLI ]

**停止与企业或 OU 共享 AMI**  
使用 [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 命令。此示例从指定组织中删除指定 AMI 的启动权限。

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --launch-permission "Remove=[{OrganizationArn=arn:aws:organizations::123456789012:organization/o-123example}]"
```

**停止与所有组织、OU 和 AWS 账户 共享 AMI**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/reset-image-attribute.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/reset-image-attribute.html) 命令。此示例从指定 AMI 中删除所有公有和显式启动权限。请注意，AMI 的拥有者始终具有启动许可，因此不受该命令影响。

```
aws ec2 reset-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --attribute launchPermission
```

------
#### [ PowerShell ]

**停止与企业或 OU 共享 AMI**  
使用 [Edit-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html) cmdlet。此示例从指定组织中删除指定 AMI 的启动权限。

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute launchPermission `
    -OperationType remove `
    -OrganizationArn "arn:aws:organizations::123456789012:organization/o-123example"
```

**停止与所有组织、OU 和 AWS 账户 共享 AMI**  
使用 [Reset-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Reset-EC2ImageAttribute.html) cmdlet。此示例从指定 AMI 中删除所有公有和显式启动权限。请注意，AMI 的拥有者始终具有启动许可，因此不受该命令影响。

```
Reset-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute LaunchPermission
```

------

# 与特定 AWS 账户共享 AMI
<a name="sharingamis-explicit"></a>

您可以在不将 AMI 设为公共的情况下，与特定 AWS 账户 共享 AMI。您需要的只是 AWS 账户 ID。

AWS 账户 ID 是一个 12 位数字（如 `012345678901`），用于唯一标识 AWS 账户。有关更多信息，请参阅《AWS 账户管理 参考指南》中的 [Viewing AWS 账户 identifiers](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html)**。



## 注意事项
<a name="considerations-for-sharing-AMI-with-accounts"></a>

在与特定 AWS 账户 共享 AMI 时，请考虑以下事项。
+ **所有权** – 若要共享 AMI，您的 AWS 账户 必须拥有 AMI。
+ **共享限制** - 有关某一区域内可以共享 AMI 的最大实体数量，请参阅 [Amazon EC2 服务限额](https://docs.aws.amazon.com//general/latest/gr/ec2-service.html#limits_ec2)。
+ **标签** – 您无法共享用户定义的标签（附加到 AMI 的标签）。共享 AMI 时，与其共享 AMI 的任何 AWS 账户 均无法使用用户定义的标签。
+ **快照** – 您不需要共享某个 AMI 为了共享该 AMI 而引用的 Amazon EBS 快照。您可以仅共享 AMI 本身；系统会自动为实例提供访问所引用 EBS 快照的权限来完成启动。不过，您必须共享用于对 AMI 引用的快照进行加密的所有 KMS 密钥。有关更多信息，请参阅《Amazon EBS 用户指南》**中的[共享 Amazon EBS 快照](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modifying-snapshot-permissions.html)。
+ **加密和密钥** – 您可以共享由未加密和加密快照支持的 AMI。
  + 加密快照必须使用 KMS 密钥加密。您无法共享由使用默认 AWS 托管式密钥加密的快照支持的 AMI。
  + 如果您共享由加密快照支持的 AMI，则必须允许 AWS 账户 使用用于加密快照的 KMS 密钥。有关更多信息，请参阅 [允许企业和 OU 使用 KMS 密钥](allow-org-ou-to-use-key.md)。要设置在使用客户托管密钥进行加密时启动 Auto Scaling 实例所需的密钥策略，请参阅*《Amazon EC2 Auto Scaling 用户指南》*中的[加密卷所需的 AWS KMS key 策略](https://docs.aws.amazon.com/autoscaling/ec2/userguide/key-policy-requirements-EBS-encryption.html)。
+ **区域** – AMI 是一种区域性资源。如果您共享 AMI，则它只能在该区域使用。要使 AMI 能够在其他区域使用，请将该 AMI 复制到该区域并进行共享。有关更多信息，请参阅 [复制 Amazon EC2 AMI](CopyingAMIs.md)。
+ **使用** – 当您共享 AMI 时，用户只能从该 AMI 启动实例。他们无法删除、共享或修改实例。但是，在他们使用您的 AMI 启动实例后，他们可以从其实例创建 AMI。
+ **复制共享 AMI** – 如果另一个账户中的用户想复制共享 AMI，则必须向他们授予对支持 AMI 的存储的读取权限。有关更多信息，请参阅 [跨账户复制](how-ami-copy-works.md#copy-ami-across-accounts)。
+ **账单** – 当其他 AWS 账户 使用您的 AMI 启动实例时，您无需付费。使用 AMI 启动实例的账户将为它们启动的实例付费。

------
#### [ Console ]

**要授予显式启动许可**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 在列表中选择您的 AMI，然后选择 **Actions**、**然后选择 Edit AMI Permissions**。

1. 选择**私有**。

1. 在 **Shared accounts**（共享账户）下，选择 **Add account ID**（添加账户 ID）。

1. 对于 **AWS 账户 ID**，输入要与其共享 AMI 的 AWS 账户 ID，然后选择 **Share AMI**（共享 AMI）。

   要与多账户共享此 AMI，请重复此步骤 5 和 6，直至您添加完所需全部账户 ID。

1. 完成后，选择 **Save changes**（保存更改）。

1. （可选）要查看您已与其共享 AMI 的 AWS 账户 ID，请在列表中选择该 AMI，然后选择 **Permissions**（权限）选项卡。要查找与您共享的 AMI，请参阅[查找用于 Amazon EC2 实例的共享 AMI](usingsharedamis-finding.md)。

------
#### [ AWS CLI ]

使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 命令共享 AMI，如以下示例所示。

**要授予显式启动许可**  
以下示例向指定 AWS 账户 授予指定 AMI 的启动权限。

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --launch-permission "Add=[{UserId=123456789012}]"
```

**要删除账户的启动许可**  
以下示例从指定 AWS 账户 中删除指定 AMI 的启动权限。

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --launch-permission "Remove=[{UserId=123456789012}]"
```

**要删除所有的启动许可**  
以下示例从指定 AMI 中删除所有公有和显式启动权限。请注意，AMI 的拥有者始终具有启动许可，因此不受该命令影响。

```
aws ec2 reset-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --attribute launchPermission
```

------
#### [ PowerShell ]

使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html) 命令（适用于 Windows PowerShell 的工具）共享 AMI，如以下示例所示。

**要授予显式启动许可**  
以下示例向指定 AWS 账户 授予指定 AMI 的启动权限。

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 ` 
    -Attribute launchPermission `
    -OperationType add `
    -UserId "123456789012"
```

**要删除账户的启动许可**  
以下示例从指定 AWS 账户 中删除指定 AMI 的启动权限。

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute launchPermission -OperationType remove `
    -UserId "123456789012"
```

**要删除所有的启动许可**  
以下示例从指定 AMI 中删除所有公有和显式启动权限。请注意，AMI 的拥有者始终具有启动许可，因此不受该命令影响。

```
Reset-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute launchPermission
```

------

# 取消与您的 AWS 账户 共享 AMI
<a name="cancel-sharing-an-AMI"></a>

通过将账户添加到 AMI 的启动权限，可以[与特定 AWS 账户 共享](sharingamis-explicit.md)亚马逊机器映像（AMI）。如果已与您的 AWS 账户 共享 AMI，而您不想再与您的账户共享该 AMI，则可以将您的账户从 AMI 的启动权限中移除。您可以通过运行 `cancel-image-launch-permission` AWS CLI 命令进行这项操作。在运行此命令时，将从指定 AMI 的启动权限中移除您的 AWS 账户。若要查找与 AWS 账户 共享的 AMI，请参阅 [查找用于 Amazon EC2 实例的共享 AMI](usingsharedamis-finding.md)。

例如，您可以取消与您的账户共享 AMI，以降低使用已与您共享的未使用或已弃用的 AMI 启动实例的可能性。当您取消与您的账户共享 AMI 时，它将不再出现在 EC2 控制台的任何 AMI 列表中，也不会出现在 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 的输出中。

**Topics**
+ [

## 限制
](#cancel-sharing-an-AMI-limitations)
+ [

## 取消与您的账户共享 AMI
](#cancel-image-launch-permission)

## 限制
<a name="cancel-sharing-an-AMI-limitations"></a>
+ 您可以将您的账户从仅与您的 AWS 账户 共享的 AMI 的启动权限中移除。您不能使用 `cancel-image-launch-permission` 从 [与组织或组织单位（OU）共享的 AMI](share-amis-with-organizations-and-OUs.md) 的启动权限中移除您的账户，也不能将其用于移除对公共 AMI 的访问权限。
+ 您不能从 AMI 的启动权限中永久移除您的账户。AMI 拥有者可以再次与您的账户共享 AMI。
+ AMI 是一种区域性资源。在运行 `cancel-image-launch-permission` 时，必须指定 AMI 所在的区域。可在命令中指定区域，或者使用 AWS\$1DEFAULT\$1REGION [环境变量](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)。
+ 只有 AWS CLI 和 SDK 支持从 AMI 的启动权限中移除您的账户。EC2 控制台目前不支持此操作。

## 取消与您的账户共享 AMI
<a name="cancel-image-launch-permission"></a>

**注意**  
在您取消与您的账户共享 AMI 后，您将无法撤消该操作。要重新获得对 AMI 的访问权限，AMI 拥有者必须将其与您的账户共享。

------
#### [ AWS CLI ]

**取消与账户共享 AMI**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/cancel-image-launch-permission.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/cancel-image-launch-permission.html) 命令。

```
aws ec2 cancel-image-launch-permission \
    --image-id ami-0abcdef1234567890 \
    --region us-east-1
```

------
#### [ PowerShell ]

**取消与账户共享 AMI**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/index.html](https://docs.aws.amazon.com/powershell/latest/reference/index.html) cmdlet。

```
Stop-EC2ImageLaunchPermission `
    -ImageId ami-0abcdef1234567890 `
    -Region us-east-1
```

------

# 创建共享 Linux AMI 的建议
<a name="building-shared-amis"></a>

使用以下指南可缩小攻击面并提高您创建的 AMI 的可靠性。

**重要**  
任何安全指南都不是详尽无遗的。请仔细构建您的共享 AMI，并花时间考虑可能导致暴露敏感数据的位置。

**Topics**
+ [

## 对根用户禁用基于密码的远程登录
](#public-amis-disable-password-logins-for-root)
+ [

## 禁用本地根访问
](#restrict-root-access)
+ [

## 删除 SSH 主机密钥对
](#remove-ssh-host-key-pairs)
+ [

## 安装公有密钥凭证
](#public-amis-install-credentials)
+ [

## 禁用 sshd DNS 检查（可选）
](#public-amis-disable-ssh-dns-lookups)
+ [

## 移除敏感数据
](#public-amis-protect-yourself)

如果为 AWS Marketplace 构建 AMI，请参阅 *AWS Marketplace 卖家指南*中的[构建 AMI 的最佳实践](https://docs.aws.amazon.com/marketplace/latest/userguide/best-practices-for-building-your-amis.html)，以了解指导原则、策略和最佳实践。

## 对根用户禁用基于密码的远程登录
<a name="public-amis-disable-password-logins-for-root"></a>

为公用 AMI 使用固定的根密码是一种很快为人知晓的安全风险。甚至于用户在第一次登录后更改密码都会给可能的滥用以可乘之机。

要解决此问题，请对根用户禁用基于密码的远程登录。

**对根用户禁用基于密码的远程登录**

1. 用文字编辑器打开 `/etc/ssh/sshd_config` 文件并查找以下行：

   ```
   #PermitRootLogin yes
   ```

1. 将行更改为：

   ```
   PermitRootLogin without-password
   ```

   若您的发行版不同或您未运行 OpenSSH，此配置文件的位置可能也会不同。若情况如此，请咨询相关文档。

## 禁用本地根访问
<a name="restrict-root-access"></a>

在使用共享 AMI 时，最佳做法是禁用直接根登录。为此，请登录到您正在运行的实例并发出以下命令：

```
[ec2-user ~]$ sudo passwd -l root
```

**注意**  
该命令不影响 `sudo` 的使用。

## 删除 SSH 主机密钥对
<a name="remove-ssh-host-key-pairs"></a>

 如果您计划共享源自公用 AMI 的 AMI，请删除 `/etc/ssh` 中的现有 SSH 主机密钥对。这会促使 SSH 在有人使用您的 AMI 启动实例时生成新的独特 SSH 密钥对，从而提高安全性并降低“中间人”攻击可能性。

删除系统上存在的以下所有密钥文件。
+  ssh\$1host\$1dsa\$1key 
+  ssh\$1host\$1dsa\$1key.pub 
+  ssh\$1host\$1key 
+  ssh\$1host\$1key.pub 
+  ssh\$1host\$1rsa\$1key 
+  ssh\$1host\$1rsa\$1key.pub 
+ ssh\$1host\$1ecdsa\$1key
+ ssh\$1host\$1ecdsa\$1key.pub
+ ssh\$1host\$1ed25519\$1key
+ ssh\$1host\$1ed25519\$1key.pub

您可以使用以下命令安全地删除所有这些文件。

```
[ec2-user ~]$ sudo shred -u /etc/ssh/*_key /etc/ssh/*_key.pub
```

**警告**  
安全删除实用工具（例如 **shred**）可能不会移除存储介质中某个文件的所有副本。文件的隐藏副本可能是由日志文件系统 (包括 Amazon Linux 默认 ext4)、快照、备份、RAID 和临时缓存创建的。有关更多信息，请参阅 [shred 文档](https://www.gnu.org/software/coreutils/manual/html_node/shred-invocation.html)。

**重要**  
如果您忘记从您的公用 AMI 中删除现有 SSH 主机密钥对，我们的例行审核过程会通知您和所有运行您的 AMI 实例的客户存在潜在安全风险。短暂的宽限期过后，我们会将 AMI 标记为私有。

## 安装公有密钥凭证
<a name="public-amis-install-credentials"></a>

配置 AMI 以防止使用密码进行登录后，您必须确保用户能用另一种机制登录。

Amazon EC2 允许用户在启动实例时指定公用–私有密钥对名称。向 `RunInstances` API 调用提供有效的密钥对名称后（或通过命令行 API 工具），公用密钥（Amazon EC2 在至 `CreateKeyPair` 或 `ImportKeyPair` 的调用后在服务器上保留的密钥对的部分)通过针对实例元数据的 HTTP 查询供实例使用。

要通过 SSH 登录，您的 AMI 必须在启动时检索密钥值并将该值附加到 `/root/.ssh/authorized_keys` (或 AMI 上任何其他用户账户的等效密钥)。用户可使用密钥对启动您的 AMI 的实例，并在不需要根密码的情况下进行登录。

很多发行版（包括 Amazon Linux 和 Ubuntu）使用 `cloud-init` 软件包为配置的用户插入公有密钥凭证。如果您的发行版不支持 `cloud-init`，则可以将以下代码添加到系统启动脚本（如 `/etc/rc.local`），以提取您在启动时为根用户指定的公有密钥。

**注意**  
在以下示例中，IP 地址 http://169.254.169.254/ 是链路本地地址，仅从该实例有效。

------
#### [ IMDSv2 ]

```
if [ ! -d /root/.ssh ] ; then
        mkdir -p /root/.ssh
        chmod 700 /root/.ssh
fi
# Fetch public key using HTTP
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/my-key
if [ $? -eq 0 ] ; then
        cat /tmp/my-key >> /root/.ssh/authorized_keys
        chmod 700 /root/.ssh/authorized_keys
        rm /tmp/my-key
fi
```

------
#### [ IMDSv1 ]

```
if [ ! -d /root/.ssh ] ; then
        mkdir -p /root/.ssh
        chmod 700 /root/.ssh
fi
# Fetch public key using HTTP
curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/my-key
if [ $? -eq 0 ] ; then
        cat /tmp/my-key >> /root/.ssh/authorized_keys
        chmod 700 /root/.ssh/authorized_keys
        rm /tmp/my-key
fi
```

------

 这一点适用于任何用户；无需将其限制为 `root` 用户。

**注意**  
根据此 AMI 进行的实例重新捆绑包括启动时所用的密钥。要防止密钥被包含，您必须清除 (或删除) `authorized_keys` 文件或将此文件排除在重新捆绑之外。

## 禁用 sshd DNS 检查（可选）
<a name="public-amis-disable-ssh-dns-lookups"></a>

禁用 sshd DNS 检查会稍微减弱您的 sshd 安全性。但是，如果 DNS 解析失败，SSH 的登录仍然有效。如果您未禁用 sshd 检查，DNS 解析失败后会阻止所有的登录。

**要禁用 sshd DNS 检查**

1. 用文字编辑器打开 `/etc/ssh/sshd_config` 文件并查找以下行：

   ```
   #UseDNS yes
   ```

1. 将行更改为：

   ```
   UseDNS no
   ```

**注意**  
若您的发行版不同或您未运行 OpenSSH，此配置文件的位置也会不同。若情况如此，请咨询相关文档。

## 移除敏感数据
<a name="public-amis-protect-yourself"></a>

我们不建议您将敏感数据或软件存储在您共享的任何 AMI 上。启动共享 AMI 的用户可能能够重新捆绑 AMI 并能自行注册 AMI。遵循上述指南可助您避免一些容易被忽视的安全风险：
+ 我们建议对 `--exclude directory` 使用 `ec2-bundle-vol` 选项，以跳过包含您不想在捆绑中包含的机密信息的所有目录和子目录。具体而言，在捆绑映像时，排除所有用户拥有的 SSH 公有/私有密钥对和 SSH `authorized_keys` 文件。Amazon 公有 AMI 会将其存储在 `/root/.ssh`（对于根用户）和 `/home/user_name/.ssh/`（对于常规用户）中。有关更多信息，请参阅 [ec2-bundle-vol](ami-tools-commands.md#ami-bundle-vol)。
+ 务必在捆绑前删除 Shell 程序历史记录。如果您在同一 AMI 中多次尝试捆绑上传，Shell 程序历史中将包含访问密钥。以下示例应为从实例内部捆绑前您运行的最后一个命令。

  ```
  [ec2-user ~]$ shred -u ~/.*history
  ```
**警告**  
以上警告中描述的 **shred** 的限制在此处也适用。  
请注意，bash 在退出时会将当前会话的历史记录写入磁盘。如果您在删除 `~/.bash_history` 后注销您的实例，然后重新登录，您将发现 `~/.bash_history` 已重新创建且包含上一会话期间运行的所有命令。  
Bash 以外的其他程序也会将历史记录写入磁盘，请谨慎使用并删除或排除不必要的点文件和点目录。
+ 捆绑正在运行的实例需要您的私有密钥和 X.509 证书。将上述密钥和凭证以及其他证书放置到未予捆绑的位置 (如实例存储)。

# 使用 Amazon EventBridge 监控 AMI 事件
<a name="monitor-ami-events"></a>

当亚马逊机器映像（AMI）状态发生变化时，Amazon EC2 将生成发送到 Amazon EventBridge（以前称为 Amazon CloudWatch Events）的事件。事件以 JSON 格式发送到默认的 EventBridge 事件总线。您可以使用 Amazon EventBridge 检测并响应这些事件。要做到这一点，您可以在 EventBridge 中创建触发操作以响应事件的规则。例如，您可以创建 EventBridge 规则，以检测 AMI 创建过程何时完成，然后调用 Amazon SNS 主题以向您发送电子邮件通知。

当 AMI 进入以下任何状态时，Amazon EC2 将生成 `EC2 AMI State Change` 事件：
+ `available`
+ `failed`
+ `deregistered`
+ `disabled`

事件将尽最大努力生成。

下表列出了 AMI 操作和 AMI 可能存在的状态。在表中，**是**表示相应操作运行时 AMI 可能存在的状态。


| AMI 操作 | available | failed | deregistered | disabled | 
| --- | --- | --- | --- | --- | 
| CopyImage | 支持 | 是 |  |  | 
|  CreateImage  |  是  |  是  |  |  | 
|  CreateRestoreImageTask  | 是 | 是 |  |  | 
| DeregisterImage |  |  |  是  |  | 
|  DisableImage  |  |  |  |  是  | 
|  EnableImage  |  是  |  |  |  | 
| RegisterImage | 是 | 是 |  |  | 

**EC2 AMI State Change 事件**
+ [

## 事件详细信息
](#ami-events)
+ [

## available 事件
](#ami-event-available)
+ [

## failed 事件
](#ami-event-failed)
+ [

## deregistered 事件
](#ami-event-deregistered)
+ [

## disabled 事件
](#ami-event-disabled)

## 事件详细信息
<a name="ami-events"></a>

您可以使用事件中的以下字段创建触发操作的规则：

`"source": "aws.ec2"`  
识别来自 Amazon EC2 的事件。

`"detail-type": "EC2 AMI State Change"`  
识别事件名称。

`"detail": { "ImageId": "ami-0abcdef1234567890", "State": "available", }`  
提供 AMI ID 和 AMI 的状态（`available`、`failed`、`deregistered` 或 `disabled`）。

有关更多信息，请参阅《Amazon EventBridge User Guide》**中的以下内容：
+ [Amazon EventBridge 事件](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)
+ [Amazon EventBridge 事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)
+ [Amazon EventBridge 规则](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html)

有关如何创建 Lambda 函数和运行 Lambda 函数的 EventBridge 规则的教程，请参阅《AWS Lambda Developer Guide》**中的 [Tutorial: Log the state of an Amazon EC2 instance using EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-log-ec2-instance-state.html)。

## available 事件
<a name="ami-event-available"></a>

以下是 Amazon EC2 在 AMI 于 `CreateImage`、`CopyImage`、`RegisterImage`、`CreateRestoreImageTask` 或 `EnableImage` 操作成功后进入 `available` 状态时所生成的事件的示例。

`"State": "available"` 表明 操作成功。

```
{
    "version": "0",
    "id": "example-9f07-51db-246b-d8b8441bcdf0",
    "detail-type": "EC2 AMI State Change",
    "source": "aws.ec2",
    "account": "012345678901",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-1",
    "resources": ["arn:aws:ec2:us-east-1::image/ami-0abcdef1234567890"],
    "detail": {
        "RequestId": "example-9dcc-40a6-aa77-7ce457d5442b",
        "ImageId": "ami-0abcdef1234567890",
        "State": "available",
        "ErrorMessage": ""
    }
}
```

## failed 事件
<a name="ami-event-failed"></a>

以下是 Amazon EC2 在 AMI 于 `CreateImage`、`CopyImage`、`RegisterImage` 或 `CreateRestoreImageTask` 操作失败后进入 `failed` 状态时所生成的事件的示例。

以下字段提供相关信息：
+ `"State": "failed"` – 指示操作失败。
+ `"ErrorMessage": ""` – 提供操作失败的原因。

```
{
    "version": "0",
    "id": "example-9f07-51db-246b-d8b8441bcdf0",
    "detail-type": "EC2 AMI State Change",
    "source": "aws.ec2",
    "account": "012345678901",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-1",
    "resources": ["arn:aws:ec2:us-east-1::image/ami-0abcdef1234567890"],
    "detail": {
        "RequestId": "example-9dcc-40a6-aa77-7ce457d5442b",
        "ImageId": "ami-0abcdef1234567890",
        "State": "failed",
        "ErrorMessage": "Description of failure"
    }
}
```

## deregistered 事件
<a name="ami-event-deregistered"></a>

以下是 Amazon EC2 在 AMI 于 `DeregisterImage` 操作成功后进入 `deregistered` 状态时所生成的事件的示例。如果操作失败，则不会生成任何事件。由于 `DeregisterImage` 是同步操作，任何故障都能被立即知晓。

`"State": "deregistered"` 表明 `DeregisterImage` 操作成功。

```
{
    "version": "0",
    "id": "example-9f07-51db-246b-d8b8441bcdf0",
    "detail-type": "EC2 AMI State Change",
    "source": "aws.ec2",
    "account": "012345678901",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-1",
    "resources": ["arn:aws:ec2:us-east-1::image/ami-0abcdef1234567890"],
    "detail": {
        "RequestId": "example-9dcc-40a6-aa77-7ce457d5442b",
        "ImageId": "ami-0abcdef1234567890",
        "State": "deregistered",
        "ErrorMessage": ""
    }
}
```

## disabled 事件
<a name="ami-event-disabled"></a>

以下是 Amazon EC2 在 AMI 于 `DisableImage` 操作成功后进入 `disabled` 状态时所生成的事件的示例。如果操作失败，则不会生成任何事件。由于 `DisableImage` 是同步操作，任何故障都能被立即知晓。

`"State": "disabled"` 表明 `DisableImage` 操作成功。

```
{
    "version": "0",
    "id": "example-9f07-51db-246b-d8b8441bcdf0",
    "detail-type": "EC2 AMI State Change",
    "source": "aws.ec2",
    "account": "012345678901",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-1",
    "resources": ["arn:aws:ec2:us-east-1::image/ami-0abcdef1234567890"],
    "detail": {
        "RequestId": "example-9dcc-40a6-aa77-7ce457d5442b",
        "ImageId": "ami-0abcdef1234567890",
        "State": "disabled",
        "ErrorMessage": ""
    }
}
```

# 了解 AMI 账单信息
<a name="ami-billing-info"></a>

启动实例时，有许多亚马逊机器映像（AMI）可供选择，它们支持各种操作系统平台和功能。要了解您在启动实例时选择的 AMI 如何影响 AWS 账单的底线，您可以研究相关的操作系统平台和账单信息。在启动任何按需或竞价型实例之前执行此操作，或者购买预留实例。

下面是关于提前研究 AMI 如何帮助您选择最适合自己需求的 AMI 的两个示例：
+ 对于竞价型实例，您可以使用 AMI **Platform details** (平台详细信息) 来确认对于竞价型实例支持 AMI。
+ 购买时 Reserved Instance 时，您可以确保选择映射到 AMI **Platform details** (平台详细信息) 的操作系统平台（**Platform** [平台]）。

有关实例定价的更多信息，请参阅 [Amazon EC2 定价](https://aws.amazon.com/ec2/pricing/)。

**Topics**
+ [

# AMI 账单信息字段
](billing-info-fields.md)
+ [

# 查找 AMI 账单和使用详细信息
](view-billing-info.md)
+ [

# 验证账单上的 AMI 费用
](verify-ami-charges.md)

# AMI 账单信息字段
<a name="billing-info-fields"></a>

以下字段提供与 AMI 关联的账单信息：

平台详细信息  
 与 AMI 的账单代码关联的平台详细信息。例如：`Red Hat Enterprise Linux`。

使用情况操作  
Amazon EC2 实例的操作以及与 AMI 关联的账单代码。例如：`RunInstances:0010`。**Usage operation** (使用情况操作) 对应于 AWS 成本和使用情况报告 (CUR) 和 [AWS 价目表 API](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/price-changes.html) 中的 [lineitem/Operation](https://docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html#Lineitem-details-O-Operation) 列。

您可以在 Amazon EC2 控制台的**实例**或 **AMI** 页面上查看这些字段，或者在 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 或 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) 命令返回的响应中查看这些字段。

## 示例数据：按平台划分的使用情况操作
<a name="billing-info"></a>

下表列出了一些平台详细信息和使用情况操作值，这些信息显示在 Amazon EC2 控制台的**实例**或 **AMI** 页面上，或者显示在由 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 或 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) 命令返回的响应中。


| 平台详细信息 | 使用情况操作 2 | 
| --- | --- | 
|  Linux/UNIX  |  RunInstances  | 
|  Red Hat BYOL Linux  |  RunInstances:00g03  | 
|  Red Hat Enterprise Linux  |  RunInstances:0010  | 
|  Red Hat Enterprise Linux with HA  |  RunInstances:1010  | 
|  Red Hat Enterprise Linux with SQL Server Standard and HA  |  RunInstances:1014  | 
|  Red Hat Enterprise Linux with SQL Server Enterprise and HA  |  RunInstances:1110  | 
|  Red Hat Enterprise Linux with SQL Server Standard  |  RunInstances:0014  | 
|  Red Hat Enterprise Linux with SQL Server Web  |  RunInstances:0210  | 
|  Red Hat Enterprise Linux with SQL Server Enterprise  |  RunInstances:0110  | 
|  SQL Server Enterprise  |  RunInstances:0100  | 
|  SQL Server Standard  |  RunInstances:0004  | 
|  SQL Server Web  |  RunInstances:0200  | 
|  SUSE Linux  |  RunInstances:000g  | 
| Ubuntu Pro |  RunInstances:0g00  | 
|  Windows  |  RunInstances:0002  | 
|  Windows BYOL  |  RunInstances:0800  | 
|  Windows with SQL Server Enterprise1  |  RunInstances:0102  | 
|  Windows with SQL Server Standard1  |  RunInstances:0006  | 
|  Windows with SQL Server Web1  |  RunInstances:0202  | 

1 如果两个软件许可证与 AMI 关联，则**平台详细信息**字段将显示两者。

2 如果您正在运行竞价型实例，则 AWS 成本和使用情况报告上的 [https://docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html#Lineitem-details-O-Operation](https://docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html#Lineitem-details-O-Operation) 可能与此处列出的**使用情况操作**值不同。例如，如果 `[lineitem/Operation](https://docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html#Lineitem-details-O-Operation)` 显示 `RunInstances:0010:SV006`，则表示 Amazon EC2 正在区域 6 中的美国东部（弗吉尼亚州北部）运行 Red Hat Enterprise Linux 竞价型实例小时。

3 这在使用情况报告中显示为 RunInstances (Linux/UNIX)。

# 查找 AMI 账单和使用详细信息
<a name="view-billing-info"></a>

以下属性可以帮助您验证账单上的 AMI 费用：
+ **平台详细信息**
+ **使用情况操作**
+ **AMI ID**

------
#### [ Console ]

**查找 AMI 的 AMI 账单信息**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择 AMI。

1. 在**详细信息**选项卡上，查找**平台详细信息**和**使用情况操作**。

**查找实例的 AMI 账单信息**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 在**详细信息**选项卡上，展开**实例详细信息**，然后查找**平台详细信息**和**使用情况操作**。

------
#### [ AWS CLI ]

**查找 AMI 的 AMI 账单信息**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --image-ids ami-0abcdef1234567890 \
    --query "Images[].{PlatformDetails:PlatformDetails,UsageOperation:UsageOperation}"
```

以下是 Linux AMI 的示例输出。

```
[
    {
        "PlatformDetails": "Linux/UNIX",
        "UsageOperation": "RunInstances"
    }
]
```

**查找实例的 AMI 账单信息**  
可以使用 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令。

```
aws ec2 describe-instances \
    --instance-ids i-1234567890abcdef0 \
    --query "Reservations[].Instances[].{PlatformDetails:PlatformDetails,UsageOperation:UsageOperation}"
```

以下是 Windows 实例的示例输出。

```
[
    {
        "PlatformDetails": "Windows",
        "UsageOperation": "RunInstances:0002"
    }
]
```

------
#### [ PowerShell ]

**查找 AMI 的 AMI 账单信息**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
Get-EC2Image `
    -ImageId ami-0abcdef1234567890 | `
    Format-List PlatformDetails, UsageOperation
```

以下是 Linux AMI 的示例输出。

```
PlatformDetails : Linux/UNIX
UsageOperation  : RunInstances
```

**查找实例的 AMI 账单信息**  
使用 [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet。

```
(Get-EC2Instance `
    -InstanceId i-1234567890abcdef0).Instances | `
    Format-List PlatformDetails, UsageOperation
```

以下是 Windows 实例的示例输出。

```
PlatformDetails : Windows
UsageOperation  : RunInstances:0002
```

------

# 验证账单上的 AMI 费用
<a name="verify-ami-charges"></a>

为确保您不会产生计划外费用，您可以验证 AWS 成本和使用情况报告 (CUR) 中某个实例的账单信息和与您用于启动实例的 AMI 关联的账单信息匹配。

要验证账单信息，请在 CUR 中找到实例 ID 并检查 `[lineitem/Operation](https://docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html#Lineitem-details-O-Operation)` 列中的相应值。该值应和与 AMI 关联的 **Usage operation** (使用情况操作) 的值相匹配。

例如，AMI `ami-0123456789EXAMPLE` 具有以下账单信息：
+ **Platform details** (平台详细信息) = `Red Hat Enterprise Linux`
+ **Usage operation** (使用情况操作) = `RunInstances:0010`

如果您使用此 AMI 启动了实例，您可以在 CUR 中找到实例 ID 并检查 `[lineitem/Operation](https://docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html#Lineitem-details-O-Operation)` 列中的相应值。在这个例子中，值应该是 `RunInstances:0010`。

# Amazon EC2 中的 AMI 配额
<a name="ami-quotas"></a>

以下限额适用于创建和共享 AMI。限额按 AWS 区域应用。


****  

| 限额名称 | 描述 | 每个区域的默认限额 | 
| --- | --- | --- | 
| AMI | 每个区域允许的最大公有和私有 AMI 数量。这包括可用、待处理和已禁用的 AMI 以及回收站中的 AMI。 | 50000 | 
| 公有 AMI | 每个区域允许的最大公有 AMI 数量，包括回收站中的公有 AMI。 | 5 | 
| AMI 共享 | 某一区域内可以共享 AMI 的最大实体（组织、组织部门 (OU) 和账户）数量。请注意，如果您与某个组织或 OU 共享一个 AMI，则该组织或 OU 中的账户数量不计入该限额。 | 1000 | 

如果您超出限额，但想创建或共享更多 AMI，可以执行以下操作：
+ 如果您超出总 AMI 或公有 AMI 限额，请考虑取消注册未使用的映像。
+ 如果您超出公有 AMI 限额，请考虑将一个或多个公有 AMI 设为私有。
+ 如果您超出 AMI 共享限额，请考虑与某个组织或 OU（而不是单独的账户）共享您的 AMI。
+ 请求增加 AMI 的限额。

## 请求增加 AMI 的限额
<a name="request-ami-quota-increase"></a>

如果您需要的 AMI 超出其默认限额，您可以请求增加限额。

**请求增加 AMI 的限额**

1. 访问 [https://console.aws.amazon.com/servicequotas/](https://console.aws.amazon.com/servicequotas/)，打开服务限额控制台。

1. 在导航窗格中，选择 **AWS 服务**。

1. 从列表中选择 **Amazon Elastic Compute Cloud (Amazon EC2)**，或在搜索框中键入服务的名称。

1. 选择 AMI 限额以请求增加限额。您可以选择的 AMI 限额包括：
   + AMI
   + 公有 AMI
   + AMI 共享

1. 选择**请求增加限额**。

1. 对于 **Change quota value**（更改限额值），输入新的限额值，然后选择 **Request**（请求）。

要查看任何待处理或最近解决的请求，请从导航窗格选择 **Dashboard (控制面板)**。对于待处理的请求，请选择请求状态以打开收到的请求。请求的初始状态为 **Pending**（待处理）。状态更改为 **Quota requested**（已请求限额）后，您将在 **Support Center case number**（支持中心案例编号）下看到案例编号。选择案例编号以打开请求服务单。

解决请求后，配额的 **Applied quota value (应用的配额值)** 设置为新值。

有关更多信息，请参阅 [Service Quotas 用户指南](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。