将实例存储支持的 AMI 转换为 EBS 支持的 AMI - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将实例存储支持的 AMI 转换为 EBS 支持的 AMI

您可以将拥有的实例存储支持的 Linux AMI 转换为 Amazon EBS 支持的 Linux AMI。

重要

您无法转换不属于自己的 AMI。

将由实例存储支持的 AMI 转换为 Amazon EBS-backed AMI
  1. 从 Amazon EBS-backed AMI 启动 Amazon Linux 实例。有关更多信息,请参阅 使用控制台中的启动实例向导来启动 EC2 实例。Amazon Linux 实例预先安装了 Amazon CLI 和 AMI 工具。

  2. 上传您用于将实例存储支持的 AMI 捆绑到实例的 X.509 私有密钥。我们使用此密钥确保只有您和 Amazon EC2 才能访问您的 AMI。

    1. 在您的实例上为 X.509 私有密钥创建临时目录,如下所示:

      [ec2-user ~]$ mkdir /tmp/cert
    2. 使用安全复制工具 (如 /tmp/certscp) 将您的 X.509 私有密钥从您的计算机复制到您实例上的 目录。以下命令中的 my-private-key 参数是您用于通过 SSH 连接到实例的私有密钥。例如:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/ pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00
  3. 配置环境变量以使用 Amazon CLI。有关更多信息,请参阅 Environment variables

    1. (推荐)为您的 Amazon 访问密钥、私有密钥和会话令牌设置环境变量。

      [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
    2. 为您的 Amazon 访问密钥和私有密钥设置环境变量。

      [ec2-user ~]$ export AWS_ACCESS_KEY_ID=your_access_key_id [ec2-user ~]$ export AWS_SECRET_ACCESS_KEY=your_secret_access_key
  4. 为新 AMI 准备 Amazon Elastic Block Store (Amazon EBS) 卷。

    1. 使用 create-volume 命令在您的实例所在的同一可用区中创建空 EBS 卷。记下命令输出中的卷 ID。

      重要

      此 EBS 卷不小于原始实例存储根卷。

      aws ec2 create-volume \ --size 10 \ --region us-west-2 \ --availability-zone us-west-2b
    2. 使用 attach-volume 命令将该卷附加到 Amazon EBS 支持的实例。

      aws ec2 attach-volume \ --volume-id vol-01234567890abcdef \ --instance-id i-1234567890abcdef0 \ --region us-west-2
  5. 创建用于捆绑的文件夹。

    [ec2-user ~]$ mkdir /tmp/bundle
  6. 使用 /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
  7. 使用 ec2-unbundle 命令从捆绑重新构建映像文件。

    1. 将目录更改为捆绑文件夹。

      [ec2-user ~]$ cd /tmp/bundle/
    2. 运行 ec2-unbundle 命令。

      [ec2-user bundle]$ ec2-unbundle -m image.manifest.xml --privatekey /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem
  8. 将文件从未捆绑的映像复制到新 EBS 卷。

    [ec2-user bundle]$ sudo dd if=/tmp/bundle/image of=/dev/sdb bs=1M
  9. 探测所有未捆绑的新分区的卷。

    [ec2-user bundle]$ sudo partprobe /dev/sdb1
  10. 列出块储存设备以查找要装载的设备名称。

    [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 (没有设备分区尾部数字)。

  11. 为新 EBS 卷创建装载点并装载该卷。

    [ec2-user bundle]$ sudo mkdir /mnt/ebs [ec2-user bundle]$ sudo mount /dev/sdb1 /mnt/ebs
  12. 使用您常用的文本编辑器(如 /etc/fstabvim)在 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

    在本示例中,应删除最后一行。

  13. 从实例中卸载和分离该卷。

    [ec2-user bundle]$ sudo umount /mnt/ebs [ec2-user bundle]$ aws ec2 detach-volume --volume-id vol-01234567890abcdef --region us-west-2
  14. 按如下所示从新 EBS 卷创建 AMI。

    1. 创建新 EBS 卷的快照。

      [ec2-user bundle]$ aws ec2 create-snapshot --region us-west-2 --description "your_snapshot_description" --volume-id vol-01234567890abcdef
    2. 检查快照是否完整。

      [ec2-user bundle]$ aws ec2 describe-snapshots --region us-west-2 --snapshot-id snap-0abcdef1234567890
    3. 使用 aki 命令标识在原始 AMI 上使用的处理器架构、虚拟化类型和内核映像 (describe-images)。对于此步骤,您需要实例存储支持的原始 AMI 的 AMI ID。

      [ec2-user bundle]$ aws ec2 describe-images --region us-west-2 --image-id ami-0abcdef1234567890 --output text IMAGES x86_64 amazon/amzn-ami-pv-2013.09.2.x86_64-s3 ami-8ef297be amazon available public machine aki-fc8f11cc instance-store paravirtual xen

      在此示例中,架构是 x86_64,内核映像 ID 是 aki-fc8f11cc。在以下步骤中使用这些值。如果上面命令的输出还列出 ari ID,请记下该 ID。

    4. 使用新 EBS 卷的快照 ID 和上一步中得到的值注册新 AMI。如果前一命令输出列出了 ari ID,请通过 --ramdisk-id ari_id 将其包括在后续命令中。

      [ec2-user bundle]$ aws ec2 register-image --region us-west-2 --name your_new_ami_name --block-device-mappings DeviceName=device-name,Ebs={SnapshotId=snap-0abcdef1234567890} --virtualization-type paravirtual --architecture x86_64 --kernel-id aki-fc8f11cc --root-device-name device-name
  15. (可选) 测试了您可以从新 AMI 启动实例之后,您可以删除为此过程创建的 EBS 卷。

    aws ec2 delete-volume --volume-id vol-01234567890abcdef