Meus scripts auxiliares não são inicializados em uma pilha do AWS CloudFormation com instâncias do Windows.
Breve descrição
Reinicie a instância do Windows. Se os scripts auxiliares não forem executados após a reinicialização da instância do Windows, conclua as etapas na seção Solucionar problemas de bootstrap.
Se você receber o erro a seguir, poderá ter problemas com o cfn-signal: "Received 0 conditions when expecting X or Failed to receive X resource signal(s) within the specified duration." Para resolver esse problema, conclua as etapas na seção Solucionar problemas com cfn-signal.
Para ambos os problemas, conclua as etapas na seção Siga as práticas recomendadas para sistemas operacionais Windows com o CloudFormation.
Resolução
Solução de problemas de inicialização
Verifique a seção de comandos do seu conjunto de configuração cfn-init para verificar se waitAfterCompletion está definido como forever. Exemplo:
"commands": { "0-restart": {
"command": "powershell.exe -Command Restart-Computer",
"waitAfterCompletion": "forever"
}
}
Observação: o valor de forever direciona cfn-init para sair e retomar somente após a conclusão da reinicialização. Para obter mais informações, consulte Comandos.
Depois de verificar sua configuração, analise os seguintes logs em busca de erros:
- O log de cfn-init: C:\cfn\log\cfn-init.log
- Os logs de eventos do Windows: C:\Windows\System32\winevt\logs
Observação: o agente EC2Launch v2 do Amazon Elastic Cloud Compute (Amazon EC2) publica logs de eventos do Windows.
- (Para instâncias do Windows que usam o Serviço EC2Config) o log de configuração: C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt
- (Para instâncias do Windows que usam o agente EC2Launch v1) o log de lançamento: C:\ProgramData\Amazon\EC2-Windows\Launch\Log
Solução de problemas do cfn-signal
Conclua as seguintes etapas:
-
Verifique se você configurou cfn-signal corretamente.
Importante: use -e $lastexitcode em scripts do PowerShell e -e %ERRORLEVEL% em 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>
-
Aumente o Tempo limite de AWS::CloudFormation::WaitCondition. Para obter um exemplo da configuração, consulte Exemplo de bootstrapping de uma pilha do Windows.
Observação: as instâncias do Windows geralmente demoram mais que as instâncias do Linux para concluir o processo de inicialização.
-
Se você estiver usando uma imagem de máquina da Amazon (AMI) personalizada, use Sysprep para criar a AMI. Se você não usar Sysprep, poderá receber o seguinte erro no log de dados do usuário para metadados: "Failed to get metadata: The result from was empty. Unable to execute userdata: Userdata was not provided."
Siga as práticas recomendadas para sistemas operacionais Windows com o CloudFormation
Use as seguintes práticas recomendadas para solucionar problemas de configuração:
-
Inclua $ErrorActionPreference = “Stop” na parte superior dos scripts do PowerShell para detectar exceções.
-
Ao fazer referência a um caminho do Windows no seu modelo do CloudFormation, adicione uma barra (/) no início do caminho. Exemplo:
"commands" : { "1-extract" : {
"command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
}
-
Para pilhas do Windows, codifique em base64 o URL do identificador WaitCondition. Exemplo:
cfn-signal.exe -e %ERRORLEVEL% ", { "Fn::Base64" : { "Ref" : "SharePointFoundationWaitHandle" }}, "\n"