Tutorial: Configuración de un enlace de ciclo de vida que invoca una función Lambda - Amazon EC2 Auto Scaling

Tutorial: Configuración de un enlace de ciclo de vida que invoca una función Lambda

En este ejercicio, creará una regla de EventBridge que incluye un patrón de filtro que, cuando se cumple, invoca una función AWS Lambda como destino de la regla. Proporcionamos el patrón de filtro y el código de la función de ejemplo que se van a usar.

Si todo está configurado correctamente, al final de este tutorial, la función Lambda realiza una acción personalizada cuando se inician las instancias. La acción personalizada simplemente registra el evento en el flujo de registros de CloudWatch Logs asociado a la función Lambda.

La función Lambda también realiza una devolución de llamada para permitir que el ciclo de vida de la instancia continúe si esta acción se completa correctamente, pero permite que la instancia deje de iniciarse y termine si la acción falla.

Prerequisites

Antes de comenzar este tutorial, cree un grupo de Auto Scaling, si aún no dispone de uno. Para crear un grupo de Auto Scaling, abra la página Auto Scaling groups (Grupos de Auto Scaling) en la consola de Amazon EC2 y elija Create Auto Scaling group (Crear grupo de Auto Scaling).

Tenga en cuenta que todos los procedimientos siguientes corresponden a la nueva consola.

Paso 1: crear un rol de IAM con permisos para completar enlaces de ciclo de vida

Antes de crear una función Lambda, primero debe crear un rol de ejecución y una política de permisos para permitir que Lambda complete los enlaces de ciclo de vida.

Para crear la política, realice el siguiente procedimiento:

  1. En la consola de IAM, abra la página Policies (Políticas), y, a continuación, elija Create policy (Crear política).

  2. Seleccione la pestaña JSON.

  3. En el cuadro Policy Document (Documento de política), pegue el siguiente documento de la política, reemplazando el texto en cursiva por el número de cuenta y el nombre del grupo de Auto Scaling.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg" } ] }
  4. Elija Next:Tags (Siguiente: etiquetas) y, a continuación, Next:Review (Siguiente: revisar).

  5. En Name (Nombre), ingrese LogAutoScalingEvent-policy. Elija Create Policy.

Cuando termine de crear la política, podrá crear un rol que la utilice.

Para crear el rol, realice el siguiente procedimiento:

  1. En el panel de navegación, elija Roles, Create role (Crear rol).

  2. En Choose a use case (Elegir un caso de uso), elija Lambda de la lista y, a continuación, elija Next Permissions (Siguiente: permisos).

  3. En Attach permissions policies (Adjuntar políticas de permisos), elija LogAutoScalingEvent-Policy y AWSLambdaBasicExecutionRole.

  4. Elija Next:Tags (Siguiente: etiquetas) y, a continuación, Next:Review (Siguiente: revisar).

  5. En la página Review (Revisión), para Name (Nombre), ingrese LogAutoScalingEvent-role y elija Create role (Crear rol).

Paso 2: crear una función Lambda

Cree una función Lambda que actúe como destino de los eventos. EventBridge invoca a la función Lambda de ejemplo, escrita en Node.js, cuando Amazon EC2 Auto Scaling emite un evento coincidente.

Para crear una función Lambda

  1. Abra la página Functions (Funciones) en la consola de Lambda.

  2. Elija Create function (Crear función) y Author from scratch (Crear desde cero).

  3. En Basic information (Información básica), para Function name (Nombre de función), escriba LogAutoScalingEvent.

  4. Elija Change default execution role (Cambiar rol de ejecución predeterminado) y, a continuación, en Execution role (Rol de ejecución), elija Use an existing role (Usar un rol existente).

  5. Para Existing role (Rol existente), elija LogAutoScalingEvent-role.

  6. Deje los demás valores predeterminados.

  7. Elija Create function (Crear función). Volverá al código y la configuración de la función.

  8. Con la función LogAutoScalingEvent aún abierta en la consola, en Function code (Código de la función), en el editor, copie el siguiente código de muestra en el archivo denominado index.js.

    var aws = require("aws-sdk"); exports.handler = (event, context, callback) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new aws.AutoScaling({region: event.region}); var eventDetail = event.detail; var params = { AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */ LifecycleActionResult: 'CONTINUE', /* required */ LifecycleHookName: eventDetail['LifecycleHookName'], /* required */ InstanceId: eventDetail['EC2InstanceId'], LifecycleActionToken: eventDetail['LifecycleActionToken'] }; var response; autoscaling.completeLifecycleAction(params, function(err, data) { if (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } else { console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } }); return response; };

    Este código simplemente registra el evento para que, al final de este tutorial, pueda ver un evento aparecer en el flujo de registros de CloudWatch Logs asociado a esta función Lambda.

  9. Elija Deploy (Implementar).

Paso 3: crear una regla de EventBridge

Cree una regla de EventBridge para ejecutar la función Lambda.

Para crear una regla con la consola

  1. Abra la consola de EventBridge.

  2. En el panel de navegación, elija Rules (Reglas), Create rule (Crear regla).

  3. En Name (Nombre), ingrese LogAutoScalingEvent-rule.

  4. En Define pattern (Definir patrón), elija Event pattern (Patrón de evento).

  5. Para Event matching pattern (Patrón de coincidencia de eventos), elija Custom pattern (Patrón personalizado).

  6. Las reglas utilizan patrones de eventos para seleccionar eventos y dirigirlos a los destinos. Copie el siguiente patrón en el cuadro Event pattern (Patrón de evento).

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-launch Lifecycle Action" ] }
  7. Para guardar el patrón de eventos, elija Save (Guardar).

  8. En Select event bus (Seleccionar bus de eventos), elija AWS default event bus (Bus de eventos predeterminado).

  9. En Target (Destino), elijaLambda function (Función Lambda).

  10. Para Function (Función), seleccione LogAutoScalingEvent. Elija Create (Crear).

Paso 4: agregar un enlace de ciclo de vida

En esta sección, agrega un enlace de ciclo de vida para que Lambda ejecute la función en instancias en el momento del inicio.

Para agregar un enlace de ciclo de vida

  1. Abra la página Auto Scaling groups (Grupos de Auto Scaling) en la consola de Amazon EC2.

  2. Seleccione la casilla situada junto al grupo de Auto Scaling.

    Se abre un panel dividido en la parte inferior de la página Auto Scaling groups (Grupos de Auto Scaling).

  3. En el panel inferior, en la pestaña Instance management (Administración de instancias), en Lifecycle hooks (Enlaces de ciclo de vida), elija Create lifecycle hook (Crear enlace de ciclo de vida).

  4. Para definir un enlace de ciclo de vida, haga lo siguiente:

    1. En Lifecycle hook name (Nombre de enlace de ciclo de vida), ingrese LogAutoScalingEvent-hook.

    2. En Lifecycle transition (Transición del ciclo de vida), elija Instance launch (Lanzamiento de instancia).

    3. En Heartbeat timeout (Tiempo de espera de latidos), ingrese 300 para indicar la cantidad de segundos que se debe esperar una devolución de llamada desde la función Lambda.

    4. En Default result (Resultado predeterminado), elija ABANDON (Abandonar). Esto significa que el grupo de Auto Scaling terminará una nueva instancia si el enlace agota el tiempo de espera sin recibir una devolución de llamada de la función Lambda.

    5. (Opcional) Deje la opción Notification metadata (Metadatos de notificación) vacía. Los datos del evento que pasamos a EventBridge contienen toda la información necesaria para invocar la función Lambda.

  5. Elija Create (Crear).

Paso 5: probar y verificar el evento

Para probar el evento, actualice el grupo de Auto Scaling aumentando la capacidad deseada del grupo de Auto Scaling en 1. Se invoca la función Lambda pocos segundos después de aumentar la capacidad deseada.

Para aumentar el tamaño del grupo de Auto Scaling

  1. Abra la página Auto Scaling groups (Grupos de Auto Scaling) en la consola de Amazon EC2.

  2. Seleccione la casilla de verificación situada junto al grupo de Auto Scaling para ver los detalles en un panel inferior y seguir viendo las filas superiores del panel superior.

  3. En el panel inferior, en la pestaña Details (Detalles), elija Group details (Detalles de grupo), Edit (Editar).

  4. En Desired capacity (Capacidad deseada), aumente el valor actual en 1.

  5. Elija Update (Actualizar). Mientras se está iniciando la instancia, la columna Status (Estado) del panel superior muestra el estado Updating capacity (Actualizando capacidad).

Después de aumentar la capacidad deseada, puede verificar que se invocó la función Lambda.

Para ver la salida de la función Lambda

  1. En la consola de CloudWatch, abra la página Log groups (grupos de registro).

  2. Seleccione el nombre del grupo de registros para la función Lambda (/aws/lambda/LogAutoScalingEvent).

  3. Seleccione el nombre del flujo de registros para ver los datos proporcionados por la función para la acción del ciclo de vida.

A continuación, puede verificar que la instancia se haya iniciado correctamente a partir de la descripción de las actividades de escalado.

Para ver la actividad de escalado

  1. Vuelva a la página Auto Scaling groups (Grupos de Auto Scaling) y seleccione su grupo.

  2. En la pestaña Activity (Actividad), en Activity history (Historial de actividad), la columna Status (Estado) muestra si su grupo de Auto Scaling ha lanzado una instancia.

    • Si la acción se completó correctamente, la actividad de escalado tendrá el estado Successful (Correcto).

    • Si hubo un error, después de esperar unos minutos, verá una actividad de escalado con el estado Cancelled (Cancelado) y el mensaje: “Instance failed to complete user's Lifecycle Action: Lifecycle Action with token e85eb647-4fe0-4909-b341-a6c42EXAMPLE was abandoned: Lifecycle Action Completed with ABANDON Result” (La instancia no pudo completar la acción del ciclo de vida del usuario: se abandonó la acción del ciclo de vida con token e85eb647-4fe0-4909-b341-a6c42EJEMPLO: la acción del ciclo de vida se completó con el resultado ABANDON).

Para disminuir el tamaño del grupo de Auto Scaling

Si no necesita la instancia adicional que lanzó para esta prueba, puede abrir la pestaña Details (Detalles) y reducir el valor Desired capacity (Capacidad deseada) en 1.

Paso 6: Siguientes pasos

Ahora que ha completado este tutorial, puede intentar crear un enlace de ciclo de vida de terminación. Si terminan las instancias del grupo de Auto Scaling, se envía un evento a EventBridge. Para obtener información acerca del evento que se emite cuando termina una instancia, consulte Acción de ciclo de vida de terminación de instancia EC2.

Paso 7: Limpieza

Si ha terminado de trabajar con los recursos que ha creado para este tutorial, siga los pasos a continuación para eliminarlos.

Para eliminar el enlace de ciclo de vida

  1. Abra la página Auto Scaling groups (Grupos de Auto Scaling) en la consola de Amazon EC2.

  2. Seleccione la casilla situada junto al grupo de Auto Scaling.

  3. En la pestaña Instance management (Administración de instancias), en Lifecycle hooks (Enlaces de ciclo de vida), elija el enlace de ciclo de vida (LogAutoScalingEvent-hook).

  4. Elija Actions (Acciones), Delete (Eliminar).

  5. Para confirmar, vuelva a elegir Delete.

Para eliminar la regla de Amazon EventBridge

  1. Abra la página Rules (Reglas) en la consola de Amazon EventBridge.

  2. En Event bus (Bus de eventos), elija el bus de eventos asociado a la regla (Default).

  3. Elija la regla (LogAutoScalingEvent-rule).

  4. Elija Actions (Acciones), Delete (Eliminar).

  5. Para confirmar, vuelva a elegir Delete.

Si ha terminado de trabajar con la función de ejemplo, elimínela. También puede eliminar el grupo de registro que almacena los registros de la función, y el rol de ejecución y la política de permisos que ha creado.

Para eliminar una función de Lambda

  1. Abra la página Functions (Funciones) en la consola de Lambda.

  2. Elija la función (LogAutoScalingEvent).

  3. Elija Actions (Acciones), Delete (Eliminar).

  4. En el cuadro de diálogo Eliminar función, elija Eliminar.

Para eliminar el grupo de registros

  1. En la consola de CloudWatch, abra la página Log groups (Grupos de registro).

  2. Seleccione el grupo de registros de la función (/aws/lambda/LogAutoScalingEvent).

  3. Elija Acciones, Eliminar grupo(s) de registro(s).

  4. En el cuadro de diálogo Eliminar grupo(s) de registro(s), elija Eliminar.

Para eliminar el rol de ejecución

  1. Abra la página Roles en la consola de IAM.

  2. Seleccione el rol de la función (LogAutoScalingEvent-role).

  3. Elija Delete role (Eliminar rol).

  4. En el cuadro de diálogo Eliminar rol, elija Sí, eliminar.

Para eliminar la política de IAM:

  1. Abra la página de Policies (Políticas) de la consola de IAM.

  2. Seleccione la directiva que ha creado (LogAutoScalingEvent-policy).

  3. Elija Delete policy.

  4. En el cuadro de diálogo Delete policy (Eliminar política), elija Yes, delete (Sí, eliminar).