aws上传私有化centos镜像到AMI的方法

为什么需要

aws的云主机要选择自己系统的时候,就需要通过自有的AMI镜像来操作的,但是AWS是不支持直接上传ISO包的,所以只能通过aws-cli来上传到S3存储桶里面,然后再导入到AMI镜像中。

导入到AMI的前提是已经在虚拟机上面安装好了系统,然后配置为DHCP,关机之后就可以导入。在windows平台可以使用vmware、HyperV、virtualBox等虚拟机软件,在导出格式时,尽量选择使用ova的格式。但由于某些原因,我们这次使用centos的KVM来做虚拟化。

安装镜像

我们使用kvm来安装需要的镜像,由于aws不支持qcow2格式,所以直接使用了raw格式:

1
2
qemu-img create -f raw -o size=5G /data/raw/raw-disk01.raw
virt-install --name wsos2 --virt-type kvm --ram 32768 --vcpus=16 --cdrom=/cache2/WSOS.iso --disk path=/cache2/raw-disk01.raw --network=bridge:virbr0 --graphics vnc,listen=0.0.0.0,port=5968,password=xxx --noautoconsole

运行之后,可以使用VNC来观察安装的进展。

kvm具体使用方法可以参考 实战CentOS7安装且使用KVM虚拟机

安装完成之后,把网卡配置为DHCP,这一步是必须的,然后直接关机即可。这样就准备好了虚拟化的文件了。

AMI制作

主要有几步:

  • 安装与配置awscli
  • 创建服务角色以方便S3的上传
  • 导入镜像

安装与配置awscli

使用 pip 安装 AWS CLI:

1
pip install awscli --upgrade --user

更多安装方法参考:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-install.html

配置AWS CLI:

1
2
3
4
5
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json

第一次运行的时候需要配置CLI,AWS CLI 会提示您输入四条信息,并将它们存储在名为 default 的配置文件(一个设置集合)中。每当您运行的 AWS CLI 命令未明确指定要使用的配置文件时,就会使用该配置文件。
参考:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-configure.html

创建服务角色

1、创建名为 trust-policy.json 的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Version": "2019-04-01",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "vmie.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals":{
"sts:Externalid": "vmimport"
}
}
}
]
}

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

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

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

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

其中

1
2
"arn:aws-cn:s3:::disk-image-file-bucket",
"arn:aws-cn:s3:::disk-image-file-bucket/*"

arn:aws-cn:s3为AWS中国区域,disk-image-file-bucket 为存储磁盘映像的存储桶:为存储桶的名称
4、使用put-role-policy命令将策略挂载到之前创建的角色,请指定 role-policy.json 文件位置的完整路径

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

导入镜像

使用以下命令导入镜像,

1
aws ec2 import-image --platform Linux --license-type BYOL --no-encrypted --description _imagedescription_ --architecture x86_64 --disk-containers Format=Raw,UserBucket="{S3Bucket=centosbucket,S3Key=wsos.raw}"

运行之后会返回一个ID,这时就可以使用 aws ec2 describe-import-image-tasks --import-task-ids import-ami-0c0a99df27707ef13 来查看进度,几个状态为:

1
2
3
4
5
6
7
8
9
包括的状态值如下:
active — 正在运行导入任务。
deleting — 正在取消导入任务。
deleted — 导入任务已取消。
updating — 导入状态正在更新。
validating — 正在验证导入的映像。
validated — 已验证导入的映像。
converting — 正在将导入的映像转换成 AMI。
completed — 导入任务已完成,并且 AMI 已准备就绪,随时可以使用。

参考资料

AWS镜像AMI制作

官方文档:VM Import说明

将 RED HAT ENTERPRISE LINUX 镜像部署为 EC2 实例

第 6 章 使用镜像构建器准备并上传云镜像

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/tools/aws-ami.html
  • 本文主题: aws上传私有化centos镜像到AMI的方法
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%