AWS S3通知Lambda的“ObjectCreated”事件有时无法收到

8
我想要实现的目标是:通过AWS SES接收电子邮件并将其存储到AWS S3。然后,AWS Lambda函数解析电子邮件,并将结果存储到数据库中。每当在S3上创建新对象时,Lambda会被S3调用。
问题:只有一小部分(我会说不到10%)的电子邮件被存储到我的数据库中。
在S3上,我设置了一个“事件通知”。它在“ObjectCreated(All)”上调用我的Lambda函数。据我理解,这意味着对于在S3上创建的每个新对象(即由SES存储的电子邮件),都会调用Lambda函数。
Lambda函数做了几件事情,但至少它做了这个:
exports.handler = function(event, context) {
  Async.mapSeries(event.Records,
    function dealWithOneMail(record, callback) {

    var srcKey = decodeURIComponent(record.s3.object.key.replace(/\+/g, " "));
    console.log('> Working on object ' + srcKey);
  }
}

正如您所看到的,我在event中遍历Records数组,并至少打印对象的名称一次。我还在Lambda代码的第一行执行此操作:

console.log('> Lambda function invoked!');

从我的日志来看,Lambda函数并不总是被调用,而只是有时才被调用。我为什么这么认为呢?

我下载了今天所有的新电子邮件,共1,245个对象。所有这些邮件也存储在S3上。但是,在我自动设置的Lambda CloudWatch日志中,只找到了85次“Lambda函数被调用”的记录。


是否有人知道可能出现的错误或者有什么调试的想法?


1
只是想让大家知道:我曾与AWS支持团队一起解决这个问题,但没有任何结果。我们放弃了Lambda来解决这个特定的问题。 - Julian
你检查过没有显示的是否被限制了吗? - shrewquest
1
您是否设置了S3键名称的前缀或后缀匹配,以便在调用Lambda时进行匹配 - 也许这不匹配。 - shrewquest
你的设置中可能存在问题,S3和Lambda应该可以无缝地协同工作。 - johnny
1个回答

0

我不知道你在S3事件通知方面遇到问题的原因。但我不明白为什么你选择使用S3事件的方式?我的项目中有类似的逻辑。我收到电子邮件并需要将它们存储在数据库中。

我在规则集中创建了以下操作:

  1. 将电子邮件正文放入S3中
  2. 从S3中读取电子邮件正文,并使用Lambda将其存储在数据库中。

Actions list

Actions 是有序列表,使用这种方式从 S3 读取文件时,我没有遇到任何问题。说实话,这只是一个个人项目,并没有真正投入生产。但我用了不同的电子邮件地址(免费和企业级)进行测试。

附注:如果您打算在接下来的步骤中处理电子邮件,请注意 Lambda 操作的 Invocation Type


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接