Configuração de instâncias inicializadas previamente para o grupo do Amazon ECS Auto Scaling
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 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 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.
#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyClusterECS_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.
Usando pools quentes com instâncias Windows do Amazon ECS
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:
-
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": "*" } ] } -
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, no Guia do usuário do Amazon EC2 Auto Scaling. -
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-hookemy-asg-namepelos 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 -ClusterMyCluster-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.