我的 Lambda 在 S3 上传时超时

My Lambda is timeout with my S3 upload

我不明白为什么我的 Lambda 不适用于我的 csv 上传。

var AWS = require('aws-sdk');
var mysql = require('mysql');
var json2csv = require('json2csv');

exports.handler = function (event, context) {

    AWS.config = {
        region: 'us-east-1',
        apiVersions : {
            s3: '2006-03-01'
        }
    };

    var s3 = new AWS.S3({signatureVersion: 'v4'});
    var bucket = 'search-dev'; 

    if(event.debug == true)
    {
        var connection = mysql.createConnection({
                            host     : event.database.host,
                            user     : event.database.user,
                            password : event.database.pwd,
                            database : event.database.name
                        });
    }

    connection.connect(function(err) {
        if (err) {
            console.error('error connecting: ' + err.stack);
            context.fail(err);
        }
    });

    mysqlData();

    connection.end();

    function mysqlData () {
        connection.query('SELECT id, keywords, result_count FROM keyword WHERE result_count != ""', function (err, results, fields) {
            if (err) {
                console.error('error connecting: ' + err.stack);
                context.fail(err);
            }

            console.log(results.length + " trouvés");

            var csvFields = [];
            for (var i in fields) {
                csvFields.push(fields[i].name);
            }

            var csv = json2csv({ data: results, fields: csvFields });

            writeInFile(csv);
        });
    }

    function writeInFile(dataCsv)
    {
        filename = generateFilename();
        var params = {
            ACL: 'public-read',
            Bucket: bucket,
            Key: filename+'.csv',
            Body: dataCsv
        };
        s3.upload(params, function (err, data) {
            if (err) {
                console.error(err, err.stack); // an error occurred
                context.fail(err);
            }

            context.succeed({url: data.Location});
        });

    }

    function generateFilename() 
    {
        var date = new Date();

        var filename = date.getDate()+'-'+date.getMonth()+'-'+date.getFullYear()+'_'+date.getHours()+':'+date.getMinutes()+':'+date.getSeconds();

        return filename;
    }

};

在其他 lambda 函数上,没有问题,但在这里,它总是超时 s3.upload 我的 Lambda 在 IAM 中有 S3FullAccess。

此代码在本地完美运行。

其他问题是我创建了一个新存储桶,但也无法在本地上传 [NoSuchBucket: The specified bucket does not exist] 我不明白,因为我创建了其他存储桶,上传到它不是问题。

谢谢

我猜您已将 Lambda 函数放置在您的 VPC 中。一旦将 Lambda 函数置于 VPC 内,它就只能访问 VPC 内的资源。要让您的 Lambda 函数访问 VPC 外部的 AWS 资源以及访问 Internet,您需要 add a NAT Gateway 到您的 VPC。

由于您只是尝试访问 S3,因此还有第二个选项 adding a S3 endpoint to your VPC