AWS S3通知' ObjectCreated'并不总是被Lambda收到

时间:2015-11-17 22:36:16

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

我想要实现的目标:我通过AWS SES接收电子邮件并将其存储到AWS S3。然后,电子邮件由AWS Lambda函数解析,结果存储到数据库。在创建新对象时,S3会调用Lambda。

问题:我的数据库中只有一小部分(我会说不到10%)的电子邮件。

在S3上,我设置了Event Notification。它在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);
  }
}

如您所见,我遍历Recordsevent的数组,并至少打印一次对象的名称。我也在我的Lambda代码的第一行中执行此操作:

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

根据我的日志判断,Lambda函数每次都被调用,但有时只调用。为什么我这么想?

我今天下载了所有新电子邮件,这些是1,245个对象。所有这些电子邮件也存储在S3上。但我在CloudWatch日志中只发现85次Lambda function invoked,这些日志已自动为Lambda设置。

有没有人提示可能是错误甚至是我可以调试的想法?

1 个答案:

答案 0 :(得分:0)

我不知道您遇到S3事件通知的原因。但是我不明白为什么您选择S3事件的方式?我在项目中也有类似的逻辑。我收到了电子邮件,不得不将它们存储在数据库中。

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

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

Actions list

动作是有序列表,使用这种方法从S3读取文件时没有问题。老实说,这是一个宠物项目,并且没有在实际生产中发布。但是我从不同的电子邮件地址(免费和公司地址)进行了测试。

PS:如果要在后续步骤中处理电子邮件,请注意Lambda操作的Invocation Type