Creación de una política de terminación personalizada con Lambda - Amazon EC2 Auto Scaling

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Creación de una política de terminación personalizada con Lambda

Amazon EC2 Auto Scaling utiliza políticas de terminación para priorizar qué instancias deben terminar primero al disminuir el tamaño del grupo de escalado automático (que se denomina reducción horizontal). El grupo de escalado automático utiliza una política de terminación predeterminada, pero opcionalmente puede elegir o crear sus propias políticas de terminación. Para obtener más información acerca de la elección de una política de terminación predefinida, consulte Configurar las políticas de terminación para Amazon EC2 Auto Scaling.

En este tema, aprenderá a crear una política de terminación personalizada utilizando una función AWS Lambda que Amazon EC2 Auto Scaling invoca en respuesta a determinados eventos. La función Lambda que crea procesa la información de los datos de entrada enviados por Amazon EC2 Auto Scaling y devuelve una lista de instancias listas para terminarse.

Una política de terminación personalizada proporciona un mejor control sobre qué instancias se terminan y cuándo. Por ejemplo, cuando el grupo de escalado automático se reduce horizontalmente, Amazon EC2 Auto Scaling no puede determinar si hay cargas de trabajo en ejecución que no deben interrumpirse. Con una función Lambda, puede validar la solicitud de terminación y esperar hasta que finalice la carga de trabajo antes de devolver el ID de instancia a Amazon EC2 Auto Scaling para la terminación.

Datos de entrada

Amazon EC2 Auto Scaling genera una carga JSON para los eventos de reducción horizontal, y también lo hace cuando las instancias están a punto de terminar como resultado de la duración máxima de la instancia o de las características de actualización de instancias. También genera una carga JSON para los eventos de reducción horizontal que puede iniciar al reequilibrar el grupo entre las zonas de disponibilidad.

Esta carga contiene información sobre la capacidad que Amazon EC2 Auto Scaling necesita terminar, una lista de instancias que sugiere para la terminación y el evento que inició la terminación.

A continuación, se muestra un ejemplo de carga:

{ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg", "AutoScalingGroupName": "my-asg", "CapacityToTerminate": [ { "AvailabilityZone": "us-east-1b", "Capacity": 2, "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "on-demand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, ... ], "Cause": "SCALE_IN" }

La carga útil incluye el nombre del grupo de escalado automático, su Nombre de recurso de Amazon (ARN) y los siguientes elementos:

  • CapacityToTerminate describe cuánta capacidad de spot o en diferido se ha configurado para terminar en una zona de disponibilidad determinada.

  • Instances representa las instancias que Amazon EC2 Auto Scaling sugiere para la terminación en función de la información de CapacityToTerminate.

  • Cause describe el evento que causó la terminación: SCALE_IN, INSTANCE_REFRESH, MAX_INSTANCE_LIFETIME o REBALANCE.

La siguiente información describe los factores más significativos de cómo Amazon EC2 Auto Scaling genera Instances en los datos de entrada:

  • El mantenimiento del equilibrio entre las zonas de disponibilidad tiene prioridad cuando se termina una instancia debido a eventos de reducción horizontal y terminaciones basadas en la actualización de instancias. Por lo tanto, si una zona de disponibilidad tiene más instancias que las otras zonas de disponibilidad usadas por el grupo, los datos de entrada contienen instancias que se pueden elegir para la terminación solo de la zona de disponibilidad desequilibrada. Si las zonas de disponibilidad utilizadas por el grupo están equilibradas, los datos de entrada contienen instancias de todas las zonas de disponibilidad del grupo.

  • Cuando se utiliza una política de instancias mixtas, mantener las capacidades de spot y en diferido en equilibrio en función de los porcentajes deseados para cada opción de compra también tiene prioridad. En primer lugar, identificamos cuál de los dos tipos (spot o en diferido) debe terminarse. A continuación, identificamos qué instancias (dentro de la opción de compra identificada) de qué zonas de disponibilidad podemos terminar, lo que hará que las zonas de disponibilidad estén más equilibradas.

Datos de respuesta

Los datos de entrada y los de respuesta en combinación reducen la lista de instancias que se van a terminar.

Con la entrada dada, la respuesta de la función Lambda debería ser similar a la del siguiente ejemplo:

{ "InstanceIDs": [ "i-02e1c69383a3ed501", "i-036bc44b6092c01c7", ... ] }

El elemento InstanceIDs de la respuesta representa las instancias que están listas para terminar.

Como alternativa, puede devolver un conjunto diferente de instancias que están listas para terminarse, que reemplaza a las instancias en los datos de entrada. Si no hay instancias listas para terminar cuando se invoca la función Lambda, también puede optar por no devolver ninguna instancia.

Cuando no haya ninguna instancia lista para terminar, la respuesta de la función Lambda debería ser similar a la del siguiente ejemplo:

{ "InstanceIDs": [ ] }

Consideraciones

Tenga en cuenta las siguientes consideraciones al utilizar una política de terminación personalizada:

  • Devolver una instancia primero en los datos de respuesta no garantiza su terminación. Si se devuelve un número de instancias superior al requerido cuando se invoca la función Lambda, Amazon EC2 Auto Scaling evalúa cada instancia con respecto a las demás políticas de terminación especificadas para el grupo de escalado automático. Cuando hay varias políticas de terminación, intenta aplicar la siguiente política de terminación de la lista y, si hay más instancias de las necesarias para terminar, pasa a la siguiente política de terminación, etc. Si no se especifica ninguna otra política de terminación, se utiliza la política de terminación predeterminada para determinar qué instancias se van a terminar.

  • Si no se devuelven instancias o se agota el tiempo de espera de la función Lambda, Amazon EC2 Auto Scaling espera un breve periodo de tiempo antes de volver a invocar la función. Para cualquier evento de reducción horizontal, sigue intentándolo siempre y cuando la capacidad deseada del grupo sea menor que su capacidad actual. Por ejemplo, en terminaciones basadas en actualizaciones, sigue intentándolo durante una hora. Después de eso, si sigue sin poder terminar instancias, se produce un error en la operación de actualización de instancias. Con la vida útil máxima de la instancia, Amazon EC2 Auto Scaling sigue intentando terminar la instancia que se ha identificado que supera su vida útil máxima.

  • Debido a que la función se reintenta repetidamente, asegúrese de probar y corregir cualquier error permanente en el código antes de usar una función Lambda como una política de terminación personalizada.

  • Si reemplaza los datos de entrada por su propia lista de instancias que desea terminar y al terminar estas instancias se desequilibran las zonas de disponibilidad, Amazon EC2 Auto Scaling reequilibra gradualmente la distribución de la capacidad entre las zonas de disponibilidad. Primero, invoca la función Lambda para ver si hay instancias que están listas para terminarse y poder determinar si debe comenzar a reequilibrar. Si hay instancias listas para terminarse, primero lanza nuevas instancias. Cuando las instancias terminan de lanzarse, detecta que la capacidad actual del grupo es superior a la capacidad deseada e inicia un evento de reducción horizontal.

  • Una política de terminación personalizada no afecta a su capacidad de utilizar también la protección contra la reducción horizontal para evitar que determinadas instancias sean terminadas. Para obtener más información, consulte Uso de la protección de reducción horizontal de instancias.

Crear la función de Lambda

Comience por crear la función Lambda, de modo que pueda especificar su Nombre de recurso de Amazon (ARN) en las políticas de terminación del grupo de escalado automático.

Para crear una función Lambda (consola)
  1. Abra la página de Funciones en la consola Lambda.

  2. En la barra de navegación de la parte superior de la pantalla, seleccione la misma región que utilizó cuando creó el grupo de escalado automático.

  3. Elija Create function (Crear función) y, a continuación, elija Author from scratch (Crear desde cero).

  4. En Basic information (Información básica), para Function name (Nombre de función), escriba un nombre para la función.

  5. Seleccione Crear función. Volverá al código y la configuración de la función.

  6. Con la función aún abierta en la consola, en Function code (Código de función), pegue el código en el editor.

  7. Seleccione Implementar.

  8. Opcionalmente, cree una versión publicada de la función Lambda eligiendo la pestaña Versions (Versiones) y, a continuación, Publish new version (Publicar nueva versión). Para obtener más información acerca del control de versiones en Lambda, consulte Versiones de la función de Lambda en la Guía para desarrolladores de AWS Lambda .

  9. Si eligió publicar una versión, elija la pestaña Aliases (Alias) si desea asociar un alias a esta versión de la función Lambda. Para obtener más información acerca de los alias en Lambda, consulte Alias de función Lambda en la Guía para desarrolladores de AWS Lambda

  10. A continuación, elija la pestaña Configuration (Configuración) y luego Permissions (Permisos).

  11. Desplácese hasta Política basada en recursos y elija Agregar permisos. Una política basada en recursos se utiliza para conceder permisos para invocar la función a la entidad principal que se especifica en la política. En este caso, la entidad principal será el rol vinculado al servicio de Amazon EC2 Auto Scaling asociado al grupo de escalado automático.

  12. En la sección Policy statement (Instrucción de la política), configure sus permisos:

    1. Elija Cuenta de AWS.

    2. En Principal (Entidad principal), escriba el ARN del rol vinculado al servicio de llamada, por ejemplo, arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling.

    3. Para Acción, elija lambda: InvokeFunction.

    4. En Statement ID (ID de estado), escriba un ID de instrucción único, como AllowInvokeByAutoScaling.

    5. Seleccione Guardar.

  13. Después de seguir estas instrucciones, continúe para especificar el ARN de la función en las políticas de terminación para el grupo de escalado automático. Para obtener más información, consulte Cambiar la política de terminación de un grupo de Auto Scaling.

nota

Para ver ejemplos que puede utilizar como referencia para desarrollar su función Lambda, consulte el GitHub repositorio de Auto Scaling de Amazon EC2.

Limitaciones

  • Solo puede especificar una función Lambda en las políticas de terminación para un grupo de escalado automático. Si se especifican varias políticas de terminación, primero se debe especificar la función Lambda.

  • Puede hacer referencia a la función Lambda utilizando un ARN no calificado (sin sufijo) o un ARN calificado que tenga una versión o un alias como sufijo. Si se utiliza un ARN no calificado (por ejemplo, function:my-function), la política basada en recursos debe crearse en la versión no publicada de la función. Si se utiliza un ARN calificado (por ejemplo, function:my-function:1 o function:my-function:prod), la política basada en recursos debe crearse en esa versión de la función publicada específica.

  • No puede utilizar un ARN calificado con el sufijo $LATEST. Si intenta agregar una política de terminación personalizada que haga referencia a un ARN calificado con el sufijo $LATEST, se producirá un error.

  • El número de instancias proporcionadas en los datos de entrada está limitado a 30 000 instancias. Si hay más de 30 000 instancias que podrían terminarse, los datos de entrada incluyen "HasMoreInstances": true para indicar que se devuelve el número máximo de instancias.

  • El tiempo máximo de ejecución de la función Lambda es de dos segundos (2000 milisegundos). Como práctica recomendada, debe establecer el valor de tiempo de espera de la función Lambda según el tiempo de ejecución previsto. Las funciones Lambda tienen un tiempo de espera predeterminado de tres segundos, pero esto puede reducirse.