【问题标题】:Self-Terminating AWS EC2 Instance?自行终止的 AWS EC2 实例?
【发布时间】:2012-05-19 11:02:39
【问题描述】:

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

【问题讨论】:

  • 澄清一下,如果实例持续时间超过 X 小时,我需要一个紧急关闭开关。我的用例是我使用 Amazon 的 EC2 快速启动实例,在 Ubuntu 上运行一些进程(大约需要 5 分钟),然后自行关闭。这是由 Windows 桌面应用程序控制的。大多数时候它就像一个魅力,然而,有时用户关闭他们的笔记本电脑并去度假一个星期,你猜怎么着,我有 168 小时的 AWS 费用,我不需要。如果有人想要更多细节,我可以告诉你一切。史蒂夫

标签: amazon-ec2 amazon-web-services terminate


【解决方案1】:

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

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

    echo "sudo halt" | at now + 55 minutes
    

不久前,我写了一篇文章,介绍了实现同样的“在一小时内结束”目标的其他选择:

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

本文最初是在instance-initiated-shutdown-behavior 可用之前编写的,但您会在 cmets 中找到更新和其他珍品。

【讨论】:

  • Eric,谢谢,但我看不到在 AWS 控制台上可以在哪里执行 #1。我在“请求实例向导”中看到“关闭行为”设置,但唯一的选项是“终止”和“停止”。这实际上并没有安排实例在一小时内停止。我将检查我用来启动实例的 AWS .NET API,看看我是否可以做类似的事情。
  • 您将“关闭行为”设置为“终止”,然后在您希望实例终止时对实例执行“暂停”或“现在关闭 -h”。使用“at”提前安排。 (1) 和 (2) 是单个过程中的必需步骤,而不是替代方法。
  • 有什么理由使用“shutdown -h now”而不是“shutdown -P now”?
  • @EricHammond 我问的原因是我的实例在大约 5% 的时间里无法关闭(它们陷入了正在运行但不会终止且不能 ssh 的楔形状态'd 进入)。只是想知道这是否可能是原因。
  • @DustinBoswell 可能是您正在使用“halt”或“shutdown -h”,这与关机不同,具体取决于系统设置。尝试“sudo poweroff”(或“sudo shutdown -P now”,但我喜欢“poweroff”,因为它很冗长)。
【解决方案2】:

你可以这样做

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

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

【讨论】:

  • 我喜欢这种方法...但它要求您在实例上设置凭据才能运行终止实例。情况并非总是如此,您会收到“Client.UnauthorizedOperation”错误。
  • 您可以设置实例配置文件,这样就无需设置凭据。
  • @RaveTheTadpole 如果您希望实例自行终止,则它需要自行终止的权限。这是一个隐含的条件。
【解决方案3】:

希望这会奏效

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

希望对你有帮助!!!

【讨论】:

【解决方案4】:

这是我的自终止

脚本
$ 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'

如果您想在 Self-Terminating 上将其指定为 Self-Stopping,则只能执行一次。

在您的 EC2 Console 中转到 Instance Settings,将 Shutdown Behavior 更改为 Stop
配置/etc/cloud/cloud.cfg,可以参考how to run a boot script using 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

Reboot你的实例,检查脚本是否执行:

$ 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 一起使用。

【讨论】:

    【解决方案5】:

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

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

    feeder 住在这里:https://github.com/alessandrocomodi/fpga-webserver 并拥有许可的开源许可证。

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2018-11-07
      • 2016-12-25
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多