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

阅读数:14 2019 年 11 月 20 日 08:00

将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 文件,因此一般情况下,我们只需要操作上述的第 126 点即可。
** 三.从虚拟化环境中导出 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 数据库,曾在多个互联网公司从事软件平台开发工作,对计算机网络架构、云平台的开发和部署有一定的经验。
** 本文转载自 AWS 技术博客。**

原文链接:
https://amazonaws-china.com/cn/blogs/china/ubuntu-ec2/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布