

# Transmisión de respuestas para funciones de Lambda
<a name="configuration-response-streaming"></a>

Las funciones de Lambda pueden transmitir nativamente las cargas útiles de respuesta a los clientes a través de las [URL de las funciones de Lambda](urls-configuration.md) o mediante la API [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) (a través de AWS SDK o llamadas directas a la API). La función de Lambda también puede transmitir cargas útiles de respuesta a través de la [integración de proxy de Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html), que utiliza la API [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) para invocar la función. 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, las funciones de transmisión de respuestas pueden devolver cargas útiles de hasta 200 MB, en comparación con el máximo 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. 

**nota**  
El flujo de respuesta de Lambda todavía no está disponible en todas las Regiones de AWS. Consulte las [Capacidades de AWS por región](https://builder.aws.com/build/capabilities) de Builder Center para ver la disponibilidad de las características por regió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 es ilimitada. 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](#config-rs-bandwidth-cap).

El flujo de respuesta conlleva un costo y las respuestas transmitidas no se interrumpen ni se detienen cuando se interrumpe la conexión del cliente que las invoca. A los clientes se les facturará por la duración total de la función, por lo que los clientes deben tener cuidado al configurar tiempos de espera prolongados de las funciones.

Lambda admite la transmisión de respuestas en tiempos de ejecución administrados por Node.js. Para otros lenguajes, como Python, puede [utilizar un tiempo de ejecución personalizado con una integración de API de tiempo de ejecución personalizada](runtimes-custom.md#runtimes-custom-response-streaming) para lograr el flujo de respuesta o utilizar [Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter).

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

**Topics**
+ [Límites de ancho de banda para la transmisión de respuestas](#config-rs-bandwidth-cap)
+ [Compatibilidad de VPC con transmisión de respuestas](#config-rs-vpc-compatibility)
+ [Escritura de funciones de Lambda habilitadas para la transmisión de respuestas](config-rs-write-functions.md)
+ [Invocación de una función habilitada para la transmisión de respuestas con URL de la función de Lambda](config-rs-invoke-furls.md)
+ [Tutorial: Creación de una función de Lambda de transmisión de respuesta con una URL de función](response-streaming-tutorial.md)

## Límites de ancho de banda para la transmisión de respuestas
<a name="config-rs-bandwidth-cap"></a>

Los primeros 6 MB de la carga útil 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. 

## Compatibilidad de VPC con transmisión de respuestas
<a name="config-rs-vpc-compatibility"></a>

Cuando se utilizan funciones de Lambda en un entorno de VPC, hay consideraciones importantes para la transmisión de respuestas:
+ Las URL de las funciones de Lambda no admiten la transmisión de respuestas en un entorno de VPC.
+ Puede utilizar la transmisión de respuestas dentro de una VPC invocando su función de Lambda a través del SDK de AWS mediante la API `InvokeWithResponseStream`. Esto requiere configurar los puntos de conexión de VPC adecuados para Lambda.
+ Para los entornos de VPC, tendrá que crear un punto de conexión de VPC de interfaz para Lambda que permita la comunicación entre los recursos de la VPC y el servicio de Lambda.

Una arquitectura típica para la transmisión de respuestas en una VPC podría incluir:

```
Client in VPC -> Interface VPC endpoint for Lambda -> Lambda function -> Response streaming back through the same path
```

# Escritura de funciones de Lambda habilitadas para la transmisión de respuestas
<a name="config-rs-write-functions"></a>

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:
+ Encapsula la función con el decorador `awslambda.streamifyResponse()`. El entorno de tiempo de ejecución Node.js de Lambda proporciona el objeto global `awslambda`.
+ 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
<a name="config-rs-write-functions-handler"></a>

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](https://nodesource.com/blog/understanding-streams-in-nodejs/). Al igual que con cualquier transmisión de este tipo, debe utilizar el método `pipeline()`.

**nota**  
El entorno de tiempo de ejecución Node.js de Lambda proporciona automáticamente el objeto global `awslambda` y no se requiere ninguna importación.

**Example controlador habilitado para transmisión de respuestas**  

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const 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 [https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback) 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
<a name="config-rs-write-functions-end"></a>

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()`.

A partir de Node.js 24, Lambda ya no espera a que se cumplan las promesas no resueltas una vez que el controlador regrese o finalice el flujo de respuesta. Si su función depende de operaciones asíncronas adicionales, como temporizadores o recuperaciones, debería incluirlas en la `await` de su controlador.

**Example Ejemplo de finalización de una transmisión con pipeline()**  

```
import { pipeline } from 'node:stream/promises';

export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  await pipeline(requestStream, responseStream);
});
```

**Example Ejemplo de finalización de una transmisión sin pipeline()**  

```
export const 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
<a name="config-rs-invoke-furls"></a>

**nota**  
Su función de Lambda ahora puede transmitir cargas útiles de respuesta a través de la [integración de proxy de Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html).

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 útil de respuesta es de 200 MB.

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`.

------
#### [ Console ]

**Para establecer el modo de invocación de una URL de función (consola)**

1. Abra la página de [Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

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

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

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

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

1. Seleccione **Save**.

------
#### [ AWS CLI ]

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

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

------
#### [ CloudFormation ]

**Para establecer el modo de invocación de la URL de una función (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 función, consulte las [URL de función de Lambda](urls-configuration.md).

# Tutorial: Creación de una función de Lambda de transmisión de respuesta con una URL de función
<a name="response-streaming-tutorial"></a>

En este tutorial, se crea una función de Lambda definida como un archivo .zip con un punto de conexión de URL de función que devuelve una transmisión de respuesta. Para obtener más información acerca de la configuración de las URL de funciones, consulte [URL de funciones](urls-configuration.md).

## Requisitos previos
<a name="response-streaming-prepare"></a>

En este tutorial, se presupone que tiene algunos conocimientos sobre las operaciones básicas de Lambda y la consola de Lambda. Si aún no lo ha hecho, siga las instrucciones de [Cree una función de Lambda con la consola.](getting-started.md#getting-started-create-function) para crear su primera función de Lambda.

Para completar los siguientes pasos, necesita la [versión 2 de la AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). Los comandos y la salida esperada se enumeran en bloques separados:

```
aws --version
```

Debería ver los siguientes datos de salida:

```
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
```

Para comandos largos, se utiliza un carácter de escape (`\`) para dividir un comando en varias líneas.

En Linux y macOS, use su administrador de intérprete de comandos y paquetes preferido.

**nota**  
En Windows, algunos comandos de la CLI de Bash que se utilizan habitualmente con Lambda (por ejemplo, `zip`) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, [instale el subsistema de Windows para Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). Los comandos de la CLI de ejemplo de esta guía utilizan el formato Linux. Los comandos que incluyen documentos JSON en línea deben reformatearse si utiliza la CLI de Windows. 

## Creación de un rol de ejecución
<a name="response-streaming-create-iam-role"></a>

Cree el [rol de ejecución](lambda-intro-execution-role.md) que concederá a su función de Lambda permiso para obtener acceso a los recursos de AWS.

**Para crear un rol de ejecución**

1. Abra la página de [Roles](https://console.aws.amazon.com/iam/home#/roles) de la consola de AWS Identity and Access Management (IAM).

1. Elija **Creación de rol**.

1. Cree un rol con las propiedades siguientes:
   + **Tipo de entidad de confianza**: **servicio de AWS**
   + **Caso de uso**: **Lambda**
   + **Permisos**: **AWSLambdaBasicExecutionRole**
   + **Role name (Nombre de rol** – **response-streaming-role**

La política **AWSLambdaBasicExecutionRole** tiene permisos que la función necesita para escribir registros a Registros de Amazon CloudWatch. Después de crear el rol, anote su nombre de recurso de Amazon (ARN). Lo necesitará en el siguiente paso.

## Crear una función de transmisión de respuestas (AWS CLI)
<a name="response-streaming-tutorial-create-function-cli"></a>

Cree una función de Lambda de transmisión de respuesta con un punto de conexión de URL de función mediante la AWS Command Line Interface (AWS CLI).

**Para crear una función que pueda transmitir respuestas**

1. Copie el siguiente código de ejemplo en un archivo denominado `index.js`. Esta función transmite tres respuestas, separadas por 1 segundo.

   ```
   exports.handler = awslambda.streamifyResponse(
   	async (event, responseStream, _context) => {
   		// Metadata is a JSON serializable JS object. Its shape is not defined here.
   		const metadata = {
   		statusCode: 200,
   		headers: {
   			"Content-Type": "application/json",
   			"CustomHeader": "outerspace"
   		}
   		};
   	
   		// Assign to the responseStream parameter to prevent accidental reuse of the non-wrapped stream.
   		responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
   	
   		responseStream.write("Streaming with Helper \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 0 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 1 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 2 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.end();
   		await responseStream.finished();
   	}
     );
   ```

1. Cree un paquete de implementación.

   ```
   zip function.zip index.js
   ```

1. Cree una función de Lambda con el comando `create-function`. Reemplace el valor de `--role` por el ARN del rol del paso anterior. Este comando establece el tiempo de espera de la función en 10 segundos, lo que le permite transmitir tres respuestas.

   ```
   aws lambda create-function \
     --function-name my-streaming-function \
     --runtime nodejs24.x \
     --zip-file fileb://function.zip \
     --handler index.handler \
     --timeout 10 \
     --role arn:aws:iam::123456789012:role/response-streaming-role
   ```

**Para crear una URL de función**

1. Agregue una política basada en recursos a la función que otorgue permisos`lambda:InvokeFunctionUrl` y `lambda:InvokeFunction`. Cada declaración debe añadirse en un comando independiente. Reemplace el valor de `--principal` por su ID de Cuenta de AWS.

   ```
   aws lambda add-permission \
     --function-name my-streaming-function \
     --action lambda:InvokeFunctionUrl \
     --statement-id UrlPolicyInvokeURL \
     --principal 123456789012 \
     --function-url-auth-type AWS_IAM
   ```

   ```
   aws lambda add-permission \
       --function-name my-streaming-function \
       --action lambda:InvokeFunction \
       --statement-id UrlPolicyInvokeFunction \
       --principal 123456789012
   ```

1. Cree un punto de conexión de la URL para la función con el comando `create-function-url-config`.

   ```
   aws lambda create-function-url-config \
     --function-name my-streaming-function \
     --auth-type AWS_IAM \
     --invoke-mode RESPONSE_STREAM
   ```
**nota**  
Si recibe un error acerca de `--invoke-mode`, puede que necesite actualizar a una [versión más reciente de la AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

## Prueba del punto de conexión de la URL de función
<a name="response-streaming-tutorial-test"></a>

Invoque la función para probar la integración. Puede abrir la URL de función en un navegador o puede usar curl.

```
curl --request GET "https://abcdefghijklm7nop7qrs740abcd.lambda-url.us-east-1.on.aws/" --user "AKIAIOSFODNN7EXAMPLE" --aws-sigv4 "aws:amz:us-east-1:lambda" --no-buffer
```

Nuestra URL de función utiliza el tipo de autenticación `IAM_AUTH`. Esto significa que debe firmar las solicitudes con las [clave de acceso y clave secreta de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html). En el comando anterior, reemplace `AKIAIOSFODNN7EXAMPLE` por el ID de clave de acceso de AWS. Ingrese su clave secreta de AWS cuando se le solicite. Si no tiene su clave secreta de AWS, puede [utilizar credenciales de AWS temporales](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) en su lugar.

Debería ver una respuesta como la siguiente:

```
Streaming with Helper 
Hello 0 
Hello 1
Hello 2
```

## Eliminación de sus recursos
<a name="cleanup"></a>

A menos que desee conservar los recursos que creó para este tutorial, puede eliminarlos ahora. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su Cuenta de AWS.

**Cómo eliminar el rol de ejecución**

1. Abra la página [Roles](https://console.aws.amazon.com/iam/home#/roles) en la consola de IAM.

1. Seleccione el rol de ejecución que creó.

1. Elija **Eliminar**.

1. Si desea continuar, escriba el nombre del rol en el campo de entrada de texto y elija **Delete** (Eliminar).

**Cómo eliminar la función de Lambda**

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Seleccione la función que ha creado.

1. Elija **Acciones**, **Eliminar**.

1. Escriba **confirm** en el campo de entrada de texto y seleccione **Delete** (Eliminar).