Node.js nodejs-尝试访问S3.getBucketLocation时aws lambda随机超时
对于以下代码,我被要求检查,它在Node.js nodejs-尝试访问S3.getBucketLocation时aws lambda随机超时,node.js,amazon-web-services,amazon-s3,lambda,Node.js,Amazon Web Services,Amazon S3,Lambda,对于以下代码,我被要求检查,它在AWS Lambda上运行,执行将文件上载到S3的简单任务,从AWS控制台手动运行时会随机超时,,但在按计划运行时,将始终在第一次尝试时超时,然后在第二次成功运行(第一次失败后立即运行)。调用s3.getBucketLocation后,代码似乎总是挂起,从未到达getBucketLocation的回调(第一次尝试时!) 所有VPC和NAT都已正确设置,这样,当我从代码中删除s3.getBucketLocation并调用s3Upload.upload(参数、cb)时
AWS Lambda
上运行,执行将文件上载到S3
的简单任务,从AWS控制台手动运行时会随机超时,
,但在按计划运行时,将始终在第一次尝试时超时,然后在第二次成功运行(第一次失败后立即运行)。
调用s3.getBucketLocation
后,代码似乎总是挂起,从未到达getBucketLocation
的回调(第一次尝试时!)
所有VPC
和NAT
都已正确设置,这样,当我从代码中删除s3.getBucketLocation
并调用s3Upload.upload(参数、cb)时代码>
直接运行时,代码不会超时
我很想理解为什么在尝试从AWSAWS
检索bucket区域时,第一个函数会失败
"use strict";
var urlHelper = require('url');
var fs = require('fs');
var AWS = require('aws-sdk');
var exp = {};
function saveToFile(path, content, cb) {
fs.writeFile(path, content, cb);
}
function saveToS3(bucket, key, content, cb) {
var s3 = new AWS.S3({apiVersion: '2006-03-01'});
var params = {
Bucket: bucket
};
s3.getBucketLocation(params, function(err, data) {
console.log('THIS IS NOT REACHED');
if (err) {
return cb(err);
}
var s3Upload = new AWS.S3({
apiVersion: '2006-03-01',
region: data.LocationConstraint
});
var params = {
Bucket: bucket,
Key: key,
Body: content,
ACL: 'public-read',
ContentType: 'text/xml',
CacheControl: 'max-age=60'
};
s3Upload.upload(params, cb);
});
}
exp.upload = function(path, content, cb) {
var url = urlHelper.parse(path);
switch(url.protocol) {
case 'file:':
case null:
saveToFile(path, content, cb);
break;
case 's3:':
saveToS3(url.host, url.pathname.substring(1), content, cb);
break;
default:
console.log('No matching protocol found for upload!');
cb(null, null);
}
};
module.exports = exp;
调用s3.getBucketLocation后,代码似乎总是挂起,从未到达它的回调。从未到达哪个回调?您没有在getBucketLocation回调中写入任何中间日志消息,因此我不确定您如何判断超时的位置。@Michael sqlbot我已编辑了我的问题以澄清您的疑问。当我说永不到达它的回调时,我指的是getBucketLocation,我想这是很清楚的,因为我在那句话中没有提到任何其他函数,我知道它挂起了,因为在要求人们花时间帮助我之前,我已经亲自测试了代码,看看它失败的地方(如我现在为您添加的日志)调用时,您允许函数在超时之前运行多长时间?如果您增加足够的时间,您应该会发现回调最终会触发,可能会出现一个有用的错误。我们最初将其设置为10秒。然后我尝试将其设置为30秒,但仍然没有错误消息。因为Lambda每次运行都会收费,所以我这样做了我真的不想将时间设置为其最大值。而且,执行这样一个简单的请求需要30秒以上也没有什么意义。我将尝试将超时限制提高到lambda允许的最大时间,看看会发生什么。我不是建议您将其设为高值,而是暂时将其调高,看看会发生什么。此外,添加日志在调用s3.getBucketLocation()之前的新行上的语句
,以验证在实际调用该函数之前没有经过异常的时间。调用s3.getBucketLocation后,代码似乎总是挂起,从未到达它的回调。从未到达哪个回调?您没有在getBucketLocation回调中写入任何中间日志消息,因此我不确定如何执行此操作Michael sqlbot我编辑了我的问题,以澄清您的疑问。当我说永不到达它的回调时,我指的是getBucketLocation,我认为这是清楚的,因为我在那句话中没有提到任何其他函数,我知道它挂起在那一点上,因为在要求人们花时间尝试帮助我,我已经亲自测试了代码,看看它失败的地方(通过添加日志,就像我现在为您做的那样)调用时,您允许函数在超时之前运行多长时间?如果您增加足够的时间,您应该会发现回调最终会触发,可能会出现一个有用的错误。我们最初将其设置为10秒。然后我尝试将其设置为30秒,但仍然没有错误消息。因为Lambda每次运行都会收费,所以我这样做了我真的不想将时间设置为其最大值。而且,执行这样一个简单的请求需要30秒以上也没有什么意义。我将尝试将超时限制提高到lambda允许的最大时间,看看会发生什么。我不是建议您将其设为高值,而是暂时将其调高,看看会发生什么。此外,添加日志在调用s3.getBucketLocation()
之前的新行上的语句,以验证在实际调用该函数之前没有经过异常的时间。