

# Configuração de instâncias inicializadas previamente para o grupo do Amazon ECS Auto Scaling
<a name="using-warm-pool"></a>

O Amazon ECS oferece suporte a grupos de alta atividade do Amazon EC2 Auto Scaling. Um grupo de alta atividade é um grupo de instâncias do Amazon EC2 pré-inicializadas e prontas para serem colocadas em serviço. Sempre que sua aplicação precisar sofrer aumento de escala na horizontal, o Amazon EC2 Auto Scaling usa as instâncias pré-inicializadas do grupo de alta atividade em vez de iniciar instâncias frias, permite que qualquer processo de inicialização final seja executado e, em seguida, coloca a instância em serviço.

Para saber mais sobre grupos de alta atividade e como adicionar um grupo de alta atividade ao seu grupo do Auto Scaling, consulte [Grupos de alta atividade para o Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html) no *Guia do usuário do Amazon EC2 Auto Scaling*.

Ao criar ou atualizar um grupo de alta atividade para um grupo do Auto Scaling para o Amazon ECS, não é possível definir a opção que retorna instâncias para o grupo de alta atividade ao reduzir a escala horizontalmente (`ReuseOnScaleIn`). Para obter mais informações, consulte [put-warm-pool](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/put-warm-pool.html) na *Referência da AWS Command Line Interface*.

Para usar grupos de alta atividade com seu cluster do Amazon ECS, defina a variável de configuração do agente `ECS_WARM_POOLS_CHECK` como `true` no campo **User data** (Dados do usuário) do seu modelo de inicialização do grupo do Amazon EC2 Auto Scaling. 

A seguir há um exemplo de como a variável de configuração do agente pode ser especificada no campo **Dados do usuário** de um modelo de inicialização do Amazon EC2 para instâncias Linux. Substitua {{MyCluster}} pelo nome do cluster. Para instâncias do Windows, consulte [Usando pools quentes com instâncias Windows do 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
```

Só há suporte para a variável `ECS_WARM_POOLS_CHECK` nas versões `1.59.0` e posteriores do agente. Para obter mais informações sobre as variáveis, consulte [Configuração do agente de contêiner do Amazon ECS](ecs-agent-config.md).

## Usando pools quentes com instâncias Windows do Amazon ECS
<a name="using-warm-pool-windows-lifecycle-hooks"></a>

Ao utilizar pools de acesso frequente com o estado **Parado** em instâncias do Windows, utilize os ganchos de ciclo de vida do Amazon EC2 Auto Scaling para garantir que a execução dos dados do usuário seja concluída antes que a instância seja desligada. Sem os ganchos de ciclo de vida, a instância pode ser parada antes que a inicialização do Amazon ECS seja concluída.

Para configurar ganchos de ciclo de vida para instâncias do “warm pool” do Windows:

1. Adicione a seguinte política do IAM ao perfil da sua instância de contêiner para permitir que a instância conclua a ação do ciclo de vida:

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

1. Adicione um gancho de ciclo de vida ao seu grupo do Auto Scaling na etapa *Inicialização da instância* com `ABANDON`, definindo como resultado padrão e um tempo limite de heartbeat que permita tempo suficiente para a inicialização do Amazon ECS (por exemplo, 10 minutos). Para obter mais informações, consulte [Adicionar ganchos de ciclo de vida](https://docs.aws.amazon.com/autoscaling/ec2/userguide/adding-lifecycle-hooks.html), no *Guia do usuário do Amazon EC2 Auto Scaling*.

1. Utilize os dados de usuário a seguir para criar uma tarefa agendada que execute a ação do ciclo de vida após um intervalo. O atraso garante que o EC2Launch conclua o salvamento de seu estado antes que a instância seja desligada. Substitua {{MyCluster}}, {{my-lifecycle-hook}} e {{my-asg-name}} pelos seus 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>
   ```

Esse script de dados de usuário faz o seguinte:
+ Inicializa o agente do Amazon ECS com a verificação de pools de acesso frequente habilitada.
+ Cria uma tarefa agendada que aguarda 30 segundos após a conclusão dos dados do usuário e, em seguida, aciona o gancho do ciclo de vida para que o processo continue. Esse atraso permite que o EC2Launch salve seu estado, de modo que os dados do usuário sejam executados corretamente nas inicializações seguintes.
+ Se a inicialização falhar, a ação do ciclo de vida é concluída com `ABANDON`, de modo que a instância é encerrada e realizada a troca.