2017-02-03 64 views
13

我有一个Lambda函数,由PUT触发到S3存储桶。我可以限制AWS Lambda的并发调用吗?

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

我已浏览了Lambda配置和文档,但看不到任何明显的内容。我可以写自己的锁定系统,但如果这已经是一个解决的问题,那将会很好。

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

+0

有兴趣,为什么你关心多少调用同时运行。 – jarmod

+0

@jarmod当时我正在考虑在Lambdas中运行Terraform更改,并且我不知道如何在Terraform本身中执行远程状态锁定。我放弃了这个想法 - 部分原因是您不能限制并发的Lambdas,部分原因是我担心五分钟的超时。 – alexwlchan

回答

9

不,这是我真的很希望看到Lambda支持的事情之一,但目前情况并非如此。其中一个问题是,如果有很多S3 PUT操作发生,AWS将不得不以某种方式排队所有的Lambda调用,目前还没有支持。

如果您在Lambda函数中构建了锁定机制,您将如何处理由于锁定而无法处理的请求?你会抛出S3通知吗?

大多数人推荐的解决方案是让S3将通知发送到SQS队列,然后让您的Lambda函数定期运行(例如每分钟一次),并检查队列中是否存在需要被处理。

或者,让S3向SQS发送通知,并且只有一个带有单线程服务的t2.nano EC2实例轮询队列。

9

我建议你使用Kinesis Streams(或者DynamoDB + DynamoDB Streams,它们本质上具有相同的行为)。

你可以看到Kinesis Streams队列。好的部分是你可以使用Kinesis Stream作为触发器给你Lambda函数。因此,插入此队列的任何内容都将按顺序自动传递到您的函数。所以你将能够进程那些S3事件一个接一个,一个Lambda执行后另一个(一次一个实例)。

为了做到这一点,你需要创建一个LAMBDA功能与得到S3活动并把它们放入一个室壁运动流的目的很简单。然后,您将配置Kinesis Stream作为您的Lambda触发器

Event Flow

在配置室壁运动流为您拉姆达触发我建议您使用以下配置:

  • 批量大小:1
    • 这意味着你的Lambda将被称为只有一个事件Kinesis。您可以选择更高的数字,并且您将获得该大小的事件列表(例如,如果要在一次Lambda执行中处理最后10个事件,而不是连续执行10次Lambda)。
  • 起始位置:修剪地平线

多一点信息。

我希望这可以帮助任何有类似问题的人。

P.S.请记住,Kinesis Streams有自己的pricing。使用DynamoDB + DynamoDB Streams可能会更便宜(甚至免费,因为DynamoDB的非到期日期Free Tier)。

+0

这个答案太棒了! OP应该真的接受它作为解决方案。 – GavinoGrifoni

12
+0

这真棒。在S3上更新文件时,我能够解决并发问题。我使用lambda函数来更新S3上的一个文件,使用并发计数为1.这确保了一次只有一个ec2实例具有对文件的写入访问权限。这比使用AWS上的任何托管数据库进行微不足道的使用便宜得多。 –

相关问题