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

Date de la dernière mise à jour : 20/02/2020

Je reçois des erreurs « Rate exceeded » (Dépassement du débit) et 429 « TooManyRequestsException » pour ma fonction AWS Lambda. Pourquoi ma fonction est-elle limitée ?

Brève description

La limitation a pour but de protéger vos ressources et applications en aval. Bien que Lambda se dimensionne automatiquement pour s'adapter à votre trafic entrant, votre fonction peut être toujours limitée pour diverses raisons. Suivez ces instructions pour éliminer la cause.

Solution

Vérifier ce qui est limité

Il est possible que les limitations que vous voyez ne soient pas sur votre fonction Lambda. Des limitations peuvent également se produire sur les appels d'API au cours de l'appel de votre fonction.

  1. Vérifiez qu'il existe des messages de limitation dans Amazon CloudWatch Logs mais pas de points de données correspondants dans les métriques Throttles (Limitations) Lambda. S'il n'existe pas de métriques de ilimitations Lambda, la limitation se produit sur les appels d'API dans le code de votre fonction Lambda.
  2. Vérifiez le code de votre fonction pour les appels d'API limités. Si certains appels d'API sont limités, veillez à utiliser l'interruption exponentielle dans votre code pour retenter les appels d'API.
  3. 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, si le quota est ajustable.

Vérifier les métriques de simultanéité

  1. 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 voyez une limitation.
  2. Comparez la métrique ConcurrentExecutions avec la métrique Throttles (Limitations) pour le même horodatage. (Affichez la statistique Maximum de ConcurrentExecutions et la statistique Sum (Somme) de Throttles (Limitates.)) Vérifiez que le nombre maximal 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).
  3. Vérifiez que vous dépassez le quota initial de simultanéité de transmission en rafales pour une région 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 soudain de limites qui correspond à un modèle d'étape ConcurrentExecutions sur le graphique. Pour contourner les limites de simultanéité en rafales, vous pouvez configurer la simultanéité allouée.
  4. Recherchez les pics dans les métriques de Duration (Durée) de votre fonction. La simultanéité dépend de la durée de la fonction. Si l'exécution de votre code prend trop de temps, il est possible 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. Si votre fonction se trouve dans un Amazon Virtual Private Cloud (Amazon VPC), consultez Comment accorder l'accès Internet à ma fonction Lambda dans un VPC ? pour plus d'informations.
    Remarque : la modification du paramètre de mémoire peut affecter les frais que vous encourez pour le temps d'exécution.
  5. Recherchez une augmentation dans la métrique Error (Error) de votre fonction. L'augmentation des erreurs peut entraîner des nouvelles tentatives et une augmentation globale des appels. (Pour les appels asynchrones, Lambda relance les appels ayant échoué deux fois de plus.) L'augmentation des appels peut entraîner une augmentation de la simultanéité. Utilisez CloudWatch Logs pour identifier et éliminer les erreurs, et pour que le code de votre fonction gère les exceptions.

Configurer la simultanéité réservée

  1. Vérifiez que vous avez configuré la simultanéité réservée sur votre fonction Lambda. 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.
  2. Passez en revue la statistique Maximum dans CloudWatch de votre fonction afin de déterminer si elle atteint la valeur maximale de la métrique ConcurrentExecutions à tout moment.
  3. 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.

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

Utiliser une file d'attente de lettres mortes

Si vous utilisez des 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) pour intercepter tous les événements qui sont ignorés en raison de limitations constantes. Cela peut protéger vos données si vous constatez une limitation importante.

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.

Demander une augmentation de quota 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, vous pouvez demander une augmentation du quota de service dans la console Service Quotas.