基于多个文件触发Lambda

时间:2020-01-29 08:43:15

标签: amazon-web-services amazon-s3 aws-lambda amazon-dynamodb

当s3中有多个特定文件可用时,我有点困惑,因为我需要运行一个AWS粘合作业。在s3中的每个文件放置事件上,我都会触发一个lambda,它将该文件元数据写入dynamodb。在dynamodb中,我还维护着一个计数器,该计数器可以对所需的文件数量进行计数。

但是,一次上传多个文件会触发多个lambda,它们几乎同时在dynamodb中写入,这会影响计数器。因此计数器无法准确计数。

当s3中提供特定(多个)文件时,我需要一种更好的方式开始工作。

请提出一个更好的方法。

3 个答案:

答案 0 :(得分:0)

Dynamo默认为最终一致。您需要请求高度一致读取,以确保您正在读取与写入的数据相同的数据。

有关更多信息,请参见this page,有关更具体的示例,请参见GetItem docs中的 ConsistentRead 标志。

值得注意的是,这些只会最小化您的问题。在读/写之间还会有一个很小的窗口,其中网络滞后导致一个功能进行读/写,而另一功能也在这样做。您应该考虑只允许一次运行一个功能,或者考虑其他一些逻辑来保证对数据库的互斥访问。

答案 1 :(得分:0)

听起来您正在获取当前计数,在Lambda函数中对其进行递增,然后使用新值更新DynamoDB。相反,您需要使用DynamoDB Atomic Counters,这将确保多个并发更新不会引起您所描述的问题。

通过使用原子计数器,您只需向DynamoDB发送一个将计数器增加1的请求。如果Lambda需要检查这是否是您在执行其他工作之前正在等待的最后一个文件,那么您可以使用更新呼叫以检查新计数是多少。

答案 2 :(得分:0)

不确定“特定”(多个)文件的含义。

如果您希望使用特定的文件名(或“模式”),则可以将所有所需的文件作为lambda函数的第一条指令进行检查。即您需要以下文件:A.txt,B.txt,C.txt,然后测试您的s3存储桶中是否包含这3个特定文件(或3个* .txt文件或任何符合您要求的文件)。如果是这种情况,请继续处理,否则请继续执行该函数中的return。从技术上讲,这将在并发调用的情况下起作用。