Come posso risolvere gli script di supporto che non si avviano in uno stack CloudFormation con istanze Windows?

4 minuti di lettura
0

I miei script di supporto non eseguono il bootstrap in uno stack AWS CloudFormation con istanze di Microsoft Windows. Come faccio a risolvere questo problema?

Breve descrizione

In un'istanza di Windows, UserData che viene eseguito come processo secondario di EC2ConfigService richiama cfn-init.exe. Alcuni passaggi eseguiti da cfn-init.exe potrebbero richiedere il riavvio del sistema.

Ad esempio, è necessario riavviare il sistema se si rinomina un computer o si aggiunge un computer a un dominio. Dopo il riavvio del sistema, cfn-init continua a eseguire il resto delle configurazioni che rimangono in AWS::CloudFormation::Init con l'aiuto di C:\cfn\cfn-init\resume_db.json.

Per gli script di supporto che non vengono eseguiti dopo il riavvio dell'istanza di Windows, completa i passaggi nella sezione Risoluzione dei problemi di avvio.

Se ricevi il seguente errore, potresti avere problemi con cfn-signal:

"Ho ricevuto 0 condizioni in attesa di X o non è stato possibile ricevere X segnali di risorse entro la durata specificata"

Per risolvere l'errore precedente, completa i passaggi nella sezione Risoluzione dei problemi relativi a cfn-signal.

Per entrambi i problemi, completa i passaggi indicati nella sezione Segui le migliori pratiche per l'utilizzo di un sistema operativo Windows con CloudFormation.

Risoluzione

Risoluzione dei problemi relativi al bootstrap

Se lo script non viene eseguito dopo il riavvio, completa i seguenti passaggi:

  1. Nella sezione comandi del set di configurazione cfn-init, conferma che waitAfterCompletion è impostato su forever. Ad esempio:
"commands": {
 "0-restart": {
 "command": "powershell.exe -Command Restart-Computer",
 "waitAfterCompletion": "forever"
 }
 }

Nota: il valore forever indica a cfn-init di uscire e riprendere solo dopo il completamento del riavvio. Per ulteriori informazioni, consulta AWS::CloudFormation::Init.

  1. Controlla la presenza di errori nei seguenti registri:
  • Registro di configurazione di Amazon Elastic Compute Cloud (Amazon EC2) in C:\Program Files\Amazon\EC2ConfigService\Logs\Ec2ConfigLog.txt (versioni precedenti a Windows 2016)
  • Registro di configurazione di Amazon EC2 all'indirizzo *C:\ProgramData\Amazon\EC2-Windows\Launch\Log* (Windows 2016 e versioni successive)
  • log cfn-init in C:\cfn\log\cfn-init.log
  • Registri eventi di Windows in C:\Windows\System32\winevt\logs

Risoluzione dei problemi relativi al segnale cfn

  1. Conferma che il segnale cfn sia configurato correttamente.

Importante: usa -e $lastexitcode negli script di PowerShell e usa -e %ERRORLEVEL% per gli script Windows cmd.exe.

Per gli script PowerShell in UserData, utilizza i seguenti tag:

<powershell></powershell>

Esempio di 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>

Per gli script cmd.exe in UserData, usa i seguenti tag:

<script></script>

Esempio di 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>
  1. Aumenta il timeout di WaitCondition a 1800/3600 secondi in base all'esempio di avvio di uno stack di Windows.

Nota: il passaggio 2 è necessario perché le istanze Windows richiedono in genere più tempo rispetto alle istanze Linux per completare il processo di avvio iniziale.

  1. Se utilizzi un'Amazon Machine Image (AMI) personalizzata, devi usare Sysprep per creare l'AMI prima di iniziare. Se non si utilizza Sysprep, è possibile che si verifichino problemi con i metadati e che venga visualizzato il seguente errore nel log dei dati utente per i metadati:
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

Segui le best practice per l'utilizzo di un sistema operativo Windows con CloudFormation

Includi $ErrorActionPreference = "Stop" nella parte superiore degli script di PowerShell per rilevare le eccezioni.

Quando fai riferimento a un percorso Windows nel tuo modello CloudFormation, devi aggiungere una barra (/) all'inizio del percorso. Ad esempio:

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

Per gli stack di Windows, è necessario codificare nuovamente in base64 l'URL dell'handle WaitCondition. Ad esempio:

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

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa