Comment résoudre les problèmes liés aux scripts d’assistance qui ne démarrent pas dans une pile CloudFormation contenant des instances Windows ?

Lecture de 4 minute(s)
0

Mes scripts d'assistance ne démarrent pas dans une pile AWS CloudFormation contenant des instances Windows.

Brève description

Redémarrez l’instance Windows. Si vos scripts d’assistance ne s’exécutent pas après le redémarrage de l’instance Windows, suivez les étapes décrites dans la section Résoudre les problèmes d’amorçage.

Si le message d’erreur suivant s’affiche, il se peut que vous rencontriez des problèmes avec cfn-signal : « Received 0 conditions when expecting X or Failed to receive X resource signal(s) within the specified duration. » Pour résoudre ce problème, suivez les étapes décrites dans la section Résoudre les problèmes liés à cfn-signal.

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

Résolution

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

Consultez la section commandes de votre ensemble de configuration cfn-init pour vérifier que WaitAfterCompletion est défini sur permanent. Exemple :

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

Remarque : la valeur permanente indique à cfn-init de se fermer et de reprendre uniquement une fois le redémarrage terminé. Pour plus d’informations, consultez la section Commandes.

Après avoir vérifié votre configuration, examinez les journaux suivants pour détecter les erreurs :

  • Le journal cfn-init : C:\cfn\log\cfn-init.log
  • Les journaux d’événements Windows : C:\Windows\System32\winevt\logs
    Remarque : l’agent Amazon Elastic Cloud Compute (Amazon EC2) EC2Launch v2 publie des journaux d’événements Windows.
  • (Pour les instances Windows qui utilisent le service EC2Config), le journal de configuration : C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt
  • (Pour les instances Windows qui utilisent l’agent EC2Launch v1), le journal de lancement : C:\ProgramData\Amazon\EC2-Windows\Launch\Log

Résoudre les problèmes liés à cfn-signal

Procédez comme suit :

  1. Vérifiez que vous avez correctement configuré le signal cfn.
    Important : utilisez -e $lastexitcode dans les scripts PowerShell et -e %ERRORLEVEL% dans 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'attente d’AWS::CloudFormation::WaitCondition. Pour un exemple de configuration, consultez la section Exemple d'amorçage d’une pile Windows.
    Remarque : les instances Windows mettent généralement plus de temps à terminer leur processus de démarrage initial que les instances Linux.

  3. Si vous utilisez une Amazon Machine Image (AMI) personnalisée, vous devez utiliser Sysprep pour créer l’AMI. Si vous n’utilisez pas Sysprep, l’erreur suivante peut s’afficher dans le journal des données utilisateur pour les métadonnées : « Failed to get metadata: The result from was empty. Unable to execute userdata: Userdata was not provided. »

Suivez les meilleures pratiques pour les systèmes d’exploitation Windows avec CloudFormation

Utilisez les bonnes pratiques suivantes pour résoudre les problèmes liés à votre configuration :

  • Incluez $ErrorActionPreference = "Stop" en haut de vos scripts PowerShell pour détecter les exceptions.

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

    "commands" : {  "1-extract" : {
        "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
      }
  • Pour les piles Windows, codez en base64 l'URL du handle WaitCondition. Exemple :

    cfn-signal.exe -e %ERRORLEVEL% ", { "Fn::Base64" : { "Ref" : "SharePointFoundationWaitHandle" }}, "\n"
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 4 mois