web-dev-qa-db-fra.com

Puis-je limiter les appels simultanés d'un AWS Lambda?

J'ai une fonction Lambda déclenchée par un PUT vers un compartiment S3.

Je veux limiter cette fonction Lambda afin qu'elle n'exécute qu'une seule instance à la fois - je ne veux pas que deux instances s'exécutent simultanément.

J'ai jeté un œil à la configuration et aux documents Lambda, mais je ne vois rien d'évident. Je peux écrire mon propre système de verrouillage, mais ce serait bien si c'était déjà un problème résolu.

Comment puis-je limiter le nombre d'appels simultanés d'un Lambda?

40
alexwlchan

AWS Lambda prend désormais en charge les limites de concurrence sur les fonctions individuelles: https://aws.Amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda- fonctions /

enter image description here

48
Robert Chen

Je vous suggère d'utiliser Kinesis Streams (ou alternativement DynamoDB + DynamoDB Streams, qui ont essentiellement le même comportement).

Vous pouvez voir Kinesis Streams comme queue. La bonne partie est que vous pouvez utiliser une fonction Kinesis Stream comme une fonction Trigger pour vous Lambda. Donc, tout ce qui est inséré dans cette file d'attente sera automatiquement transmis à votre fonction, dans l'ordre. Vous pourrez donc traiter ces événements S3 un par un, une exécution Lambda après l'autre (une instance à la fois).

Pour ce faire, vous devrez créer une fonction Lambda dans le simple but d'obtenir Événements S3 et de les placer dans un Kinesis Stream. Ensuite, vous configurerez ce Kinesis Stream comme votre Lambda Trigger.

Event Flow

Lorsque vous configurez le Kinesis Stream comme votre Lambda Trigger je vous suggère d'utiliser la configuration suivante:

  • Taille du lot: 1
    • Cela signifie que votre Lambda sera appelé avec un seul événement de Kinesis . Vous pouvez sélectionner un nombre plus élevé et vous obtiendrez une liste d'événements de cette taille (par exemple, si vous souhaitez traiter les 10 derniers événements en une seule exécution Lambda au lieu de 10 exécutions Lambda consécutives).
  • Position de départ: Trim horizon
    • Cela signifie qu'il se comportera comme une file d'attente ( [~ # ~] fifo [~ # ~] )

Un peu plus d'informations sur AWS May Webinar Series - Streaming Data Processing with Amazon Kinesis and AWS Lambda .

J'espère que cela aide toute personne ayant un problème similaire.

P.S. Gardez à l'esprit que Kinesis Streams ont leur propre tarification . Utiliser DynamoDB + DynamoDB Streams pourrait être moins cher (ou même gratuit en raison de la non-expiration Free Tier de DynamoDB).

17
dsaiztc

Non, c'est l'une des choses que j'aimerais vraiment voir le support Lambda, mais actuellement ce n'est pas le cas. L'un des problèmes est que s'il y avait beaucoup d'opérations S3 PUT, AWS devrait mettre en file d'attente toutes les invocations Lambda d'une manière ou d'une autre, et il n'y a actuellement aucun support pour cela.

Si vous avez intégré un mécanisme de verrouillage dans votre fonction Lambda, que feriez-vous avec les demandes que vous ne traitez pas en raison d'un verrou? Souhaitez-vous simplement jeter ces notifications S3?

La plupart des gens recommandent la solution pour que S3 envoie les notifications à une file d'attente SQS, puis que votre fonction Lambda soit planifiée pour s'exécuter périodiquement, comme une fois par minute, et vérifier s'il y a un élément dans la file d'attente qui doit être traité.

Sinon, demandez à S3 d'envoyer les notifications à SQS et ayez simplement une instance t2.nano EC2 avec un service à thread unique interrogeant la file d'attente.

11
Mark B

Faire en sorte que les "événements Put" S3 provoquent la mise en place d'un message dans la file d'attente (au lieu d'impliquer une fonction lambda). Le message doit contenir une référence à l'objet S3. PLANIFIEZ ensuite un lambda pour "SHORT POLL toute la file d'attente".

PS: Les événements S3 ne peuvent pas déclencher un flux Kinesis ... uniquement SQS, SMS, Lambda (voir http://docs.aws .Amazon.com/AmazonS3/latest/dev/NotificationHowTo.html # destinations-de-notification-prises en charge ). Kinesis Stream est coûteux et utilisé pour la gestion des événements en temps réel.

1
William Choy