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?
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 /
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.
Lorsque vous configurez le Kinesis Stream comme votre Lambda Trigger je vous suggère d'utiliser la configuration suivante:
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).
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.
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.