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

É possível realizar o streaming da resposta de uma função do Lambda para melhorar a performance do tempo até o primeiro byte (TTFB) e enviar respostas parciais de volta ao cliente assim que elas se tornam disponíveis. O API Gateway exige que você use a API InvokeWithResponseStream do Lambda para invocar sua função do Lambda. O API Gateway transmite um objeto de evento para a função do Lambda. A função do Lambda do backend analisa os dados da solicitação recebida para determinar a resposta que ela retorna. Para o API Gateway transmitir a saída do Lambda, a função do Lambda deve gerar o formato exigido pelo API Gateway.

Diferenças nas integrações de proxy do Lambda entre o modo de transferência de fluxo e resposta em buffer

A lista a seguir descreve as diferenças entre uma integração do proxy do Lambda e uma integração do proxy do Lambda para streaming de resposta:

  • O API Gateway utiliza a API InvokeWithResponseStream para invocar a integração do proxy do Lambda para streaming de respostas. Isso gera um URI diferente, que é o seguinte:

    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

    Esse ARN utiliza uma data diferente para a versão da API e uma ação de serviço diferente em comparação à integração do proxy do Lambda.

    Se você utiliza o console do API Gateway para streaming de respostas, o console usa o URI correto para você.

  • Em uma integração do proxy do Lambda, o API Gateway envia a resposta ao cliente somente depois de receber a resposta completa do Lambda. Em uma integração do proxy do Lambda para streaming de resposta, o API Gateway inicia o fluxo de carga útil depois de receber os metadados e o delimitador válidos do Lambda.

  • A integração do proxy do Lambda para streaming de respostas utiliza o mesmo formato de entrada que o da integração de proxy, mas exige um formato de saída diferente.

Formato de integração do proxy do Lambda para streaming de resposta

Quando o API Gateway invoca uma função do Lambda com streaming de resposta, o formato de entrada é igual ao formato de entrada de uma função do Lambda para integração de proxy. Para obter mais informações, consulte Formato de entrada de uma função do Lambda para integração de proxy.

Quando o Lambda transmite uma resposta para o API Gateway, ela deve seguir o formato a seguir. Esse formato utiliza um delimitador para separar o JSON dos metadados e a carga útil bruta. Nesse caso, os dados da carga útil são transmitidos no decorrer do streaming realizado pela função de streaming do Lambda:

{ "headers": {"headerName": "headerValue", ...}, "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... }, "cookies" : ["cookie1", "cookie2"], "statusCode": httpStatusCode }<DELIMITER>PAYLOAD1 | PAYLOAD2 | PAYLOAD3

Na saída:

  • As chaves headers, multiValueHeaders, cookies e statusCode poderão ficar sem especificação se nenhum cabeçalho de resposta extra precisar ser exibido.

  • A chave headers só pode conter cabeçalhos de valor único.

  • A saída espera que os cabeçalhos contenham Transfer-Encoding: chunked ou Content-length: number. Se sua função não exibir nenhum desses cabeçalhos, o API Gateway anexará Transfer-Encoding: chunked ao cabeçalho de resposta.

  • A chave multiValueHeaders pode conter cabeçalhos de vários valores e cabeçalhos de valor único. Você pode usar a chave multiValueHeaders para especificar todos os seus cabeçalhos extras, incluindo os de valor único.

  • Se você especificar valores para headers e multiValueHeaders, o API Gateway os mesclará em uma única lista. Se o mesmo de chave/valor for especificado em ambos, somente os valores de multiValueHeaders aparecerão na lista mesclada.

  • Os metadados devem ser JSON válido. Somente as chaves headers, multiValueHeaders, cookies e statusCode são aceitas.

  • Você deve fornecer um delimitador após o JSON dos metadados. O delimitador deve ter 8 bytes nulos e deve aparecer nos primeiros 16 KB de dados do fluxo.

  • O API Gateway não exige um formato específico para a carga útil de resposta do método.

Se você estiver usando um URL de função para transmitir sua função do Lambda, deverá modificar a entrada e a saída da sua função do Lambda para atender a esses requisitos.

Se a saída da função do Lambda não atender aos requisitos desse formato, o API Gateway ainda poderá invocar sua função do Lambda. A tabela a seguir mostra as combinações das configurações de solicitação de integração da API e do código da função do Lambda que comportam o API Gateway. Isso inclui combinações aceitas pelo modo de transferência de resposta em buffer.

Modo de transferência de resposta O código da função segue o formato exigido API de invocação do Lambda Aceito pelo API Gateway.

Fluxo

Sim

InvokeWithResponseStream

Sim. O API Gateway transmite sua resposta.

Fluxo

Não

InvokeWithResponseStream

Não. O API Gateway invocará a função do Lambda e exibirá uma resposta de erro de 500.

Fluxo

Sim

Invocar

Não. O API Gateway não aceita essa configuração de integração.

Fluxo

Não

Invocar

Não. O API Gateway não aceita essa configuração de integração.

Armazenado em buffer

Sim

InvokeWithResponseStream

Não. O API Gateway não aceita essa configuração de integração.

Armazenado em buffer

Não

InvokeWithResponseStream

Não. O API Gateway não aceita essa configuração de integração.

Armazenado em buffer

Sim

Invocar

O API Gateway exibe os cabeçalhos HTTP e o código de status, mas não o corpo da resposta.

Armazenado em buffer

Não

Invocar

Sim. Esta é uma integração do proxy do Lambda. Para acessar mais informações, consulte Integração do proxy do Lambda.