Comment dépanner les scripts d'assistant qui ne vont pas démarrer dans une pile CloudFormation avec des instances Windows ?

Lecture de 4 minute(s)
0

Mes scripts d'assistant ne démarreront pas dans une pile AWS CloudFormation avec des instances Microsoft Windows. Comment résoudre ce problème ?

Brève description

Dans une instance Windows, UserData qui s'exécute en tant que processus enfant d'EC2ConfigService appelle cfn-init.exe. Certaines étapes effectuées par cfn-init.exe peuvent nécessiter un redémarrage du système.

Par exemple, vous devez redémarrer le système si vous renommez un ordinateur ou joignez un ordinateur à un domaine. Après le redémarrage du système, cfn-init continue à exécuter le reste des configurations dans AWS::CloudFormation::Init à l'aide de C:\cfn\cfn-init\resume_db.json.

Pour les scripts d'assistant qui ne s'exécutent pas après le redémarrage de l'instance Windows, suivez les étapes de la section Résoudre les problèmes d'amorçage.

Si vous recevez le message d'erreur suivant, il se peut que vous ayez des problèmes avec le cfn-signal :

« Received 0 conditions when expecting X or Failed to receive X resource signal(s) within the specified duration » (0 conditions reçues lors de l'attente de X ou Impossible de recevoir X signal/signaux de ressource dans les délais impartis)

Pour résoudre l'erreur précédente, suivez les étapes de la section Résoudre les problèmes de cfn-signal.

Pour les deux problèmes, suivez les étapes de la section Suivre les bonnes pratiques pour utiliser un système d'exploitation Windows avec CloudFormation.

Solution

Résoudre les problèmes d'amorçage

Si votre script ne s'exécute pas après le redémarrage, effectuez les opérations suivantes :

1.    Dans la section des commandes de votre jeu de configurations cfn-init, vérifiez que waitAfterCompletion est défini sur forever. Par exemple :

"commands": {
 "0-restart": {
 "command": "powershell.exe -Command Restart-Computer",
 "waitAfterCompletion": "forever"
 }
 }

Remarque : la valeur forever indique à cfn-init de quitter et de reprendre uniquement une fois le redémarrage terminé. Pour plus d’informations, consultez AWS::CloudFormation::Init.

2.    Recherchez les erreurs dans les journaux suivants :

  • Journal de configuration d'Amazon Elastic Compute Cloud (Amazon EC2) à l'adresse C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt (versions antérieures à Windows 2016)
  • Journal de configuration d'Amazon EC2 à l'adresse *C:\ProgramData\Amazon\EC2-Windows\Launch\Log* (Windows 2016 et versions ultérieures)
  • Journal cfn-init à l'adresse C:\cfn\log\cfn-init.log
  • Journaux d'événements Windows à l'adresse C:\Windows\System32\winevt\logs

Résoudre les problèmes de cfn-signal

1.    Vérifiez que le cfn-signal est configuré correctement.

Important : utilisez -e $lastexitcode dans les scripts PowerShell et utilisez -e %ERRORLEVEL% pour les scripts Windows cmd.exe.

Pour les scripts PowerShell dans UserData, utilisez les balises suivantes :

<powershell></powershell>

Exemple de script PowerShell :

UserData:
        Fn::Base64:
          Fn::Sub : |
            <powershell>
            $LASTEXITCODE=0
            echo Current date and time >> C:\Temp\test.log
            echo %DATE% %TIME% >> C:\Temp\test.log
            cfn-init.exe -s ${AWS::StackId} -r SInstance --region ${AWS::Region}
            New-Item -Path "C:\" -Name userdata -ItemType directory
            cfn-signal.exe -e $LASTEXITCODE --stack ${AWS::StackId} --resource WindowsInstance --region ${AWS::Region}
            </powershell>

Pour les scripts cmd.exe dans UserData, utilisez les balises suivantes :

<script></script>

Exemple de script cmd.exe :

UserData:
  Fn::Base64: !Sub |
    <script>
    cfn-init.exe -v -s ${AWS::StackId} -r WindowsInstance --configsets ascending --region ${AWS::Region}
    cfn-signal.exe -e %ERRORLEVEL% --stack ${AWS::StackId} --resource WindowsInstance --region ${AWS::Region}
    </script>

2.    Augmentez le délai d'expiration de WaitCondition à 1800/3600 secondes en fonction de l'exemple de démarrage d'une pile Windows.

Remarque : l'étape 2 est nécessaire, car les instances Windows prennent généralement plus de temps que les instances Linux pour terminer leur processus de démarrage initial.

3.    Si vous utilisez une Amazon Machine Image (AMI) personnalisée, vous devez utiliser Sysprep pour créer l'AMI avant de démarrer. Si vous n'utilisez pas Sysprep, vous pourriez rencontrer des problèmes de métadonnées et obtenir l'erreur suivante dans le journal de données utilisateur pour les métadonnées :

Failed to get metadata: The result from http://169.254.169.254/latest/user-data was empty
Unable to execute userdata: Userdata was not provided

Suivre les bonnes pratiques pour utiliser un système d'exploitation Windows avec CloudFormation

Incluez $ErrorActionPreference = "Stop" en haut de vos scripts PowerShell pour intercepter les exceptions.

Lorsque vous faites référence à un chemin Windows dans votre modèle CloudFormation, vous devez ajouter une barre oblique (/) au début du chemin. Par exemple :

"commands" : {
  "1-extract" : {
    "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
  }

Pour les piles Windows, vous devez encoder à nouveau l'URL du handle WaitCondition en base64. Par exemple :

cfn-signal.exe -e %ERRORLEVEL% ", { "Fn::Base64" : { "Ref" : "SharePointFoundationWaitHandle" }}, "\n"

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans