【问题标题】:Creating a custom EC2 AMI from a qcow2 image file with Python使用 Python 从 qcow2 图像文件创建自定义 EC2 AMI
【发布时间】:2014-07-15 22:13:08
【问题描述】:

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

我一直在探索 apache-libcloudboto 库,但似乎 AMI 注册函数是为基于正在运行的实例创建 AMI 而构建的,我想将 AMI 基于我的 qcow2 图像文件。

如果这个问题没有简单的解决方案,我会选择一个复杂的。如果由于某种原因无法使用 qcow2 图像文件,我也可以访问 RAW 图像文件。

【问题讨论】:

    标签: python amazon-ec2 cloud amazon-ami


    【解决方案1】:

    我已经成功地以编程方式完成了这项工作。我的解决方案使用原始图像文件,因为它们可以直接写入磁盘。如果您需要从 qcow2 图像文件进行转换,您可以使用qemu-img 手动进行,或查看转换的a simple Python implementation

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

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

    2. 根据所选的 AMI 和 AKI 启动实用程序实例。它必须经过 EBS 优化(m1.large 大小的实例可以很好地与 EBS 配合使用)并且应该附加一个足够大的辅助 EBS 卷,以容纳您要注册的整个未压缩映像。我使用/dev/sdb 作为此设备名称。

    3. 通过 SSH 访问实用程序实例后,让它将原始映像文件写入辅助卷。就我个人而言,我从 Internet 上提取了一个 .raw.xz 文件,这是我要写入的图像,因此我的实用程序命令是 sudo sh -c 'curl RAW_XZ_URL | xzcat > /dev/xvdb。请注意,根据我的所有经验,/dev/sdX 设备在实际实例中以/dev/xvdX 的身份访问,但并非所有地方都如此。

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

    5. 在实用程序实例不再运行后,拍摄/dev/sdb 卷的快照。

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

    实现这一切的一种方法是通过apache-libcloudparamiko Python 库,这两个库都是pip-installable。 Fedimg 库就是一个很好的例子,它实现了这种精确的方法,以便在 Fedora 云映像构建完成时自动在所有 EC2 区域中注册新的 AMI。

    在实际实施此过程时,涉及到相当多的时间安排、异常处理和其他“陷阱”。这只是概述了通过我的方法解决挑战所必须采取的步骤。

    【讨论】:

    • 我从这个描述中得到的是,不能将图像直接上传到 S3 存储桶,您必须通过 EC2 实例插入。
    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2019-06-01
    • 2019-01-03
    • 2015-01-16
    • 2021-08-11
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多