Wie behebe ich Probleme mit Hilfsskripten, die in einem CloudFormation-Stack mit Windows-Instances nicht booten?

Lesedauer: 4 Minute
0

Meine Hilfsskripte lassen sich in einem AWS CloudFormation-Stack mit Microsoft Windows-Instances nicht booten. Wie kann ich dieses Problem lösen?

Kurzbeschreibung

In einer Windows-Instanz ruft UserData, das als untergeordneter Prozess von ec2ConfigService ausgeführt wird, cfn-init.exe auf. Bestimmte Schritte, die cfn-init.exe ausführt, erfordern möglicherweise einen Systemneustart.

Sie müssen beispielsweise das System neu starten, wenn Sie einen Computer umbenennen oder einen Computer zu einer Domäne hinzufügen. Nach dem Neustart des Systems führt cfn-init die restlichen Konfigurationen, die in AWS::CloudFormation::Init verbleiben, mithilfe von C:\cfn\cfn-init\resume_db.json weiter aus.

Führen Sie für Hilfsskripts, die nach dem Neustart der Windows-Instanz nicht ausgeführt werden, die Schritte im Abschnitt Bootstrapping-Probleme beheben aus.

Wenn Sie die folgende Fehlermeldung erhalten, haben Sie möglicherweise Probleme mit cfn-Signal:

„Es wurden 0 Bedingungen empfangen, wenn X erwartet wurde, oder es konnten keine X-Ressourcensignale innerhalb der angegebenen Dauer empfangen werden“

Um den vorherigen Fehler zu beheben, führen Sie die Schritte im Abschnitt CFN-Signal-Probleme beheben aus.

**Gehen Sie bei beiden Problemen wie im ** Abschnitt Bewährte Methoden für die Verwendung eines Windows-Betriebssystems mit CloudFormation beschrieben vor.

Behebung

Bootstrapping-Probleme beheben

Wenn Ihr Skript nach dem Neustart nicht ausgeführt wird, führen Sie die folgenden Schritte aus:

  1. Bestätigen Sie im Befehlsbereich Ihres cfn-init-Konfigurationssatzes, dass waitAfterCompletion auf forever gesetzt ist. Zum Beispiel:
"commands": {
 "0-restart": {
 "command": "powershell.exe -Command Restart-Computer",
 "waitAfterCompletion": "forever"
 }
 }

**Hinweis:**Der Wert forever weist cfn-init an, das Programm zu beenden und erst dann fortzufahren, wenn der Neustart abgeschlossen ist. Weitere Informationen finden Sie unter AWS::CloudFormation::Init.

  1. Überprüfen Sie die folgenden Protokolle auf Fehler:
  • Amazon Elastic Compute Cloud (Amazon EC2) -Konfigurationsprotokoll unter C:\Program Files\ Amazon\ EC2ConfigService\ Logs\ Ec2ConfigLog.txt (Versionen vor Windows 2016)
  • Amazon EC2-Konfigurationsprotokoll unter * *C:\ProgramData\Amazon\EC2 -Windows\ Launch\ Log\ * * (Windows 2016 und höher)
  • cfn-init-Protokoll unter C:\cfn\log\cfn-init.log
  • Windows-Ereignisprotokolle unter ** C:\Windows\System32\winevt\logs **

Probleme mit dem CFN-Signal beheben

  1. Vergewissern Sie sich, dass das CFN-Signal korrekt konfiguriert ist.

**Wichtig:**Verwenden Sie -e $lastexitcode in PowerShell-Skripten und -e %ERRORLEVEL% für Windows cmd.exe-Skripts.

Verwenden Sie für PowerShell-Skripts in UserData die folgenden Tags:

<powershell></powershell>

Beispiel für ein PowerShell-Skript:

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>

Verwenden Sie für cmd.exe-Skripts in UserData die folgenden Tags:

<script></script>

Beispiel für ein cmd.exe-Skript:

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>
  1. Erhöhen Sie das Timeout der WaitCondition auf 1800/3600 Sekunden, basierend auf dem Beispiel für das Bootstrapping eines Windows-Stacks.

**Hinweis:**Schritt 2 ist erforderlich, da Windows-Instances normalerweise länger benötigen als Linux-Instances, um ihren ersten Startvorgang abzuschließen.

  1. Wenn Sie ein benutzerdefiniertes Amazon Machine Image (AMI) verwenden, müssen Sie Sysprep verwenden, um das AMI zu erstellen, bevor Sie beginnen. Wenn Sie Sysprep nicht verwenden, treten möglicherweise Probleme mit Metadaten auf und im Benutzerdatenprotokoll für Metadaten wird der folgende Fehler angezeigt:
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

Folgen Sie den bewährten Methoden für die Verwendung eines Windows-Betriebssystems mit CloudFormation

Fügen Sie $errorActionPreference = „Stop“ am Anfang Ihrer PowerShell-Skripts ein, um Ausnahmen abzufangen.

Wenn Sie in Ihrer CloudFormation-Vorlage auf einen Windows-Pfad verweisen, müssen Sie am Anfang des Pfads einen Schrägstrich (/) hinzufügen. Zum Beispiel:

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

Für Windows-Stacks müssen Sie die WaitCondition-Handle-URL erneut mit Base64 codieren. Zum Beispiel:

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

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren