Comment résoudre les problèmes liés à l'inclusion de métadonnées sur une instance EC2 dans CloudFormation ?

Date de la dernière mise à jour : 12/04/2022

J'ai utilisé AWS::CloudFormation::Init pour inclure des métadonnées sur une instance Amazon Elastic Cloud Compute (Amazon EC2), mais je ne vois pas les changements sur l'instance.

Brève description

Les problèmes avec les métadonnées d'une instance EC2 dans une pile AWS CloudFormation peuvent se produire pour les raisons suivantes :

  • Le script d'aide cfn-init n'est pas installé sur une ou plusieurs instances de la pile CloudFormation. Pour résoudre ce problème, effectuez les étapes de la section Vérifier que le script d'aide cfn-init est installé.
  • L'instance n'est pas connectée à Internet. Pour résoudre ce problème, effectuez les étapes de la section Vérifier que l'instance est connectée à Internet.
  • Le modèle CloudFormation contient des erreurs de syntaxe ou des valeurs incorrectes. Pour résoudre ce problème, effectuez les étapes de la section Rechercher des erreurs dans les journaux cloud-init ou cfn-init.

Important : avant d'effectuer les solutions suivantes, définissez l'option Rollback on failure (Restaurer en cas d'échec) de votre pile CloudFormation sur No (Non).

Remarque : les solutions suivantes sont spécifiques aux piles CloudFormation qui sont créées avec des instances Linux.

Solution

Vérifier que le script d'aide cfn-init est installé

Pour confirmer que cfn-init est installé sur l'instance qui est configurée pour envoyer des signaux aux ressources CloudFormation :

1.    Connectez-vous à l'instance à l'aide du protocole SSH.

2.    Exécutez l'une des commandes suivantes pour vérifier que cfn-init ou le package aws-cfn-bootstrap est installé dans votre répertoire.

cfn-init :

$ sudo find / -name cfn-init
/opt/aws/bin/cfn-init
/opt/aws/apitools/cfn-init
/opt/aws/apitools/cfn-init-1.4-34.24.amzn1/bin/cfn-init
/var/lib/cfn-init

-ou-

paquet aws-cfn-bootstrap :

$ sudo rpm -q aws-cfn-bootstrap
aws-cfn-bootstrap-1.4-34.24.amzn1.noarch

Important : cette commande fonctionne uniquement avec les distributions de type RPM Package Manager.

Remarque : par défaut, les scripts d'aide CloudFormation sont installés sur l'Amazon Machine Image (AMI) Amazon Linux. Si les scripts d'aide CloudFormation ne sont pas installés, consultez la référence des scripts d'aide CloudFormation pour savoir comment les installer.

Vérifier que l'instance est connectée à Internet

Si l'instance se trouve dans un Amazon Virtual Private Cloud (Amazon VPC), elle peut se connecter à Internet via :

  • Un dispositif NAT dans un sous-réseau privé
  • Une passerelle Internet dans un sous-réseau public

Pour tester la connexion Internet de l'instance, accédez à une page Web publique, comme AWS, et exécutez une commande curl sur l'instance. Par exemple :

curl -I https://aws.amazon.com

Remarque : si l'instance est connectée à Internet, la commande renvoie un code d'état HTTP 200.

Si vous utilisez un point de terminaison d'un VPC d'interface, le point de terminaison doit être situé dans la même région AWS que l'instance. En outre, le groupe de sécurité attaché au point de terminaison d'interface doit autoriser les connexions entrantes sur le port 443 à partir du sous-réseau privé d'Amazon VPC.

Rechercher des erreurs dans les journaux cloud-init ou cfn-init

Pour rechercher des erreurs dans les journaux cloud-init ou dans les journaux cfn-init, procédez comme suit :

1.    Connectez-vous à l’instance en utilisant SSH.

2.    Recherchez des messages d'erreur ou d'échec détaillés en recherchant les mots-clés « error » (erreur) ou « failure » (échec) dans les journaux suivants :

  • /var/log/cloud-init-output.log
  • /var/log/cloud-init.log
  • /var/log/cfn-init.log
  • /var/log/cfn-init-cmd.log

Pour analyser toutes les occurrences des mots clés « error » ou « failure » dans les fichiers /var/log/cfn ou /var/log/cloud-init, exécutez la commande suivante :

grep -ni 'error\|failure' $(sudo find /var/log -name cfn-init\* -or -name cloud-init\*)

Remarque : cette commande renvoie le nom du fichier, le numéro de ligne et un message d'erreur.

Recherchez cfn-init.log. Si vous ne le trouvez pas, c'est que cfn-init n'a pas été exécuté. Vous devez également vérifier cloud-init-output.log et cloud-init.log pour voir s'il y a eu un échec lors de l'exécution des données utilisateur. Après avoir identifié l'erreur, corrigez-la en fonction du message d'erreur, puis recréez la pile.

Si cfn-init.log existe, cfn-init a été exécuté, mais un échec s'est produit. Vérifiez cfn-init.log pour voir ce qui n'a pas fonctionné et corrigez-le en fonction du message d'erreur.

Pour confirmer que la propriété UserData est configurée pour exécuter cfn-init, effectuez les étapes suivantes :

  1. Dans un éditeur de code, ouvrez le modèle AWS CloudFormation pour votre pile, puis recherchez la section de propriété UserData.
  2. Recherchez les erreurs, notamment au niveau de la syntaxe, des espaces manquants, des fautes d'orthographe et d’autres fautes de frappe.
  3. Confirmez que les valeurs applicables aux propriétés de la pile, de la ressource et de la région sont correctes.
  4. Pour la fonction intrinsèque Fn::Join de la propriété UserData, utilisez l'option -v pour exécuter cfn-init en mode détaillé. Consultez les modèles d'exemples JSON et YAML.