综述

本文记录了将Azure中运行的虚机迁移到AWS中EC2运行的实战过程。

原理

使用 VM Import/Export 将虚拟机 (VM) 映像VHD文件,作为 Amazon 系统映像 (AMI) 从虚拟化环境导入到 Amazon EC2 中,并用于启动实例。

步骤

1、查询限制条件

在开始之前,需要了解 VM Import/Export 支持的操作系统和映像格式,以及实例和卷的导入限制。参考:

https://docs.aws.amazon.com/zh_cn/vm-import/latest/userguide/vmie_prereqs.html


2、环境中增加中转机

新增Window EC2设备,用于从Azure侧下载镜像VHD文件。


3、Azure VDH文件下载(解决镜像文件大下载不成功问题)

下载Microsoft Azure Storage Explorer,使用Azure 管理员账户登陆,选择需要迁移的虚拟机,执行VHD文件下载。


4、VHD文件上传S3

4.1、创建 S3 存储桶

通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

选择 Create Bucket。

在 Create a Bucket (创建存储桶) 对话框中,执行以下操作:

对于 Bucket Name,键入azuremigration您的存储桶的名称。

对于 Region,为您的 AMI 选择一个区域。

选择 Create。


4.2、创建服务角色

  1. 利用以下策略创建名为 trust-policy.json 的文件:
  2. {
  3. "Version": "2012-10-17",
  4. "Statement": [
  5. {
  6. "Effect": "Allow",
  7. "Principal": { "Service": "vmie.amazonaws.com" },
  8. "Action": "sts:AssumeRole",
  9. "Condition": {
  10. "StringEquals":{
  11. "sts:Externalid": "vmimport"
  12. }
  13. }
  14. }
  15. ]

}

使用 create-role 命令创建名为 vmimport 的角色,并向 VM Import/Export 提供对该角色的访问权。请确保指定 trust-policy.json 文件的完整路径,并且为路径添加 file:// 前缀。

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

创建名为 role-policy.json 的文件并编写下面的策略,其中,disk-image-file-bucket为存储磁盘映像的存储桶:

  1. {
  2. "Version":"2012-10-17",
  3. "Statement":[
  4. {
  5. "Effect":"Allow",
  6. "Action":[
  7. "s3:GetBucketLocation",
  8. "s3:GetObject",
  9. "s3:ListBucket"
  10. ],
  11. "Resource":[
  12. "arn:aws:s3::: azuremigration",
  13. "arn:aws:s3::: azuremigration/*"
  14. ]
  15. },
  16. {
  17. "Effect":"Allow",
  18. "Action":[
  19. "ec2:ModifySnapshotAttribute",
  20. "ec2:CopySnapshot",
  21. "ec2:RegisterImage",
  22. "ec2:Describe*"
  23. ],
  24. "Resource":"*"
  25. }
  26. ]

}

使用下面的 put-role-policy 命令将策略挂载到之前创建的角色。请务必指定 role-policy.json 文件位置的完整路径。

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


4.3、将映像上传到 Amazon S3

安装AWS CLI,执行命令:aws s3 cp xxx.vhd s3://azuremigration/,完成镜像上传。


4.4、导入 VM镜像

将您的 VM 映像文件上传到 Amazon S3 后,使用 AWS CLI 导入该映像。

aws ec2 import-image --description "bishuiyuantest" --disk-containers "file://containers.json"

下面是一个 containers.json 示例文件。

[

{

"Description": "bishuiyuantest-1",

"Format": "vhd",

"UserBucket": {

"S3Bucket": "azuremigration",

"S3Key": "jiayuefeng0320190509094710.vhd"

}

},

{

"Description": "bishuiyuantest-2",

"Format": "vhd",

"UserBucket": {

"S3Bucket": "azuremigration",

"S3Key": "jiayuefeng03-disk-0-20190509094710.vhd"

}

}


4.5检查导入任务的状态

使用 describe-import-image-tasks 命令返回导入任务的状态。

包括的状态值如下:

  • active — 正在运行导入任务。
  • deleting — 正在取消导入任务。
  • deleted — 导入任务已取消。
  • updating — 导入状态正在更新。
  • validating — 正在验证导入的映像。
  • validated — 已验证导入的映像。
  • converting — 正在将导入的映像转换成 AMI。
  • completed — 导入任务已完成,并且 AMI 已准备就绪,随时可以使用。

aws ec2 describe-import-image-tasks


5、启动VM

基于当前镜像文件启动对应的VM,完成业务节点迁移。