

# 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
```

------