

# Configuración de instancias preinicializadas para el grupo de escalado automático de Amazon ECS
<a name="using-warm-pool"></a>

Amazon ECS admite grupos de calentamiento de Amazon EC2 Auto Scaling. Un grupo de calentamiento es un grupo de Amazon EC2 instances (Instancias de Amazon EC2) inicializadas previamente listas para ponerse en servicio. Siempre que su aplicación necesita escalar horizontalmente, Amazon EC2 Auto Scaling utiliza las instancias preinicializadas del grupo de calentamiento en lugar de lanzar instancias en frío, permite ejecutar cualquier proceso de inicialización final y, a continuación, pone la instancia en servicio.

Para obtener más información sobre grupos de calentamiento y cómo agregar un grupo de calentamiento a un grupo de escalado automático, consulte [Grupos de calentamiento para Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html) *en la Guía del usuario de Amazon EC2 Auto Scaling*.

Cuando se crea o actualiza un grupo de calentamiento para un grupo de escalado automático para Amazon ECS, no se puede configurar la opción que devuelve las instancias al grupo de calentamiento al reducir horizontalmente (`ReuseOnScaleIn`). Para obtener más información, consulte [put-warm-pool](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/put-warm-pool.html) en la *Referencia de AWS Command Line Interface*.

Para utilizar los grupos de calentamiento con su clúster de Amazon ECS, establezca la variable de configuración del agente `ECS_WARM_POOLS_CHECK` en `true` en el campo **User data** (Datos de usuario) de la plantilla de lanzamiento del grupo de Amazon EC2 Auto Scaling. 

A continuación, mostramos un ejemplo de cómo se puede especificar la variable de configuración del agente en el campo **Datos de usuario** de una plantilla de lanzamiento de Amazon EC2 para las instancias de Linux. Sustituya {{MyCluster}} por el nombre del clúster. Para las instancias de Windows, consulte [Uso de grupos de calentamiento con instancias de Windows en Amazon ECS](#using-warm-pool-windows-lifecycle-hooks).

```
#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER={{MyCluster}}
ECS_WARM_POOLS_CHECK=true
EOF
```

Esta variable `ECS_WARM_POOLS_CHECK` solo se admite en versiones de agente `1.59.0` y posterior. Para obtener más información sobre la variable, consulte [Configuración del agente de contenedor de Amazon ECS](ecs-agent-config.md).

## Uso de grupos de calentamiento con instancias de Windows en Amazon ECS
<a name="using-warm-pool-windows-lifecycle-hooks"></a>

Cuando utilice grupos de calentamiento con el estado de grupo **Detenido** en instancias de Windows, utilice además los enlaces de ciclo de vida de Amazon EC2 Auto Scaling para garantizar que la ejecución de los datos del usuario se complete antes de que se detenga la instancia. Si no hay enlaces de ciclo de vida, la instancia puede detenerse antes de que finalice la inicialización de Amazon ECS.

Cómo configurar los enlaces de ciclo de vida para las instancias de grupos de calentamiento de Windows:

1. Agregue la siguiente política de IAM a su rol de instancia de contenedor para permitir que la instancia complete la acción de ciclo de vida:

   ```
   {
       "Version": "2012-10-17",
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "autoscaling:CompleteLifecycleAction"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

1. Agregue un enlace de ciclo de vida a su grupo de escalado automático en *Lanzar una instancia* con `ABANDON` como el resultado predeterminado y un tiempo de espera de la señal de actividad que permita suficiente tiempo para incializar Amazon ECS (por ejemplo, 10 minutos). Para obtener más información, consulte [Agregar enlaces de enlace de ciclo de vida](https://docs.aws.amazon.com/autoscaling/ec2/userguide/adding-lifecycle-hooks.html) en la *guía de hombre del usuario de Amazon EC2 Auto Scaling*.

1. Utilice los siguientes datos de usuario para crear una tarea programada para completar la acción del ciclo de vida tras un retraso. El retraso garantiza que EC2Launch termine de guardar su estado antes de que se detenga la instancia. Sustituya {{MyCluster}}, {{my-lifecycle-hook}} y {{my-asg-name}} por sus valores.

   ```
   <powershell>
   $lifecycleHookName = "{{my-lifecycle-hook}}"
   $autoScalingGroupName = "{{my-asg-name}}"
   
   $scriptContent = @'
   $token = Invoke-RestMethod -Method Put -Uri http://169.254.169.254/latest/api/token -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"}
   $instanceId = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id -Headers @{"X-aws-ec2-metadata-token" = $token}
   $region = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/placement/region -Headers @{"X-aws-ec2-metadata-token" = $token}
   $lifecycleHookName = "{{my-lifecycle-hook}}"
   $autoScalingGroupName = "{{my-asg-name}}"
   Complete-ASLifecycleAction -LifecycleHookName $lifecycleHookName -AutoScalingGroupName $autoScalingGroupName -InstanceId $instanceId -LifecycleActionResult 'CONTINUE' -Region $region
   '@
   Set-Content -Path "C:\ProgramData\Amazon\ECS\complete-lifecycle.ps1" -Value $scriptContent
   
   try
   {
       [Environment]::SetEnvironmentVariable("ECS_WARM_POOLS_CHECK", "true", "Machine")
       Import-Module ECSTools
       Initialize-ECSAgent -Cluster {{MyCluster}} -EnableTaskIAMRole
   
       $taskAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\ProgramData\Amazon\ECS\complete-lifecycle.ps1"
       $taskTrigger = New-ScheduledTaskTrigger -Once -At ((Get-Date).AddSeconds(60))
       $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable
       $taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
       Register-ScheduledTask -TaskName "CompleteLifecycleHook" -Action $taskAction -Trigger $taskTrigger -Principal $taskPrincipal -Settings $settings -Force
   }
   catch
   {
       $token = Invoke-RestMethod -Method Put -Uri http://169.254.169.254/latest/api/token -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"}
       $INSTANCE = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id -Headers @{"X-aws-ec2-metadata-token" = $token}
       $region = Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/placement/region -Headers @{"X-aws-ec2-metadata-token" = $token}
       Complete-ASLifecycleAction -InstanceId $INSTANCE -LifecycleHookName $lifecycleHookName -AutoScalingGroupName $autoScalingGroupName -LifecycleActionResult ABANDON -Region $region
   }
   </powershell>
   <persist>true</persist>
   ```

Este script de datos de usuario hace lo siguiente:
+ Inicializa el agente de Amazon ECS con la comprobación de grupos de calentamiento habilitada.
+ Crea una tarea programada que espera 30 segundos después de que se completen los datos del usuario y luego le indica al enlace de ciclo de vida que debe continuar. El retraso permite a EC2Launch guardar su estado para que los datos del usuario se vuelvan a ejecutar correctamente en los siguientes arranques.
+ Si la inicialización falla, se completa la acción del ciclo de vida con `ABANDON`, por lo que la instancia se termina y se reemplaza.