¿Cómo puedo solucionar problemas con los scripts de ayuda que no arrancan en una pila de CloudFormation con instancias de Windows?

4 minutos de lectura
0

Mis scripts de ayuda no arrancan en una pila de AWS CloudFormation con instancias de Microsoft Windows. ¿Cómo puedo resolver este problema?

Descripción breve

En una instancia de Windows, UserData, que se ejecuta como un proceso secundario de EC2ConfigService, invoca cfn-init.exe. Ciertos pasos que realiza cfn-init.exe pueden requerir un reinicio del sistema.

Por ejemplo, debe reiniciar el sistema si cambia el nombre de un equipo o une un equipo a un dominio. Tras el reinicio del sistema, cfn-init continúa ejecutando el resto de las configuraciones que quedan en AWS::CloudFormation::Init con la ayuda de C:\cfn\cfn -init\resume_db.json.

En el caso de los scripts de ayuda que no se ejecuten después de reiniciar la instancia de Windows, siga los pasos de la sección Solucionar problemas de arranque.

Si recibe el siguiente error, es posible que tenga problemas con ** cfn-signal**:

«Se recibieron 0 condiciones al esperar X o no se pudieron recibir X señales de recursos dentro de la duración especificada"

Para resolver el error anterior, complete los pasos de la sección Solucionar problemas con cfn-signal.

Para ambos problemas, siga los pasos de la sección Seguir las prácticas recomendadas para usar un sistema operativo Windows con CloudFormation.

Solución

Solucionar problemas de arranque

Si el script no se ejecuta después del reinicio, siga estos pasos:

1.    En la sección Comandos del conjunto de configuración cfn-init, confirme que waitAfterCompletion está configurado en forever. Por ejemplo:

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

Nota: El valor forever indica a cfn-init que salga y reanude solo después de que se complete el reinicio. Para más información, consulte AWS::CloudFormation::Init.

2.    Compruebe si hay errores en los siguientes registros:

  • Registro de configuración de Amazon Elastic Compute Cloud (Amazon EC2) en C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt (versiones anteriores a Windows 2016)
  • Registro de configuración de Amazon EC2 en *C:\ProgramData\Amazon\EC2-Windows\Launch\Log* (Windows 2016 y versiones posteriores)
  • registro cfn-init en C:\cfn\log\cfn-init.log
  • Registros de eventos de Windows en C:\Windows\System32\winevt\logs

Solucionar problemas con cfn-signal

1.    Confirme que cfn-signal esté configurado correctamente.

Importante: Utilice -e $lastexitcode en los scripts de PowerShell y -e %ERRORLEVEL% para los scripts cmd.exe de Windows.

Para los scripts de PowerShell en UserData, utilice las siguientes etiquetas:

<powershell></powershell>

Ejemplo de script de 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 los scripts cmd.exe en UserData, utilice las siguientes etiquetas:

<script></script>

Ejemplo 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 el tiempo de espera de la condición WaitCondition a 1800/3600 segundos basándose en el ejemplo de arranque de una pila de Windows.

Nota: El paso 2 es necesario porque las instancias de Windows suelen tardar más que las de Linux en completar su proceso de arranque inicial.

3.    Si utiliza una imagen de máquina de Amazon (AMI) personalizada, debe usar Sysprep para crear la AMI antes de empezar. Si no usa Sysprep, es posible que tenga problemas con los metadatos y aparezca el siguiente error en el registro de datos de usuario de los metadatos:

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

Seguir las prácticas recomendadas para usar un sistema operativo Windows con CloudFormation

Incluya $ErrorActionPreference = "Stop" en la parte superior de los scripts de PowerShell para detectar excepciones.

Cuando haga referencia a una ruta de Windows en su plantilla de CloudFormation, debe añadir una barra diagonal (/) al principio de la ruta. Por ejemplo:

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

Para las pilas de Windows, debe volver a codificar en base64 la URL del identificador WaitCondition. Por ejemplo:

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

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años