答案1
有几种方法可以考虑如何终止实例本身:
启动 EC2 实例,将 instance-initiated-shutdown-behavior 设置为“terminate”,然后在实例内部执行“sudo halt”或同等操作。
使用允许其自行终止的 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 上测试。可能在其他地方不起作用。