使用 S3 存储和还原 AMI - Amazon Elastic Compute Cloud

使用 S3 存储和还原 AMI

您可以将 Amazon Machine Image (AMI) 存储在 Amazon S3 存储桶中、将 AMI 复制到另一个 S3 存储桶,然后从 S3 存储桶还原它。通过使用 S3 存储桶存储和还原 AMI,您可以将 AMI 从一个 AWS 分区复制到另一个分区,例如,从主商业分区到 AWS GovCloud (US) 分区。您还可以通过将 AMI 存储在 S3 存储桶中为其创建存档副本。

支持使用 S3 存储和还原 AMI 的 API 是 CreateStoreImageTaskDescribeStoreImageTasksCreateRestoreImageTask

CopyImage 是推荐用于在 AWS 分区复制 AMI 的 API。但是,CopyImage 无法将 AMI 复制到另一个分区。

有关 AWS 分区的信息,请参阅 IAM 用户指南Amazon 资源名称(ARN)页面上的分区

警告

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

使用案例

将 AMI 从一个 AWS 分区复制到另一个 AWS 分区

通过使用 S3 存储桶存储和还原 AMI,您可以将 AMI 从一个 AWS 分区复制到另一个分区,或从一个 AWS 区域复制到另一个区域。在以下示例中,您可将 AMI 从主商业分区复制到 AWS GovCloud (US) 分区,尤其是从 us-east-2 区域复制到 us-gov-east-1 区域。

要将 AMI 从一个分区复制到另一个分区,请执行以下步骤:

  • 使用 CreateStoreImageTask 将 AMI 存储在当前区域内的 S3 存储桶中。在此示例中,S3 存储桶位于 us-east-2 中。有关示例命令,请参阅 将 AMI 存储在 S3 存储桶中

  • 使用 DescribeStoreImageTasks 监控存储任务的进度。任务完成后,对象将在 S3 存储桶中可见。有关示例命令,请参阅 描述 AMI 存储任务的进度

  • 使用您选择的程序将存储的 AMI 对象复制到目标分区中的 S3 存储桶。在此示例中,S3 存储桶位于 us-gov-east-1 中。

    注意

    由于每个分区均需要不同的 AWS 凭证,因此无法将 S3 对象从一个分区直接复制到另一个分区。跨分区复制 S3 对象的过程不在本文档的讨论范围之内。我们提供以下复制过程作为示例,但您必须使用符合安全要求的复制过程。

    • 要跨分区复制某一 AMI,复制过程可能非常简单,如下所示:从源存储桶下载对象到中间主机(例如,EC2 实例或笔记本电脑),然后从中间主机上传对象到目标存储桶。对于该过程的每个阶段,请对分区使用 AWS 凭证。

    • 要实现更持久的使用,请考虑开发一个管理副本的应用程序(可能使用 S3 分段下载和上传)。

  • 使用 CreateRestoreImageTask 从目标分区中的 S3 存储桶还原 AMI。在此示例中,S3 存储桶位于 us-gov-east-1 中。有关示例命令,请参阅 从 S3 存储桶还原 AMI

  • 通过对需要检查其状态何时变为可用的 AMI 进行描述来监控还原任务的进度。您还可以通过描述快照来监控构成所还原 AMI 的快照的进度百分比。

制作 AMI 的存档副本

您可以通过将 AMI 存储在 S3 存储桶中为其创建存档副本。有关示例命令,请参阅 将 AMI 存储在 S3 存储桶中

AMI 被打包到 S3 内的单个对象中,所有 AMI 元数据(不包括共享信息)都作为存储 AMI 的一部分得到保留。AMI 数据将作为存储流程的一部分进行压缩。由于 AMI 包含可轻松压缩的数据,因此 S3 中的对象较小。为了降低成本,您可以使用更便宜的 S3 存储套餐。有关更多信息,请参阅 Amazon S3 存储类Amazon S3 定价

AMI 存储和还原 API 的工作原理

要使用 S3 存储和还原 AMI,请使用以下 API:

  • CreateStoreImageTask – 将 AMI 存储在 S3 存储桶中

  • DescribeStoreImageTasks – 提供 AMI 存储任务的进度

  • CreateRestoreImageTask – 从 S3 存储桶还原 AMI

CreateStoreImageTask

CreateStoreImageTask API 将 AMI 作为单个对象存储在 S3 存储桶中。

API 创建一个任务,从 AMI 及其快照中读取所有数据,然后使用 S3 分段上传将数据存储在 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 的大小总和限制为每个账户 600 GB 的 EBS 快照数据。进一步的任务创建将被拒绝,直到正在进行的任务低于限制。例如,如果当前正在存储快照数据为 100 GB 的 AMI 和另一个快照数据为 200 GB 的 AMI,则将接受另一个请求,因为正在进行的总量为 300 GB,低于限制。但是,如果当前正在存储的单个 AMI 的快照数据为 800 GB,则在任务完成之前,将会拒绝进一步的任务。

DescribeStoreImageTasks

DescribeStoreImageTasks API 描述 AMI 存储任务的进度。您可以描述指定 AMI 的任务。如果未指定 AMI,则会获得过去 31 天内处理的所有存储映像任务的分页列表。

对于每个 AMI 任务,响应会指示任务是 InProgressCompleted 还是 Failed。对于任务 InProgress,响应会将估计进度显示为百分比值。

任务按反向的时间顺序列出。

目前,只能查看上个月的任务。

CreateRestoreImageTask

CreateRestoreImageTask API 启动一个任务,该任务可从先前使用 CreateStoreImageTask 请求创建的 S3 对象还原 AMI。

执行还原任务的区域可以与执行存储任务的区域相同,也可以不同。

要从中还原 AMI 对象的 S3 存储桶必须位于请求执行还原任务的相同区域中。AMI 将在此区域中还原。

AMI 将使用其元数据还原,例如与存储的 AMI 值对应的名称、描述和块储存设备映射。名称对该账户在该区域中的 AMI 必须唯一。如果未提供名称,则新 AMI 获得的名称与原始 AMI 的名称相同。AMI 获得在还原流程中生成的新 AMI ID。

完成 AMI 还原任务所需的时间取决于 AMI 的大小。它还取决于有多少其他任务正在进行,因为任务需要排队。您可以通过描述 AMI (describe-images) 或其 EBS 快照 (describe-snapshots) 来查看任务的进度。如果任务失败,AMI 和快照将移至失败状态。

所有正在进行的 AMI 的大小总和限制为每个账户的 EBS 快照数据 300 GB(根据还原后的大小)。进一步的任务创建将被拒绝,直到正在进行的任务低于限制。

限制

  • 要存储 AMI,您的 AWS 账户必须拥有该 AMI 及其快照的所有权,或者该 AMI 及其快照必须直接与您的账户共享。如果 AMI 仅公开共享,则无法存储。

  • 使用这些 API 只能存储由 EBS 支持的 AMI。

  • 不支持半虚拟化 (PV) AMI。

  • 可存储的 AMI 的大小(压缩前)限制为 5,000 GB。

  • 存储映像请求的限额:600 GB 的存储工作(快照数据)正在进行中。

  • 还原映像请求的限额:300 GB 的还原工作(快照数据)正在进行中。

  • 在存储任务的持续时间内,不得删除快照,执行存储的 IAM 委托人必须有权访问快照,否则存储流程将会失败。

  • 您不能在同一 S3 存储桶中创建 AMI 的多个副本。

  • 存储在 S3 存储桶中的 AMI 无法使用其原始 AMI ID 进行还原。您可以使用 AMI 别名来缓解这种情况。

  • 目前,仅支持使用 AWS Command Line Interface、AWS 开发工具包和 Amazon EC2 API 存储和还原 API。您无法使用 Amazon EC2 控制台存储和还原 AMI。

成本

使用 S3 存储和还原 AMI 时,您需要为存储和还原 API 使用的服务以及数据传输付费。API 使用 S3 和 EBS Direct API(由这些 API 在内部使用以访问快照数据)。有关更多信息,请参阅 Amazon S3 定价Amazon EBS 定价

保护您的 AMI

要使用存储和还原 API,S3 存储桶和 AMI 必须位于同一区域中。务必确保 S3 存储桶配置有足够的安全性来保护 AMI 的内容,并确保只要 AMI 对象仍保留在存储桶中,安全性将保持不变。如果无法做到这一点,建议不要使用这些 API。确保不允许对 S3 存储桶进行公开访问。我们建议为存储 AMI 的 S3 存储桶启用服务器端加密,但不是必需要求。

有关如何为 S3 存储桶设置适当的安全设置的信息,请查看以下安全主题:

当 AMI 快照复制到 S3 对象时,将通过 TLS 连接复制数据。您可以使用加密快照存储 AMI,但是快照会作为存储流程的一部分进行解密。

使用 S3 存储和还原 AMI 的权限

如果您的 IAM 主体将使用 Amazon S3 来存储或还原 AMI,则需要向其授予所需权限。

以下示例策略包括允许 IAM 委托人执行存储和还原任务需要的所有操作。

此外,您还可以创建向主体授予仅访问指定资源权限的 IAM policy。如需了解更多示例策略,请参阅《IAM 用户指南》中的 AWS 资源的访问管理

注意

如果构成 AMI 的快照已加密,或者账户默认启用了加密功能,您的 IAM 主体必须具有使用 KMS 密钥的权限。

{ "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": "*" } ] }

使用 AMI 存储和还原 API

将 AMI 存储在 S3 存储桶中

存储 AMI (AWS CLI)

使用 create-store-image-task 命令。指定 AMI 的 ID 以及要在其中存储 AMI 的 S3 存储桶的名称。

aws ec2 create-store-image-task \ --image-id ami-1234567890abcdef0 \ --bucket myamibucket

预期输出

{ "ObjectKey": "ami-1234567890abcdef0.bin" }

描述 AMI 存储任务的进度

描述 AMI 存储任务的进度 (AWS CLI)

使用 describe-store-image-tasks 命令。

aws ec2 describe-store-image-tasks

预期输出

{ "AmiId": "ami-1234567890abcdef0", "Bucket": "myamibucket", "ProgressPercentage": 17, "S3ObjectKey": "ami-1234567890abcdef0.bin", "StoreTaskState": "InProgress", "StoreTaskFailureReason": null, "TaskStartTime": "2021-01-01T01:01:01.001Z" }

从 S3 存储桶还原 AMI

还原 AMI (AWS CLI)

使用 create-restore-image-task 命令。使用来自 S3ObjectKey 输出的 Bucketdescribe-store-image-tasks 的值,请指定 AMI 的对象键以及要将 AMI 复制到的 S3 存储桶的名称。还可以为还原的 AMI 指定名称。名称对该账户在该区域中的 AMI 必须唯一。

注意

还原的 AMI 将获得一个新 AMI ID。

aws ec2 create-restore-image-task \ --object-key ami-1234567890abcdef0.bin \ --bucket myamibucket \ --name "New AMI Name"

预期输出

{ "ImageId": "ami-0eab20fe36f83e1a8" }

使用 S3 中的文件路径

您可以通过以下方式在存储和恢复 AMI 时使用文件路径:

  • 在 S3 中存储 AMI 时,可以将文件路径添加到存储桶名称中。在内部,系统将路径与存储桶名称分开,然后将路径添加到为存储 AMI 而生成的对象密钥中。完整的对象路径显示在 API 调用的响应中。

  • 在恢复 AMI 时,由于对象密钥参数可用,可以将路径添加到对象键值的开头。

在使用 AWS CLI 和 SDK 时,可以使用文件路径。

示例:在存储和恢复 AMI (AWS CLI) 时使用文件路径

以下示例首先将 AMI 存储在 S3 中,并将文件路径附加到存储桶名称。然后,该示例从 S3 恢复 AMI,将文件路径预置在对象键参数之前。

  1. 存储 AMI。对于 --bucket,在存储桶名称后指定文件路径,如下所示:

    aws ec2 create-store-image-task \ --image-id ami-1234567890abcdef0 \ --bucket myamibucket/path1/path2

    预期输出

    { "ObjectKey": "path1/path2/ami-1234567890abcdef0.bin" }
  2. 恢复 AMI。对于 --object-key,指定上一步中输出的值,其中包括文件路径。

    aws ec2 create-restore-image-task \ --object-key path1/path2/ami-1234567890abcdef0.bin \ --bucket myamibucket \ --name "New AMI Name"