

# 使用 S3 存储和还原 AMI
<a name="ami-store-restore"></a>

您可以将亚马逊机器映像（AMI）存储在 Amazon S3 存储桶中、将 AMI 复制到另一个 S3 存储桶，然后从 S3 存储桶还原它。通过使用 S3 存储桶存储和还原 AMI，您可以将 AMI 从一个 Amazon 分区复制到另一个分区，例如，从主商业分区到 Amazon GovCloud (US) 分区。您还可以通过将 AMI 存储在 S3 存储桶中为其创建存档副本。

支持使用 S3 存储和还原 AMI 的 API 是 `CreateStoreImageTask`、`DescribeStoreImageTasks` 和 `CreateRestoreImageTask`。

`CopyImage` 是推荐用于在 Amazon 分区*内*复制 AMI 的 API。但是，`CopyImage` 无法将 AMI 复制到*另一个*分区。

有关 Amazon 分区的信息，请参阅 *IAM 用户指南*中 [Amazon 资源名称(ARN)](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference-arns.html)页面上的*分区*。

**警告**  
在 Amazon 分区或 Amazon 区域之间移动数据时，请确保遵守所有适用法律和业务要求，包括但不限于任何适用的政府法规和数据驻留要求。

**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**
+ [在 Amazon 分区之间复制 AMI](#copy-to-partition)
+ [制作 AMI 的存档副本](#archival-copies)

### 在 Amazon 分区之间复制 AMI
<a name="copy-to-partition"></a>

通过使用 S3 存储桶存储和还原 AMI，您可以将 AMI 从一个 Amazon 分区复制到另一个分区，或从一个 Amazon 区域复制到另一个区域。在以下示例中，您可将 AMI 从主商业分区复制到 Amazon 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` 中。
**注意**  
由于每个分区均需要不同的 Amazon 凭证，因此无法将 S3 对象从一个分区直接复制到另一个分区。跨分区复制 S3 对象的过程不在本文档的讨论范围之内。我们提供以下复制过程作为示例，但您必须使用符合安全要求的复制过程。  
要跨分区复制某一 AMI，复制过程可能非常简单，如下所示：从源存储桶[下载对象](https://docs.amazonaws.cn/AmazonS3/latest/userguide/download-objects.html)到中间主机（例如，EC2 实例或笔记本电脑），然后从中间主机[上传对象](https://docs.amazonaws.cn/AmazonS3/latest/userguide/upload-objects.html)到目标存储桶。对于该过程的每个阶段，请对分区使用 Amazon 凭证。
要实现更持久的使用，请考虑开发一个管理副本的应用程序（可能使用 S3 [分段下载和上传](https://docs.amazonaws.cn/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://www.amazonaws.cn/s3/storage-classes/)和 [Amazon S3 定价](https://www.amazonaws.cn/s3/pricing/)

## 限制
<a name="ami-store-restore-limitations"></a>
+ 要存储 AMI，您的 Amazon Web Services 账户必须拥有该 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.amazonaws.cn/systems-manager/latest/userguide/parameter-store-ec2-aliases.html)来缓解这种情况。
+ 目前，仅支持使用 Amazon Command Line Interface、Amazon 开发工具包和 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://www.amazonaws.cn/s3/pricing/)和 [Amazon EBS 定价](https://www.amazonaws.cn/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.amazonaws.cn/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.amazonaws.cn/cli/latest/reference/ec2/describe-images.html)) 或其 EBS 快照 ([describe-snapshots](https://docs.amazonaws.cn/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.amazonaws.cn/AmazonS3/latest/userguide/serv-side-encryption.html)，但不是必需要求。

有关如何为 S3 存储桶设置适当的安全设置的信息，请查看以下安全主题：
+ [阻止对 Amazon S3 存储的公有访问](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-control-block-public-access.html)
+ [设置 Amazon S3 存储桶的默认服务器端加密行为](https://docs.amazonaws.cn/AmazonS3/latest/userguide/bucket-encryption.html)
+ [我可以使用哪个 S3 桶策略来遵守 Amazon Config 规则 s3-bucket-ssl-requests-only？](https://repost.aws/knowledge-center/s3-bucket-policy-for-config-rule)
+ [启用 Amazon S3 服务器访问日志记录](https://docs.amazonaws.cn/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 用户指南**》中的 [Amazon 资源的访问管理](https://docs.amazonaws.cn/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 的大小。您可以跟踪该任务的进度，直到其成功或失败。

------
#### [ Amazon CLI ]

**创建存储映像任务**  
使用 [create-store-image-task](https://docs.amazonaws.cn/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.amazonaws.cn/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.amazonaws.cn/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.amazonaws.cn/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。

------
#### [ Amazon CLI ]

**创建恢复映像任务**  
使用 [create-restore-image-task](https://docs.amazonaws.cn/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.amazonaws.cn/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
```

------