

# Arranque de pilas de CloudFormation basadas en Windows
<a name="cfn-windows-stacks-bootstrapping"></a>

En este tema se describe cómo arrancar una pila de Windows y solucionar problemas de creación de pila. 

**Topics**
+ [Datos de usuario en instancias de EC2](#cfn-windows-bootstrapping-user-data)
+ [Scripts auxiliares de CloudFormation](#cfn-windows-bootstrapping-helper-scripts)
+ [Ejemplo de arranque de una pila de Windows](#cfn-windows-bootstrapping-example)
+ [Evite las barras invertidas en las rutas de los archivos de Windows](#cfn-windows-stacks-escape-backslashes)
+ [Administración de servicios de Windows](#cfn-windows-stacks-manage-windows-services)
+ [Cómo solucionar problemas de creación de pila](#cfn-windows-stacks-troubleshooting)

## Datos de usuario en instancias de EC2
<a name="cfn-windows-bootstrapping-user-data"></a>

Los datos de usuario son una característica de Amazon EC2 que le permite pasar scripts o información de configuración a una instancia de EC2 cuando se lanza. 

En el caso de las instancias de EC2 de Windows:
+ Puede utilizar scripts por lotes (mediante etiquetas `<script>`) o scripts PowerShell (mediante etiquetas `<powershell>`).
+ EC2Launch gestiona la ejecución del script.

**importante**  
Si va a crear su propia AMI de Windows para usarla con CloudFormation, asegúrese de que EC2Launch v2 esté configurada correctamente. EC2Launch v2 es necesario para que las herramientas de arranque de CloudFormation inicialicen y configuren correctamente las instancias de Windows durante la creación de la pila. Para obtener más información, consulte [Uso del agente EC2Launch v2 para realizar tareas durante la inicialización de una instancia de EC2 Windows](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html) en la *Guía del usuario de Amazon EC2*.  
Para obtener información sobre las AMI de Windows de AWS, consulte [AWS Windows AMI Reference](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

## Scripts auxiliares de CloudFormation
<a name="cfn-windows-bootstrapping-helper-scripts"></a>

Los scripts auxiliares son utilidades para configurar instancias durante el proceso de arranque. Se utilizan con los datos de usuario de Amazon EC2 y ofrecen opciones eficaces de configuración.

CloudFormation proporciona los siguientes scripts auxiliares de Python que puede utilizar para instalar software e iniciar servicios en una instancia de Amazon EC2 que cree como parte de la pila:
+  `cfn-init`: se utiliza para recuperar e interpretar los metadatos de los recursos, instalar paquetes, crear archivos e iniciar servicios.
+  `cfn-signal`: se utiliza para señalizar con una `CreationPolicy`, de modo que se puedan sincronizar otros recursos de la pila cuando esté listo el recurso o la aplicación de requisitos previos.
+  `cfn-get-metadata`: se utiliza para recuperar los metadatos de un recurso o de la ruta a una clave específica.
+  `cfn-hup`: se utiliza para comprobar si hay actualizaciones de metadatos y ejecutar enlaces personalizados cuando se detectan cambios.

Los scripts se llaman directamente desde la plantilla. Los scripts funcionan junto con los metadatos de los recursos que están definidos en la misma plantilla. Los scripts se ejecutan en la instancia Amazon EC2 durante el proceso de creación de la pila.

Para obtener más información, consulte [Referencia de scripts auxiliares de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) en la *Guía de referencia de plantillas de CloudFormation*.

## Ejemplo de arranque de una pila de Windows
<a name="cfn-windows-bootstrapping-example"></a>

Examinemos fragmentos de ejemplo de una plantilla de Windows Server que realiza las siguientes acciones:
+ Lanza una instancia de EC2 con el nombre `TestInstance` de una AMI de Windows Server de 2022.
+ Crea un archivo de prueba sencillo para verificar que `cfn-init` está funcionando.
+ Configura `cfn-hup` para la administración continua de la configuración.
+ Utiliza una `CreationPolicy` para garantizar que la instancia señale la finalización exitosa.

El script auxiliar `cfn-init` se utiliza para llevar a cabo cada una de estas acciones en función de la información del recurso `AWS::CloudFormation::Init` de la plantilla.

La sección `AWS::CloudFormation::Init` se denomina `TestInstance` y comienza con la siguiente instrucción.

```
TestInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      configSets:
        default:
          - create_files
          - start_services
```

Después de esto, la sección `files` de `AWS::CloudFormation::Init` se declara.

```
      create_files:
        files:
          c:\cfn\test.txt:
            content: !Sub |
              Hello from ${AWS::StackName}
          c:\cfn\cfn-hup.conf:
            content: !Sub |
              [main]
              stack=${AWS::StackName}
              region=${AWS::Region}
              interval=2
          c:\cfn\hooks.d\cfn-auto-reloader.conf:
            content: !Sub |
              [cfn-auto-reloader-hook]
              triggers=post.update
              path=Resources.TestInstance.Metadata.AWS::CloudFormation::Init
              action=cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
```

Aquí se crean tres archivos, que se colocan en el directorio `C:\cfn` de la instancia del servidor:
+ `test.txt`, un archivo de prueba simple que verifica que `cfn-init` funciona correctamente y puede crear archivos con contenido dinámico.
+ `cfn-hup.conf`, el archivo de configuración para `cfn-hup` con un intervalo de verificación de 2 minutos.
+ `cfn-auto-reloader.conf`, el archivo de configuración para el enlace que usa `cfn-hup` para iniciar una actualización (mediante llamada a `cfn-init`) cuando cambian los metadatos en `AWS::CloudFormation::Init`.

La siguiente es la sección `start_services` que configura los servicios de Windows.

```
      start_services:
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Esta sección garantiza que el servicio `cfn-hup` se inicie y se reinicie automáticamente si se modifican los archivos de configuración. El servicio supervisa los cambios en los metadatos de CloudFormation y vuelve a ejecutar `cfn-init` cuando se detectan actualizaciones.

A continuación está la sección `Properties`.

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Metadata:
    AWS::CloudFormation::Init:
      # ... metadata configuration ...
  Properties:
    InstanceType: t2.large
    ImageId: '{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base}}'
    SecurityGroupIds:
      - !Ref InstanceSecurityGroup
    KeyName: !Ref KeyPairName
    UserData:
      Fn::Base64: !Sub |
        <powershell>
        cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
        cfn-signal.exe -e $lastexitcode --stack ${AWS::StackName} --resource TestInstance --region ${AWS::Region}
        </powershell>
```

En esta sección, la propiedad `UserData` contiene un script PowerShell que ejecutará EC2Launch, rodeado de etiquetas `<powershell>`. El script ejecuta `cfn-init` con el ConfigSet `default` y luego utiliza `cfn-signal` para informar el código de salida a CloudFormation. La `CreationPolicy` se utiliza para garantizar que la instancia está configurada correctamente antes de que se dé por finalizada la creación de la pila.

La propiedad `ImageId` utiliza un parámetro público de Systems Manager Parameter Store para recuperar automáticamente el último ID de AMI del Windows Server de 2022. Este enfoque elimina la necesidad de mapeos de AMI específicos de la región y garantiza que usted siempre obtenga la AMI más reciente. El uso de parámetros de Systems Manager para los ID de AMI es una práctica recomendada para mantener las referencias de AMI actuales. Si planea conectarse a su instancia, asegúrese de que la propiedad `SecurityGroupIds` haga referencia a un grupo de seguridad que permita el acceso RDP.

La `CreationPolicy` se declara como parte de las propiedades del recurso y especifica un periodo de tiempo de espera. El comando `cfn-signal` en las señales de datos de usuario indica cuándo se ha completado la configuración de la instancia:

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Properties:
    # ... other properties ...
```

Como el proceso de arranque es mínimo y solo crea archivos e inicia los servicios, la `CreationPolicy` espera 20 minutos (PT20M) antes de que se agote el tiempo de espera. El tiempo de espera se especifica mediante el formato de duración ISO 8601. Tenga en cuenta que las instancias de Windows suelen tardar más en lanzarse que las instancias de Linux, por lo que debe realizar pruebas exhaustivas para determinar los valores de tiempo de espera más adecuados para sus necesidades.

Si todo va bien, la `CreationPolicy` se completa correctamente y usted puede acceder a la instancia del Windows Server mediante su dirección IP pública. Una vez completada la creación de la pila, el ID de la instancia y la dirección IP aparecerán en la pestaña **Salidas** de la consola de CloudFormation. 

```
Outputs:
  InstanceId:
    Value: !Ref TestInstance
    Description: Instance ID of the Windows Server
  PublicIP:
    Value: !GetAtt TestInstance.PublicIp
    Description: Public IP address of the Windows Server
```

También puede comprobar manualmente que el arranque ha funcionado correctamente conectándote a la instancia mediante RDP y comprobando que el archivo `C:\cfn\test.txt` existe y contiene el contenido esperado. Para obtener información acerca de cómo conectarse a una instancias de Windows, consulte [Conexión a la instancia de Windows mediante RDP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html) en la *Guía del usuario de Amazon EC2*.

## Evite las barras invertidas en las rutas de los archivos de Windows
<a name="cfn-windows-stacks-escape-backslashes"></a>

Al hacer referencia a las rutas de Windows en las plantillas de CloudFormation, recuerde siempre evitar correctamente las barras invertidas (`\`) según el formato de plantilla que utilice.
+ En el caso de las plantillas JSON, debe usar barras invertidas dobles en las rutas de los archivos de Windows, ya que JSON trata a la barra invertida como un carácter de escape. La primera barra invertida escapa a la segunda, lo que da como resultado la interpretación de una sola barra invertida literal.

  ```
  "commands" : {
    "1-extract" : {
      "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
    }
  }
  ```
+ En el caso de las plantillas YAML, las barras invertidas únicas suelen ser suficientes.

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

## Administración de servicios de Windows
<a name="cfn-windows-stacks-manage-windows-services"></a>

Puede administrar los servicios de Windows de la misma forma que los servicios de Linux, salvo que use una clave `windows` en lugar de `sysvinit`. El siguiente ejemplo inicia el servicio `cfn-hup`, lo establece en automático y reinicia el servicio si `cfn-init` modifica los archivos de configuración `c:\cfn\cfn-hup.conf` o `c:\cfn\hooks.d\cfn-auto-reloader.conf`.

```
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Puede administrar otros servicios de Windows de la misma forma mediante el nombre, no el nombre de visualización, para hacer referencia al servicio.

## Cómo solucionar problemas de creación de pila
<a name="cfn-windows-stacks-troubleshooting"></a>

Si la pila falla durante la creación, el comportamiento predeterminado es de restauración en caso de error. Mientras que normalmente dicho comportamiento es bueno, ya que evita gastos innecesarios, dificulta la depuración de por qué falla la creación de la pila.

Para desactivar este comportamiento al crear o actualizar la pila con la consola de CloudFormation, seleccione la opción **Preservar los recursos aprovisionados correctamente** en **Opciones de error de pila**. Para obtener más información, consulte [Elija cómo gestionar los errores al aprovisionar recursos](stack-failure-options.md). Esto le permite iniciar sesión en la instancia y ver el archivo de registros para identificar los problemas encontrados al ejecutar sus scripts de arranque.

Es importante fijarse en estos registros:
+ El registro de configuración de EC2 en `%ProgramData%\Amazon\EC2Launch\log\agent.log`
+ El registro **cfn-init** en `C:\cfn\log\cfn-init.log` (comprueba los códigos de salida y los mensajes de error para ver si hay puntos de fallo específicos)

Para obtener más registros, consulte los siguientes temas en la *Guía del usuario de Amazon EC2*:
+ [EC2Launch Estructura de directorios de](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2config-service.html#UsingConfigXML_WinAMI)
+ [EC2Launch Estructura de directorios de v](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html#ec2launch-v2-directory)

Para obtener más información sobre la solución de problemas de arranque, consulte [¿Cómo se solucionan los problemas de los scripts auxiliares que no se inician en una pila de CloudFormation con instancias de Windows?](https://repost.aws/knowledge-center/cloudformation-helper-scripts-windows).