

# Transmitir a resposta para suas integrações de proxy no API Gateway
<a name="response-transfer-mode"></a>

É possível configurar sua integração de proxy para controlar como o API Gateway exibe sua resposta de integração. Por padrão, o API Gateway espera receber a resposta completa antes de iniciar a transmissão. No entanto, se você definir o modo de transferência de resposta da sua integração como `STREAM`, o API Gateway vai esperar uma resposta ser completamente calculada antes de enviá-la ao cliente. O streaming de resposta funciona para todos os tipos de endpoints da API REST.

Use o streaming de resposta para os seguintes casos de uso:
+ Reduzir o tempo até o primeiro byte (TTFB) para aplicações de IA generativa, como chatbots.
+ Transmitir arquivos grandes de imagem, vídeo ou música sem utilizar um URL pré-assinado do S3.
+ Realizar operações de longa duração enquanto relata o progresso incremental, como eventos enviados pelo servidor (SSE).
+ Exceder o limite de carga útil de resposta de 10 MB do API Gateway.
+ Exceder o limite de tempo limite de 29 segundos do API Gateway sem solicitar aumento do tempo limite de integração.
+ Receber uma carga útil binária sem configurar os tipos de mídia binária.

## Considerações sobre streaming de carga útil de resposta
<a name="response-transfer-mode-considerations"></a>

As seguintes considerações podem afetar o uso de streaming de carga útil de resposta:
+ Você só pode usar streaming de carga útil de resposta para os tipos de integração `HTTP_PROXY` ou `AWS_PROXY`. Isso inclui integrações de proxy do Lambda e integrações privadas que utilizem integrações `HTTP_PROXY`.
+ A configuração padrão do modo de transferência é `BUFFERED`. Para usar o streaming de resposta, você deve alterar o modo de transferência de resposta para `STREAM`.
+ O streaming de resposta só aceita APIs REST.
+ A solicitação de streaming não é aceita.
+ Você pode transmitir sua resposta por até 15 minutos.
+ Seus fluxos estão sujeitos a tempos limite de inatividade. No caso de endpoints regionais ou privados, o tempo limite é de 5 minutos. Em relação a endpoints otimizados para borda, o tempo limite é de 30 segundos.
+ Se você usar streaming de resposta para uma API REST regional com sua própria distribuição do CloudFront, poderá atingir um tempo limite de inatividade superior a 30 segundos aumentando o tempo limite de resposta da sua distribuição do CloudFront. Para acessar mais informações, consulte [Tempo limite de resposta](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistValuesOrigin.html#DownloadDistValuesOriginResponseTimeout).
+ Quando o modo de transferência de resposta está definido como`STREAM`, o API Gateway não comporta recursos que exijam o armazenamento em buffer de toda a resposta da integração. Por esse motivo, os seguintes recursos não comportam o streaming de respostas:
  + Cache de endpoints
  + Codificação de conteúdo. Se você quiser compactar sua resposta de integração, faça isso em sua integração.
  + Transformação de resposta com VTL
+ Em cada resposta de streaming, os primeiros 10 MB de carga útil de resposta não estão sujeitos a nenhuma restrição de largura de banda. Os dados de carga útil de resposta que excedem 10 MB ficam restritos a 2 MB/s.
+ Quando a conexão entre o cliente e o API Gateway ou entre o API Gateway e o Lambda é fechada devido ao tempo limite, a função do Lambda pode continuar sendo executada. Para acessar mais informações, consulte [Configurar tempo limite das funções do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html).
+ O streaming de resposta gera um custo. Para obter mais informações, consulte [Preços do API Gateway](https://aws.amazon.com/api-gateway/pricing/).

# Configurar uma integração de proxy HTTP com streaming de resposta de carga útil no API Gateway
<a name="response-streaming-http"></a>

Ao configurar o streaming de carga útil de resposta, você especifica o modo de transferência de resposta na solicitação de integração do seu método. 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. Quando você utiliza o streaming de resposta, pode configurar o tempo limite de integração como até 15 minutos.

Quando você usa o streaming de resposta de carga útil com uma integração `HTTP_PROXY`, o API Gateway não envia o código de status da resposta HTTP nem o cabeçalho de resposta HTTP até receber integralmente todos os cabeçalhos.

## Configurar uma integração de proxy HTTP com streaming de resposta de carga útil
<a name="response-streaming-http-create"></a>

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 HTTP](#response-streaming-http-update).

------
#### [ Console de gerenciamento da AWS ]

**Como configurar uma integração de proxy HTTP com streaming de resposta de carga útil**

1. Inicie uma sessão no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Escolha uma API REST.

1. Selecione **Criar recurso**.

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

1. Selecione **Criar recurso**.

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

1. Em **Tipo de método**, selecione **ANY**.

1. Em **Tipo de integração**, escolha **HTTP**.

1. Selecione **Integração de proxy HTTP**.

1. Em **Modo de transferência de resposta**, selecione **Fluxo**.

1. Em **Método HTTP**, escolha um método.

1. Em **URL do endpoint**, insira um endpoint de integração. Escolha um endpoint que produza uma grande carga útil para ser transmitida de volta para você.

1. Escolha **Criar método**.

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

**Para implantar sua API**

1. Escolha **Implantar API**.

1. Em **Estágio**, selecione **Novo estágio**.

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

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

1. Escolha **Implantar**.

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

**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` está definido como `STREAM`. O endpoint de integração está definido como `https://example.com`, mas recomendamos que você o modifique para um endpoint que produza uma grande carga útil a ser transmitida de volta para você.

   ```
   openapi: "3.0.1"
   info:
     title: "ResponseStreamingDemo"
     version: "2025-04-28T17:28:25Z"
   servers:
   - url: "{basePath}"
     variables:
       basePath:
         default: "prod"
   paths:
     /streaming:
       get:
         x-amazon-apigateway-integration:
           httpMethod: "GET"
           uri: "https://example.com"
           type: "http_proxy"
           timeoutInMillis: 900000
           responseTransferMode: "STREAM"
   ```

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

1. Utilize o seguinte comando `create-deployment` para implantar a nova API em um estágio:

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

------

## Atualizar o modo de transferência de resposta para uma integração de proxy HTTP
<a name="response-streaming-http-update"></a>

O procedimento a seguir mostra como atualizar o modo de transferência de resposta para uma integração de proxy HTTP.

------
#### [ Console de gerenciamento da AWS ]

**Como atualizar o modo de transferência de resposta para uma integração de proxy HTTP**

1. Inicie uma sessão no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Escolha uma API REST.

1. Escolha um método.

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

1. Em **Modo de transferência de resposta**, selecione **Fluxo**.

1. Escolha **Salvar**.

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

**Para implantar sua API**

1. Escolha **Implantar API**.

1. Em **Estágio**, selecione **Novo estágio**.

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

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

1. Escolha **Implantar**.

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

O comando `update-integration` a seguir atualiza o modo de transferência de uma integração de `BUFFERED` para `STREAM`. Para todas as APIs existentes, o modo de transferência de resposta para todas as integrações está definido como `BUFFERED`.

```
aws apigateway update-integration \
 --rest-api-id a1b2c3 \
 --resource-id aaa111 \
 --http-method GET \
 --patch-operations "op='replace',path='/responseTransferMode',value=STREAM" \
 --region us-west-1
```

Será necessário implantar a API novamente para que as alterações sejam implementadas. Se você personalizou o tempo limite de integração, esse valor de tempo limite será removido, pois o API Gateway transmite sua resposta por até 5 minutos.

O seguinte comando `update-integration` atualiza o modo de transferência de uma integração de `STREAM` para `BUFFERED`.

```
aws apigateway update-integration \
 --rest-api-id a1b2c3 \
 --resource-id aaa111 \
 --http-method GET \
 --patch-operations "op='replace',path='/responseTransferMode',value=BUFFERED" \
 --region us-west-1
```

Será necessário implantar a API novamente para que as alterações sejam implementadas.

------

# Configurar uma integração de proxy do Lambda com streaming de resposta da carga útil no API Gateway
<a name="response-transfer-mode-lambda"></a>

É 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](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) 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](#response-transfer-mode-lambda-format) 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 name="response-transfer-mode-lambda-comparison"></a>

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](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) 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
<a name="response-transfer-mode-lambda-format"></a>

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](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format). 

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](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Sim. O API Gateway transmite sua resposta.  | 
|  Fluxo  |  Não  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Não. O API Gateway invocará a função do Lambda e exibirá uma resposta de erro de 500.  | 
|  Fluxo  |  Sim  |   [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Fluxo  |  Não  |   [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Armazenado em buffer  |  Sim  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Armazenado em buffer  |  Não  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Não. O API Gateway não aceita essa configuração de integração.  | 
|  Armazenado em buffer  |  Sim  |   [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  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](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Sim. Esta é uma integração do proxy do Lambda. Para acessar mais informações, consulte [Integração do proxy do Lambda](set-up-lambda-proxy-integrations.md).  | 

# Configurar uma integração de proxy do Lambda com streaming de resposta da carga útil no API Gateway
<a name="response-streaming-lambda-configure"></a>

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 name="response-streaming-lambda-example"></a>

A sua função do Lambda deve seguir o [Formato de integração do proxy do Lambda para streaming de resposta](response-transfer-mode-lambda.md#response-transfer-mode-lambda-format). 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](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html).
+ 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](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html).

```
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](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html).

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
<a name="response-streaming-lambda-create"></a>

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](https://console.aws.amazon.com/apigateway).

1. Escolha uma API REST.

1. Selecione **Criar recurso**.

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

1. Selecione **Criar recurso**.

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

1. Em **Tipo de método**, selecione **ANY**.

1. Em **Tipo de integração**, escolha **Lambda**.

1. Selecione **Integração de proxy do Lambda**.

1. Em **Modo de transferência de resposta**, selecione **Fluxo**.

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

   O console do API Gateway utiliza automaticamente a API [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) 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](#response-streaming-lambda-example).

1. Escolha **Criar método**.

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

**Para implantar sua API**

1. Escolha **Implantar API**.

1. Em **Estágio**, selecione **Novo estágio**.

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

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

1. 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](#response-streaming-lambda-update).

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

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

1. 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
<a name="response-streaming-lambda-update"></a>

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](https://console.aws.amazon.com/apigateway).

1. Escolha uma API REST.

1. Escolha um método.

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

1. Em **Modo de transferência de resposta**, selecione **Fluxo**.

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

1. Escolha **Salvar**.

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

**Para implantar sua API**

1. Escolha **Implantar API**.

1. Em **Estágio**, selecione **Novo estágio**.

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

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

1. Escolha **Implantar**.

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

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

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

1. Implante a API novamente para que as alterações entrem em vigor.

------

# Solucionar problemas com o streaming de respostas no API Gateway
<a name="response-streaming-troubleshoot"></a>

As diretrizes de solução de problemas a seguir podem ajudar a resolver problemas com suas APIs que utilizam streaming de resposta.

## Solução de problemas gerais
<a name="response-streaming-general-troubleshooting"></a>

Você pode usar o [TestInvokeMethod](https://docs.aws.amazon.com/apigateway/latest/api/API_TestInvokeMethod.html) a guia de teste do console para testar a resposta do fluxo. As seguintes considerações podem afetar o uso da invocação de teste para streaming de resposta:
+ Quando você testa seu método, o API Gateway armazena em buffer sua carga útil de resposta transmitida. Depois que qualquer uma das condições a seguir for atendida, o API Gateway exibirá uma resposta única contendo a carga útil armazenada em buffer:
  + A solicitação está completa
  + 35 segundos se passaram
  + Mais de 1 MB de carga útil de resposta foi armazenada em buffer
+ Se transcorrerem mais de 35 segundos antes que seu método exiba um status de resposta HTTP e todos os cabeçalhos, o status da resposta exibido em TestInvokeMethod será 0.
+ O API Gateway não produz nenhum log de execução.

Depois de implantar sua API, você pode testar a resposta do fluxo utilizando um comando curl. É recomendável utilizar a opção `-i` de incluir cabeçalhos da resposta de protocolo na saída. Para ver os dados de resposta à medida que eles chegam, utilize a opção `--no-buffer`.

## Solucionar problemas de cURL
<a name="response-streaming-troubleshoot-curl-error"></a>

Se você estiver testando uma integração e receber o erro `curl: (18) transfer closed with outstanding read data remaining`, verifique se o tempo limite da integração é longo o suficiente. Se você estiver usando uma função do Lambda, precisará atualizar o tempo limite de resposta dela. Para acessar mais informações, consulte [Configurar tempo limite das funções do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html).

## Solução de problemas no uso do registro em log do acesso
<a name="response-streaming-troubleshoot-access-logging"></a>

Você pode usar logs de acesso para o estágio da API REST a fim de registrar em log e solucionar problemas em seu fluxo de resposta. Além das variáveis existentes, você pode usar as seguintes variáveis de log de acesso:

`$context.integration.responseTransferMode`  
O modo de transferência de resposta da integração. Ele pode ser `BUFFERED` ou `STREAMED`.

`$context.integration.timeToAllHeaders`  
O tempo entre o momento em que o API Gateway estabelece a conexão de integração e o momento em que recebe todos os cabeçalhos de resposta de integração do cliente.

`$context.integration.timeToFirstContent`  
O tempo entre o momento em que o API Gateway estabelece a conexão de integração e o momento em que recebe os primeiros bytes de conteúdo.

`$context.integration.latency` ou `$context.integrationLatency`  
O momento em que o API Gateway estabelece a conexão de integração e o momento em que o fluxo de resposta de integração é concluído.

A figura a seguir mostra como essas variáveis de log de acesso representam diferentes componentes de um fluxo de resposta.

![\[Variáveis de log de acesso para streaming de resposta no API Gateway\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/response-streaming-figure.png)


Para obter mais informações sobre os logs de acesso, consulte [Configurar o registro em log do CloudWatch para APIs REST no API Gateway](set-up-logging.md). Você também pode usar o X-Ray para monitorar seu fluxo de resposta. Para obter mais informações, consulte [Rastrear solicitações de usuário para APIs REST usando o X-Ray no API Gateway](apigateway-xray.md).