Como soluciono problemas de scripts auxiliares que não inicializam em uma pilha do CloudFormation com instâncias do Windows?
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"
Conteúdo relevante
- AWS OFICIALAtualizada há 5 meses
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos