Comment résoudre les problèmes de scripts d'assistant qui ne démarreront pas dans une pile AWS CloudFormation avec des instances Windows ?

Date de la dernière mise à jour : 19/06/2020

Je souhaite amorcer mes scripts d'assistant dans une pile AWS CloudFormation avec des instances Windows.

Brève description

Si vos scripts d'assistant ne s'exécutent pas après le redémarrage de l'instance Windows, suivez les étapes de la section Troubleshoot bootstrap issues.

Si vous recevez l'erreur « Received 0 conditions when attente X or Failed to receive X resource signal (s) in the specified duration », suivez les étapes de la section Troubleshoot cfn-signal issues.

Enfin, suivez les étapes de la section Suivez les bonnes pratiques pour utiliser un système d'exploitation Windows avec AWS CloudFormation.

Solution

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

Dans une instance Windows, UserData (en cours d'exécution 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. Une fois le redémarrage du système terminé, cfn-init continue à exécuter le reste des configurations dans AWS::CloudFormation::Init à l'aide de C:\cfn\cfn-init\resume_db.json.

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 Amazon Elastic Compute Cloud (Amazon EC2) à l'adresse C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt (versions antérieures à Windows 2016) et C:\ProgramData\Amazon\EC2-Windows\Launch\Log\ (Windows 2016 et versions ultérieures)
Le journal cfn-init à l'adresse C:\cfn\log\cfn-init.log
Les 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 la condition d'attente à 1800/3600 secondes en fonction des exemplesWindows AWS CloudFormation.

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 pouvez 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

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

Autorisez les exceptions à intercepter en incluant $ErrorActionPreference = « Stop » en haut de vos scripts PowerShell.

Lorsque vous faites référence à un chemin d'accès Windows dans votre modèle AWS CloudFormation, vous devez prédéfinir tout chemin d'accès Windows avec une barre oblique (« / »). 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"

Pour plus d'informations, consultez Amorçage des piles Windows AWS CloudFormation


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?