

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