Comment résoudre les erreurs de limitation de fonction Lambda de type « Rate exceeded » (Dépassement du débit) et 429 « TooManyRequestsException » ?

Date de la dernière mise à jour : 14/04/2021

Ma fonction AWS Lambda génère des erreurs « Rate exceeded » et 429 « TooManyRequestsException ». Pourquoi ma fonction est-elle limitée et comment puis-je résoudre ces problèmes ?

Solution

Les fonctions Lambda sont parfois limitées pour protéger vos ressources et vos applications en aval. Bien que Lambda se mette automatiquement à l'échelle pour s'adapter à votre trafic entrant, votre fonction peut malgré tout rester limitée pour diverses raisons.

Pour résoudre les problèmes de limitation Lambda, y compris les erreurs Rate exceeded (Dépassement du débit) et TooManyRequestsException, procédez comme suit :

Vérifiez quelle ressource est limitée

Les erreurs de limitation peuvent ne pas provenir de votre fonction Lambda. Des limitations peuvent également se produire sur les appels d'API au cours de l'appel de votre fonction.

Pour vérifier quelle ressource est limitée, procédez comme suit :

Consultez vos Amazon CloudWatch Logs pour vérifier s'ils contiennent des erreurs de limitation, mais sans points de données correspondants dans les métriques Throttles (limitations) Lambda

S'il n'existe pas de métriques Throttles Lambda, la limitation se produit sur les appels d'API dans le code de votre fonction Lambda.

Vérifiez si le code de votre fonction contient des appels d'API limités

Si certains appels d'API sont limités, utilisez l'interruption exponentielle dans votre code pour retenter les appels d'API.

Remarque : si vous déterminez que vous avez besoin d'un quota de transactions par seconde (TPS) plus élevé pour un appel d'API, vous pouvez demander une augmentation du quota de service. Tous les quotas ne sont pas ajustables.

Vérifiez les métriques de simultanéité de votre fonction

Passez en revue vos métriques Lambda dans Amazon CloudWatch

Vérifiez la métrique ConcurrentExecutions de votre fonction dans la région AWS où vous constatez une limitation.

Comparez la métrique ConcurrentExecutions à la métrique Throttles correspondant au même horodatage

Consultez les statistiques Maximum pour ConcurrentExecutions et Sum pour Throttles. Vérifiez si le nombre maximal d'exécutions simultanées ConcurrentExecutions est proche du quota de simultanéité au niveau du compte dans la région, ainsi que les points de données correspondants dans le graphique Throttles (Limites).

Vérifiez si vous dépassez le quota initial de simultanéité de transmission en rafales pour une région AWS donnée

Sur la page Metrics (Métriques) de Lambda dans la console CloudWatch, réduisez la plage de temps du graphique à une minute. Si vous êtes limité par le dimensionnement en rafales, vous constatez un pic de la métrique Throttles qui correspond à un motif en escalier de la métrique ConcurrentExecutions sur le graphique.

Remarque : pour contourner les limites de simultanéité en rafales, vous pouvez configurer la simultanéité allouée.

Recherchez des pics dans les métriques Duration (Durée) de votre fonction

La simultanéité dépend de la durée de la fonction. Si l'exécution du code de votre fonction prend trop de temps, cela peut signifier qu'il ne dispose pas de suffisamment de ressources de calcul.

Essayez d'augmenter le paramètre de mémoire de la fonction. Ensuite, utilisez AWS X-Ray et CloudWatch Logs pour isoler la cause des augmentations de durée.

Remarque : la modification du paramètre de mémoire peut affecter les frais que vous encourez pour le temps d'exécution.

Si votre fonction se trouve dans un Amazon Virtual Private Cloud (Amazon VPC), consultez Comment accorder l'accès Internet à une fonction Lambda connectée à un VPC Amazon ?

Recherchez une augmentation dans la métrique Error (Erreur) de votre fonction

L'augmentation des erreurs peut entraîner des nouvelles tentatives et une augmentation globale des appels. L'augmentation des appels peut entraîner une augmentation de la simultanéité. Utilisez CloudWatch Logs pour identifier et éliminer les erreurs, et veillez à ce que le code de votre fonction gère les exceptions.

Remarque : votre fonction peut également être limitée en fonction des demandes d'appel par région (demandes par seconde), soit 10 fois votre quota d'exécutions simultanées.

Configurez la simultanéité réservée

Vérifiez que vous avez configuré la simultanéité réservée sur votre fonction

Vérifiez le paramètre à l'aide de la console Lambda, ou en appelant l'API GetFunction.

Remarque : si une fonction est configurée pour n'avoir aucune simultanéité réservée, la fonction est limitée, car elle ne peut pas traiter les événements. Veillez à augmenter la valeur à un nombre supérieur à zéro.

Consultez la statistique Maximum dans CloudWatch pour votre fonction

Vérifiez si la métrique de la fonction atteint la valeur maximale pour ConcurrentExecutions à un moment donné.

Augmentez la simultanéité réservée de votre fonction à une valeur de simultanéité qui empêche sa limitation

Modifiez le paramètre à l'aide de la console Lambda, ou en appelant l'API PutFunctionConcurrency.

Utilisez une fonction d'interruption exponentielle dans votre application

La bonne pratique consiste à réessayer les demandes limitées en utilisant une fonction d'interruption exponentielle dans votre application qui appelle votre fonction Lambda.

Utilisez une file d'attente de lettres mortes

Pour les sources d'événements asynchrones, telles qu'Amazon Simple Storage Service (Amazon S3) et Amazon CloudWatch Events, configurez votre fonction avec une file d'attente de lettres mortes (DLQ). La DLQ capture tous les événements rejetés en raison de la limitation constante et peut protéger vos données si vous observez une limitation significative.

Remarque : pour les sources d'événements Amazon Simple Queue Service (Amazon SQS), vous devez configurer la file d'attente DLQ sur la file d'attente Amazon SQS.

Demandez une augmentation des quotas de service

Si vous déterminez que votre charge de travail nécessite un quota de service plus élevé pour les exécutions simultanées, demandez une augmentation du quota de service dans la console de quotas de service.