EC2自动缩放AMI并自动从快照中附加新的EBD

尝试解决如何configurationEC2自动缩放以在生成新实例时自动附加和EBS卷。

理想情况下,当产生新实例时,我们试图实现以下目标。

  1. 从主实例生成快照,该实例是组中当前活动的实例之一(这可能会随着自动缩放添加和删除实例而变化)。

  2. 从我们的AMI创build一个新的实例

  3. 从1中的快照创build一个EBS卷。

  4. 将卷连接并挂载到实例

  5. 将新实例添加到负载均衡器。

这可能吗。 关键问题是与处理EBS方面的东西… … –

任何build议

一些基本的API调用可能会达到某种程度。 如何使API调用取决于你,他们可以使用已经在path中的工具(或者至less它们已经在那里)或者通过使用Amazon已经构build的SDK的各种库从命令行完成,包括Java,Ruby,Python,PHP和.NET。 下面的说明针对的是使用bash脚本的linux机器,尽pipe它们有类似的Windows命令,但我不知道与它们的使用有关的怪癖。

我使用AMI来引用亚马逊机器映像和API调用,以引用命令行工具(都称为AMI工具)和API工具,因为它们的命名是唯一的。

  1. 要从EBS卷生成快照,必须将卷从实例中分离出来。 要在生产环境中执行此操作,您可能希望只有一个只写操作日志的从服务器,因此您可以卸载该服务器,快照,重新挂载驱动器,并应用任何缺less的操作来进行跟踪。

    • 卸载机器上的实例,注意处理应用程序中的任何后果(如没有数据库写入)。 通常我使用umount -v / dev / sdf / $ MOUNT_DIR。 使用-v开关来获取一些输出以进行error handling。
    • 传递卷的卷标以使用ec2-create-snapshot创build快照 。 这个驱动器不需要卸载就可以做到这一点,但是如果你这样做更安全。 某些文件系统(如xfs)可以冻结文件系统,以便安装挂载的快照。 确保保存快照ID以备后用。
    • 如果需要,使用mount -v -t [filesystem type] / dev / sdf / $ MOUNT_DIR

  2. 从已部署的AMI绑定新实例相当简单。 理想情况下,您的AMI设置为使所有大多数静态信息(configuration,库,安装的程序等)位于设备的临时存储器上,并且所有数据(dbs,日志等)都存储在所连接的驱动器上。 这是理想的,因为AMI绑定命令需要lockingFS,但允许您排除某些目录。 注意:对于其中的每一个,您都需要提供您的亚马逊凭证,其中涵盖了您的帐户页面中的多项内容,包括您的访问密钥ID,秘密访问密钥,证书,私钥和AWS账户ID。

    • 使用ec2-bundle-vol捆绑您的根文件系统
    • 使用ec2-upload-bundle将软件包上传到Amazon
    • 向Amazon注册捆绑包,以便使用ec2-register启动一个实例。 跟踪新的AMI ID以供稍后使用以重新启动。
    • 要启动一个图像,无论是刚刚创build的还是想要重新使用的图像,都可以调用ec2-run-instances ,根据需要指定细节。

  3. 使用API​​调用从快照创buildEBS很容易。

    • 获得快照ID后,只需创build卷并使用ec2-create-volume指定ID即可。 但是,请注意,卷的大小必须与快照大小相同,如果您需要增加大小,请同时安装较大的驱动器,并以您最喜爱的方式复制数据。

  4. 要附加和安装驱动器,您需要在操作系统命令上执行API调用的组合。

    • 使用ec2-create-volume并parsing卷ID的命令返回,以便您可以调用ec2-attach-volume 。 对于卷信息,请安装到较新的设备位置,因为较早的设备位置通常用于临时存储(实例本身)。 在Linux上,从/ dev / sdf或更高版本开始。 我在这篇文章中使用了/ dev / sdf,但是只要你是一致的,任何在f和p之后的文字都应该可以工作。
    • 将设备安装到文件系统中。 在Linux中,我使用mount -v -t [文件系统types] / dev / sdf / $ MOUNT_DIR。 -v开关给你一些输出,你可以parsingerror handling。

  5. 再次,另一个API调用。 我通过自动脚本使用这个方面没有太多的经验,但是它应该像调用elb-register-instances-with-lb一样简单。

请务必使用这些调用的响应进行error handling。 几个月前,我特别烦恼ec2-upload-bundle调用超时,并没有完成上传整个图像。 如果您决定使用SDK,那么这些步骤应该与SDK中包含的所有Amazon API命令大致相同,尽pipe语法不同。