web-dev-qa-db-fra.com

Exécutez un script bash après le démarrage de l'instance EC2

J'ai un script sur une instance EC2 qui démarre à distance une autre instance.

Une fois cette instance complètement chargée (démarrage terminé), je veux qu'elle exécute automatiquement un script bash, quelle serait la meilleure façon de procéder?

J'ai besoin que tout soit complètement démarré, fondamentalement le script bash exécute un script de conversion d'image (en utilisant ImageMagick et exécute la commande "wget" plusieurs fois)

Actuellement, le script se trouve ici:

/home/root/beginProcess.sh

Et je peux le démarrer manuellement en exécutant

bash beginProcess.sh

RHEL-6.2-Démarreur-EBS-i386

Il y a aussi un volume EBS attaché à cela, si cela aide, merci!

23
SSH This

Je suggère d'utiliser simplement l'option ser-data pour ec2-run-instances. Il vous permet de donner un script quelconque à la VM qui sera exécutée au premier démarrage. Si vous utilisez ubuntu ou debian, vous pouvez utiliser cloud-init =, ce qui met un peu de poli dans le processus. Si vous utilisez cloud-init, vous pouvez utiliser le [runcmd] section du fichier de configuration pour spécifier les commandes arbitraires à exécuter après le démarrage.

Merci à l'utilisateur SF Eric Hammond pour la page des données utilisateur. Découvrez son site - il a une mine d'informations sur AWS.

Edit: Après relecture, il n'est pas clair si vous vouliez exécuter une commande au démarrage initial ou à chaque démarrage. Les instructions ci-dessus s'appliquent uniquement au démarrage initial. Si vous souhaitez exécuter une commande à chaque démarrage, vous avez quelques options - vous pouvez exécuter une commande via le @reboot directive cron, ou bien vous pouvez ajouter le script à /etc/rc.local, qui sera exécuté à chaque démarrage du système.

32
EEAA

Si vous utilisiez une AMI qui avait le cloud-init package installé (comme Amazon Linux ou Ubuntu), vous pouvez simplement passer le script bash (qui commence par #!) en tant que fichier de données utilisateur et il s'exécutera automatiquement à la fin du processus de démarrage.

Par exemple, cela pourrait être aussi simple que:

ec2-run-instances                             \
  --user-data-file /home/root/beginProcess.sh \
  --key $USER                                 \
  AMI-XXXXXXXX

Voici l'article où j'ai présenté le concept de script de données utilisateur, désormais disponible dans les principales AMI EC2 comme Amazon Linux et Ubuntu: http://alestic.com/2009/06/ec2-user-data-scripts =

Malheureusement, il semble que vous souhaitiez utiliser un RHEL AMI. J'ai exécuté une copie de cela et je n'ai trouvé aucune référence à cloud-init ou à l'exécution de scripts de données utilisateur au premier démarrage, ni fait un test du même travail.

Je ne dis pas que vous devriez changer les distributions Linux juste pour cela, mais Amazon Linux est basé sur RHEL, donc cela pourrait fonctionner pour vous.

Voici un article que j'ai écrit qui pourrait vous aider à déboguer votre script de données utilisateur s'il ne fonctionne pas la première fois: http://alestic.com/2010/12/ec2-user-data-output =

9
Eric Hammond

C'est une vieille question mais je n'ai pu trouver une bonne réponse à cela nulle part. Mon cas d'utilisation avait besoin de réexécuter certaines commandes sur une instance existante en raison de l'arrêt de l'instance et de son redémarrage selon un calendrier.

La réponse typique est d'utiliser les données utilisateur EC2, mais cela ne semble pas fonctionner pour moi. Soit parce que les données utilisateur sont uniquement destinées à l'exécution de commandes sur les instances nouvellement créées (telles que les instances d'amorçage pour la mise à l'échelle), soit parce que la documentation est obsolète. Je ne sais pas lequel, mais je n'ai pas eu de chance de faire travailler quoi que ce soit. Il existe apparemment une méthode pour exécuter des commandes à chaque fois qu'une instance existante démarre affichée ici: Comment faire pour que le script de données utilisateur EC2 s'exécute à nouveau au démarrage ? , mais cela ne fonctionne tout simplement pas du tout pour moi. Rien ne se passe.

Après avoir hésité pendant un certain temps, j'ai pris une photo dans le noir et j'ai juste modifié le fichier .bashrc sur mon instance EC2, et voilà, cela fonctionne exactement comme prévu et exécute mes commandes au démarrage de l'instance. C'est presque trop évident, mais c'est un peu remarquable, il n'est mentionné nulle part.

0
adammtlx

La source faisant autorité pour savoir comment utiliser EC2 UserData pour exécuter un script à chaque démarrage de votre instance est ici . En bref, je crée un script sur l'instance (assurez-vous de le rendre exécutable), puis j'utilise le script userdata suivant:

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

/path/to/script.sh
--//

Il vous suffit de modifier l'avant-dernière ligne pour pointer vers votre script.

Une autre astuce que j'ai trouvée est que si vous jouiez déjà avec cela et que vous aviez un autre script UserData sur l'instance, il est mis en cache sur la machine et ne se met pas à jour lorsque vous modifiez le script UserData. Pour forcer l'utilisation du nouveau script UserData, vous devez exécuter cloud-init clean sur l'instance pour effacer le cache UserData.

0
crockeea