55 votes

Comment allumer des instances EC2 et télécharger/exécuter un script de démarrage sur chacune d'elles ?

Je veux automatiser le lancement d'un ensemble d'instances Linux EC2.

En gros, je veux écrire un script/programme qui :

  • Instancier N occurrences d'un de mes AMI donné.
  • Pour chaque instance démarrée, il téléchargerait un script personnalisé et laisserait le script s'exécuter dans l'instance.

En utilisant VMWare, je le ferais typiquement en utilisant vmrun ou le SDK de Vix.

Quelles sont les options d'Amazon AWS/EC2 ?

86voto

Eric Hammond Points 10699

La réponse dépend un peu de l'AMI que vous exécutez, car les fonctionnalités fournies dépendent entièrement de l'AMI.

L'AMIS d'Amazon Linux et les AMI officielles d'Ubuntu ont l'avantage d'avoir les mêmes caractéristiques. cloud-init paquet installé. Il existe plusieurs façons de déclencher des actions de démarrage, mais celle qui correspond le mieux à votre demande (et ma préférée car je l'ai inventée) est le concept de données utilisateur script .

Vous pouvez simplement passer tout script (commençant par les deux caractères # !) comme données utilisateur lors du démarrage des instances EC2. Il sera exécuté en tant que Root lors du premier démarrage de l'instance.

Pour un exemple précis de ce fonctionnement, j'utilise cette technique exacte dans mon récent article : Télécharger la clé d'hôte ssh connue dans les données utilisateur EC2 script.

Vous vouliez également exécuter plus d'une instance EC2 avec le même script. La commande ec2-run-instances ainsi que les API et la console Web associées vous permettent de spécifier un nombre quelconque d'instances à lancer avec les mêmes données utilisateur. Par exemple :

ec2-run-instances            \
  --instance-count 10        \
  --user-data-file $MYSCRIPT \
  --key $USER                \
  $SOMEAMI

Si vous utilisez actuellement une AMI qui n'a pas installé cloud-init, vous pouvez faire l'une des choses suivantes :

  • Passez à une AMI sur laquelle cloud-init est installé, ou

  • Créez une version personnalisée de votre AMI sur laquelle cloud-init est installé, ou bien

  • Écrivez une enveloppe script plus compliquée qui fait un enregistrement de tous les ids d'instance après qu'ils aient été démarrés, attend que toutes les instances passent à l'état de fonctionnement, attend que le sshd accepte les connexions, télécharge votre script de démarrage sur chaque instance, et exécute le script de démarrage sur chaque instance.

21 votes

L'un des avantages de l'OS est qu'au moment où vous commencez à trouver des conseils, le type dont le nom commence à apparaître dans toutes vos requêtes Google a répondu personnellement à votre question. Génial :-)

0 votes

J'éviterais l'option 3 de la réponse ci-dessus. J'ai rencontré deux écueils différents avec cette approche. 1) Une instance a une adresse IP que vous avez déjà vue, et l'entrée known_hosts ne correspond pas. 2) La machine qui télécharge et contrôle toutes les instances et les scripts de démarrage est surchargée et tout se casse.

10 votes

Meilleure citation du SO : "et ma préférée parce que je l'ai inventée"

2voto

Chetabahana Points 3161

J'ai un tutoriel pour exécuter le script dans le "cloud-init". qui s'exécute à chaque démarrage d'AWS EC2.

  • pour définir le fichier de configuration (AWS CentOS6) et

  • Exécutez les scripts lorsque vous démarrez l'EC2.

Pour définir le fichier de configuration sous Linux, vous pouvez vous référer à configurer cloud-init sur AWS Linux .

J'utilise personnellement AWS VPC/EBS qui a été configuré sur la base de l'AMI Linux, je n'ai rien touché au fichier de configuration. /etc/cloud/cloud.cfg mais mon boot script dans le cloud-init fonctionne bien.

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