使用Python从qcow2图像文件创建自定义EC2 AMI

使用Python从qcow2图像文件创建自定义EC2 AMI,python,amazon-ec2,cloud,amazon-ami,Python,Amazon Ec2,Cloud,Amazon Ami,我正在编写一个服务,它需要基于qcow2映像文件在每个EC2区域注册自定义AMI 我一直在探索apachelibcloud和boto库,但是似乎构建AMI注册函数是为了基于运行的实例创建一个AMI,我想基于我的qcow2映像文件创建AMI 如果这个问题没有简单的解决办法,我就选一个复杂的。如果由于某种原因,qcow2图像文件无法实现这一点,我还可以访问原始图像文件。我已经成功地通过编程实现了这一点。我的解决方案使用原始图像文件,因为它们可以直接写入磁盘。如果需要从qcow2图像文件进行转换,可以

我正在编写一个服务,它需要基于qcow2映像文件在每个EC2区域注册自定义AMI

我一直在探索apachelibcloud和boto库,但是似乎构建AMI注册函数是为了基于运行的实例创建一个AMI,我想基于我的qcow2映像文件创建AMI


如果这个问题没有简单的解决办法,我就选一个复杂的。如果由于某种原因,qcow2图像文件无法实现这一点,我还可以访问原始图像文件。

我已经成功地通过编程实现了这一点。我的解决方案使用原始图像文件,因为它们可以直接写入磁盘。如果需要从qcow2图像文件进行转换,可以使用
qemu img
手动进行转换,或参见转换步骤

基于原始图像文件的AMI注册过程概述:

  • 选择要用作“实用程序实例”的AMI和相应的AKI。它不必是与您尝试注册的映像相同的操作系统。如果AMI在
    /etc/sudoers
    中启用了
    requirety
    ,则需要确保在尝试SSH到节点时请求伪终端,例如使用Paramiko的
    通道。get_pty()
    方法

  • 基于选定的AMI和AKI启动实用程序实例。它必须经过EBS优化(
    m1.大型
    size实例与EBS配合良好),并且应该连接一个辅助EBS卷,该卷的大小足以容纳要注册的整个未压缩映像。我使用
    /dev/sdb
    作为这个设备名

  • 通过SSH访问实用程序实例后,让它将原始映像文件写入辅助卷。就我个人而言,我从互联网上提取了一个
    .raw.xz
    文件,这就是我想要编写的图像,因此我的实用程序命令是
    sudo sh-c'curl raw\u xz\u URL | xzcat>/dev/xvdb
    。请注意,根据我的所有经验,
    /dev/sdX
    设备在实际实例上作为
    /dev/xvdX
    访问,但并非所有情况都是这样

  • 一旦实用程序命令完成,您可以销毁该实用程序节点,前提是您已使
    /dev/sdb
    卷在节点终止时不被删除。如果没有,请停止节点。如果以编程方式执行实用程序命令,则可以使用Paramiko的
    Channel.recv_exit_status()
    方法等待命令完成,然后检查指示成功的
    0
    退出状态

  • 一旦实用程序实例不再运行,请拍摄
    /dev/sdb
    卷的快照

  • 快照完成后,可以将其注册为AMI。确保使用与您一直使用的相同的AKI,以及正确的根设备名称(我使用完整的磁盘映像,因此我的根设备名称是
    /dev/sda
    ,而不是
    /dev/sda1
    )。亚马逊建议您现在使用hd0 pv grub AKIs,而不是hd00

  • 实现这一切的一种方法是通过
    apachelibcloud
    paramiko
    Python库,这两个库都是可安装的。一个很好的例子是这个库,它实现了这个精确的方法,以便在Fedora云映像构建完成时在所有EC2区域自动注册新的AMI


    在实际实现这个过程时,会涉及很多时间、异常处理和其他“陷阱”。这只是通过我的方法解决挑战所必须采取的步骤的概要。

    我从这篇描述中得到的是,无法将图像直接上传到S3存储桶,必须通过EC2实例插入。