Amazon web services 我可以限制AWS Lambda的并发调用吗?

Amazon web services 我可以限制AWS Lambda的并发调用吗?,amazon-web-services,locking,aws-lambda,Amazon Web Services,Locking,Aws Lambda,我有一个Lambda函数,它是由对S3 bucket的PUT触发的 我想限制这个Lambda函数,使它一次只运行一个实例——我不希望两个实例同时运行 我已经查看了Lambda配置和文档,但没有看到任何明显的内容。我可以考虑编写自己的锁定系统,但如果这已经是一个解决了的问题,那就太好了 如何限制Lambda的并发调用次数?不,这是我非常希望看到Lambda支持的内容之一,但目前没有。其中一个问题是,如果有大量的S3PUT操作发生,AWS将不得不以某种方式将所有Lambda调用排队,而目前对此没有支

我有一个Lambda函数,它是由对S3 bucket的PUT触发的

我想限制这个Lambda函数,使它一次只运行一个实例——我不希望两个实例同时运行

我已经查看了Lambda配置和文档,但没有看到任何明显的内容。我可以考虑编写自己的锁定系统,但如果这已经是一个解决了的问题,那就太好了


如何限制Lambda的并发调用次数?

不,这是我非常希望看到Lambda支持的内容之一,但目前没有。其中一个问题是,如果有大量的S3PUT操作发生,AWS将不得不以某种方式将所有Lambda调用排队,而目前对此没有支持

如果在Lambda函数中构建了锁定机制,那么对于由于锁定而未处理的请求,您会怎么做?你能把那些S3通知扔掉吗

大多数人建议的解决方案是让S3将通知发送到SQS队列,然后安排Lambda函数定期运行,比如每分钟运行一次,并检查队列中是否有需要处理的项目


或者,让S3将通知发送给SQS,只让一个t2.nano EC2实例和一个单线程服务轮询队列。

我建议您使用(或者使用DynamoDB+DynamoDB流,它们基本上具有相同的行为)

您可以将运动流视为队列。很好的一点是,您可以使用动态流作为Lambda函数的触发器。因此,插入到此队列中的任何内容都将按顺序自动传递给您的函数。因此,您将能够一个接一个地处理这些S3事件,一个接一个地执行Lambda(一次一个实例)

为了做到这一点,您需要创建一个Lambda函数,其目的很简单,就是获取S3事件并将它们放入一个Kinesis流中。然后,您将配置该运动流作为Lambda触发器

当您将Kinesis流配置为Lambda触发器时,我建议您使用以下配置:

  • 批量大小:1
    • 这意味着您的Lambda将通过来自Kinesis的一个事件调用。您可以选择一个更大的数字,您将获得该大小的事件列表(例如,如果您希望在一次Lambda执行中处理最后10个事件,而不是连续10次Lambda执行)
  • 起始位置:修剪地平线
    • 这意味着它将表现为队列(FIFO
更多的信息

我希望这能帮助任何有类似问题的人

请记住,运动流有其自身的特点。使用DynamoDB+DynamoDB流可能更便宜(或者由于DynamoDB的非过期性,甚至是免费的)。

让S3“Put事件”将消息放置在队列上(而不是涉及lambda函数)。消息应该包含对S3对象的引用。然后安排lambda“短轮询整个队列”


PS:S3事件不能触发动觉流。。。仅限SQS、SMS、Lambda(请参阅)。Kinesis流非常昂贵,用于实时事件处理。

AWS Lambda现在支持单个函数的并发限制:


有兴趣了解为什么您关心并发运行多少调用。@jarmod这是在我考虑在Lambdas中运行Terraform更改时,我不知道如何在Terraform本身中执行远程状态锁定。我放弃了这个想法——一部分是因为你不能限制并发Lambdas,另一部分是因为我担心5分钟的超时。这个答案太棒了!OP应该真的接受它作为解决方案。为了确保准确的行为,您还需要一个配置:Kinesis Shard Count:1在多碎片Kinesis流中,每个流触发一个Lambda,因此我们可以有多个Lambda并行执行。这太棒了。在S3上更新文件时,我能够解决并发问题。我正在使用lambda函数更新S3上的一个文件,并发计数为1。这确保了一次只有一个ec2实例具有对文件的写访问权限。这比在AWS上使用任何托管数据库进行琐碎的使用要便宜得多。我知道这已经有2年的历史了,但这解决了我遇到的一个问题。非常感谢。这真的是100%的节省吗?我做了一些研究,如果我没有弄错的话,可能会有很多有效的消息因为节流而失败,以防你收到很多消息。正如这篇详细的文章所描述的:您如何配置Visibility Timeout等?@BjörnGrambow我认为这取决于您如何调用函数。这方面的理想用例是来自SQS的异步调用或事件调用。在这个用例中,您将遇到的唯一问题是,您的事件增长速度是否快于您处理它们的速度。