Configuration d'une fonction Lambda pour le streaming des réponses - AWS Lambda

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.

Configuration d'une fonction Lambda pour le streaming des réponses

Vous pouvez configurer les URL de vos fonctions Lambda de manière à ce que les charges utiles des réponses soient renvoyées en continu aux clients. Le streaming de réponses peut profiter aux applications sensibles à la latence en améliorant les performances de temps au premier octet (TTFB). En effet, vous pouvez renvoyer des réponses partielles au client dès qu'elles sont disponibles. En outre, vous pouvez utiliser le streaming de réponses pour créer des fonctions qui renvoient des charges utiles plus importantes. Les charges utiles de la diffusion des réponses ont une limite souple de 20 Mo par rapport à la limite de 6 Mo pour les réponses mises en mémoire tampon. La diffusion d'une réponse signifie également que votre fonction n'a pas besoin de stocker l'intégralité de la réponse en mémoire. Pour les réponses très volumineuses, cela peut réduire la quantité de mémoire que vous devez configurer pour votre fonction.

La vitesse à laquelle Lambda diffuse vos réponses dépend de la taille de la réponse. Le débit de diffusion pour les 6 premiers Mo de réponse de votre fonction n'est pas plafonné. Pour les réponses supérieures à 6 Mo, le reste de la réponse est soumis à une limite de bande passante. Pour plus d'informations sur la bande passante de diffusion, consultez Limitation de la bande passante pour la diffusion des réponses.

Le streaming des réponses entraîne un coût. Pour plus d’informations, consultez Tarification d’AWS Lambda.

Lambda prend en charge le streaming des réponses sur les exécutions gérées par Node.js. Pour les autres langages, vous pouvez utiliser une exécution personnalisée avec une intégration d'API d'exécution personnalisée pour diffuser les réponses en continu ou utiliser l'adaptateur Web Lambda. Vous pouvez diffuser les réponses via les URL des fonctions Lambda, le AWS SDK ou l'API Lambda. InvokeWithResponseStream

Note

Lorsque vous testez votre fonction via la console Lambda, vous verrez toujours les réponses comme étant mises en mémoire tampon.

Écriture de fonctions compatibles avec le streaming de réponses

L'écriture du gestionnaire pour les fonctions de streaming de réponses est différente des modèles de gestionnaire typiques. Lorsque vous écrivez des fonctions de streaming, assurez-vous de faire ce qui suit :

  • Enveloppez votre fonction avec le décorateur awslambda.streamifyResponse() fourni par les exécutions natives de Node.js.

  • Terminez la diffusion de manière élégante afin de vous assurer que le traitement des données est terminé.

Configuration d'une fonction gestionnaire pour diffuser les réponses

Pour indiquer à l'exécution que Lambda doit diffuser les réponses de votre fonction, vous devez envelopper votre fonction avec le décorateur streamifyResponse(). Cela indique à l'exécution d'utiliser le chemin logique approprié pour le streaming des réponses et permet à la fonction de diffuser les réponses.

Le décorateur streamifyResponse() accepte une fonction qui accepte les paramètres suivants :

  • event : fournit des informations sur l'événement d'invocation de l'URL de la fonction, telles que la méthode HTTP, les paramètres de la requête et le corps de la requête.

  • responseStream : fournit un flux inscriptible.

  • context : fournit des méthodes et des propriétés avec des informations sur l'invocation, la fonction et l'environnement d'exécution.

L'objet responseStream est un writableStream Node.js. Comme pour tout flux de ce type, vous devez utiliser la méthode pipeline().

Exemple gestionnaire compatible avec le streaming de réponses
const pipeline = require("util").promisify(require("stream").pipeline); const { Readable } = require('stream'); exports.echo = awslambda.streamifyResponse(async (event, responseStream, _context) => { // As an example, convert event to a readable stream. const requestStream = Readable.from(Buffer.from(JSON.stringify(event))); await pipeline(requestStream, responseStream); });

Bien que responseStream propose la méthode write() pour écrire dans le flux, nous vous recommandons d'utiliser pipeline() dans la mesure du possible. L'utilisation de pipeline() permet de s'assurer que le flux accessible en écriture n'est pas submergé par un flux accessible en lecture plus rapide.

Fin du flux

Assurez-vous de terminer correctement le flux avant le retour du gestionnaire. La méthode pipeline() s'en charge automatiquement.

Pour les autres cas d'utilisation, appelez la méthode responseStream.end() pour terminer correctement un flux. Cette méthode signale que plus aucune donnée ne doit être écrite dans le flux. Cette méthode n'est pas nécessaire si vous écrivez dans le flux avec pipeline() ou pipe().

Exemple de fin d'un flux avec pipeline()
const pipeline = require("util").promisify(require("stream").pipeline); exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { await pipeline(requestStream, responseStream); });
Exemple de fin d'un flux sans pipeline()
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { responseStream.write("Hello "); responseStream.write("world "); responseStream.write("from "); responseStream.write("Lambda!"); responseStream.end(); });

Invocation d'une fonction compatible avec le flux de réponses à l'aide des URL de fonctions Lambda

Note

Vous devez invoquer votre fonction à l'aide d'une URL de la fonction pour diffuser les réponses.

Vous pouvez invoquer des fonctions compatibles avec le streaming de réponses en modifiant le mode d'invocation de l'URL de votre fonction. Le mode d'invocation détermine l'opération d'API que Lambda utilise pour invoquer votre fonction. Les modes d'invocation disponibles sont les suivants :

  • BUFFERED : il s'agit de l'option par défaut. Lambda invoque votre fonction en utilisant l’opération d’API Invoke. Les résultats de l’invocation sont disponibles lorsque la charge utile est complète. La taille de la charge utile maximale est de 6 Mo.

  • RESPONSE_STREAM : permet à votre fonction de diffuser les résultats de la charge utile au fur et à mesure qu'ils sont disponibles. Lambda invoque votre fonction en utilisant l'opération d'API InvokeWithResponseStream. La taille maximale des données utiles est de 20 Mo. Toutefois, vous pouvez demander une augmentation du quota.

Vous pouvez toujours invoquer votre fonction sans streaming de réponses en appelant directement l'opération d'API Invoke. Cependant, Lambda diffuse toutes les charges utiles de réponse pour les invocations qui passent par l'URL de la fonction jusqu'à ce que vous changiez le mode d'invocation en BUFFERED.

Pour définir le mode d'invocation d'une URL de la fonction (console)
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Sélectionnez le nom de la fonction pour laquelle vous voulez définir le mode d'invocation.

  3. Choisissez l'onglet Configuration, puis Function URL (URL de fonction).

  4. Sélectionnez Modifier, puis Paramètres supplémentaires.

  5. Sous Mode d'invocation, sélectionnez le mode d'invocation de votre choix.

  6. Choisissez Enregistrer.

Pour définir le mode d'invocation d'une URL de la fonction (AWS CLI)

aws lambda update-function-url-config --function-name my-function --invoke-mode RESPONSE_STREAM

Pour définir le mode d'invocation d'une URL de la fonction (AWS CloudFormation)

MyFunctionUrl: Type: AWS::Lambda::Url Properties: AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM

Pour plus d'informations sur la configuration des URL des fonctions, consultez la section URL des fonctions Lambda.

Limitation de la bande passante pour la diffusion des réponses

Les 6 premiers Mo de la charge utile de la réponse de votre fonction disposent d'une bande passante non plafonnée. Après cette première salve, Lambda diffuse votre réponse à un débit maximum de 2 Mbit/s. Si les réponses de votre fonction ne dépassent jamais 6 Mo, cette limite de bande passante ne s'applique pas.

Note

Les limites de bande passante s'appliquent uniquement à la charge utile de la réponse de votre fonction, et non à l'accès au réseau par votre fonction.

Le débit de bande passante non plafonnée varie en fonction d'un certain nombre de facteurs, notamment la vitesse de traitement de votre fonction. Vous pouvez normalement vous attendre à un débit supérieur à 2 Mbit/s pour les 6 premiers Mo de la réponse de votre fonction. Si votre fonction diffuse une réponse vers une destination située à l'extérieur AWS, le débit de diffusion dépend également de la vitesse de la connexion Internet externe.