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

Jul*_*ian 6 amazon-s3 amazon-web-services amazon-sns aws-lambda

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

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


在S3上,我设置了一个Event Notification.它正在调用我的Lambda函数ObjectCreated (All).根据我的理解,这意味着,对于在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);
  }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我重复阵列上Recordsevent至少打印对象的名称一次.我也在我的Lambda代码的第一行中执行此操作:

console.log('> Lambda function invoked!');
Run Code Online (Sandbox Code Playgroud)

从我的日志来看,Lambda函数不是每次调用,而只是有时调用.为什么我这么想?

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


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

Rre*_*Cat 0

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

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

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

行动清单

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

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