亚马逊AWS官方博客

将VMware 中的Ubuntu 12.04 映像导入成Amazon EC2 AMI

(本操作文档部分叙述内容与技术知识引用自AWS官方网站)

要在 Amazon EC2 中使用您的 VM,您必须首先将其从虚拟化环境中导出,然后使用 AWS Command Line Interface (AWS CLI) 或 API 工具将其导入 Amazon EC2。(AWS Console不支持从VM导入AWS的操作功能。)

从总体上看,要将VM导入到Amazon EC2中,需要经过以下五个步骤:

1. 安装 AWS CLI。

2. 为 VM 导入 Amazon EC2 做准备。

3. 从虚拟化环境中导出 VM。

4. 将 VM 导入 Amazon EC2。

5. 在 Amazon EC2 中启动实例。

本次实验使用VMware Workstation 10,把Ubuntu原生镜像ubuntu-12.04.5-desktop-amd64.iso导入到VMware Workstation 10。自行个性化操作后,利用VMware Workstation 10导出OVF映像的功能,获得VM的vmdk文件。并用AWS CLI,以流优化型 ESX 虚拟机磁盘 (VMDK) 映像格式把它导入到Beijing Region的AMI当中。(AWS并不完全支持所有基于Windows或Linux操作系统的系统版本,具体的支持列表请查看http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/VMImportPrerequisites.html)。

一.安装AWS CLI
在本地安装AWS CLI具体请查看http://docs.aws.amazon.com/zh_cn/cli/latest/userguide/installing.html。需要注意的是,安装完客户端后,需要在AWS账户的IAM->用户->(目标用户)->安全证书 中创建并下载访问安全密钥,根据下载的Excel文件中的AWS Access Key ID和AWS Secret Access Key,配置好AWS CLI。具体请看以下截图。

二.为 VM 导入 Amazon EC2 做准备

把个性化操作后的Ubuntu VM从VMware Workstation 10导出前,需要在VM中进行以下几步重要的操作:

1. 在VM中启用SSH远程访问,并保证VM防火墙允许外部访问VM。虽然允许基于密码的SSH,但为安全起见,建议使用公共密钥登录。

2. 在VM中配置一个非root用户。虽然允许root登录,但为了安全起见,建议配置一个非root用户。

3. 确保您的 Linux VM 将 GRUB(传统 GRUB)或 GRUB 2 作为其启动加载程序。

4. 确保您的 Linux VM 使用下列根文件系统之一:EXT2、EXT3、EXT4、Btrfs、JFS 或 XFS。

5. 关闭所有反病毒软件,从您的 VMware 虚拟机上卸载 VMware 工具。

6. 保持您的网络设置为 DHCP 而不是静态 IP 地址。

在本次的操作中,由于我们使用原生的Ubuntu ISO文件,因此一般情况下,我们只需要操作上述的第1、2、6点即可。

三.从虚拟化环境中导出 VM

AWS支持下列四种映像格式:

1. 用于导入磁盘和 VM 的 RAW 格式。

2. 固定和动态虚拟硬盘 (VHD) 映像格式,该格式与 Microsoft Hyper-V 和 Citrix Xen 虚拟化产品兼容。目前不支持 VHDX 映像。VM Export 仅支持动态虚拟硬盘 (VHD)。不支持固定 VHD。

3. 流优化型 ESX 虚拟机磁盘 (VMDK) 映像格式,该格式可与 VMware ESX 和 VMware vSphere 虚拟化产品兼容。只能将通过 VMware 中的 OVF 导出过程创建的 VMDK 文件导入 Amazon EC2

4. 启动虚拟装置 (OVA) 映像格式,该格式支持将映像与多个硬盘一起导入。

AWS官方文档中提到Citrix Xen、Microsoft Hyper-V 和 VMware vSphere这三款虚拟化环境软件。其中VMware vSphere支持导出OVF格式和OVA格式。而最常用的VMware Workstation系列软件,则只支持导出OVF格式。考虑到VMware vSphere是一款操作系统软件,而VMware Workstation是一款应用软件,为了简化复杂程度,我们使用VMware Workstation 10,也就决定了我们使用第三种的映像格式。

当在VM上个性化操作后,关闭VM,然后在VMware Workstation 10菜单栏中的“文件”->”导出为OVF”中把选中的VM导出到磁盘中。导出后一共有.mf、.ovf、.vmdk三个文件,个别操作系统的VM会出现.iso原生镜像文件。其中.mf文件是一些文件SHA的集合,主要起到防止映像文件被非法用户篡改的验证作用。.ovf文件相当于配置文件,它保证了映像文件vmdk、资源文件iso与虚拟机domain配置之间的正确对应。.vmdk文件是具体的映像资源。在这里,我们只需要把.vmdk文件上传到AWS S3的bucket即可

四.将 VM 导入 Amazon EC2
在这一步中,我们需要使用AWS CLI操作S3中的.vmdk文件,把该文件转换为AMI。在这个过程当中,我们所使用的CLI命令import-image需要在我们的账户中创建名为vmimport的角色,并为该角色配置相关的策略和为使用IAM身份登录的用户配置权限后(http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/VMImportPrerequisites.html),才能够执行特定的操作。因此在转换为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",

        "S3Key": "OVA_ubuntu_12.04/Ubuntu12.04-disk1.vmdk"

    }

}]

如果该VM具有多个显示磁盘,import-image命令也支持具有多个显示磁盘的VM导入Amazon EC2中。在这种情况下,containers.json文件的内容类似于:

[{

    "Description": "First CLI task",

    "Format": "vmdk",

    "UserBucket": {

        "S3Bucket": "my-import-bucket",

        "S3Key": "my-windows-2008-vm-disk1.vmdk"

    }

},

 

 {

    "Description": "Second CLI task",

    "Format": "vmdk",

    "UserBucket": {

        "S3Bucket": "my-import-bucket",

        "S3Key": "my-windows-2008-vm-disk2.vmdk"

    }

}]

特别注意事项:

(1) 上述命令中的description均为注解部分,用户可以根据自己的需要进行修改。

(2) 上述红色字体中的”Format“的值取决于第三步中导出VM的映像格式。如果导出的VM映像格式为ova,请把”Format“的值改为ova。本次实验使用的是流优化型 ESX 虚拟机磁盘 (VMDK) 映像格式,所以”Format“的值为vmdk。

(3) 上述红色字体中的”S3Bucket“的值指的是VM映像所在S3的bucket名字,而”S3Key“的值指的是VM映像所在bucket中的具体路径名,用户可以根据自身情况进行修改。需要注意的是,设定”S3Key“的值时,请注意S3中文件夹的存在。请按照“文件夹/子文件夹/……/文件名”的格式进行填写。

当执行完该命令后,如果没有错误发生,CLI会返回任务响应。在任务相应中含有一个ImportTaskId的值,我们保存下来,方便下面查询使用。

5.检查您的导入映像任务的状态

具体命令:

aws ec2 describe-import-image-tasks --cli-input-json "{ \"ImportTaskIds\": [\"import-ami-fggrs8es\"], \"NextToken\": \"abc\", \"MaxResults\": 10 } "

注意事项:

(1) 上述命令中的红色部分为导入映像任务的id值,用户根据上一步保留的ImportTaskId值自行替换,即可查询该任务的情况。

(2) 当使用上述命令查询任务状态时,根据AWS的处理进度,返回任务响应中的Status依次为“Pending”、“Converting”、“Updating”、“Updated”、“Preparing AMI”等。整个的处理过程持续10+分钟,请用户耐心等待。隔一段时间再次查询后,如果Status为“Completed”,则表示映像转换完成,用户可以在EC2的AMI镜像中找到它。

五.在 Amazon EC2 中启动实例
当生成AMI镜像后,我们就能够通过EC2按照正常的方法创建对应的实例。但需要注意的是:您的实例将只有一个 Ethernet 网络接口。另外,对于不同的操作系统,import-image命令对其Licence、最低存储、Internet协议、实例类型等方面有不同的限制和要求,具体请查看http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/VMImportPrerequisites.html的《要求和限制》部分。

作者介绍:

邓明轩

亚马逊AWS解决方案架构师;拥有15年IT 领域的工作经验,先后在IBM,RIM,Apple 等企业担任工程师、架构师等职位;目前就职于AWS,担任解决方案架构师一职。喜欢编程,喜欢各种编程语言,尤其喜欢Lisp。喜欢新技术,喜欢各种技术挑战,目前在集中精力学习分布式计算环境下的机器学习算法。

邱越俊

亚马逊AWS解决方案架构师实习生,擅长Web开发,熟悉使用Java、Javascript、Html5、Mysql数据库,曾在多个互联网公司从事软件平台开发工作,对计算机网络架构、云平台的开发和部署有一定的经验。