常见本地自建虚拟机是在 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或者VirtualBox中导出时,直接选择导出为OVF格式,导出后一共有.mf、.ovf、.vmdk三个文件
其中.mf文件是一些文件SHA的集合,主要起到防止映像文件被非法用户篡改的验证作用
.ovf文件相当于配置文件,它保证了映像文件vmdk、资源文件iso与虚拟机domain配置之间的正确对应
.vmdk文件是具体的映像资源。在这里,我们只需要把.vmdk文件上传到AWS S3的bucket即可
当 .vmdk文件上传到AWS S3之后,就要在本机使用CLI的import-image命令,而这需要在我们的账户中创建名为vmimport的角色,并为该角色配置相关的策略和权限后,才能够执行特定的操作。因此在转换为AMI前,我们需要先操作我们的账户。下面会逐步介绍。
使用 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″不变。 |
为角色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名字。 |
为使用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": "*"
}
]
} |
创建新的导入映像任务
经历了上述角色和账户操作后,我们现在终于可以使用 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的值,我们保存下来,方便下面查询使用。 |
aws ec2 describe-import-image-tasks --import-task-ids import-ami-1234567890abcdef0 包括的状态值如下: active — 正在运行导入任务。 deleting — 正在取消导入任务。 deleted — 导入任务已取消。 updating — 导入状态正在更新。 validating — 正在验证导入的映像。 validated — 已验证导入的映像。 converting — 正在将导入的映像转换成 AMI。 completed — 导入任务已完成,并且 AMI 已准备就绪,随时可以使用。 |
注意:同上“将 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 | 是否需要代码集成开发 | 否 |