创建映像时自动终止 EC2 实例

创建映像时自动终止 EC2 实例

我想要实现 AMI 创建的自动化流程,剩下的一件事就是在创建图像后自动清理实例。

实例启动时用户数据脚本完成必要的设置,然后使用以下命令开始创建镜像AWS CLI。然后它就关闭了。我可以选择--no-reboot等待,直到图像准备好,然后终止,但文档指出“无法保证所创建图像上的文件系统完整性”,所以我想避免使用它。

图像创建完成后,终止实例的最佳方法是什么?

答案1

有几种方法可以考虑如何终止实例本身:

  1. 启动 EC2 实例,将 instance-initiated-shutdown-behavior 设置为“terminate”,然后在实例内部执行“sudo halt”或同等操作。

  2. 使用允许其自行终止的 IAM 角色启动 EC2 实例,然后从实例调用 ec2 终止实例 API(例如,使用 aws-cli)。从实例元数据中获取实例 ID。

第一种方法相当简单,并且实例终止其他实例的风险较小,但是您已经从实例调用了 AWS API,因此您也已经完成了第二种方法的一半。

现在的问题是如何在创建映像重启后触发终止。

您只需将所需的停止/终止命令放入启动脚本(如 /etc/rc.local)中,系统重新启动时它就会运行。正如 @AlexB 在评论中指出的那样,您需要确保这不会导致带有该映像的新实例停止,因此也许可以测试 instance_id。

无需等待新 AMI 创建完成。即使您的实例不再运行,它也会顺利完成。

这是一个有很大改进空间的快速技巧:

# 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

此代码创建一个启动脚本,如果满足某些条件,该脚本将自行删除并暂停系统。如果出现问题,可能会造成普遍混乱。已在 Ubuntu 12.04 上测试。可能在其他地方不起作用。

答案2

查看packer.io来自 HashiCorp 的开源图像构建工具。

您应该使用它,因为它是 Google、Netflix、Target 等公司使用的标准工具。它还被纳入了名为大三角帆

您可以使用 AMAZON AMI BUILDER。

相关内容