通常我们做虚拟化,需要先做P2V然后将镜像导入到虚拟机中。而P2V后需要根据虚拟化层所支持的镜像类型做镜像格式的转换。在云平台间的虚拟机迁移,原理是差不多,可以看作是不同的虚拟化平台的迁移。这里我以Azure的VM虚拟机(ARM资源管理模式)迁移到AWS的EC2虚拟机为例:

(如果你使用的是早期的经典模式虚拟机Classic Model VM,请将经典模式转为资源管理模式ARM VM)本篇Blog使用VM Import/Export 可以让您轻松将虚拟机映像从现有环境导入到 Amazon EC2 实例中。

大致步骤与要把大象放到冰箱里总共分几步差不多:

将Azure的VM的镜像导出VHD
将Azure的VM镜像上传到对象存储
将VHD镜像转换为AMI并通过AMI启动EC2

一:创建Azure VHD镜像:

登录到 Azure 门户。
首先在左测工具栏选择需要迁移的“虚拟机”。在“虚拟机”边栏选项卡中进入设置中的“磁盘”。
然后在上方工具栏选择“创建快照”
输入快照的名称 。选择现有的资源组,或键入新资源组的名称。
对于源磁盘,选择要获取其快照的Managed磁盘。
选择用于存储快照的“帐户类型”。 使用Standard HDD,除非需要将其存储在高性能 SSD 上。
单击创建。

选择需要迁移的虚拟机:

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第1张图片

导出VHD文件,创建快照导出(不需要停机,完整只读副本)

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第2张图片

下载镜像并上传到S3对象存储:直接将镜像用EC2下载并上传到AWS的S3对象存储上。

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第3张图片

需要本地安装windows AWS cli的工具,该工具可以通过命令将镜像文件上传到S3上。安装方法:

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/install-windows.html

PS:如果你已经拥有一台安装了aws cli的AWS EC2 windows server可以直接运行命令。

将镜像copy到S3上:

$ aws s3 cp [--options]

注释:aws s3 cp 本地镜像存储的路径 S3://桶的路径
S3命令可以参考:https://docs.amazonaws.cn/cli/latest/userguide/cli-services-s3-commands.html

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第4张图片

二:使用vmimport 工具来实现VHD镜像文件导入与AMI的转换:

1.创建一个角色vmimport并附件策略如下:

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第5张图片

附加策略:

{

"Version": "2012-10-17",

"Statement": [

    {

        "Effect": "Allow",

        "Action": [

            "s3:GetBucketLocation",

            "s3:GetObject",

            "s3:ListBucket"

        ],

        "Resource": [

            "arn:aws-cn:s3:::vmwimport",

            "arn:aws-cn:s3:::vmwimport/*"

        ]

    },

    {

        "Effect": "Allow",

        "Action": [

            "ec2:ModifySnapshotAttribute",

            "ec2:CopySnapshot",

            "ec2:RegisterImage",

            "ec2:Describe*"

        ],

        "Resource": "*"

    }

]

}

2.编辑信任关系:

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第6张图片

信任关系的策略如下:

{

"Version": "2012-10-17",

"Statement": [

{

  "Effect": "Allow",

  "Principal": {

    "Service": "vmie.amazonaws.com"

  },

  "Action": "sts:AssumeRole",

  "Condition": {

    "StringEquals": {

      "sts:Externalid": "vmimport"

    }

  }

}

]

}

3.导入VHD AWS CLI运行命令:

aws ec2 import-image --cli-input-json "{ \"Description\": \"WinServer2008R2\", \"DiskContainers\": [ { \"Description\": \"First CLI task\", \"UserBucket\": { \"S3Bucket\": \"vmwimport\", \"S3Key\" : \"abcd\" } } ]}”

注释:

S3Bucket:是S3 bucket桶的名字
S3Key:是S3 bucket对象的名字
Progress:是进度
StatusMessage:是状态,分别经历 Pending——Converting——Uploading——Booting——Booted
这里我只截图3个状态:
[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第7张图片

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第8张图片

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第9张图片

4.我的AMI(AWS虚拟机镜像)

在EC2中AMI找到我们刚刚转换成功的AMI,并利用该AMI启用一台EC2.

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第10张图片

回顾一下instance的生命周期,当EC2的状态是Running的时候,我们就登录进去:

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第11张图片

这里需要注意的是登录的用户名与密码是你在Azure的VM中的系统用户名与密码信息。

[AWS][迁移] 使用 VM import 将 Azure 虚拟机迁移至 AWS 平台_第12张图片

总结:
本篇以Azure导入映像到AWS为例,其他平台迁移大同小异,因为VM Import/Export 支持的映像类型很多,比如:OVA,VHD/VHDX,VMDK,RAW。

VM Import/Export 可以让您轻松将虚拟机映像从现有环境导入到 Amazon EC2 实例中,然后再将导出回本地环境。它允许您将用于满足 IT 安全、配置管理和合规要求的虚拟机纳入 Amazon EC2 中作为随时可用的实例,从而充分利用其中的现有投资。您还可以将导入的实例导出回本地虚拟化基础设施,从而部署跨 IT 基础设施的工作负载。

除了 Amazon EC2 和 Amazon S3 的标准使用费外,VM Import/Export 无需其他任何费用。

有关EC2的详细教学视频参考:https://edu.51cto.com/center/course/lesson/index?id=517075