我的 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。
我不明白为什么我的 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。