104 votes

Instance AWS EC2 auto-terminante ?

Existe-t-il un moyen pour que les instances EC2 d'Amazon Web Services puissent se terminer automatiquement ? Est-ce qu'Amazon a quelque chose qui permet à une instance de se terminer elle-même ("Hara-Kiri") après avoir fonctionné pendant plus d'une heure, par exemple ? Je pourrais modifier les scripts sur l'instance en cours d'exécution pour qu'elle le fasse elle-même, mais cela pourrait échouer et je ne veux pas modifier l'image, donc je voudrais qu'Amazon tue l'instance.

124voto

Eric Hammond Points 10699

Pour qu'une instance se termine d'elle-même, effectuez ces deux étapes :

  1. Démarrez l'instance avec --instance-initiated-shutdown-behavior terminate ou l'équivalent sur la console AWS ou l'appel API.
  2. Exécuter shutdown -h now en tant que racine. Sur Ubuntu, vous pouvez configurer cette opération pour qu'elle se produise en 55 minutes en utilisant :

    echo "sudo halt" | at now + 55 minutes

J'ai écrit un article il y a quelque temps sur d'autres options pour atteindre ce même objectif de "terminer en une heure" :

Résiliation automatique des instances temporaires sur Amazon EC2
http://alestic.com/2010/09/ec2-instance-termination

L'article a été rédigé avant instance-initiated-shutdown-behavior était disponible, mais vous trouverez des mises à jour et d'autres joyaux dans les commentaires.

27voto

tommyogp Points 339

Vous pouvez le faire

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

L'ec2 obtiendra son identifiant d'instance actuel et se terminera.

14voto

Venu Gopal Points 98

J'espère que cela fonctionnera

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

J'espère que cela vous aidera ! !!

8voto

Chetabahana Points 3161

Voici mon script pour 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'

Si vous voulez l'assigner comme Self-Stopping en Self-Terminating vous ne pouvez le faire qu'une seule fois.

Dans votre Console EC2 aller à Paramètres de l'instance le changement Comportement en cas d'arrêt à Stop .
Configurer /etc/cloud/cloud.cfg vous pouvez vous référer à comment lancer un script de démarrage en utilisant cloud-init .
Suivre la réponse de Eric Hammond , mettez la commande dans un fichier et localisez-le dans scripts-par-boot chemin :

$ 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

Redémarrer votre instance, vérifiez si le script est exécuté :

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

Si c'est le cas, juste au cas où vous auriez oublié d'arrêter votre instance, cela vous assurera que l'instance se terminera d'elle-même en s'arrêtant lorsqu'elle aura fonctionné pendant 55 minutes ou tout autre temps que vous aurez défini dans le script.

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

The system is going down for halt NOW!

PS : Pour tous ceux qui veulent utiliser le Self-Stopping Il convient de noter que tous les types d'EC2 ne se rétablissent pas automatiquement au redémarrage. Je recommande d'utiliser EC2-VPC/EBS avec Programme de marche/arrêt .

0voto

Steve Hoover Points 11

J'avais un besoin similaire, où des applications web faisaient tourner des instances EC2. Je ne pouvais pas faire confiance à l'application web pour arrêter/terminer les instances, j'ai donc créé un script à exécuter dans un processus séparé, appelé le "feeder". Le feeder a la responsabilité d'arrêter/terminer l'instance. L'application web doit périodiquement demander au feeder de "nourrir" l'instance. Si une instance est "affamée" (n'est pas alimentée dans une période de temps donnée), le feeder l'arrêtera/terminera. Deux feeders peuvent être exécutés simultanément sur des machines différentes pour se protéger contre les problèmes d'un processus de feeder. En d'autres termes, l'instance fonctionne sur un interrupteur à pression. Lorsque la pression est relâchée, l'instance est arrêtée/terminée. Cela me permet également de partager une instance entre plusieurs utilisateurs.

Pour répondre à la question initiale, le dispositif d'alimentation, qui pourrait être exécuté dans l'instance EC2 elle-même, élimine le besoin de savoir a priori combien de temps la tâche sera exécutée, mais il impose à l'application de fournir des alimentations périodiques. Si l'ordinateur portable est fermé, l'instance s'arrête.

Le nourrisseur vit ici : https://github.com/alessandrocomodi/fpga-webserver et dispose d'une licence open-source permissive.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X