简介

场景说明

常见本地自建虚拟机是在 VMware 或者VirtualBox,客户想迁移到 AWS 云上使用,不用重新部署自己的应用环境等,亦或者是本地算力不足,需要扩展机器等,总的需求是要更多的虚拟机和更便宜的费用。

AWS 能够将虚拟机映像从现有的虚拟化环境导入 Amazon EC2。例如可以将 VMware 虚拟机导出成 ovf 格式,导出后一共有.mf、.ovf、.vmdk三个文件,打包成 .ova文件,AWS支持导入 AMI 镜像和快照两种方式。

环境准备

先决条件(限制)

具体内容参考链接:https://docs.aws.amazon.com/zh_cn/vm-import/latest/userguide/vmie_prereqs.html

实践步骤

一、 从虚拟化环境中导出 VM

在VM或者VirtualBox中导出时,直接选择导出为OVF格式,导出后一共有.mf、.ovf、.vmdk三个文件
其中.mf文件是一些文件SHA的集合,主要起到防止映像文件被非法用户篡改的验证作用
.ovf文件相当于配置文件,它保证了映像文件vmdk、资源文件iso与虚拟机domain配置之间的正确对应
.vmdk文件是具体的映像资源。在这里,我们只需要把.vmdk文件上传到AWS S3的bucket即可

二、将 VM 作为映像导入

当 .vmdk文件上传到AWS S3之后,就要在本机使用CLI的import-image命令,而这需要在我们的账户中创建名为vmimport的角色,并为该角色配置相关的策略和权限后,才能够执行特定的操作。因此在转换为AMI前,我们需要先操作我们的账户。下面会逐步介绍。

  1. 使用 aws iam create-role 命令创建名为 vmimport 的角色,并向 VM Import/Export 提供对该角色的访问权

    具体命令:
    aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
    其中trust-policy.json文件的内容为:
    {
    "Version":"2012-10-17",
    "Statement":[
       {
          "Sid":"",
          "Effect":"Allow",
          "Principal":{
             "Service":"vmie.amazonaws.com"
          },
          "Action":"sts:AssumeRole",
          "Condition":{
             "StringEquals":{
                "sts:ExternalId":"vmimport"
             }
          }
       }
    ]
    }
    特别注意事项:
    (1) 必须将外部 ID 命名为vmimport,不能是其他的名字。
    (2) trust-policy.json文件当中的"Version"并非是用户自定义版本号,而是AWS中vmimport的版本号,因此请保留"Version":"2012-10-17″不变。
  2. 为角色vmimport创建策略

    具体命令:
    aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json
    其中role-policy.json文件的内容为:
    {
    "Version":"2012-10-17",
    "Statement":[
       {
          "Effect":"Allow",
          "Action":[
             "s3:ListBucket",
             "s3:GetBucketLocation"
          ],
          "Resource":[
             "arn:aws-cn:s3:::vm.vincentqiu.cn"          #修改此处为具体的值
          ]
       },
       {
          "Effect":"Allow",
          "Action":[
             "s3:GetObject"
          ],
          "Resource":[
             "arn:aws-cn:s3:::vm.vincentqiu.cn/*"        #修改此处为具体的值
          ]
       },
       {
          "Effect":"Allow",
          "Action":[
             "ec2:ModifySnapshotAttribute",
             "ec2:CopySnapshot",
             "ec2:RegisterImage",
             "ec2:Describe*"
          ],
          "Resource":"*"
       }
    ]
    }
    特别注意事项:
    (1) 同样地,要求保留role-policy.json文件中的"Version":"2012-10-17″不变。
    (2) 需要特别注意上述role-policy.json文件中红色标注的两行,分别有两个注意事项:
    第一,如果VM映像所在的S3为中国区内,则需要以"arn:aws-cn:s3"开头标注资源;如果VM映像所在的S3为中国区外的标准AWS区域,则只需要使用一般的"arn:aws:s3"开头标注资源。
    第二,上述的vm.vincentqiu.cn为本人的VM映像在S3中的bucket名字,用户可根据情况替换成自己的bucket名字。
  3. 为使用IAM身份登录的用户配置权限
    如果您以 AWS Identity and Access Management (IAM) 用户身份登录,那么您的 IAM 策略中需要以下权限才能导入或导出 VM。

    {
    "Version": "2012-10-17",
    "Statement": [
     {
       "Effect": "Allow",
       "Action": [
         "s3:ListAllMyBuckets"
       ],
       "Resource": "*"
     },
     {
      "Effect": "Allow",
      "Action": [
         "s3:CreateBucket",
         "s3:DeleteBucket",
         "s3:DeleteObject",
         "s3:GetBucketLocation",
         "s3:GetObject",
         "s3:ListBucket",
         "s3:PutObject"
       ],
       "Resource": ["arn:aws:s3:::mys3bucket","arn:aws:s3:::mys3bucket/*"]         #修改此处为具体的值
     },
     {
       "Effect": "Allow",
       "Action": [
         "ec2:CancelConversionTask",
         "ec2:CancelExportTask",
         "ec2:CreateImage",
         "ec2:CreateInstanceExportTask",
         "ec2:CreateTags",
         "ec2:DeleteTags",
         "ec2:DescribeConversionTasks",
         "ec2:DescribeExportTasks",
         "ec2:DescribeInstanceAttribute",
         "ec2:DescribeInstanceStatus",
         "ec2:DescribeInstances",
         "ec2:DescribeTags",
         "ec2:ImportInstance",
         "ec2:ImportVolume",
         "ec2:StartInstances",
         "ec2:StopInstances",
         "ec2:TerminateInstances",
         "ec2:ImportImage",
         "ec2:ImportSnapshot",
         "ec2:DescribeImportImageTasks",
         "ec2:DescribeImportSnapshotTasks",
         "ec2:CancelImportTask"
       ],
       "Resource": "*"
     }
     ]
    } 
  4. 创建新的导入映像任务
    经历了上述角色和账户操作后,我们现在终于可以使用 aws ec2 import-image 创建新的导入映像任务!

    具体命令:
    aws ec2 import-image --description "Ubuntu 12.04 vmdk" --disk-containers file://containers.json
    其中containers.json文件的内容为:
    [{
     "Description": "VM import first CLI task",
     "Format": "vmdk",
     "UserBucket": {
         "S3Bucket": "vm.vincentqiu.cn",                       #修改此处为具体的S3Bucket
         "S3Key": "OVA_ubuntu_12.04/Ubuntu12.04-disk1.vmdk"    #修改此处为具体的Bucket下面的vmdk文件路径
     }
    }]
    如果该VM具有多个显示磁盘,import-image命令也支持具有多个显示磁盘的VM导入Amazon EC2中。在这种情况下,containers.json文件的内容类似于:
    [{
     "Description": "First CLI task",
     "Format": "vmdk",
     "UserBucket": {
         "S3Bucket": "my-import-bucket",                    #修改此处为具体的S3Bucket
         "S3Key": "my-windows-2008-vm-disk1.vmdk"           #修改此处为具体的Bucket下面的vmdk文件路径
     }
    },
    {
     "Description": "Second CLI task",
     "Format": "vmdk",
     "UserBucket": {
         "S3Bucket": "my-import-bucket",                #修改此处为具体的S3Bucket
         "S3Key": "my-windows-2008-vm-disk2.vmdk"       #修改此处为具体的Bucket下面的vmdk文件路径
     }
    }]
    当执行完该命令后,如果没有错误发生,CLI会返回任务响应。在任务相应中含有一个ImportTaskId的值,我们保存下来,方便下面查询使用。 
  5. 监控导入映像任务的状态
    使用 describe-import-image-tasks 命令返回导入任务的状态
aws ec2 describe-import-image-tasks --import-task-ids import-ami-1234567890abcdef0
包括的状态值如下:
active — 正在运行导入任务。
deleting — 正在取消导入任务。
deleted — 导入任务已取消。
updating — 导入状态正在更新。
validating — 正在验证导入的映像。
validated — 已验证导入的映像。
converting — 正在将导入的映像转换成 AMI。
completed — 导入任务已完成,并且 AMI 已准备就绪,随时可以使用。

三、将 VM 作为快照导入

 注意:同上“将 VM 作为映像导入”的 1、2、3 步骤,需要添加对应的用户权限、角色和策略

使用下面的 import-snapshot 命令导入磁盘。您可以指定 S3 存储桶的 URL,或提供 S3Bucket和 S3Key

具体命令:
aws ec2 import-snapshot --description "centos7 VMDK" --disk-container "file://containers.json"
其中containers.json文件的内容为:
{
    "Description": "VM import first CLI task",
    "Format": "VMDK",
    "UserBucket": {
        "S3Bucket": "my-import-bucket",               #修改此处为具体的S3Bucket
        "S3Key": "vms/my-server-vm.vmdk"              #修改此处为具体的Bucket下面的vmdk文件路径
    }
}

#以下为响应示例:
{
    "Description": "VM import first CLI task",
    "ImportTaskId": "import-snap-1234567890abcdef0",
    "SnapshotTaskDetail": {
        "Description": "VM import first CLI task",
        "DiskImageSize": "0.0",
        "Format": "VMDK",
        "Progress": "3",
        "Status": "active",
        "StatusMessage": "pending",
        "UserBucket": {
            "S3Bucket": "my-import-bucket",
            "S3Key": "vms/my-server-vm.vmdk"
        }
    }
}

监控快照导入任务
aws ec2 describe-import-snapshot-tasks --import-task-ids import-snap-1234567890abcdef0
以下为响应示例。所示状态为 active,表明正在导入。当状态为 completed 时,表示快照可供使用。
{
    "ImportSnapshotTasks": [
        {
            "Description": "VM import first CLI task",
            "ImportTaskId": "import-snap-1234567890abcdef0",
            "SnapshotTaskDetail": {
                "Description": "My server VMDK",
                "DiskImageSize": "3.115815424E9",
                "Format": "VMDK",
                "Progress": "22",
                "Status": "active",
                "StatusMessage": "downloading/converting",
                "UserBucket": {
                    "S3Bucket": "my-import-bucket",
                    "S3Key": "vms/my-server-vm.vmdk"
                },
            }
        }
    ]
}

取消导入快照任务:
aws ec2 cancel-import-task --import-task-id import-snap-1234567890abcdef0

自我判定

序号

判定描述

自我判定(是/否)

1

在各搜索引擎中是否能找到知识信息(包括但不限于Google、百度、Bing)

2

是否需要代码集成开发