Exécuter des commandes au lancement sur votre instance Linux - Amazon Elastic Compute Cloud

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exécuter des commandes au lancement sur votre instance Linux

Lorsque vous lancez une instance dans Amazon EC2, vous avez la possibilité de transmettre les données des utilisateurs vers l’instance qui peut être utilisée pour effectuer des tâches de configuration automatisées communes et même exécuter des scripts après le démarrage de l’instance. Vous pouvez transmettre deux types de données utilisateur vers Amazon EC2 : des scripts shell et des directives cloud-init. Vous pouvez également transférer ces données dans l’assistant de lancement d’instance en tant que texte brut, en tant que fichier (cela est utile pour le lancement d’instance à l’aide des outils de ligne de commande) ou en tant que texte codé en base 64 (pour les appels d’API).

Si vous êtes intéressé par des scénarios d'automatisation plus complexes, vous pouvez envisager AWS CloudFormation ou AWS OpsWorks. Pour plus d’informations, consultez les ressources suivantes :

Pour obtenir des informations sur l’exécution de commandes sur votre instance Windows au lancement, consultez Exécution de commandes sur votre instance Windows lors du lancement et Gestion de la configuration des instances Windows dans le Amazon EC2 Guide de l’utilisateur pour les instances Windows.

Dans les exemples suivants, les commandes du didacticiel : Installation d’un serveur web LAMP sur Amazon Linux 2 sont converties en script shell et en ensemble de directives cloud-init qui est exécuté lors du lancement de l’instance. Dans chaque exemple, les tâches suivantes sont exécutées par les données de l’utilisateur :

  • Les packages logiciels de distribution sont mis à jour.

  • Le serveur web, les packages php et mariadb nécessaires sont installés.

  • Le service httpd est lancé et activé via la commande systemctl.

  • L’utilisateur ec2-user est ajouté au groupe Apache.

  • La propriété et les autorisations sur les fichiers appropriées sont définies pour le répertoire web et les fichiers qu’il contient.

  • Une page Web simple est créée pour tester le serveur Web et le moteur PHP.

Prérequis

Les exemples de cette rubrique supposent ce qui suit :

  • Votre instance possède un nom DNS public auquel on peut accéder à partir d’Internet. Pour plus d’informations, consultez Attribuer automatiquement une adresse IP publique dans la section Paramètres réseau et Création d'un groupe de sécurité.

  • Le groupe de sécurité associé à votre instance est configuré pour autoriser le trafic SSH (port 22) afin de vous permettre de vous connecter à ladite instance pour afficher les fichiers journaux de sortie. Pour plus d’informations, consultez Création d'un groupe de sécurité.

  • Votre instance est lancée avec une AMI Amazon Linux 2. Ces instructions sont destinées à Amazon Linux 2, et il se peut que les commandes et les directives ne fonctionnent pas pour d’autres distributions Linux. Pour obtenir plus d’informations sur d’autres distributions, comme leur support pour cloud-init, consultez leur documentation spécifique.

Données utilisateur et scripts shell

Si vous connaissez le scripting de shell, il s’agit de la méthode la plus simple et la plus complète pour envoyer des instructions à une instance lors du lancement. L’ajout de ces tâches au moment du démarrage augmente le temps que cela prend pour démarrer l’instance. Vous devriez laisser s’écouler quelques minutes supplémentaires pour que les tâches s’effectuent avant de vérifier que le script utilisateur a fini avec succès.

Important

Par défaut, les scripts de données utilisateur et les directives cloud init s’exécutent uniquement pendant le cycle de démarrage lorsque vous lancez une instance pour la première fois. Vous pouvez mettre à jour votre configuration pour vous assurer que vos scripts de données utilisateur et vos directives cloud-init s’exécutent chaque fois que vous redémarrez votre instance. Pour plus d'informations, consultez Comment utiliser les données utilisateur pour exécuter automatiquement un script à chaque redémarrage de mon instance Linux Amazon EC2 ? dans le AWS Knowledge Center.

Les scripts shell de données utilisateur doivent commencer par les caractères #! et le chemin vers interpréteur que vous avez choisi pour la lecture du script (généralement /bin/bash)). Pour une introduction aux scripts shell, consultez le manuel de référence Bash sur le site Web du système d'exploitation GNU.

Les scripts entrés en tant que données utilisateur sont exécutés en tant qu’utilisateur root, donc n’utilisez pas la commande sudo dans le script. N’oubliez pas que tous les fichiers que vous créez seront la propriété de l’utilisateur root. Si vous avez besoin qu’un utilisateur non root ait accès aux fichiers, vous devez modifier les autorisations en conséquence dans le script. Par ailleurs, étant donné que le script n’est pas exécuté de façon interactive, vous ne pouvez pas inclure des commandes qui nécessitent les réactions de l’utilisateur (comme yum update sans l’indicateur -y).

Si vous utilisez une AWS API, y compris la AWS CLI, dans un script de données utilisateur, vous devez utiliser un profil d'instance lors du lancement de l'instance. Un profil d'instance fournit les AWS informations d'identification appropriées requises par le script de données utilisateur pour émettre l'appel d'API. Pour plus d’informations, consultez Utilisation de profils d’instance dans le IAM Guide de l’utilisateur. Les autorisations que vous attribuez au rôle IAM dépendent des services que vous appelez avec l’API. Pour plus d’informations, consultez Rôles IAM pour Amazon EC2.

Le fichier journal de sortie cloud-init () capture la sortie de la console, si bien que vous pouvez facilement déboguer vos scripts après un lancement si l’instance ne se comporte pas comme vous le vouliez. Pour afficher le fichier journal,connexion à l’instanceet ouvrez/var/log/cloud-init-output.log.

Lorsqu’un script de données utilisateur est traité, il est copié dans et exécuté à partir de l /var/lib/cloud/instances/instance-id/. Le script n’est pas supprimé après son exécution. Veillez à supprimer les scripts de données utilisateur dans /var/lib/cloud/instances/instance-id/ avant de créer une AMI à partir de l’instance. Dans le cas contraire, le script figurera dans ce répertoire sur toute instance lancée à partir de l’AMI.

Données utilisateur et console

Vous pouvez spécifier des données utilisateur d’instance lorsque vous lancez l’instance. Si le volume racine de l’instance est un volume EBS, vous pouvez également arrêter l’instance et mettre à jour ses données utilisateur.

Spécification des données utilisateur d’instance au moment du lancement

Suivez la procédure pour lancer une instance. Le champ User data (Données utilisateur) se trouve dans la section Détails avancés de l’assistant de lancement d’instance. Saisissez votre script shell dans le champ User data (Données utilisateur), puis terminez la procédure de lancement de l’instance.

Dans l’exemple de script ci-dessous, le script crée et configure notre serveur web.

#!/bin/bash yum update -y amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2 yum install -y httpd mariadb-server systemctl start httpd systemctl enable httpd usermod -a -G apache ec2-user chown -R ec2-user:apache /var/www chmod 2775 /var/www find /var/www -type d -exec chmod 2775 {} \; find /var/www -type f -exec chmod 0664 {} \; echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

Laissez assez de temps à l’instance pour lancer et exécuter les commandes dans votre script, puis vérifiez que votre script a terminé les tâches que vous souhaitiez.

Pour notre exemple, dans un navigateur web, saisissez l’URL du fichier test PHP que le script a créé. Cette URL est l’adresse DNS publique de votre instance suivie par une barre oblique et le nom du fichier.

http://my.public.dns.amazonaws.com/phpinfo.php

Vous devriez voir la page d’informations PHP. Si vous ne pouvez pas voir la page d’informations PHP, vérifiez que le groupe de sécurité que vous utilisez contient une règle pour permettre le trafic HTTP (port 80). Pour plus d’informations, consultez Ajouter des règles à un groupe de sécurité.

(Facultatif) Si votre script n’a pas accompli les tâches que vous attendiez ou si vous voulez uniquement vérifier que votre script s’est terminé sans erreur, connectez-vous à l’instance, examinez le fichier journal de sortie cloud-init (/var/log/cloud-init-output.log) et recherchez les messages erronés dans les résultats.

Pour obtenir des informations supplémentaires sur le débogage, vous pouvez créer une archive Mime en plusieurs parties qui comporte la section de données cloud-init avec la directive suivante :

output : { all : '| tee -a /var/log/cloud-init-output.log' }

Cette directive envoie la sortie de la commande de votre script à /var/log/cloud-init-output.log. Pour plus d’informations sur les formats de données cloud-init et la création d’archives Mime en plusieurs parties, consultez Formats de cloud-init..

Affichage et mise à jour des données utilisateur d’instance

Pour mettre à jour les données de l’utilisateur de l’instance, vous devez d’abord arrêter l’instance. Si l’instance est en cours d’exécution, vous pouvez afficher les données utilisateur, mais vous ne pouvez pas les modifier.

Avertissement

Lorsque vous arrêtez une instance, les données contenues sur les volumes de stockage d’instances sont effacées. Pour conserver les données provenant des volumes de stockage d’instances, sauvegardez-les sur un stockage permanent.

Pour modifier les données utilisateur d’instance
  1. Ouvrez la console Amazon EC2 à l’adresse https://console.aws.amazon.com/ec2/.

  2. Dans le panneau de navigation, choisissez Instances.

  3. Sélectionnez l’instance et choisissez État de l’instance, Arrêter l’instance. Si cette option est désactivée, l’instance est déjà arrêtée ou son périphérique racine est un volume de stockage d’instances.

  4. Lorsque vous êtes invité à confirmer l’opération, choisissez Arrêter. L’arrêt de l’instance peut prendre quelques minutes.

  5. Alors que l’instance est toujours sélectionnée, choisissez Actions, Instance settings (Paramètres de l’instance), Edit user data (Modifier les données utilisateur).

  6. Modifiez les données utilisateur selon vos besoins, puis choisissez Save (Enregistrer).

  7. Démarrez l’instance. Les nouvelles données utilisateur sont visibles sur votre instance, après son démarrage. Par contre, les scripts des données utilisateur ne sont pas exécutés.

Directives sur les données utilisateur et Cloud-Init

Le package cloud-init configure les aspects spécifiques d’une nouvelle instance Amazon Linux lorsqu’elle est lancée. Il configure plus particulièrement le fichier .ssh/authorized_keys pour l’utilisateur ec2 afin que vous puissiez vous connecter avec votre clé privée. Pour plus d’informations sur les tâches de configuration exécutées par le package cloud init pour les instances Amazon Linux, consultez cloud-init.

Les directives d’utilisateur cloud-init peuvent être transférées vers une instance au moment du lancement tout comme un script, même si la syntaxe est différente. Pour plus d’informations sur cloud-init, consultez http://cloudinit.readthedocs.org/en/latest/index.html.

Important

Par défaut, les scripts de données utilisateur et les directives cloud init s’exécutent uniquement pendant le cycle de démarrage lorsque vous lancez une instance pour la première fois. Vous pouvez mettre à jour votre configuration pour vous assurer que vos scripts de données utilisateur et vos directives cloud-init s’exécutent chaque fois que vous redémarrez votre instance. Pour plus d'informations, consultez Comment utiliser les données utilisateur pour exécuter automatiquement un script à chaque redémarrage de mon instance Linux Amazon EC2 ? dans le AWS Knowledge Center.

L’ajout de ces tâches au moment du démarrage augmente le temps que cela prend pour démarrer une instance. Vous devriez laisser s’écouler quelques minutes supplémentaires pour que les tâches s’effectuent avant de vérifier que vos directives sur les données utilisateur sont terminées.

Pour transférer les directives cloud-init vers une instance avec les données utilisateur
  1. Suivez la procédure pour lancer une instance. Le champ User data (Données utilisateur) se trouve dans la section Détails avancés de l’assistant de lancement d’instance. Saisissez le texte de la directive cloud-init dans le champ User data (Données utilisateur), puis terminez la procédure de lancement de l’instance.

    Pour l’exemple ci-dessous, les directives créent et configurent un serveur Web sur Amazon Linux 2. La ligne #cloud-config en haut est requise pour identifier les commandes en tant que directives cloud-init.

    #cloud-config repo_update: true repo_upgrade: all packages: - httpd - mariadb-server runcmd: - [ sh, -c, "amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2" ] - systemctl start httpd - sudo systemctl enable httpd - [ sh, -c, "usermod -a -G apache ec2-user" ] - [ sh, -c, "chown -R ec2-user:apache /var/www" ] - chmod 2775 /var/www - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ] - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ] - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
  2. Laissez assez de temps à l’instance pour lancer et exécuter les directives dans vos données utilisateur, puis vérifiez que vos directives ont terminé les tâches que vous souhaitiez.

    Pour notre exemple, dans un navigateur Web, saisissez l’URL du fichier test PHP que les directives ont créé. Cette URL est l’adresse DNS publique de votre instance suivie par une barre oblique et le nom du fichier.

    http://my.public.dns.amazonaws.com/phpinfo.php

    Vous devriez voir la page d’informations PHP. Si vous ne pouvez pas voir la page d’informations PHP, vérifiez que le groupe de sécurité que vous utilisez contient une règle pour permettre le trafic HTTP (port 80). Pour plus d’informations, consultez Ajouter des règles à un groupe de sécurité.

  3. (Facultatif) Si vos directives n’ont pas accompli les tâches que vous attendiez ou si vous voulez uniquement vérifier que vos directives se sont terminées sans erreur, connectez-vous à l’instance, examinez le fichier journal de sortie (/var/log/cloud-init-output.log) et recherchez les messages erronés dans les résultats. Pour plus d’informations sur le débogage, vous pouvez ajouter la ligne suivante à vos directives :

    output : { all : '| tee -a /var/log/cloud-init-output.log' }

    Cette directive envoie le résultat runcmd à /var/log/cloud-init-output.log.

Les données de l'utilisateur et le AWS CLI

Vous pouvez utiliser le AWS CLI pour spécifier, modifier et afficher les données utilisateur de votre instance. Pour plus d’informations sur l’affichage des données utilisateur de votre instance à l’aide des métadonnées d’instance, consultez Récupération des données utilisateur d’instance depuis votre instance.

Sous Windows, vous pouvez utiliser le AWS Tools for Windows PowerShell au lieu du AWS CLI. Pour plus d'informations, consultez la section Données utilisateur et outils pour Windows PowerShell dans le Guide de l'utilisateur Amazon EC2 pour les instances Windows.

Exemple : spécification des données utilisateur au moment du lancement

Pour spécifier les données utilisateur lorsque vous lancez l’instance, utilisez la commande run-instances avec le paramètre --user-data. Avecrun-instances, il AWS CLI effectue le codage base64 des données utilisateur pour vous.

L’exemple suivant montre comment définir un script en tant que chaîne sur la ligne de commande :

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data echo user data

L’exemple suivant montre comment définir un script en utilisant un fichier texte. Assurez-vous d’utiliser le préfixe file:// pour spécifier le fichier.

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data file://my_script.txt

L’exemple suivant est celui d’un fichier texte avec un script shell.

#!/bin/bash yum update -y service httpd start chkconfig httpd on
Exemple : Modification des données utilisateur d’une instance arrêtée

Vous pouvez modifier les données utilisateur d'une instance arrêtée à l'aide de la modify-instance-attributecommande. Avecmodify-instance-attribute, le AWS CLI n'effectue pas le codage base64 des données utilisateur pour vous.

  • Sur un ordinateur Linux utilisez la commande base64 pour encoder les données utilisateur.

    base64 my_script.txt >my_script_base64.txt
  • Sur un ordinateur Windows, utilisez la commande certutil pour encoder les données utilisateur. Avant de pouvoir utiliser ce fichier avec le AWS CLI, vous devez supprimer la première ligne (CERTIFICAT DE DÉBUT) et la dernière (CERTIFICAT DE FIN).

    certutil -encode my_script.txt my_script_base64.txt notepad my_script_base64.txt

Utilisez les paramètres --attribute et --value afin d’utiliser le fichier texte encodé pour spécifier les données utilisateur. Assurez-vous d’utiliser le préfixe file:// pour spécifier le fichier.

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --value file://my_script_base64.txt
Exemple : Effacer les données utilisateur d’une instance arrêtée

Pour supprimer les données utilisateur existantes, utilisez la modify-instance-attributecommande suivante :

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --user-data Value=
Exemple : Affichage des données utilisateur

Pour récupérer les données utilisateur d'une instance, utilisez la describe-instance-attributecommande. Avecdescribe-instance-attribute, le AWS CLI n'effectue pas de décodage base64 des données utilisateur pour vous.

aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData

Voici un exemple de sortie avec les données utilisateur base64 encodées.

{ "UserData": { "Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg==" }, "InstanceId": "i-1234567890abcdef0" }
  • Sur un ordinateur Linux, utilisez l’option --query pour obtenir les données utilisateur encodées et la commande base64 pour les décoder.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode
  • Sur un ordinateur Windows, utilisez l’option --query pour obtenir les données utilisateur codées et la commande certutil pour les décoder. Notez que la sortie encodée est stockée dans un fichier et que la sortie décodée est stockée dans un autre fichier.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" >my_output.txt certutil -decode my_output.txt my_output_decoded.txt type my_output_decoded.txt

Voici un exemple de sortie.

#!/bin/bash yum update -y service httpd start chkconfig httpd on

Combiner des scripts shell et des directives cloud-init

Par défaut, vous ne pouvez inclure qu’un seul type de contenu à la fois dans les données utilisateur. Toutefois, vous pouvez utiliser les types de contenu text/cloud-config et text/x-shellscript dans un fichier MIME en plusieurs parties pour inclure à la fois un script shell et des directives cloud-init dans vos données utilisateur.

Le format MIME en plusieurs parties est représenté ci-dessous.

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-init directives --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash shell script commands --//--

Par exemple, les données utilisateur suivantes incluent des directives cloud-init et un script shell bash. Les directives cloud-init créent un fichier (/test-cloudinit/cloud-init.txt) et y écrivent Created by cloud-init. Le script shell bash crée un fichier (/test-userscript/userscript.txt) et y écrit Created by bash shell script.

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 runcmd: - [ mkdir, /test-cloudinit ] write_files: - path: /test-cloudinit/cloud-init.txt content: Created by cloud-init --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash mkdir test-userscript touch /test-userscript/userscript.txt echo "Created by bash shell script" >> /test-userscript/userscript.txt --//--