Configuración de una función de Lambda para transmitir respuestas - AWS Lambda

Configuración de una función de Lambda para transmitir respuestas

Puede configurar las URL de función de Lambda para devolver las cargas de respuesta a los clientes. La transmisión de respuestas puede beneficiar a las aplicaciones sensibles a la latencia al mejorar el rendimiento del tiempo hasta el primer byte (TTFB). Esto se debe a que puede volver respuestas parciales al cliente a medida que estén disponibles. Además, puede usar la transmisión de respuestas para crear funciones que devuelvan cargas más grandes. Las cargas de transmisión de respuestas tienen un límite flexible de 20 MB, en comparación con el límite de 6 MB para las respuestas almacenadas en búfer. Transmitir una respuesta también significa que la función no necesita incluir toda la respuesta en la memoria. Para respuestas muy grandes, esto puede reducir la cantidad de memoria que necesita configurar para la función.

La velocidad a la que Lambda transmite las respuestas depende del tamaño de la respuesta. La velocidad de transmisión de los primeros 6 MB de la respuesta de la función no tiene límite. Para las respuestas de más de 6 MB, el resto de la respuesta está sujeto a un límite de ancho de banda. Para obtener más información sobre el ancho de banda de transmisión, consulte Límites de ancho de banda para la transmisión de respuestas.

Las respuestas de transmisión tienen un costo. Para más información, consulte Precios de AWS Lambda.

Lambda admite la transmisión de respuestas en tiempos de ejecución administrados por Node.js. Para otros idiomas, puede usar un tiempo de ejecución personalizado con una integración de API de tiempo de ejecución personalizada para transmitir respuestas o utilizar Lambda Web Adapter. Puede transmitir las respuestas a través de las URL de las funciones de Lambda, el AWS SDK o mediante la API de Lambda. InvokeWithResponseStream

nota

Cuando pruebe la función en la consola de Lambda, siempre verá las respuestas en búfer.

Escritura de funciones habilitadas para la transmisión de respuestas

Escribir el controlador para las funciones de transmisión de respuestas es diferente a escribir los patrones de controlador típicos. Al escribir funciones de transmisión, asegúrese de realizar lo siguiente:

  • Ajuste su función con el decorador awslambda.streamifyResponse() que proporcionan los tiempos de ejecución nativos de Node.js.

  • Finalice la transmisión de manera correcta para asegurarse de que se haya completado todo el procesamiento de datos.

Configuración de una función de controlador para transmitir respuestas

Para indicar al tiempo de ejecución que Lambda debe transmitir las respuestas de su función, debe ajustar la función al decorador streamifyResponse(). Esto indica al tiempo de ejecución que utilice la ruta lógica adecuada para transmitir las respuestas y permite que la función transmita las respuestas.

El decorador streamifyResponse() acepta una función que acepta los siguientes parámetros:

  • event: proporciona información sobre el evento de invocación de la URL de función, como el método HTTP, los parámetros de consulta y el cuerpo de la solicitud.

  • responseStream: proporciona una transmisión con escritura permitida.

  • context: proporciona métodos y propiedades con información acerca de la invocación, la función y el entorno de ejecución.

El objeto responseStream es un writableStream de Node.js. Al igual que con cualquier transmisión de este tipo, debe utilizar el método pipeline().

ejemplo controlador habilitado para transmisión de respuestas
const pipeline = require("util").promisify(require("stream").pipeline); const { Readable } = require('stream'); exports.echo = awslambda.streamifyResponse(async (event, responseStream, _context) => { // As an example, convert event to a readable stream. const requestStream = Readable.from(Buffer.from(JSON.stringify(event))); await pipeline(requestStream, responseStream); });

Si bien responseStream ofrece el método write() para escribir en la transmisión, le recomendamos que utilice pipeline() siempre que sea posible. El uso de pipeline() garantiza que la transmisión con escritura permitida no se sature por una transmisión legible más rápida.

Finalización de la transmisión

Asegúrese de finalizar la transmisión correctamente antes de que el controlador regrese. El método pipeline() gestiona esto de manera automática.

Para otros casos de uso, llame al método responseStream.end() para finalizar correctamente una transmisión. Este método indica que no se deben escribir más datos en la transmisión. Este método no es necesario si escribe a la transmisión con pipeline() o pipe().

ejemplo Ejemplo de finalización de una transmisión con pipeline()
const pipeline = require("util").promisify(require("stream").pipeline); exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { await pipeline(requestStream, responseStream); });
ejemplo Ejemplo de finalización de una transmisión sin pipeline()
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { responseStream.write("Hello "); responseStream.write("world "); responseStream.write("from "); responseStream.write("Lambda!"); responseStream.end(); });

Invocación de una función habilitada para la transmisión de respuestas con URL de la función de Lambda

nota

Debe invocar la función mediante una URL de función para transmitir las respuestas.

Puede invocar funciones habilitadas para la transmisión de respuestas si cambia el modo de invocación de la URL de función. El modo de invocación determina qué operación de API utiliza Lambda para invocar la función. Estos son los modos de invocación disponibles:

  • BUFFERED: esta es la opción predeterminada. Lambda invoca su función mediante la operación de la API Invoke. Los resultados de la invocación estarán disponibles cuando se complete la carga. El tamaño de carga máximo es de 6 MB.

  • RESPONSE_STREAM: permite que la función transmita los resultados de la carga a medida que estén disponibles. Lambda invoca su función mediante la operación de la API InvokeWithResponseStream. El tamaño máximo de carga de respuesta es de 20 MB. Sin embargo, puede solicitar un aumento de cuota.

Aún puede invocar la función sin transmisión de respuestas al llamar directamente a la operación de la API Invoke. Sin embargo, Lambda transmite todas las cargas de respuesta para las invocaciones que llegan a través de la URL de función hasta que cambie el modo de invocación a BUFFERED.

Para establecer el modo de invocación de una URL de función (consola)
  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija el nombre de la función para la que desea establecer el modo de invocación.

  3. Elija la pestaña Configuration (Configuración) y, a continuación, elija Function URL (URL de función).

  4. Elija Editar y, a continuación, elija Configuración adicional.

  5. En Modo de invocación, elija el modo de invocación que desee.

  6. Seleccione Guardar.

Para establecer el modo de invocación de la URL de función (AWS CLI)

aws lambda update-function-url-config --function-name my-function --invoke-mode RESPONSE_STREAM

Para establecer el modo de invocación de la URL de función (AWS CloudFormation)

MyFunctionUrl: Type: AWS::Lambda::Url Properties: AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM

Para obtener más información acerca de la configuración de las URL de funciones, consulte URL de funciones de Lambda.

Límites de ancho de banda para la transmisión de respuestas

Los primeros 6 MB de la carga de respuesta de la función tienen un ancho de banda ilimitado. Tras esta ráfaga inicial, Lambda transmite la respuesta a una velocidad máxima de 2 Mbps. Si las respuestas de la función nunca superan los 6 MB, este límite de ancho de banda nunca se aplica.

nota

Los límites de ancho de banda solo se aplican a la carga de respuesta de la función y no al acceso de la función a la red.

La velocidad del ancho de banda ilimitado varía en función de diversos factores, incluida la velocidad de procesamiento de la función. Por lo general, puede esperar una velocidad superior a 2 Mbps para los primeros 6 MB de respuesta de la función. Si la función transmite una respuesta a un destino externo a AWS, la velocidad de transmisión también depende de la velocidad de la conexión a Internet externa.