

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Configurer une intégration de proxy Lambda avec le streaming des réponses de charge utile dans API Gateway
<a name="response-transfer-mode-lambda"></a>

Vous pouvez diffuser la réponse d'une fonction Lambda pour améliorer les performances du délai d'obtention du premier octet (TTFB) et renvoyer des réponses partielles au client dès qu'elles sont disponibles. API Gateway nécessite que vous utilisiez l'API [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)Lambda pour appeler votre fonction Lambda. API Gateway transmet un objet d'événement à la fonction Lambda. La fonction Lambda du backend analyse les données de la demande entrante pour déterminer la réponse qu’elle renvoie. Pour qu'API Gateway diffuse la sortie Lambda, la fonction Lambda doit générer le [format](#response-transfer-mode-lambda-format) requis par API Gateway.

## Différences entre les intégrations de proxy Lambda entre le mode de transfert de réponse en flux et le mode de transfert de réponse en mémoire tampon
<a name="response-transfer-mode-lambda-comparison"></a>

La liste suivante décrit les différences entre une intégration de proxy Lambda et une intégration de proxy Lambda pour le streaming de réponses :
+ API Gateway utilise l'[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)API pour appeler l'intégration du proxy Lambda pour le streaming des réponses. Il en résulte un URI différent, qui est le suivant :

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

  Cet ARN utilise une date différente pour la version de l'API et une action de service différente par rapport à l'intégration du proxy Lambda.

  Si vous utilisez la console API Gateway pour le streaming des réponses, la console utilise l'URI qui vous convient.
+ Dans le cadre d'une intégration de proxy Lambda, API Gateway envoie la réponse au client uniquement après avoir reçu la réponse complète de Lambda. Dans le cadre d'une intégration de proxy Lambda pour le streaming des réponses, API Gateway lance le flux de charge utile après avoir reçu les métadonnées et le délimiteur valides de Lambda. 
+ L'intégration du proxy Lambda pour le streaming des réponses utilise le même format d'entrée que l'intégration du proxy, mais elle nécessite un format de sortie différent.

## Format d'intégration du proxy Lambda pour le streaming des réponses
<a name="response-transfer-mode-lambda-format"></a>

Lorsqu'API Gateway invoque une fonction Lambda avec flux de réponse, le format d'entrée est le même que celui d'une fonction Lambda pour l'intégration de proxy. Pour de plus amples informations, veuillez consulter [Format d’entrée d’une fonction Lambda pour l’intégration de proxy](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format). 

Lorsque Lambda diffuse une réponse à API Gateway, la réponse doit respecter le format suivant. Ce format utilise un délimiteur pour séparer les métadonnées JSON de la charge utile brute. Dans ce cas, les données de charge utile sont diffusées telles qu'elles sont transmises par votre fonction Lambda de streaming :

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

Dans la sortie :
+ Les `statusCode` touches `headers``multiValueHeaders`,`cookies`, et peuvent ne pas être spécifiées si aucun en-tête de réponse supplémentaire ne doit être renvoyé.
+ La clé `headers` ne peut contenir que des en-têtes à valeur unique.
+ La sortie s'attend à ce que les en-têtes contiennent l'un `Transfer-Encoding: chunked` ou `Content-length: number` l'autre. Si votre fonction ne renvoie aucun de ces en-têtes, API Gateway les ajoute `Transfer-Encoding: chunked` à l'en-tête de réponse.
+ La clé `multiValueHeaders` peut contenir des en-têtes à valeurs multiples, ainsi que des en-têtes à valeur unique. Vous pouvez utiliser la clé `multiValueHeaders` pour spécifier l’ensemble de vos en-têtes supplémentaires, y compris n’importe quel en-tête à valeur unique.
+ Si vous spécifiez des valeurs pour `headers` et `multiValueHeaders`, API Gateway les fusionne en une seule liste. Si la même paire clé-valeur est spécifiée dans les deux, seules les valeurs de `multiValueHeaders` s’afficheront dans la liste fusionnée.
+ Les métadonnées doivent être au format JSON valide. Seulement `headers``multiValueHeaders`, `cookies` et les `statusCode` touches sont prises en charge.
+ Vous devez fournir un délimiteur après le JSON des métadonnées. Le délimiteur doit être de 8 octets nuls et doit apparaître dans les 16 premiers Ko de données de flux.
+ API Gateway ne nécessite pas de format spécifique pour la charge utile de réponse de la méthode.

Si vous utilisez une URL de fonction pour diffuser votre fonction Lambda, vous devez modifier l'entrée et la sortie de votre fonction Lambda pour répondre à ces exigences.

Si la sortie de votre fonction Lambda ne répond pas aux exigences de ce format, API Gateway peut toujours appeler votre fonction Lambda. Le tableau suivant présente les combinaisons de paramètres de demande d'intégration d'API et de code de fonction Lambda pris en charge par API Gateway. Cela inclut les combinaisons prises en charge pour le mode de transfert des réponses en mode tampon.


| Mode de transfert de réponse | Le code de fonction est conforme au format requis | API d'appel Lambda | Pris en charge par API Gateway | 
| --- | --- | --- | --- | 
|  Flux  |  Oui  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Oui. API Gateway diffuse votre réponse.  | 
|  Flux  |  Non  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Non API Gateway appelle votre fonction Lambda et renvoie une réponse d'erreur de 500.  | 
|  Flux  |  Oui  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Non API Gateway ne prend pas en charge cette configuration d'intégration.  | 
|  Flux  |  Non  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Non API Gateway ne prend pas en charge cette configuration d'intégration.  | 
|  Mis en mémoire tampon  |  Oui  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Non API Gateway ne prend pas en charge cette configuration d'intégration.  | 
|  Mis en mémoire tampon  |  Non  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Non API Gateway ne prend pas en charge cette configuration d'intégration.  | 
|  Mis en mémoire tampon  |  Oui  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  API Gateway renvoie les en-têtes HTTP et le code d'état, mais pas le corps de la réponse.  | 
|  Mis en mémoire tampon  |  Non  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Oui. Il s'agit d'une intégration de proxy Lambda. Pour plus d'informations, consultez la section Intégration du [proxy Lambda](set-up-lambda-proxy-integrations.md).  | 

# Configuration d'une intégration de proxy Lambda avec le streaming des réponses de charge utile dans API Gateway
<a name="response-streaming-lambda-configure"></a>

Lorsque vous configurez le streaming de la charge utile de réponse, vous spécifiez le mode de transfert dans la demande d'intégration de votre ressource. Vous configurez ces paramètres dans la demande d'intégration pour contrôler le comportement d'API Gateway avant et pendant la réponse d'intégration.

## Exemples de fonctions Lambda pour le streaming des réponses
<a name="response-streaming-lambda-example"></a>

Votre fonction Lambda doit respecter le. [Format d'intégration du proxy Lambda pour le streaming des réponses](response-transfer-mode-lambda.md#response-transfer-mode-lambda-format) Nous vous recommandons d'utiliser l'un des trois exemples de fonctions Lambda pour tester le streaming des réponses. Lorsque vous créez votre fonction Lambda, veillez à effectuer les opérations suivantes :
+ Prévoyez un délai d'attente suffisant pour votre fonction. Nous vous recommandons de configurer un délai d'au moins 1 minute pour en savoir plus sur le streaming des réponses. Lorsque vous créez vos ressources de production, assurez-vous que le délai d'expiration de votre fonction Lambda couvre l'ensemble du cycle de demande. Pour plus d'informations, voir [Configurer le délai d'expiration de la fonction Lambda.](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)
+ Utilisez le dernier moteur d'exécution de Node.js.
+ Utilisez une région dans laquelle le streaming des réponses Lambda est disponible.

------
#### [ Using HttpResponseStream.from ]

L'exemple de code suivant renvoie les objets de métadonnées JSON et les charges utiles au client à l'aide de la `awslambda.HttpResponseStream()` méthode sans utiliser la méthode du pipeline. Il n'est pas nécessaire de créer le délimiteur. Pour plus d'informations, consultez la section [Écrire des fonctions Lambda compatibles avec le streaming des réponses](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 ]

Lambda recommande que lorsque vous écrivez des fonctions activées pour le streaming de réponses, vous utilisiez le `awslambda.streamifyResponse()` décorateur fourni par les environnements d'exécution natifs de Node.js, ainsi que la méthode. `pipeline()` Lorsque vous utilisez la méthode du pipeline, vous n'avez pas besoin de créer le délimiteur, Lambda le fait pour vous. Pour plus d'informations, consultez la section [Écrire des fonctions Lambda compatibles avec le streaming des réponses](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html).

L'exemple de code suivant renvoie les objets de métadonnées JSON et trois charges utiles au client.

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

L'exemple de code suivant renvoie les objets de métadonnées JSON et trois charges utiles au client sans utiliser la `awslambda.HttpResponseStream()` méthode. Sans `awslambda.HttpResponseStream()` cette méthode, vous devez inclure un délimiteur de 8 octets nuls entre les métadonnées et la charge utile. 

```
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();
});
```

------

## Création d'une intégration de proxy Lambda avec diffusion en continu de la réponse à la charge utile
<a name="response-streaming-lambda-create"></a>

La procédure suivante montre comment créer une intégration de proxy Lambda avec le streaming de réponse de charge utile. Utilisez l'exemple de fonction Lambda ou créez la vôtre.

------
#### [ AWS Management Console ]

**Pour créer une intégration de proxy Lambda avec le streaming de réponse à la charge utile**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez une API REST.

1. Choisissez **Créer une ressource**.

1. Sous **Resource Name (Nom de la ressource)**, entrez **streaming**.

1. Choisissez **Créer une ressource**.

1. Lorsque la ressource **/streaming** est sélectionnée, choisissez **Create method**.

1. Pour **Type de méthode**, choisissez **ANY**.

1. Pour **Type d’intégration**, choisissez **Lambda**.

1. Choisissez l'intégration du **proxy Lambda**.

1. Pour le **mode de transfert Response**, choisissez **Stream**.

1. Pour la **fonction Lambda**, choisissez le nom de votre fonction Lambda.

   La console API Gateway utilise automatiquement [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)l'API pour appeler la fonction Lambda. Vous êtes responsable de l'écriture d'une fonction Lambda compatible avec le streaming des réponses. Pour obtenir un exemple, consultez [Exemples de fonctions Lambda pour le streaming des réponses](#response-streaming-lambda-example).

1. Choisissez **Créer une méthode**.

Après avoir créé votre méthode, déployez votre API.

**Pour déployer votre API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **prod**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

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

La procédure suivante explique comment importer une nouvelle API avec la valeur `responseTransferMode` définie sur`STREAM`. Si vous disposez d'une API d'intégration existante et que vous souhaitez la modifier`responseTransferMode`, consultez[Mettre à jour le mode de transfert des réponses pour une intégration de proxy Lambda](#response-streaming-lambda-update).

**Pour créer une nouvelle API avec diffusion en continu de la réponse à la charge utile**

1. Copiez le fichier Open API suivant, puis enregistrez-le sous`ResponseStreamDemoSwagger.yaml`. Dans ce fichier, `responseTransferMode` est défini sur`STREAM`, et l'URI d'intégration est défini sur`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`.

   Remplacez le nom de la fonction par une fonction compatible `my-function` avec le streaming et remplacez les informations d'identification par un rôle IAM doté de politiques permettant au `apigateway` service d'invoquer des fonctions 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"
   ```

   Au lieu de fournir un rôle IAM pour les informations d'identification, vous pouvez utiliser la `add-permission` commande Lambda pour ajouter des autorisations basées sur les ressources.

1. Utilisez la `import-rest-api` commande suivante pour importer votre définition OpenAPI :

   ```
   aws apigateway import-rest-api \
     --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \
     --parameters endpointConfigurationTypes=REGIONAL \
     --region us-west-1
   ```

1. Utilisez la `create-deployment` commande suivante pour déployer votre nouvelle API sur une étape :

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

------

### Mettre à jour le mode de transfert des réponses pour une intégration de proxy Lambda
<a name="response-streaming-lambda-update"></a>

La procédure suivante montre comment mettre à jour le mode de transfert des réponses pour une intégration de proxy Lambda. Lorsque vous passez du mode de transfert des réponses au streaming, mettez à jour votre fonction Lambda afin qu'elle soit conforme aux exigences du streaming des réponses. Utilisez l'exemple de fonction Lambda ou créez la vôtre.

------
#### [ AWS Management Console ]

**Pour mettre à jour le mode de transfert des réponses pour une intégration de proxy Lambda**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez une API REST.

1. Choisissez une méthode.

1. Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**.

1. Pour le **mode de transfert Response**, choisissez **Stream**.

1. Pour la **fonction Lambda**, choisissez le nom de votre fonction Lambda.

1. Choisissez **Enregistrer**.

Après avoir mis à jour votre méthode, déployez votre API.

**Pour déployer votre API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **prod**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

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

1. Mettez à jour votre fonction Lambda pour qu'elle soit compatible avec le streaming.

1. Utilisez la AWS CLI commande suivante pour mettre à jour l'URI d'intégration et le mode de transfert des réponses de votre intégration :

   ```
   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. Redéployez l’API pour que les modifications prennent effet.

------