Como soluciono problemas de scripts auxiliares que não inicializam em uma pilha do CloudFormation com instâncias do Windows?

4 minuto de leitura
0

Meus scripts auxiliares não inicializam em uma pilha do AWS CloudFormation com instâncias do Microsoft Windows. Como faço para resolver esse problema?

Breve descrição

Em uma instância do Windows, UserData executado como um processo secundário do EC2ConfigService invoca o cfn-init.exe. Algumas etapas que o cfn-init.exe executa podem exigir a reinicialização do sistema.

Por exemplo, você deve reinicializar o sistema se renomear um computador ou aderir um computador a um domínio. Depois que o sistema for reinicializado, o cfn-init continua executando o restante das configurações que permanecem no AWS::CloudFormation::Init com a ajuda de C:\cfn\cfn-init\resume_db.json.

Para scripts auxiliares que não são executados após a reinicialização da instância do Windows, conclua as etapas na seção Solução de problemas de inicialização.

Se você receber o erro a seguir, poderá ter problemas com o cfn-signal:

“Recebeu 0 condições ao esperar X ou falhou ao receber sinais do recurso X dentro da duração especificada”

Para resolver o erro anterior, conclua as etapas na seção Solução de problemas do cfn-signal.

Para ambos os problemas, conclua as etapas na seção Siga as melhores práticas para usar um sistema operacional Windows com o CloudFormation.

Resolução

Solução de problemas de inicialização

Se o script não for executado após a reinicialização, conclua as etapas a seguir:

1.Na seção de comandos do seu conjunto de configurações cfn-init, confirme se waitAfterCompletion está definido como para sempre. Por exemplo:

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

Observação: o valor para sempre direciona o cfn-init para sair e continuar somente após a reinicialização estar concluída. Para obter mais informações, consulte AWS::CloudFormation::Init.

2.Verifique se há erros nos logs a seguir:

  • Log de configuração do Amazon Elastic Compute Cloud (Amazon EC2) em C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt (versões anteriores ao Windows 2016)
  • Log de configuração do Amazon EC2 em *C:\ProgramData\Amazon\EC2-Windows\Launch\Log* (Windows 2016 e versões posteriores)
  • Log de cfn-init log em C:\cfn\log\cfn-init.log
  • Logs de eventos do Windows em C:\Windows\System32\winevt\logs

Solução de problemas do cfn-signal

1.Confirme se o cfn-signal está configurado corretamente.

Importante: use -e $lastexitcode em scripts do PowerShell e use -e %ERRORLEVEL% para scripts cmd.exe do Windows.

Para scripts do PowerShell em UserData, use as tags a seguir:

<powershell></powershell>

Exemplo de script do 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>

Para scripts cmd.exe em UserData, use as tags a seguir:

<script></script>

Exemplo 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.Aumente o Timeout da WaitCondition para 1800/3600 segundos com base no exemplo de inicialização de uma pilha do Windows.

Observação: a etapa 2 é necessária porque as instâncias do Windows geralmente demoram mais do que as instâncias do Linux para concluir o processo inicial de inicialização.

3.Se você estiver usando uma imagem de máquina da Amazon (AMI) personalizada, deverá usar o Sysprep para criar a AMI antes de começar. Se você não usar o Sysprep, poderá ter problemas de metadados e receber o seguinte erro no log de dados do usuário para metadados:

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

Siga as melhores práticas ao usar um sistema operacional Windows com o CloudFormation

Inclua $ErrorActionPreference = “Stop” na parte superior dos scripts do PowerShell para detectar exceções.

Ao se referir a um caminho do Windows em seu modelo do CloudFormation, você deve adicionar uma barra (/) no início do caminho. Por exemplo:

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

Para pilhas do Windows, você deve codificar em base64 o URL do identificador WaitCondition novamente. Por exemplo:

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

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos