【发布时间】:2020-11-19 21:10:29
【问题描述】:
AWS lambda 函数有时会在连接 S3 SDK 时超时,没有任何错误消息。
- 当尝试 S3.getObject() 时,Lambda 函数停止直到超时,没有任何错误消息。
- 只是有时,即使我使用相同的参数、相同的代码,也会发生这种情况。
- 我已经使用了 try catch 代码。如果有问题,代码会产生错误消息,但是,它不是。
关键是 lambda 函数“有时”会产生问题。 通常,它运作良好。但是,它突然停止了。
请帮我解决这个问题
2020-07-30T16:45:22.003+09:00
START RequestId: 2c1dcd43-41f6-5d95-a862-9adf3d267ecf Version: $LATEST
2020-07-30T16:45:22.009+09:00
2020-07-30T07:45:22.009Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO fileKeys : [ '701bcf80-ed63-46d4-9524-d38a14a74fe0.dwg' ]
2020-07-30T16:45:22.009+09:00
2020-07-30T07:45:22.009Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO getObject drawingFile 701bcf80-ed63-46d4-9524-d38a14a74fe0.dwg
2020-07-30T16:45:22.019+09:00
2020-07-30T07:45:22.018Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO before getObject
2020-07-30T16:45:22.020+09:00
2020-07-30T07:45:22.020Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO before createReadStream
2020-07-30T16:45:22.021+09:00
2020-07-30T07:45:22.021Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO before pipe
2020-07-30T16:45:52.032+09:00
END RequestId: 2c1dcd43-41f6-5d95-a862-9adf3d267ecf
2020-07-30T16:45:52.032+09:00
REPORT RequestId: 2c1dcd43-41f6-5d95-a862-9adf3d267ecf Duration: 30027.38 ms Billed Duration: 30000 ms Memory Size: 3008 MB Max Memory Used: 31 MB
2020-07-30T16:45:52.032+09:00
2020-07-30T07:45:52.032Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf Task timed out after 30.03 seconds
这里是代码
exports.getObject = async (type, fileKey) => {
try {
const config = env[type]();
const s3 = new AWS.S3();
return new Promise((resolve, reject) => {
const fileName = `/tmp/${fileKey}`;
const fileStream = fs.createWriteStream(fileName, 'binary');
const s3Stream = s3
.getObject({
Bucket: config.origin,
Key: fileKey,
})
.createReadStream();
s3Stream
.on('error', function (err) {
console.error('s3Stream : ', err);
fileStream.end();
reject(err);
})
.on('data', (data) => {
// console.log('data stream...');
})
.on('end', () => {
console.log('s3Stream read end');
});
fileStream
.on('error', function (err) {
console.error('fileStream : ', err);
fileStream.end();
reject(err);
})
.on('close', function () {
console.log('fileStream Done.');
resolve('success');
});
s3Stream.pipe(fileStream)
.on('error', function (err) {
console.error('File Stream:', err);
reject(err);
})
.on('close', function () {
console.log('Pipe Done.');
});;
});
} catch (error) {
throw (error);
}
};
【问题讨论】:
-
能否请您将错误和代码作为文本而不是屏幕截图?
-
Lambda 函数是否连接到 VPC?如果是这样,为什么会做出这个决定?此外,如果它连接到 VPC,Lambda 函数是连接到多个子网,还是只连接一个?这些子网是“私有子网”、“公共子网”还是两者的混合?
-
@Marcin 我刚刚添加了它们
-
@JohnRotenstein 是的 Lambda 连接到 VPC 和 4 个子网和混合。
-
所以 lambda 函数只是有时不起作用? VPC 中的 lambda 没有互联网连接。你如何使它有时工作,或不工作?
标签: javascript node.js amazon-web-services amazon-s3 aws-lambda