我有一个由PUT触发到S3存储桶的Lambda函数。
我想限制这个Lambda函数,以便它一次只运行一个实例 - 我不希望两个实例同时运行。
我已经了解了Lambda配置和文档,但我看不出任何明显的东西。我可以编写自己的锁定系统,但如果这已经解决了问题就好了。
如何限制Lambda的并发调用次数?
答案 0 :(得分:36)
AWS Lambda现在支持各个功能的并发限制: https://aws.amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda-functions/
答案 1 :(得分:15)
我建议您使用Kinesis Streams(或者 DynamoDB + DynamoDB Streams ,它们基本上具有相同的行为)。
您可以将 Kinesis Streams 视为队列。最重要的是,您可以将 Kinesis Stream 用作 Trigger 作为 Lambda 功能。因此,插入此队列的任何内容都将按顺序自动传递给您的函数。因此,您将能够逐个处理这些 S3事件,一个Lambda执行一个接一个(一次一个实例)。
为了做到这一点,你需要创建一个 Lambda 函数,其简单目的是获取 S3 Events 并将它们放入 Kinesis Stream 。然后,您将 Kinesis Stream 配置为 Lambda Trigger 。
当您将 Kinesis Stream 配置为 Lambda触发器时,我建议您使用以下配置:
关于AWS May Webinar Series - Streaming Data Processing with Amazon Kinesis and AWS Lambda的更多信息。
我希望这可以帮助任何有类似问题的人。
P.S。请记住 Kinesis Streams 有自己的pricing。使用 DynamoDB + DynamoDB Streams 可能会更便宜(甚至免费,因为DynamoDB未过期Free Tier。)
答案 2 :(得分:11)
不,这是我非常希望看到Lambda支持的事情之一,但目前还没有。其中一个问题是,如果发生了大量的S3 PUT操作,AWS必须以某种方式排队所有Lambda调用,并且目前不支持。
如果您在Lambda函数中构建了一个锁定机制,那么对于由于锁定而未处理的请求,您将如何处理?你会抛弃那些S3通知吗?
大多数人建议的解决方案是让S3将通知发送到SQS队列,然后将Lambda函数安排为定期运行,例如每分钟一次,并检查队列中是否有需要的项目处理。
或者,让S3将通知发送到SQS并且只有一个t2.nano EC2实例,其中单线程服务轮询队列。
答案 3 :(得分:1)
有S3"举办活动"导致将消息放入队列(而不是涉及lambda函数)。该消息应包含对S3对象的引用。然后安排一个lambda到" SHORT POLL整个队列"。
PS: S3事件无法触发Kinesis Stream ...只有SQS,SMS,Lambda(请参阅http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#supported-notification-destinations)。 Kinesis Stream价格昂贵,用于实时事件处理。