Configuración de una integración de proxy de Lambda con transmisión de respuesta de carga útil en API Gateway - Amazon API Gateway

Configuración de una integración de proxy de Lambda con transmisión de respuesta de carga útil en API Gateway

Cuando configura la transmisión de la carga útil de respuesta, especifica el modo de transferencia en la solicitud de integración del recurso. Estos ajustes se configuran en la solicitud de integración para controlar el comportamiento de API Gateway antes y durante la respuesta de integración.

Ejemplos de funciones de Lambda para la transmisión de respuestas

La función de Lambda debe cumplir el Formato de integración de proxy de Lambda para transmisión de respuestas. Le recomendamos que utilice una de las tres funciones de Lambda de ejemplo para probar la transmisión de respuestas. Cuando cree la función de Lambda, asegúrese de hacer lo siguiente:

  • Proporcione un tiempo de espera adecuado para la función. Le recomendamos configurar un tiempo de espera de al menos 1 minuto para obtener información sobre la transmisión de respuestas. Al crear los recursos de producción, asegúrese de que el tiempo de espera de la función de Lambda abarque todo el ciclo de solicitud. Para obtener más información, consulte Configuración del tiempo de espera de la función de Lambda.

  • Utilice el último tiempo de ejecución de Node.js.

  • Utilice una región en la que esté disponible la transmisión de respuestas de Lambda.

Using HttpResponseStream.from

El siguiente ejemplo de código transmite los objetos de metadatos y las cargas útiles de JSON de vuelta al cliente mediante el método awslambda.HttpResponseStream() sin utilizar el método de canalización. No es necesario crear el delimitador. Para obtener más información, consulte Escritura de funciones de Lambda habilitadas para la transmisión de respuestas.

export const handler = awslambda.streamifyResponse( async (event, responseStream, context) => { const httpResponseMetadata = { "statusCode": 200, "headers": { "x-foo": "bar" }, "multiValueHeaders": { "x-mv1": ["hello", "world"], "Set-Cookie": ["c1=blue", "c2=red"] } }; responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata); await new Promise(r => setTimeout(r, 1000)); // synthetic delay responseStream.write("First payload "); await new Promise(r => setTimeout(r, 1000)); // synthetic delay responseStream.write("Final payload"); responseStream.end(); });
Using the pipeline method

Lambda recomienda que, al escribir funciones habilitadas para la transmisión de respuestas, utilice el decorador awslambda.streamifyResponse() que proporcionan los tiempos de ejecución nativos de Node.js y el método de pipeline(). Cuando utiliza el método de canalización, no necesita crear el delimitador; Lambda lo hace automáticamente. Para obtener más información, consulte Escritura de funciones de Lambda habilitadas para la transmisión de respuestas.

El ejemplo de código siguiente transmite los objetos de metadatos y tres cargas útiles de JSON de vuelta al cliente.

import { pipeline } from 'node:stream/promises'; import { Readable } from 'node:stream'; export const handler = awslambda.streamifyResponse( async (event, responseStream, context) => { const httpResponseMetadata = { statusCode: 200, headers: { "Content-Type": "text/plain", "X-Custom-Header": "Example-Custom-Header" } }; responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata); const dataStream = Readable.from(async function* () { yield "FIRST payload\n"; await new Promise(r => setTimeout(r, 1000)); yield "SECOND payload\n"; await new Promise(r => setTimeout(r, 1000)); yield "THIRD payload\n"; await new Promise(r => setTimeout(r, 1000)); }()); await pipeline(dataStream, responseStream); } );
Without using the pipeline method

El ejemplo de código siguiente transmite los objetos de metadatos y tres cargas útiles de JSON de vuelta al cliente sin usar el método awslambda.HttpResponseStream(). Sin el método awslambda.HttpResponseStream(), debe incluir un delimitador de 8 bytes nulos entre los metadatos y la carga útil.

export const handler = awslambda.streamifyResponse(async (event, response, ctx) => { response.write('{"statusCode": 200, "headers": {"hdr-x": "val-x"}}'); response.write("\x00".repeat(8)); // DELIMITER await new Promise(r => setTimeout(r, 1000)); response.write("FIRST payload"); await new Promise(r => setTimeout(r, 1000)); response.write("SECOND payload"); await new Promise(r => setTimeout(r, 1000)); response.write("FINAL payload"); response.end(); });

Creación de una integración de proxy de Lambda con transmisión de respuesta de carga útil

En el siguiente procedimiento se muestra cómo crear una integración de proxy de Lambda con la transmisión de respuesta de carga útil. Utilice la función de Lambda de ejemplo o cree la suya propia.

Consola de administración de AWS
Creación de una integración de proxy de Lambda con transmisión de respuesta de carga útil
  1. Inicie sesión en la consola de API Gateway en https://console.aws.amazon.com/apigateway.

  2. Elija una API de REST.

  3. Elija Crear recurso.

  4. En Nombre del recurso, escriba streaming.

  5. Elija Crear recurso.

  6. Con el recurso /streaming seleccionado, elija Crear método.

  7. En Tipo de método, elija CUALQUIERA.

  8. Para Tipo de integración, elija Lambda.

  9. Elija Integración de proxy de Lambda.

  10. Para el modo de transferencia de respuesta, elija Flujo.

  11. Para la función de Lambda, elija el nombre de la función de Lambda.

    La consola de API Gateway utiliza automáticamente la API InvokeWithResponseStream para invocar la función de Lambda. Es responsable de escribir una función de Lambda habilitada para la transmisión de respuestas. Para ver un ejemplo, consulta Ejemplos de funciones de Lambda para la transmisión de respuestas.

  12. Elija Crear método.

Después de crear el método, implemente la API.

Para implementar su API
  1. Elija Implementar API.

  2. En Etapa, seleccione Nueva etapa.

  3. En Stage name (Nombre de etapa), escriba prod.

  4. (Opcional) En Description (Descripción), introduzca una descripción.

  5. Elija Implementar.

AWS CLI

El siguiente procedimiento muestra cómo importar una nueva API con el valor responseTransferMode establecido en STREAM. Si tiene una API de integración existente y desea modificar responseTransferMode, consulte Actualización del modo de transferencia de respuestas para una integración de proxy de Lambda.

Creación de una nueva API con transmisión de respuesta de carga útil
  1. Copie el siguiente archivo de API abierto y guárdelo como ResponseStreamDemoSwagger.yaml. En este archivo, responseTransferMode se establece en STREAM y el URI de integración se establece en arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations.

    Sustituya el nombre de la función de my-function por una función habilitada para transmisión y sustituya las credenciales por un rol de IAM que tenga políticas que permitan al servicio de apigateway invocar funciones de Lambda.

    openapi: "3.0.1" info: title: "ResponseStreamingDemo" version: "2025-04-28T17:28:25Z" servers: - url: "{basePath}" variables: basePath: default: "prod" paths: /lambda: get: x-amazon-apigateway-integration: httpMethod: "POST" uri: "arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations" type: "aws_proxy" timeoutInMillis: 90000 responseTransferMode: "STREAM" credentials: "arn:aws:iam::111122223333:role/apigateway-lambda-role"

    En lugar de proporcionar un rol de IAM para credenciales, puede utilizar el comando add-permission para Lambda para agregar permisos basados en recursos.

  2. Use el comando import-rest-api siguiente para importar la definición de OpenAPI:

    aws apigateway import-rest-api \ --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \ --parameters endpointConfigurationTypes=REGIONAL \ --region us-west-1
  3. Use el comando create-deployment siguiente para implementar la nueva API en una etapa:

    aws apigateway create-deployment \ --rest-api-id a1b2c2 \ --stage-name prod \ --region us-west-1

Actualización del modo de transferencia de respuestas para una integración de proxy de Lambda

El procedimiento siguiente muestra cómo actualizar el modo de transferencia de respuestas para una integración de proxy de Lambda. Cuando cambie el modo de transferencia de respuesta a transmisión, actualice la función de Lambda para que cumpla con los requisitos de la transmisión de respuesta. Utilice la función de Lambda de ejemplo o cree la suya propia.

Consola de administración de AWS
Actualización del modo de transferencia de respuestas para una integración de proxy de Lambda
  1. Inicie sesión en la consola de API Gateway en https://console.aws.amazon.com/apigateway.

  2. Elija una API de REST.

  3. Elija un método.

  4. En la pestaña Solicitud de integración, en Configuración de la solicitud de integración, seleccione Editar.

  5. Para el modo de transferencia de respuesta, elija Flujo.

  6. Para la función de Lambda, elija el nombre de la función de Lambda.

  7. Seleccione Save.

Después de actualizar el método, implemente la API.

Para implementar su API
  1. Elija Implementar API.

  2. En Etapa, seleccione Nueva etapa.

  3. En Stage name (Nombre de etapa), escriba prod.

  4. (Opcional) En Description (Descripción), introduzca una descripción.

  5. Elija Implementar.

AWS CLI
  1. Actualización de la función de Lambda para que esté habilitada para la transmisión.

  2. Utilice el comando AWS CLI siguiente para actualizar el URI de integración y el modo de transferencia de respuestas de la integración:

    aws apigateway update-integration \ --rest-api-id a1b2c3 \ --resource-id aaa111 \ --http-method ANY \ --patch-operations "[{\"op\":\"replace\",\"path\":\"/uri\",\"value\":\"arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations\"}, {\"op\":\"replace\",\"path\":\"/responseTransferMode\",\"value\":\"STREAM\"}]" \ --region us-west-1
  3. Vuelva a implementar la API para que los cambios se apliquen.