Selbstterminierende AWS EC2-Instanz?

78

Gibt es eine Möglichkeit, dass Amazon Web Services EC2-Instanzen sich selbst beenden können? Hat Amazon etwas, das es einer Instanz ermöglicht, sich selbst zu beenden ("Hara-Kiri"), nachdem sie länger als eine Stunde ausgeführt wurde? Ich könnte die Skripte auf der laufenden Instanz ändern, um dies selbst zu tun, aber das könnte fehlschlagen und ich möchte das Bild nicht bearbeiten, daher möchte ich, dass Amazon die Instanz beendet.

Steve3p0
quelle
2
Zur Verdeutlichung benötige ich einen Not-Aus-Schalter, wenn die Instanz länger als X Stunden dauert. Mein Anwendungsfall ist, dass ich Amazon EC2 verwende, um eine Instanz schnell zu drehen, einen Prozess unter Ubuntu auszuführen (das dauert ungefähr 5 Minuten) und mich dann selbst herunterzufahren. Dies wird von einer Windows-Desktop-App gesteuert. Meistens funktioniert es wie ein Zauber, aber manchmal schließt ein Benutzer seinen Laptop und fährt für eine Woche in den Urlaub. Ratet mal, ich habe AWS-Gebühren für 168 Stunden, die ich nicht brauchte. Wenn jemand mehr Details möchte, kann ich Ihnen alles darüber erzählen. Steve
Steve3p0

Antworten:

97

Führen Sie beide Schritte aus, damit sich eine Instanz selbst beendet:

  1. Starten Sie die Instanz mit --instance-initiated-shutdown-behavior terminateoder einer entsprechenden Instanz in der AWS-Konsole oder im API-Aufruf.
  2. Führen Sie shutdown -h nowals root. Unter Ubuntu können Sie dies in 55 Minuten einrichten, indem Sie Folgendes verwenden:

    echo "sudo halt" | at now + 55 minutes
    

Ich habe vor einiger Zeit einen Artikel über andere Optionen geschrieben, um das gleiche Ziel "In einer Stunde beenden" zu erreichen:

Automatische Beendigung temporärer Instanzen auf Amazon EC2
http://alestic.com/2010/09/ec2-instance-termination

Der Artikel, der ursprünglich geschrieben instance-initiated-shutdown-behaviorwurde, war verfügbar, aber Updates und andere Juwelen finden Sie in den Kommentaren.

Eric Hammond
quelle
Eric, danke, aber ich sehe nicht, wo ich auf der AWS-Konsole die Nummer 1 machen kann. Ich sehe eine Einstellung "Verhalten beim Herunterfahren" im "Assistenten für Instanzen anfordern", aber die einzigen Optionen sind "Beenden" und "Beenden". Dadurch wird die Instanz nicht in einer Stunde gestoppt. Ich werde in der AWS .NET-API, die ich zum Starten der Instanz verwende, überprüfen, ob ich so etwas tun kann.
Steve3p0
6
Sie setzen "Abschaltverhalten" auf "Beenden" und führen dann "Halt" oder "Herunterfahren -h jetzt" für die Instanz aus, wenn Sie möchten, dass sie beendet wird. Planen Sie im Voraus mit "at". (1) und (2) sind erforderliche Schritte in einem einzigen Prozess, keine alternativen Ansätze.
Eric Hammond
2
Gibt es einen Grund für "shutdown -h now" im Gegensatz zu "shutdown -P now"?
Dustin Boswell
3
@EricHammond Der Grund, den ich frage, ist, dass meine Instanzen in etwa 5% der Fälle nicht heruntergefahren werden können (sie bleiben in einem verkeilten Zustand stecken, in dem sie ausgeführt werden, werden aber nicht beendet und können nicht ssh'd werden). Ich habe mich nur gefragt, ob das die Ursache sein könnte.
Dustin Boswell
2
@DustinBoswell Es kann sein, dass Sie "halt" oder "shutdown -h" verwenden, was je nach Systemeinstellungen nicht mit Ausschalten identisch ist. Versuchen Sie stattdessen "sudo poweroff" (oder "sudo shutdown -P now", aber ich mag "poweroff" wegen seiner Ausführlichkeit).
AntonioMO
23

Du kannst das

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

Der ec2 erhält seine aktuelle Instanz-ID und beendet sich selbst.

Tommy
quelle
4
Ich mag diese Methode ... aber es erfordert, dass Sie Anmeldeinformationen für die Instanz eingerichtet haben, um Terminate-Instanzen auszuführen. Dies ist nicht immer der Fall und Sie erhalten den Fehler "Client.UnauthorizedOperation".
RaveTheTadpole
3
Sie können ein Instanzprofil einrichten, wodurch das Einrichten von Anmeldeinformationen überflüssig wird.
Galva
@RaveTheTadpole Wenn eine Instanz sich selbst beenden soll, benötigt sie die Berechtigung, sich selbst zu beenden. Es ist eine implizite Bedingung.
Polvoazul
10

Hoffentlich funktioniert das

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

Hoffe das hilft dir !!!

Venu
quelle
6

Hier ist mein Skript für Self-Terminating

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

Wenn Sie es als zuweisen möchten Selbst Stoppen auf Self-Terminating , können Sie es nur einmal tun.

Gehen Sie in Ihrer EC2-Konsole zu Instanzeinstellungen und ändern Sie das Abschaltverhalten in Stopp . Wenn Sie /etc/cloud/cloud.cfg
konfigurieren, erfahren Sie, wie Sie ein Startskript mit Cloud-Init ausführen .
Folgen Sie der Antwort von Eric Hammond , fügen Sie den Befehl in eine Datei ein und suchen Sie ihn im Skript-pro-Boot- Pfad:

$ 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

Starten Sie Ihre Instanz neu und prüfen Sie, ob das Skript ausgeführt wird:

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

Wenn dies der Fall ist, wird für den Fall, dass Sie vergessen haben, Ihre Instanz zu stoppen, sichergestellt, dass die Instanz selbst beendet wird, wenn sie 55 Minuten lang ausgeführt wird oder zu welcher Zeit auch immer Sie sie im Skript festgelegt haben.

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

The system is going down for halt NOW!

PS: Für alle, die Self-Stop verwenden möchten, sollten Sie beachten, dass nicht alle EC2-Typen beim Neustart selbst wiederhergestellt werden. Ich empfehle die Verwendung von EC2-VPC / EBS mit Ein / Aus-Zeitplan .

Chetabahana
quelle
-1

Ich hatte einen ähnlichen Bedarf, bei dem Webanwendungen EC2-Instanzen auslösten. Ich konnte der Webanwendung nicht vertrauen, dass sie die Instanzen stoppt / beendet, daher habe ich ein Skript erstellt, das in einem separaten Prozess namens "Feeder" ausgeführt wird. Der Feeder ist dafür verantwortlich, die Instanz zu stoppen / zu beenden. Die Webanwendung muss regelmäßig anfordern, dass der Feeder die Instanz "füttert". Wenn eine Instanz "verhungert" (nicht innerhalb eines Timeout-Zeitraums gespeist wird), stoppt / beendet der Feeder sie. Zwei Feeder können gleichzeitig auf verschiedenen Maschinen ausgeführt werden, um Probleme mit einem Feeder-Prozess zu vermeiden. Mit anderen Worten, die Instanz wird auf einem Druckschalter ausgeführt. Wenn der Druck abgelassen wird, wird die Instanz gestoppt / beendet. Dadurch kann ich auch eine Instanz für mehrere Benutzer freigeben.

Bei der ursprünglichen Frage macht der Feeder, der in der EC2-Instanz selbst ausgeführt werden könnte, die Notwendigkeit überflüssig, a priori zu wissen, wie lange die Aufgabe ausgeführt wird, belastet jedoch die Anwendung, regelmäßige Feedings bereitzustellen. Wenn der Laptop geschlossen ist, fällt die Instanz aus.

Der Feeder lebt hier: https://github.com/alessandrocomodi/fpga-webserver und verfügt über eine zulässige Open-Source-Lizenz.

Steve Hoover
quelle