Invocación de funciones duraderas de Lambda - AWS Lambda

Invocación de funciones duraderas de Lambda

Las funciones duraderas de Lambda admiten los mismos métodos de invocación que las funciones estándar de Lambda. Puede invocar funciones duraderas de forma sincrónica, asíncrona o mediante asignaciones de orígenes de eventos. El proceso de invocación es idéntico al de las funciones estándar, pero las funciones duraderas proporcionan capacidades adicionales para las ejecuciones de larga duración y la administración automática del estado.

Métodos de invocación

Invocación sincrónica: invoca una función duradera y espera la respuesta. Lambda limita las invocaciones sincrónicas a 15 minutos (o menos, según la función configurada y el tiempo de espera de ejecución). Utilice la invocación sincrónica cuando necesite resultados inmediatos o cuando se integre con API y servicios que esperan una respuesta. Puede utilizar las operaciones de espera para un cómputo eficiente sin interrumpir a la persona que llama; la invocación espera a que se complete toda la ejecución duradera. Para que se inicie una ejecución idempotente, utilice el parámetro del nombre de la ejecución, como se describe en Idempotencia.

aws lambda invoke \ --function-name my-durable-function:1 \ --cli-binary-format raw-in-base64-out \ --payload '{"orderId": "12345"}' \ response.json

Invocación asíncrona: coloca un evento en cola para su procesamiento sin esperar una respuesta. Lambda coloca el evento en una cola y lo devuelve de inmediato. Las invocaciones asíncronas admiten duraciones de ejecución de hasta 1 año como máximo. Utilice la invocación asíncrona en situaciones de tipo «disparar y olvidar», o cuando el procesamiento pueda realizarse en segundo plano. Para que se inicie una ejecución idempotente, utilice el parámetro del nombre de la ejecución, como se describe en Idempotencia.

aws lambda invoke \ --function-name my-durable-function:1 \ --invocation-type Event \ --cli-binary-format raw-in-base64-out \ --payload '{"orderId": "12345"}' \ response.json

Asignaciones de orígenes de eventos: configure Lambda para que invoque automáticamente la función duradera cuando haya registros disponibles en servicios basados en colas o flujos, como Amazon SQS, Kinesis o DynamoDB. Las asignaciones de orígenes de eventos sondean el origen de eventos e invocan su función con lotes de registros. Para obtener más información sobre el uso de las asignaciones de orígenes de eventos con funciones duraderas, incluidos los límites de duración de la ejecución, consulte Asignaciones de orígenes de eventos con funciones duraderas.

Para obtener información completa sobre cada método de invocación, consulte invocación sincrónica e invocación asíncrona.

nota

Las funciones duraderas admiten colas de mensajes fallidos (DLQ) para la gestión de errores, pero no admiten destinos de Lambda. Configure una DLQ para capturar los registros de las invocaciones fallidas.

Requerimiento de ARN calificados

Las funciones duraderas requieren identificadores calificados para la invocación. Debe invocar funciones duraderas con un número de versión, un alias o $LATEST. Puede utilizar un ARN calificado completo o un nombre de función con el sufijo de versión/alias. No puede utilizar un identificador no calificado (sin un sufijo de versión o alias).

Invocaciones válidas:

# Using full ARN with version number arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1 # Using full ARN with alias arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:prod # Using full ARN with $LATEST arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:$LATEST # Using function name with version number my-durable-function:1 # Using function name with alias my-durable-function:prod

Invocaciones inválidas:

# Unqualified ARN (not allowed) arn:aws:lambda:us-east-1:123456789012:function:my-durable-function # Unqualified function name (not allowed) my-durable-function

Este requisito garantiza que las ejecuciones duraderas se mantengan consistentes durante todo su ciclo de vida. Cuando se inicia una ejecución duradera, se fija en la versión de la función específica. Si la función se detiene y se reanuda horas o días después, Lambda invoca la misma versión que inició la ejecución, lo que garantiza la coherencia del código en todo el flujo de trabajo.

Práctica recomendada

En lugar de utilizar $LATEST, utilice versiones numeradas o alias para las funciones duraderas de producción. Las versiones numeradas son inmutables y garantizan una reproducción determinista. Opcionalmente, los alias proporcionan una referencia estable que se puede actualizar para que apunte a nuevas versiones sin cambiar el código de invocación. Cuando actualiza un alias, las nuevas ejecuciones utilizan la nueva versión, mientras que las ejecuciones en curso continúan con su versión original. Puede utilizar $LATEST para crear prototipos o acortar los tiempos de implementación durante el desarrollo; debe tener en cuenta que las ejecuciones podrían no reproducirse correctamente (o incluso fallar) si el código subyacente cambia durante las ejecuciones en ejecución.

Descripción del ciclo de vida de una ejecución

Cuando invoca una función duradera, Lambda crea una ejecución duradera que puede abarcar múltiples invocaciones de funciones:

  1. Invocación inicial: su solicitud de invocación crea una nueva ejecución duradera. Lambda asigna un identificador de ejecución único e inicia el procesamiento.

  2. Ejecución y puntos de control: a medida que su función ejecuta operaciones duraderas, el SDK crea puntos de control para seguir el progreso.

  3. Suspensión (si es necesaria): si la función utiliza esperas duraderas, como wait o waitForCallback, o reintentos automáticos por pasos, Lambda suspende la ejecución y deja de cobrar por el tiempo de cómputo.

  4. Reanudación: cuando llega el momento de la reanudación (incluso después de los reintentos), Lambda vuelve a invocar la función. El SDK reproduce el registro de puntos de control y continúa desde donde se detuvo la ejecución.

  5. Finalización: cuando la función devuelve un resultado final o arroja un error no controlado, se completa la ejecución duradera.

Para las invocaciones sincrónicas, la persona que llama espera a que se complete toda la ejecución duradera, incluidas las operaciones de espera. Si la ejecución supera el tiempo de espera de la invocación (15 minutos o menos), se agota el tiempo de espera de la invocación. Para las invocaciones asíncronas, Lambda regresa de inmediato, y la ejecución continúa de forma independiente. Utilice las API de ejecución duradera para realizar un seguimiento del estado de la ejecución y recuperar los resultados finales.

Invocación desde el código de la aplicación

Utilice los AWS SDK para invocar funciones duraderas desde el código de la aplicación. El proceso de invocación es idéntico al de las funciones estándar:

TypeScript
import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'; const client = new LambdaClient({}); // Synchronous invocation const response = await client.send(new InvokeCommand({ FunctionName: 'arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1', Payload: JSON.stringify({ orderId: '12345' }) })); const result = JSON.parse(Buffer.from(response.Payload!).toString()); // Asynchronous invocation await client.send(new InvokeCommand({ FunctionName: 'arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1', InvocationType: 'Event', Payload: JSON.stringify({ orderId: '12345' }) }));
Python
import boto3 import json client = boto3.client('lambda') # Synchronous invocation response = client.invoke( FunctionName='arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1', Payload=json.dumps({'orderId': '12345'}) ) result = json.loads(response['Payload'].read()) # Asynchronous invocation client.invoke( FunctionName='arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1', InvocationType='Event', Payload=json.dumps({'orderId': '12345'}) )

Invocaciones encadenadas

Las funciones duraderas pueden invocar otras funciones duraderas y no duraderas mediante la operación invoke desde DurableContext. Esto crea una invocación encadenada en la que la función de llamada espera (suspende) a que se complete la función invocada:

TypeScript
export const handler = withDurableExecution( async (event: any, context: DurableContext) => { // Invoke another durable function and wait for result const result = await context.invoke( 'process-order', 'arn:aws:lambda:us-east-1:123456789012:function:order-processor:1', { orderId: event.orderId } ); return { statusCode: 200, body: JSON.stringify(result) }; } );
Python
@durable_execution def handler(event, context: DurableContext): # Invoke another durable function and wait for result result = context.invoke( 'arn:aws:lambda:us-east-1:123456789012:function:order-processor:1', {'orderId': event['orderId']}, name='process-order' ) return {'statusCode': 200, 'body': json.dumps(result)}

Las invocaciones encadenadas crean un punto de control en la función de llamada. Si la función de llamada se interrumpe, se reanuda desde el punto de control con el resultado de la función invocada, sin volver a invocarla.

nota

No se admiten invocaciones encadenadas entre cuentas. La función invocada debe estar en la misma cuenta de AWS que la función de llamada.