将实例存储支持的 AMI 转换为 EBS 支持的 AMI
您可以将拥有的实例存储支持的 Linux AMI 转换为 Amazon EBS 支持的 Linux AMI。
重要
您无法转换不属于自己的 AMI。
将由实例存储支持的 AMI 转换为 Amazon EBS-backed AMI
-
从 Amazon EBS-backed AMI 启动 Amazon Linux 实例。有关更多信息,请参阅 使用控制台中的启动实例向导来启动 EC2 实例。Amazon Linux 实例预先安装了 AWS CLI 和 AMI 工具。
-
上传您用于将实例存储支持的 AMI 捆绑到实例的 X.509 私有密钥。我们使用此密钥确保只有您和 Amazon EC2 才能访问您的 AMI。
-
在您的实例上为 X.509 私有密钥创建临时目录,如下所示:
[ec2-user ~]$
mkdir /tmp/cert
-
使用安全复制工具 (如
/tmp/cert
scp) 将您的 X.509 私有密钥从您的计算机复制到您实例上的 目录。以下命令中的my-private-key
参数是您用于通过 SSH 连接到实例的私有密钥。例如:you@your_computer:~ $
scp -i
pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00my-private-key
.pem/path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem
ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com
:/tmp/cert/
-
-
配置环境变量以使用 AWS CLI。有关更多信息,请参阅 Environment variables。
-
(推荐)为您的 AWS 访问密钥、私有密钥和会话令牌设置环境变量。
[ec2-user ~]$
export AWS_ACCESS_KEY_ID=
your_access_key_id
[ec2-user ~]$
export AWS_SECRET_ACCESS_KEY=
your_secret_access_key
[ec2-user ~]$
export AWS_SESSION_TOKEN=
your_session_token
为您的 AWS 访问密钥和私有密钥设置环境变量。
[ec2-user ~]$
export AWS_ACCESS_KEY_ID=
your_access_key_id
[ec2-user ~]$
export AWS_SECRET_ACCESS_KEY=
your_secret_access_key
-
-
为新 AMI 准备 Amazon Elastic Block Store (Amazon EBS) 卷。
-
使用 create-volume 命令在您的实例所在的同一可用区中创建空 EBS 卷。记下命令输出中的卷 ID。
重要
此 EBS 卷不小于原始实例存储根卷。
[ec2-user ~]$
aws ec2 create-volume --size 10 --region
us-west-2
--availability-zoneus-west-2b
-
使用 attach-volume 命令将该卷附加到 Amazon EBS 支持的实例。
[ec2-user ~]$
aws ec2 attach-volume --volume-id
volume_id
--instance-idinstance_id
--device /dev/sdb --regionus-west-2
-
-
创建用于捆绑的文件夹。
[ec2-user ~]$
mkdir /tmp/bundle
-
使用
/tmp/bundle
命令将由实例存储支持的 AMI 的捆绑下载到 ec2-download-bundle。[ec2-user ~]$
ec2-download-bundle -b
amzn-s3-demo-bucket
/bundle_folder
/bundle_name
-m image.manifest.xml -a $AWS_ACCESS_KEY_ID -s $AWS_SECRET_ACCESS_KEY --privatekey/path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem
-d /tmp/bundle -
使用 ec2-unbundle 命令从捆绑重新构建映像文件。
-
将目录更改为捆绑文件夹。
[ec2-user ~]$
cd /tmp/bundle/
-
运行 ec2-unbundle 命令。
[ec2-user bundle]$
ec2-unbundle -m image.manifest.xml --privatekey
/path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem
-
-
将文件从未捆绑的映像复制到新 EBS 卷。
[ec2-user bundle]$
sudo dd if=/tmp/bundle/image of=/dev/sdb bs=1M
-
探测所有未捆绑的新分区的卷。
[ec2-user bundle]$
sudo partprobe /dev/sdb1
-
列出块储存设备以查找要装载的设备名称。
[ec2-user bundle]$
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT /dev/sda 202:0 0 8G 0 disk └─/dev/sda1 202:1 0 8G 0 part / /dev/sdb 202:80 0 10G 0 disk └─/dev/sdb1 202:81 0 10G 0 part在此示例中,要装载的分区是
/dev/sdb1
,但您的设备名称可能有所不同。如果您的卷未分区,则要装载的设备类似于/dev/sdb
(没有设备分区尾部数字)。 -
为新 EBS 卷创建装载点并装载该卷。
[ec2-user bundle]$
sudo mkdir /mnt/ebs
[ec2-user bundle]$sudo mount
/dev/sdb1
/mnt/ebs -
使用您常用的文本编辑器(如
/etc/fstab
或 vim)在 EBS 卷上打开 nano 文件,然后删除实例存储(临时)卷的所有条目。因为 EBS 卷装载在/mnt/ebs
上,所以fstab
文件位于/mnt/ebs/etc/fstab
处。[ec2-user bundle]$
sudo nano /mnt/ebs/etc/fstab
# LABEL=/ / ext4 defaults,noatime 1 1 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0/dev/sdb /media/ephemeral0 auto defaults,comment=cloudconfig 0 2
在本示例中,应删除最后一行。
-
从实例中卸载和分离该卷。
[ec2-user bundle]$
sudo umount /mnt/ebs
[ec2-user bundle]$
aws ec2 detach-volume --volume-id
volume_id
--regionus-west-2
-
按如下所示从新 EBS 卷创建 AMI。
-
创建新 EBS 卷的快照。
[ec2-user bundle]$
aws ec2 create-snapshot --region
us-west-2
--description "your_snapshot_description
" --volume-idvolume_id
-
检查快照是否完整。
[ec2-user bundle]$
aws ec2 describe-snapshots --region
us-west-2
--snapshot-idsnapshot_id
-
使用
aki
命令标识在原始 AMI 上使用的处理器架构、虚拟化类型和内核映像 (describe-images)。对于此步骤,您需要实例存储支持的原始 AMI 的 AMI ID。[ec2-user bundle]$
aws ec2 describe-images --region
IMAGES x86_64 amazon/amzn-ami-pv-2013.09.2.x86_64-s3
--image-idus-west-2
ami-id
--output textami-8ef297be
amazon available public machine aki-fc8f11cc instance-store paravirtual xen在此示例中,架构是
x86_64
,内核映像 ID 是aki-fc8f11cc
。在以下步骤中使用这些值。如果上面命令的输出还列出ari
ID,请记下该 ID。 -
使用新 EBS 卷的快照 ID 和上一步中得到的值注册新 AMI。如果前一命令输出列出了
ari
ID,请通过--ramdisk-id
将其包括在后续命令中。ari_id
[ec2-user bundle]$
aws ec2 register-image --region
us-west-2
--nameyour_new_ami_name
--block-device-mappings DeviceName=device-name
,Ebs={SnapshotId=snapshot_id
} --virtualization-type paravirtual --architecture x86_64 --kernel-idaki-fc8f11cc
--root-device-namedevice-name
-
-
(可选) 测试了您可以从新 AMI 启动实例之后,您可以删除为此过程创建的 EBS 卷。
aws ec2 delete-volume --volume-id
volume_id