Configuración de instancias preinicializadas para el grupo de escalado automático de Amazon ECS
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 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 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.
#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyClusterECS_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.
Uso de grupos de calentamiento con instancias de Windows en Amazon ECS
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:
-
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": "*" } ] } -
Agregue un enlace de ciclo de vida a su grupo de escalado automático en Lanzar una instancia con
ABANDONcomo 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 en la guía de hombre del usuario de Amazon EC2 Auto Scaling. -
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-hookymy-asg-namepor 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 -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>
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.