Tutorial: Configuración de un enlace de ciclo de vida que invoca una función 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.

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

En este ejercicio, crearás una EventBridge regla de Amazon que incluye un patrón de filtro que, cuando coincide, invoca una AWS Lambda función como objetivo 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 registro de CloudWatch registros 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.

La siguiente ilustración resume el flujo de un evento de escalado horizontal cuando se utiliza una función Lambda para realizar una acción personalizada. Tras el lanzamiento de una instancia, el ciclo de vida de la instancia se detiene hasta que se complete el enlace del ciclo de vida, ya sea porque se agota el tiempo de espera o cuando Amazon EC2 Auto Scaling recibe una señal para continuar.

El flujo de un evento de escalado horizontal cuando se utiliza una función Lambda para realizar una acción personalizada.

Requisitos previos

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

Paso 1: Crear un rol de IAM con permisos para completar acciones 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 de
  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 Siguiente.

  5. Para Policy name (Nombre de política), introduzca LogAutoScalingEvent-policy. Elija Crear política.

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

Para crear el rol.
  1. En el panel de navegación de la izquierda, seleccione Roles.

  2. Elija Crear rol.

  3. En Select trusted entity (Seleccionar entidad de confianza), elija AWS service (Servicio de ).

  4. Para el caso de uso, elija Lambda y, luego, elija Next (Siguiente).

  5. En Agregar permisos, elija la política que creó (LogAutoScalingEvent-policy) y la política nombrada. AWSLambdaBasicExecutionRole A continuación, elija Siguiente.

    nota

    La AWSLambdaBasicExecutionRolepolítica tiene los permisos que la función necesita para escribir registros en CloudWatch Logs.

  6. En la página Name, review and create (Asignar nombre, revisar y crear), para Role name (Nombre del rol), ingrese LogAutoScalingEvent-role y seleccione Create role (Crear rol).

Paso 2: Crear una función de Lambda

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

Cómo crear una función de 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. En Tiempo de ejecución, elija Node.js 18.x.

  5. Elija Cambiar el rol de ejecución predeterminado y, a continuación, en Rol de ejecución, elija Usar un rol existente.

  6. En Función existente, elija LogAutoScalingEvent -role.

  7. Deje los demás valores predeterminados.

  8. Elija Crear función. Volverá al código y la configuración de la función.

  9. Con la función LogAutoScalingEvent aún abierta en la consola, en Código fuente, en el editor, pegue el siguiente código de muestra en el archivo denominado index.mjs.

    import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling"; export const handler = async(event) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new AutoScalingClient({ 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; const command = new CompleteLifecycleActionCommand(params); try { var data = await autoscaling.send(command); console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } catch (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } return response; };

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

  10. Elija Implementar.

Paso 3: Crear una regla EventBridge

Cree una EventBridge regla para ejecutar la función Lambda. Para obtener más información sobre su uso EventBridge, consulteSe usa EventBridge para gestionar eventos de Auto Scaling.

Para crear una regla con la consola
  1. Abra la consola de EventBridge.

  2. En el panel de navegación, seleccione Reglas.

  3. Seleccione Crear regla.

  4. En Definir detalle de la regla, haga lo siguiente:

    1. En Nombre, escriba LogAutoScalingEvent-rule.

    2. En Bus de eventos, elija Predeterminado. Cuando un Servicio de AWS elemento de su cuenta genera un evento, siempre va al bus de eventos predeterminado de su cuenta.

    3. En Tipo de regla, elija Regla con un patrón de evento.

    4. Elija Siguiente.

  5. En Crear patrón de evento, realice una de las siguientes acciones:

    1. En Origen del evento, selecciona AWS eventos o eventos EventBridge asociados.

    2. Desplácese hacia abajo hasta Patrón de eventos y haga lo siguiente:

      1. En Origen del evento, elija Servicios de AWS.

      2. En Servicio de AWS, elija Auto Scaling.

      3. En Event Type (Tipo de evento), seleccione Instance Launch and Terminate (Lanzamiento y terminación de la instancia).

      4. De forma predeterminada, la regla coincide con cualquier evento de escalado o reducción horizontal. Para crear una regla que le notifique cuando hay un evento de escalado horizontal y una instancia se pone en estado de espera por un enlace de ciclo de vida, elija Specific instance event(s) (Eventos de instancia específicos) y seleccione EC2 Instance-launch Lifecycle Action (Acción de ciclo de vida de lanzamiento de instancia EC2).

      5. De forma predeterminada, la regla coincide con cualquier grupo de Auto Scaling en la región. Para que la regla coincida con un grupo de escalado automático específico, elija Nombres de grupos específicos y, a continuación, seleccione el grupo.

      6. Elija Siguiente.

  6. En Seleccionar destino, realice una de las siguientes acciones:

    1. Para Target types (Tipos de destino), elija Servicio de AWS.

    2. En Select a target (Seleccione destino), elija Lambda function (Función de Lambda).

    3. En Función, elija LogAutoScalingEvent.

    4. Seleccione Next (Siguiente) dos veces.

  7. En la página Revisar y crear, elija Crear regla.

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 grupos de escalado automático en la consola de Amazon EC2.

  2. Seleccione la casilla situada junto al grupo de escalado automático. Se abre un panel dividido en la parte inferior de la página.

  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 para escalar horizontalmente (lanzamiento de instancias), 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 de eventos a los que pasamos 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 grupos de escalado automático 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 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. Abra la página de grupos de registros de la CloudWatch consola.

  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: limpiar

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 grupos de escalado automático en la consola de Amazon EC2.

  2. Seleccione la casilla situada junto al grupo de escalado automático.

  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 Acciones, Eliminar.

  5. Para confirmar, vuelva a elegir Delete.

Para eliminar la EventBridge regla de Amazon
  1. Abre la página de reglas en la EventBridge consola de Amazon.

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

  3. Active la casilla que hay junto a la regla (LogAutoScalingEvent-rule).

  4. Elija Eliminar.

  5. Cuando se le pida la confirmación, escriba el nombre de la regla y, a continuación, elija Delete (Eliminar).

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 Acciones, Eliminar.

  4. Cuando se le pida la confirmación, escriba delete para confirmar la eliminación de la función especificada y, a continuación, elija Delete (Eliminar).

Para eliminar el grupo de registros
  1. Abre la página de grupos de registros de la CloudWatch consola.

  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 Delete log group(s), Eliminar grupo(s) de registro(s) elija Delete (Eliminar).

Cómo 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 Eliminar.

  4. Cuando se le pida la confirmación, escriba el nombre del rol y, a continuación, elija Delete (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 política que creó (LogAutoScalingEvent-policy).

  3. Elija Acciones, Eliminar.

  4. Cuando se le pida la confirmación, escriba el nombre de la política y, a continuación, elija Delete (Eliminar).

Los siguientes temas relacionados pueden resultarle útiles a la hora de crear EventBridge reglas basadas en los eventos que ocurren en las instancias de su grupo de Auto Scaling.

Para ver un tutorial que muestra cómo usar el Servicio de metadatos de instancias (IMDS) para invocar una acción desde la propia instancia, consulte Tutorial: Utilice los metadatos del script de datos y de la instancia para recuperar el estado del ciclo de vida.