如何使用 VM Import/Export 根据我的 Amazon 系统映像 (AMI) 导出 VM?

上次更新日期:2021 年 3 月 3 日

我想要将我的 Amazon 系统映像 (AMI) 副本导出为虚拟机 (VM),以部署在我的现场虚拟化环境中。如何使用 VM Import/Export 执行该操作?

简短描述

您可以通过 AWS 命令行界面 (AWS CLI) 使用 VM Import/Export 启动映像导出任务。然后,您的 Amazon 系统映像 (AMI) 副本将导出为 VM 文件,并写入 Amazon Simple Storage Service (Amazon S3) 存储桶中。您可以使用导出的 VM 在现场虚拟化环境中部署新的标准化实例。您可以将大多数 AMI 导出到 Citrix Xen、Microsoft Hyper-V 或 VMware vSphere 中。

注意:如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

在开始以下解决步骤之前,请执行以下操作:

解决方法

1.    从要导出的 EC2 实例创建由 Amazon Elastic Block Store (Amazon EBS) 支持的 AMI。

对于 Linux,请参阅创建 Amazon EBS 支持的 Linux AMI

对于 Windows,请参阅创建自定义 Windows AMI

2.    在客户端计算机上安装 AWS CLI,然后使用为 IAM 用户生成的 AWS 凭证对其进行配置

3.    在与您计划导出的 AMI 相同的 AWS 区域中创建新的 S3 存储桶

4.    创建所需的服务角色。 作为先决条件,请确保在使用 VM Import/Export 的区域中启用 AWS Security Token Service (AWS STS)

要创建服务角色,请先在计算机上创建一个名为 trust-policy.json 的文件,然后将以下策略添加到该文件:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}

运行 create-role 命令以使用 trust-policy.json 文件创建名为 vmimport 的角色,从而授予 VM Import/Export 访问该角色的权限:

aws iam create-role --role-name vmimport --assume-role-policy-document "file://C:\import\trust-policy.json"

注意:在前面的示例中,请确保指定您创建的 trust-policy.json 文件位置的完整路径。务必包含 file:// 前缀。

在您的计算机上创建另一个名为 role-policy.json 的文件,然后将以下策略添加到该文件中。将 my-export-bucket 替换为您的 S3 存储桶名称。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-export-bucket",
                "arn:aws:s3:::my-export-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifySnapshotAttribute",
                "ec2:CopySnapshot",
                "ec2:RegisterImage",
                "ec2:Describe*"
            ],
            "Resource": "*"
        }
    ]
}

使用 put-role-policy 命令将 role-policy.json 策略附加到您以前创建的 vmimport 角色:

aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file://C:\import\role-policy.json"

在前面的示例中,请确保指定 role-policy.json 文件位置的完整路径。

注意:VM Import/Export 将来的更新可能需要 vmimport 角色中的其他权限。有关所需权限的最新示例,请参阅所需服务角色文档中的示例策略。

5.    从安装了 AWS CLI 的客户端计算机上, 运行 AWS CLI 命令 export-image 以开始导出映像任务:

aws ec2 export-image --image-id ami-id --disk-image-format VMDK --s3-export-location S3Bucket=my-export-bucket,S3Prefix=exports/

注意:在前面的示例中,将 ami-id 替换为您的 AMI ID。选择所需的磁盘映像格式(VMDK、RAW 或 VHD)。将 my-export-bucket 替换为您的 S3 存储桶名称。导出的文件将使用 S3 密钥 prefixexport-ami-id.format(例如,my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk)写入 S3 存储桶中。您可以向导出的文件添加前缀。

如果请求成功,export-image 命令输出将返回有关任务的详细信息,包括导出映像任务 ID,如以下示例所示:

{
    "DiskImageFormat": "vmdk",
    "ExportImageTaskId": "export-ami-1234567890abcdef0"
    "ImageId": "ami-1234567890abcdef1",
    "RoleName": "vmimport",
    "Progress": "0",
    "S3ExportLocation": {
        "S3Bucket": "my-export-bucket",
        "S3Prefix": "exports/"
    },
    "Status": "active",
    "StatusMessage": "validating"
}

6.    要检查导出映像任务的状态,请运行 AWS CLI 命令 describe-export-image-tasks

示例

aws ec2 describe-export-image-tasks --export-image-task-id export-ami-id

注意:在前面的示例中,将 export-ami-id 替换为 export-image 命令输出中的导出映像任务 ID。

describe-export-image-tasks 命令输出将返回有关任务进度和整体状态的详细信息。以下示例输出适用于处于活动状态且正在进行的导出映像任务:

{
    "ExportImageTasks": [
        {
            "ExportImageTaskId": "export-ami-1234567890abcdef0"
            "Progress": "21",
            "S3ExportLocation": {
                "S3Bucket": "my-export-bucket",
                "S3Prefix": "exports/"
            },
            "Status": "active",
            "StatusMessage": "updating"
        }
    ]
}

7.    当导出映像任务的状态变为“已完成”时,导出的文件将作为对象在 S3 存储桶中准备就绪。以下示例输出显示了已完成的导出映像任务。Amazon S3 中生成的导出文件为 my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk

{
    "ExportImageTasks": [
        {
            "ExportImageTaskId": "export-ami-1234567890abcdef0"
            "S3ExportLocation": {
                "S3Bucket": "my-export-bucket",
                "S3Prefix": "exports/"
            },
            "Status": "completed"
        }
    ]
}

8.    使用 Amazon S3 控制台访问您的 S3 存储桶,以查找并下载对象。