我想要一个自动创建 AMI 的过程,剩下的一件就是在创建映像后自动清理实例。
该实例使用执行必要设置的用户数据脚本启动,然后使用AWS CLI从自身开始创建映像。然后它关闭。我可以--no-reboot
选择选项并在那里等到图像准备好,然后终止,但文档指出“无法保证创建的图像的文件系统完整性”,所以我想避免使用它。
完成映像创建后从自身中杀死实例的最佳方法是什么?
我想要一个自动创建 AMI 的过程,剩下的一件就是在创建映像后自动清理实例。
该实例使用执行必要设置的用户数据脚本启动,然后使用AWS CLI从自身开始创建映像。然后它关闭。我可以--no-reboot
选择选项并在那里等到图像准备好,然后终止,但文档指出“无法保证创建的图像的文件系统完整性”,所以我想避免使用它。
完成映像创建后从自身中杀死实例的最佳方法是什么?
有几种方法可以考虑如何从自身终止实例:
启动 EC2 实例,将 instance-initiated-shutdown-behavior 设置为“terminate”,然后从实例内部设置“sudo halt”或等效项。
使用允许其自行终止的 IAM 角色启动 EC2 实例,然后从实例调用 ec2 terminate-instances API(例如,使用 aws-cli)。从实例元数据中获取实例 ID。
第一种方法要容易得多,并且实例能够终止其他实例的风险较小,但是您已经从实例调用 AWS API,因此您已经完成了 rm /etc/rc2.d/S90halt- 的一半after-create-image 也是第二种方法。
现在是关于如何在 create-image 重新启动后触发终止的问题。
您可以简单地将所需的停止/终止命令放入 /etc/rc.local 之类的启动脚本中,当系统重新启动时它会运行。正如@AlexB 在评论中指出的那样,您需要确保这不会导致带有图像的新实例停止,因此也许可以测试 instance_id。
无需等待新的 AMI 创建完成。即使您的实例不再运行,它也会很好地完成。
这是一个有很大改进空间的快速技巧:
此代码创建一个启动脚本,如果某些条件为真,该脚本会自行删除并暂停系统。如果出现问题,可能会导致普遍的破坏。在 Ubuntu 12.04 上测试。可能无法在其他地方工作。
查看来自HashiCorp的开源图像构建工具 packer.io。
您应该使用它,因为它是 Google、Netflix、Target 等公司使用的标准工具。它还被合并到称为Spinnaker的更高阶开源 CD 工具中。
您可以使用亚马逊 AMI 构建器。