Configurar uma integração de proxy do Lambda com streaming de resposta da carga útil no API Gateway - Amazon API Gateway

Configurar uma integração de proxy do Lambda com streaming de resposta da carga útil no API Gateway

Quando você configura o streaming de carga útil de resposta, especifica o modo de transferência na resposta de integração do seu recurso. Você precisa definir essas configurações na solicitação de integração a fim de controlar como o API Gateway se comporta antes e durante a resposta de integração.

Exemplos de função do Lambda para streaming de resposta

A sua função do Lambda deve seguir o Formato de integração do proxy do Lambda para streaming de resposta. Recomendamos que você use um dos três exemplos de funções do Lambda para testar o streaming de respostas. Ao criar a função do Lambda, faça o seguinte:

  • Forneça um tempo limite adequado para sua função. Recomendamos que você configure um tempo limite de pelo menos 1 minuto para saber mais sobre o streaming de respostas. Ao criar seus recursos de produção, garanta que o tempo limite da função do Lambda abranja todo o ciclo de solicitações. Para acessar mais informações, consulte Configurar tempo limite das funções do Lambda.

  • Use o runtime mais recente do Node.js.

  • Use uma região onde o streaming de respostas do Lambda esteja disponível.

Using HttpResponseStream.from

O exemplo de código a seguir transmite os objetos e cargas úteis de metadados JSON de volta para o cliente utilizando o método awslambda.HttpResponseStream() sem usar o método de pipeline. Não é necessário criar o delimitador. Para acessar mais informações, consulte Escrever funções do Lambda habilitadas para streaming de resposta.

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

O Lambda recomenda que, ao escrever funções habilitadas para streaming de resposta, você use o decorador awslambda.streamifyResponse() fornecido pelos runtimes nativos do Node.js e o método pipeline(). Quando você utiliza o método de pipeline, não precisa criar o delimitador. O Lambda faz isso para você. Para acessar mais informações, consulte Escrever funções do Lambda habilitadas para streaming de resposta.

O exemplo de código a seguir transmite os objetos e cargas úteis de metadados JSON de volta para o 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

O exemplo de código a seguir transmite os objetos e cargas úteis de metadados JSON de volta para o cliente sem utilizar o método awslambda.HttpResponseStream(). Sem o método awslambda.HttpResponseStream(), você deve incluir um delimitador de 8 bytes nulos entre os metadados e a 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(); });

Criar uma integração de proxy do Lambda com streaming de resposta da carga útil

O procedimento a seguir mostra como criar uma integração do proxy do Lambda com streaming da resposta da carga útil. Use o exemplo da função do Lambda ou crie a sua própria.

Console de gerenciamento da AWS
Como criar uma integração do proxy do Lambda com streaming de resposta da carga útil
  1. Inicie uma sessão no console do API Gateway em https://console.aws.amazon.com/apigateway.

  2. Escolha uma API REST.

  3. Selecione Criar recurso.

  4. Em Resource Name (Nome do recurso), insira streaming.

  5. Selecione Criar recurso.

  6. Com o recurso /streaming selecionado, escolha Criar método.

  7. Em Tipo de método, selecione ANY.

  8. Em Tipo de integração, escolha Lambda.

  9. Selecione Integração de proxy do Lambda.

  10. Em Modo de transferência de resposta, selecione Fluxo.

  11. Em Função do Lambda, escolha o nome da sua função do Lambda.

    O console do API Gateway utiliza automaticamente a API InvokeWithResponseStream para invocar a função do Lambda. Você é responsável por escrever uma função do Lambda habilitada para streaming de resposta. Para ver um exemplo, consulte Exemplos de função do Lambda para streaming de resposta.

  12. Escolha Criar método.

Depois de criar o método, implante a API.

Para implantar sua API
  1. Escolha Implantar API.

  2. Em Estágio, selecione Novo estágio.

  3. Em Stage name (Nome do estágio), insira prod.

  4. (Opcional) Em Description (Descrição), insira uma descrição.

  5. Escolha Implantar.

AWS CLI

O procedimento a seguir mostra como importar uma nova API com o responseTransferMode definido como STREAM. Se você tiver uma API de integração existente e quiser modificar o responseTransferMode, consulte Atualizar o modo de transferência de resposta para uma integração de proxy do Lambda.

Como criar uma API com streaming de resposta de carga útil
  1. Copie o arquivo Open API a seguir e, depois, salve-o como ResponseStreamDemoSwagger.yaml. Nesse arquivo, responseTransferMode é definido como STREAM, e o URI de integração é definido como 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.

    Substitua o nome da função de my-function por uma função habilitada para streaming e substitua as credenciais por um perfil do IAM que tenha políticas que permitem que o serviço apigateway invoque funções do 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"

    Em vez de fornecer um perfil do IAM para recuperar credenciais, você pode utilizar o comando add-permission para o Lambda adicionar permissões baseadas em recurso.

  2. Utilize o seguinte comando import-rest-api para importar sua definição de OpenAPI:

    aws apigateway import-rest-api \ --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \ --parameters endpointConfigurationTypes=REGIONAL \ --region us-west-1
  3. Utilize o seguinte comando create-deployment para implantar a nova API em um estágio:

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

Atualizar o modo de transferência de resposta para uma integração de proxy do Lambda

O procedimento a seguir mostra como atualizar o modo de transferência de resposta para uma integração de proxy do Lambda. Ao alterar o modo de transferência de resposta para streaming, atualize sua função do Lambda para que ela atenda aos requisitos de streaming de resposta. Use o exemplo da função do Lambda ou crie a sua própria.

Console de gerenciamento da AWS
Como atualizar o modo de transferência de resposta para uma integração do proxy do Lambda
  1. Inicie uma sessão no console do API Gateway em https://console.aws.amazon.com/apigateway.

  2. Escolha uma API REST.

  3. Escolha um método.

  4. Na guia Solicitação de integração, em Configurações de solicitação de integração, selecione Editar.

  5. Em Modo de transferência de resposta, selecione Fluxo.

  6. Em Função do Lambda, escolha o nome da sua função do Lambda.

  7. Escolha Salvar.

Depois de atualizar o método, implante a API.

Para implantar sua API
  1. Escolha Implantar API.

  2. Em Estágio, selecione Novo estágio.

  3. Em Stage name (Nome do estágio), insira prod.

  4. (Opcional) Em Description (Descrição), insira uma descrição.

  5. Escolha Implantar.

AWS CLI
  1. Atualize a função do Lambda para que seja habilitada para streaming.

  2. Use o seguinte comando da AWS CLI para atualizar o URI de integração e o modo de transferência de resposta da sua integração:

    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. Implante a API novamente para que as alterações entrem em vigor.