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

Ale*_*x B 5 amazon-ec2

我想要一个自动化的 AMI 创建过程,剩下的一个是在创建映像后自动清理实例。

该实例使用执行必要设置的用户数据脚本启动,然后使用AWS CLI从 self 启动映像创建。然后它关闭。我可以--no-reboot选择并在那里等待,直到图像准备好,然后终止,但文档指出“无法保证创建的图像上的文件系统完整性”,所以我想避免使用它。

映像创建完成后,从自身杀死实例的最佳方法是什么?

Eri*_*ond 6

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

  1. 启动 EC2 实例,将 instance-initiated-shutdown-behavior 设置为“终止”,然后从实例内部设置“sudohalt”或等效项。

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

第一种方法要简单一些,并且实例能够终止其他实例的风险较小,但是您已经从实例调用 AWS API,因此您已完成 rm /etc/rc2.d/S90halt- after-create-image 也是第二种方法。

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

您可以简单地将所需的暂停/终止命令放入像 /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
Run Code Online (Sandbox Code Playgroud)

此代码创建一个启动脚本,如果某些条件为真,该脚本会自行删除并停止系统。如果出现问题,可能会造成普遍的破坏。在 Ubuntu 12.04 上测试。可能无法在其他地方工作。