自终止AWS EC2实例?


78

Amazon Web Services EC2实例是否可以自我终止?亚马逊运行了一个多小时后,是否有任何允许实例终止自身的内容(“ Hara-Kiri”)?我可以更改正在运行的实例上的脚本以自行执行此操作,但是这可能会失败,并且我不想编辑映像,因此我希望Amazon杀死该实例。


2
为了明确起见,如果实例的持续时间超过X小时,则需要紧急关闭开关。我的用例是,我使用Amazon的EC2快速旋转实例,在Ubuntu上运行某些过程(大约需要5分钟),然后关闭自身。这是由Windows桌面应用程序控制的。在大多数情况下,它像护身符一样工作,但是,有时用户关闭笔记本电脑并休假一周,然后猜测一下,我有168小时不需要的AWS费用。如果有人需要更多详细信息,我可以告诉您所有信息。Steve
Steve3p0 2012年

Answers:


97

要使实例自身终止,请执行以下两个步骤:

  1. --instance-initiated-shutdown-behavior terminate在AWS控制台或API调用上使用或等效名称启动实例。
  2. shutdown -h now以root身份运行。在Ubuntu上,您可以使用以下命令将其设置为在55分钟内完成:

    echo "sudo halt" | at now + 55 minutes
    

我写了一篇关于其他选项的文章,以实现相同的“在一小时内终止”目标:

在Amazon EC2上自动终止临时实例
http://alestic.com/2010/09/ec2-instance-termination

该文章最初是在撰写之前instance-initiated-shutdown-behavior提供的,但是您会在评论中找到更新和其他宝石。


埃里克(Eric),谢谢,但是我看不到在AWS控制台上可以做的第一件事。我在“请求实例向导”中看到“关闭行为”设置,但是唯一的选项是“终止”和“停止”。这实际上并没有计划实例在一个小时内停止。我将检入用于启动实例的AWS .NET API,以查看是否可以执行类似操作。
Steve3p0 2012年

6
您希望将实例关闭时,将“关闭行为”设置为“终止”,然后在实例上执行“暂停”或“立即关闭-h”。使用“ at”提前预定。(1)和(2)是单个过程中必需的步骤,而不是替代方法。
埃里克·哈蒙德

2
有什么理由要进行“ shutdown -h now”而不是“ shutdown -P now”?
达斯汀·博斯韦

3
@EricHammond我问的原因是我的实例在大约5%的时间内无法关闭(它们陷入运行的楔形状态,但不会终止并且无法被ssh'd)。只是想知道这是否可能是原因。
达斯汀·波斯威尔

2
@DustinBoswell可能是您使用的“停止”或“关闭-h”与关闭电源不同,具体取决于系统设置。尝试使用“ sudo poweroff”(或“ sudo shutdown -P now”,但是我很喜欢“ poweroff”的冗长性)。
AntonioMO

23

你可以这样做

ec2-terminate-instances $(curl -s http://169.254.169.254/latest/meta-data/instance-id)

ec2将获取其当前实例ID并自行终止。


4
我喜欢这种方法...但是它要求您在实例上设置凭据才能运行终止实例。并非总是如此,您将收到“ Client.UnauthorizedOperation”错误。
RaveTheTadpole

3
您可以设置实例配置文件,这样就无需设置凭据。
galva

@RaveTheTadpole如果您希望实例终止自身,则需要获得权限才能终止自身。它是一个隐含条件。
polvoazul

10

希望这会起作用

instanceId=$(curl http://169.254.169.254/latest/meta-data/instance-id/)
region=$(curl http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | awk '{print $3}' | sed  's/"//g'|sed 's/,//g')

/usr/bin/aws ec2 terminate-instances --instance-ids $instanceId --region $region

希望这对您有帮助!


6

这是我的自我终结脚本

$ EC2_INSTANCE_ID="`wget -q -O - http://instance-data/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"
$ echo "ec2-terminate-instances $EC2_INSTANCE_ID" | at now + 55 min || die 'cannot obtain instance-id'

如果要将其分配为“自终止自动停止” ,则只能执行一次。

在您的EC2控制台中,转到“实例设置”,将“关机行为更改 为“停止”
配置/etc/cloud/cloud.cfg,您可以参考如何使用cloud-init运行启动脚本
按照Eric Hammond的回答,将命令放在文件中,然后在scripts-per-boot路径中找到它:

$ echo '#!/bin/sh' > per-boot.sh
$ echo 'echo "halt" | at now + 55 min' >> per-boot.sh
$ echo 'echo per-boot: `date` >> /tmp/per-boot.txt' >> per-boot.sh
$ chmod +x per-boot.sh
$ sudo chown -R root per-boot.sh
$ sudo mv -viu per-boot.sh /var/lib/cloud/scripts/per-boot

重新启动您的实例,检查脚本是否已执行:

$ cat /tmp/per-boot.txt 
per-boot: Mon Jul 4 15:35:42 UTC 2016

如果是这样,以防万一您忘记停止实例,它将向您保证实例在运行了55分钟或在脚本中设置的任何时间都将终止为终止。

Broadcast message from root@ip-10-0-0-32
        (unknown) at 16:30 ...

The system is going down for halt NOW!

PS:对于每个想使用Self-Stopping的人,您应该注意的是,并非所有EC2类型都可以在重启时进行自我恢复。我建议将EC2-VPC / EBSOn / Off Schedule一起使用


-1

我有类似的需求,当时我的Web应用程序启动了EC2实例。我不相信Web应用程序停止/终止实例,所以我创建了一个脚本来运行在一个单独的进程中,称为“ feeder”。Feeder负责停止/终止实例。Web应用程序必须定期请求供稿器“供稿”实例。如果实例“饿死”(在超时时间内未喂饱),则馈送器将停止/终止它。两个供料器可以在不同的机器上同时运行,以防止一个供料器过程出现问题。换句话说,实例在压力开关上运行。释放压力后,实例将停止/终止。这也使我可以在多个用户之间共享一个实例。

对于最初的问题,可以在EC2实例本身中运行的Feeder无需先验地知道任务将运行多长时间,但是这给应用程序提供了周期性的负担。如果笔记本电脑关闭,则实例将关闭。

该供稿器位于此处:https : //github.com/alessandrocomodi/fpga-webserver,并具有开放源代码许可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.