我想要获得AMI创build的自动化过程,剩下的一部分将在创build映像后自动清除实例。
使用用户数据脚本启动实例,进行必要的设置,然后使用AWS CLI从自我启动图像创build。 然后它closures。 我可以使用--no-reboot选项并等待,直到图像准备好,然后终止,但文档声明“文件系统完整性在创build的图像不能保证”,所以我想避免使用它。
图像创build完成后,从本身中删除实例的最好方法是什么?
有几种方法可以考虑如何从本身终止一个实例:
启动EC2实例,将instance-initiated-shutdown-behavior设置为“terminate”,然后在实例内部执行“sudo halt”或等效命令。
使用IAMangular色启动EC2实例,允许其自行终止,然后从实例调用ec2 terminate-instances API(例如,使用aws-cli)。 从实例元数据中获取实例ID。
第一种方法比较容易,实例能够终止其他实例的风险较小,但是您已经从实例中调用了AWS API,因此您已经是rm /etc/rc2.d/S90halt-第二种方法是在创build图像之后。
现在针对如何在创build映像重启之后触发终止的问题。
您可以简单地将所需的halt / terminate命令放入像/etc/rc.local这样的启动脚本中,并在系统恢复时运行。 正如@AlexB在注释中指出的那样,您需要确保这不会导致图像的新实例停止,因此可能需要testinginstance_id。
没有必要等待新的AMI创build完成。 即使您的实例不再运行,它也会完好无损。
这里有一个很好的改进空间,
# This would be dangerous in a non-EC2 environment or on an instance that # does not fit the criteria in the original question. original_instance_id=$(curl -s http://instance-data/latest/meta-data/instance-id) cat >/etc/rc2.d/S90halt-after-create-image <<EOF #!/bin/sh rm \$0 instance_id=\$(curl -s http://instance-data/latest/meta-data/instance-id) test "\$instance_id" = "$original_instance_id" && sudo halt EOF chmod +x /etc/rc2.d/S90halt-after-create-image
此代码创build一个启动脚本,如果某些条件成立,它将自行删除并暂停系统。 如果事情发生错误,可能会造成一般的骇客。 在Ubuntu 12.04上testing 可能无法在别处工作。
查看packer.io是HashiCorp的一个开源的图像构build工具。
您应该使用它,因为它是Google,Netflix,Target等公司使用的标准工具。 它也被整合到一个名为Spinnaker的高阶开源CD工具中。
您可以使用AMAZON AMI BUILDER。