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 se deben terminar primero al reducir el tamaño de su grupo de Auto Scaling (lo que se denomina escalamiento interno). 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 políticas de rescisión para Amazon EC2 Auto Scaling.
En este tema, aprenderá a crear una política de rescisión personalizada mediante una AWS Lambda función que Amazon EC2 Auto Scaling invoca en respuesta a determinados eventos. La función Lambda que cree procesa la información de los datos de entrada enviados por Amazon EC2 Auto Scaling y devuelve una lista de instancias que están listas para finalizar.
Una política de terminación personalizada proporciona un mejor control sobre qué instancias se terminan y cuándo. Por ejemplo, cuando su grupo de Auto Scaling se amplía, Amazon EC2 Auto Scaling no puede determinar si hay cargas de trabajo en ejecución que no deberían interrumpirse. Con una función Lambda, puede validar la solicitud de terminación y esperar a que finalice la carga de trabajo antes de devolver el ID de instancia a Amazon EC2 Auto Scaling para su finalización.
Datos de entrada
Amazon EC2 Auto Scaling genera una carga útil JSON para escalarla en los eventos y también lo hace cuando las instancias están a punto de finalizar debido a la vida útil máxima de la instancia o a las funciones de actualización de la instancia. 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 útil contiene información sobre la capacidad que Amazon EC2 Auto Scaling necesita para finalizar, una lista de instancias que sugiere 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 los casos que Amazon EC2 Auto Scaling sugiere para la terminación en función de la información que contieneCapacityToTerminate
. -
Cause
describe el evento que causó la terminación:
,SCALE_IN
INSTANCE_REFRESH
,MAX_INSTANCE_LIFETIME
oREBALANCE
.
La siguiente información describe los factores más importantes de la forma en que Amazon EC2 Auto Scaling genera los Instances
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 que especificó para su grupo de Auto Scaling. 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 devuelve ninguna instancia o se agota el tiempo de espera de la función Lambda, Amazon EC2 Auto Scaling espera un momento 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 una vida útil máxima de la instancia, Amazon EC2 Auto Scaling sigue intentando terminar la instancia que, según se identifica, ha superado 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 anula los datos de entrada con su propia lista de instancias para finalizar y, al finalizar estas instancias, las zonas de disponibilidad se desequilibran, 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 frente a la reducción horizontal de instancias para controlar la terminación 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)
Abra la página Functions (Funciones)
en la consola de Lambda. -
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.
-
Elija Create function (Crear función) y, a continuación, elija Author from scratch (Crear desde cero).
-
En Basic information (Información básica), para Function name (Nombre de función), escriba un nombre para la función.
-
Seleccione Crear función. Volverá al código y la configuración de la función.
-
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.
-
Elija Implementar.
-
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 .
-
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
-
A continuación, elija la pestaña Configuration (Configuración) y luego Permissions (Permisos).
-
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, el principal será el rol vinculado al servicio Amazon EC2 Auto Scaling que está asociado al grupo Auto Scaling.
-
En la sección Policy statement (Instrucción de la política), configure sus permisos:
-
Elija Cuenta de AWS.
-
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
. -
En Acción, elija lambda:. InvokeFunction
-
En Statement ID (ID de estado), escriba un ID de instrucción único, como
AllowInvokeByAutoScaling
. -
Seleccione Guardar.
-
-
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 Cambio de la política de terminación de un grupo de escalado automático.
nota
Para ver ejemplos que puede utilizar como referencia para desarrollar su función Lambda, consulte el GitHub repositorio
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
ofunction: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.
-
Si su tiempo de ejecución supera el límite de 2 segundos, cualquier acción de reducción horizontal se suspenderá hasta que el tiempo de ejecución caiga por debajo de este umbral. En el caso de las funciones de Lambda con tiempos de ejecución más largos y constantes, busque una forma de reducir el tiempo de ejecución, por ejemplo, almacenando en caché los resultados donde puedan recuperarse durante las siguientes invocaciones a Lambda.