Conceptos básicos - AWS Lambda

Conceptos básicos

Lambda proporciona los SDK de ejecución duradera para JavaScript, TypeScript y Python. Estos SDK son la base para crear funciones duraderas y proporcionan los componentes que necesita para comprobar el progreso, gestionar los reintentos y administrar el flujo de ejecución. Para ver ejemplos y documentación completa del SDK, consulte el SDK para JavaScript/TypeScript y el SDK para Python en GitHub.

Ejecución duradera

Una ejecución duradera representa el ciclo de vida completo de una función duradera de Lambda y utiliza un mecanismo de puntos de control y reproducción para realizar un seguimiento del progreso de la lógica empresarial, suspender la ejecución y recuperarse de los errores. Cuando las funciones se reanudan tras una suspensión o interrupción, los puntos de control completados anteriormente se reproducen y la función continúa ejecutándose.

El ciclo de vida puede incluir varias invocaciones de una función de Lambda para completar la ejecución, especialmente después de suspensiones o una recuperación de errores. Este enfoque permite que la función se ejecute durante períodos prolongados (hasta 1 año) y, al mismo tiempo, mantiene un progreso fiable a pesar de las interrupciones.

Cómo funciona la reproducción

Lambda mantiene un registro en ejecución de todas las operaciones duraderas (pasos, esperas y otras operaciones) a medida que se ejecuta la función. Cuando la función necesita hacer una pausa o se produce una interrupción, Lambda guarda este registro de puntos de control y detiene la ejecución. Cuando llega el momento de reanudarla, Lambda vuelve a invocar la función desde el principio y reproduce el registro de puntos de control; así se sustituyen los valores almacenados por las operaciones completadas. Esto significa que el código se vuelve a ejecutar, pero los pasos completados anteriormente no se vuelven a ejecutar. En cambio, se utilizan sus resultados almacenados.

Este mecanismo de reproducción es fundamental para comprender las funciones duraderas. El código debe ser determinista durante la reproducción, lo que significa que produce los mismos resultados con las mismas entradas. Evite realizar operaciones con efectos secundarios (como generar números al azar u obtener la hora actual) fuera de los pasos, ya que pueden producir valores diferentes durante la reproducción y provocar un comportamiento no determinista.

DurableContext

DurableContext es el objeto de contexto recibido por la función duradera. Proporciona métodos para operaciones duraderas, como pasos y esperas, que crean puntos de control y administran el flujo de ejecución.

La función duradera recibe un DurableContext en lugar del predeterminado de Lambda:

TypeScript
import { DurableContext, withDurableExecution, } from "@aws/durable-execution-sdk-js"; export const handler = withDurableExecution( async (event: any, context: DurableContext) => { const result = await context.step(async () => { return "step completed"; }); return result; }, );
Python
from aws_durable_execution_sdk_python import ( DurableContext, durable_execution, durable_step, ) @durable_step def my_step(step_context, data): # Your business logic return result @durable_execution def handler(event, context: DurableContext): result = context.step(my_step(event["data"])) return result

El SDK para Python para funciones duraderas utiliza métodos sincrónicos y no admite await. El SDK para TypeScript utiliza async/await.

Steps

Steps utiliza la lógica empresarial con reintentos integrados y creación automática de puntos de control. Cada paso guarda su resultado, lo que garantiza que la función pueda reanudarse desde cualquier paso completado después de las interrupciones.

TypeScript
// Each step is automatically checkpointed const order = await context.step(async () => processOrder(event)); const payment = await context.step(async () => processPayment(order)); const result = await context.step(async () => completeOrder(payment));
Python
# Each step is automatically checkpointed order = context.step(lambda: process_order(event)) payment = context.step(lambda: process_payment(order)) result = context.step(lambda: complete_order(payment))

Estados de espera

Los estados de espera son pausas planificadas en las que la función deja de ejecutarse (y deja de cargarse) hasta el momento de continuar. Utilícelos para esperar períodos de tiempo, devoluciones de llamada externas o condiciones específicas.

TypeScript
// Wait for 1 hour without consuming resources await context.wait({ seconds:3600 }); // Wait for external callback const approval = await context.waitForCallback( async (callbackId) => sendApprovalRequest(callbackId) );
Python
# Wait for 1 hour without consuming resources context.wait(3600) # Wait for external callback approval = context.wait_for_callback( lambda callback_id: send_approval_request(callback_id) )

Cuando la función encuentra una espera o necesita hacer una pausa, Lambda guarda este registro de puntos de control y detiene la ejecución. Cuando llega el momento de reanudarla, Lambda vuelve a invocar la función y reproduce el registro de puntos de control; así se sustituyen los valores almacenados por las operaciones completadas.

Para flujos de trabajo más complejos, las funciones duraderas de Lambda también incluyen operaciones avanzadas, como parallel() para la ejecución simultánea, map() para el procesamiento de matrices, runInChildContext() para las operaciones anidadas y waitForCondition() para el sondeo. Consulte los ejemplos para ver ejemplos detallados y obtener orientación sobre cuándo utilizar cada operación.

Invocación de otras funciones

Invocación permite que una función duradera llame a otras funciones de Lambda y espera sus resultados. La función de llamada se suspende mientras se ejecuta la función invocada, lo que crea un punto de control que conserva el resultado. Esto le permite crear flujos de trabajo modulares en los que las funciones especializadas gestionan tareas específicas.

Use context.invoke() para llamar a otras funciones desde su función duradera. La invocación tiene un punto de control, por lo que si la función se interrumpe una vez completada la función invocada, se reanudará con el resultado almacenado sin volver a invocar la función.

TypeScript
// Invoke another function and wait for result const customerData = await context.invoke( 'validate-customer', 'arn:aws:lambda:us-east-1:123456789012:function:customer-service:1', { customerId: event.customerId } ); // Use the result in subsequent steps const order = await context.step(async () => { return processOrder(customerData); });
Python
# Invoke another function and wait for result customer_data = context.invoke( 'arn:aws:lambda:us-east-1:123456789012:function:customer-service:1', {'customerId': event['customerId']}, name='validate-customer' ) # Use the result in subsequent steps order = context.step( lambda: process_order(customer_data), name='process-order' )

La función invocada puede ser una función duradera o estándar de Lambda. Si invoca una función duradera, la función de llamada espera a que finalice la ejecución duradera completa. Este patrón es común en las arquitecturas de microservicios, en las que cada función gestiona un dominio específico, lo que permite crear flujos de trabajo complejos a partir de funciones especializadas y reutilizables.

nota

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

Configuración de funciones duraderas

Las funciones duraderas tienen ajustes de configuración específicos que controlan el comportamiento de ejecución y la retención de datos. Estos ajustes son independientes de la configuración estándar de la función de Lambda y se aplican a todo el ciclo de vida de la ejecución duradera.

El objeto DurableConfig define la configuración de las funciones duraderas:

{ "ExecutionTimeout": Integer, "RetentionPeriodInDays": Integer }

Execution timeout (Tiempo de espera hasta ejecución)

El tiempo de espera de la ejecución controla el tiempo que puede durar una ejecución duradera desde el principio hasta su finalización. Esto es diferente del tiempo de espera de la función de Lambda, que controla cuánto tiempo puede ejecutarse la invocación de una sola función.

Una ejecución duradera puede abarcar varias invocaciones de funciones de Lambda a medida que avanza por los puntos de control, las esperas y las reproducciones. El tiempo de espera de ejecución se aplica al tiempo total transcurrido de la ejecución duradera, no a las invocaciones de funciones individuales.

Descripción de las diferencias

El tiempo de espera de la función de Lambda (máximo 15 minutos) limita cada invocación individual de la función. El tiempo de espera de la ejecución duradera (máximo 1 año) limita el tiempo total desde que se inicia la ejecución hasta que se completa, se produce un error o se agota el tiempo de espera. Durante este período, es posible que la función se invoque varias veces mientras procesa los pasos, espera y se recupera de los errores.

Por ejemplo, si establece un tiempo de espera de ejecución duradera de 24 horas y un tiempo de espera de la función de Lambda de 5 minutos:

  • La invocación de cada función debe completarse en 5 minutos.

  • Toda la ejecución duradera puede durar hasta 24 horas.

  • Su función se puede invocar muchas veces durante esas 24 horas.

  • Las operaciones de espera no se tienen en cuenta para el tiempo de espera de la función de Lambda, pero sí para el tiempo de espera de ejecución.

Puede configurar el tiempo de espera de ejecución si crea una función duradera mediante la consola de Lambda, la AWS CLI o el AWS SAM. En la consola de Lambda, seleccione su función y, a continuación, elija Configuración, Ejecución duradera. Establezca el valor del tiempo de espera de ejecución en segundos (predeterminado: 86 400 segundos/24 horas, mínimo: 60 segundos, máximo: 31 536 000 segundos/1 año).

nota

El tiempo de espera de ejecución y el tiempo de espera de la función de Lambda son ajustes diferentes. El tiempo de espera de la función de Lambda controla cuánto tiempo puede ejecutarse cada invocación individual (máximo 15 minutos). El tiempo de espera de la ejecución controla el tiempo total transcurrido durante toda la ejecución duradera (máximo 1 año).

Periodo de retención

El período de retención controla el tiempo que Lambda conserva el historial de ejecución y los datos de los puntos de control una vez finalizada una ejecución duradera. Estos datos incluyen los resultados de los pasos, el estado de ejecución y el registro completo de los puntos de control.

Una vez que vence el período de retención, Lambda elimina el historial de ejecuciones y los datos de los puntos de control. Ya no se pueden recuperar los detalles de la ejecución ni reproducir la ejecución. El período de retención comienza cuando la ejecución alcanza un estado terminal (EXITOSA, FALLIDA, DETENIDA o TIEMPO DE ESPERA AGOTADO).

Puede configurar el período de retención cuando crea una función duradera mediante la consola de Lambda, la AWS CLI o el AWS SAM. En la consola de Lambda, seleccione su función y, a continuación, elija Configuración, Ejecución duradera. Establezca el valor del período de retención en días (predeterminado: 14 días, mínimo: 1 día, máximo: 90 días).

Elija un período de retención según sus requisitos de conformidad, sus necesidades de depuración y las consideraciones de los costos. Los períodos de retención más prolongados proporcionan más tiempo para la depuración y la auditoría, pero aumentan los costos de almacenamiento.