amazon-web-services - S3 事件触发器是否可扩展?

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

将大约 3K 个对象(文件)加载到 S3。有一个事件会触发加载到该 S3 存储桶的每个文件。

Lambda 仅接收大约 300 个对象的事件触发器。如果我重试(从 S3 移回并将其放回 S3),它会为另外 400 个对象生成事件,其余事件甚至没有到达 lambda。

我在这里缺少什么,我如何为创建的任意数量的对象进行缩放?

var async = require('async');                                                                                                                                                                                
var aws = require('aws-sdk');                                                                                                                                                                                
var s3 = new aws.S3();                                                                                                                                                                                       
var kinesis = new aws.Kinesis();                                                                                                                                                                             
var sns = new aws.SNS();                                                                                                                                                                                     
var config = require('./config.js');                                                                                                                                                                         


var logError = function(errormsg) {                                                                                                                                                                          
    sns.publish({                                                                                                                                                                                            
        TopicArn: config.TopicArn,                                                                                                                                                                           
        Message: errormsg                                                                                                                                                                                    
    }, function(err, data) {                                                                                                                                                                                 
        if (err) {                                                                                                                                                                                           
            console.log(errormsg);                                                                                                                                                                           
        }                                                                                                                                                                                                    
    });                                                                                                                                                                                                      
};                                                                                                                                                                                                           


exports.handler = function(event, context, callback) {                                                                                                                                                       

    var readS3andSendtoKinesis = function(record, index, cb) {                                                                                                                                               
        var params = {                                                                                                                                                                                       
            Bucket: record.s3.bucket.name,                                                                                                                                                                   
            Key: record.s3.object.key                                                                                                                                                                        
        }; 
        console.log('Received File: ' +  record.s3.object.key);                                                                                                                                                                                                 
        s3.getObject(params, function(err, data) {                                                                                                                                                           
            if (!err) {                                                                                                                                                                                      
                var kinesisParams = {                                                                                                                                                                        
                    Data: data.Body.toString('utf8'),                                                                                                                                                        
                    PartitionKey: config.PartitionKey,                                                                                                                                                       
                    StreamName: config.StreamName                                                                                                                                                            
                };                                                                                                                                                                                           
                kinesis.putRecord(kinesisParams, function(err, data) {                                                                                                                                       
                    if (err) {                                                                                                                                                                               
                        // Handle Kinesis Failures                                                                                                                                                           
                        logError(JSON.stringify(err, null, 2));                                                                                                                                              
                    }                                                                                                                                                                                        
                    cb(null, 'done');                                                                                                                                                                        
                });                                                                                                                                                                                          
            } else {                                                                                                                                                                                         
                // Handle S3 Failures                                                                                                                                                                        
                logError(JSON.stringify(err, null, 2));                                                                                                                                                      
                cb(null, 'done');                                                                                                                                                                            
            }                                                                                                                                                                                                
        });                                                                                                                                                                                                  
    };                                                                                                                                                                                                       

    async.eachOfLimit(event.Records, 1, readS3andSendtoKinesis, function(err) {                                                                                                                              
        callback(null, 'Done');                                                                                                                                                                              
    });                                                                                                                                                                                                      
}; 

既然大家都推荐看cloudwatch,这里分享一下相关lambda的cloudwatch指标,

enter image description here

最佳答案

我们发现根本原因似乎在资源的另一端失败。 S3 触发器发生并且无法扩展到它收到的巨大触发器。

要解决,

Return the S3 Lambda Trigger as quickly as possible, delaying will cause issues.



如果您花太多时间处理触发器内部的业务逻辑,在我们的例子中,我们从 S3 读取并写入流。相反,我们只是在接收端写入 S3 的位置并从 S3 读取。

希望能帮助到你。

关于amazon-web-services - S3 事件触发器是否可扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47146314/

相关文章:

sharepoint - 将 SharePoint 连接到数据库即服务,例如 AWS RDS 或 Azure SQL 数据库

node.js - 无法确认 AWS Sns 订阅 NodeJS 中的 http 端点

java - 无法解释的 AmazonS3Client getObject() 403 AccessDenied 异常

ruby-on-rails - Rails 错误 - 无法加载此类文件 - aws-sdk(您可能需要安装 aws-sdk gem)

javascript - Lambda 本地和 HTTP 调用

java - 使用 AWS S3 SDK 在 S3 和我的数据中心之间传输数据是否安全?

python - Lambda 调用 Lambda - 如何在第二个中访问有效负载?

jenkins - 在 AWS ECS 上挂载 S3 存储桶

aws-lambda - 从 Visual Studio Team Services 部署到 AWS Lambda,找不到 Dotnet Lamba

amazon-web-services - 如何从aws中的lambda函数调用对网络负载均衡器(nlb)vpc端点的请求