为什么从S3流创建的文件为空?

时间:2019-02-14 14:19:33

标签: node.js amazon-web-services amazon-s3 aws-lambda

我正在尝试通过Cognito识别的lambda函数访问私有S3存储桶中的文件。

  • 在lambda之外读取流是可行的,但在lambda之外不能读取
  • 创建预签名的网址可在lambda内实现
  • 等待内容作为字符串在lambda内正常工作

我设法获得了一个预签名的URL,以下载文件。使用相同的参数,我尝试将读取的流写入本地文件。文件已创建,但为空。在此过程中我找不到任何错误。

const s3 = new AWS.S3({ apiVersion: 'latest' });
const file = 's3Filename.csv'
const userId = event.requestContext.identity.cognitoIdentityId;
const s3Params = {
    Bucket: 'MY_BUCKET',
    Key: `private/${userId}/${file}`, 
};

var fileStream = require('fs').createWriteStream('/path/to/my/file.csv'); 
var s3Stream = s3.getObject(s3Params).createReadStream();

// Try to print s3 stream errors
s3Stream
.on('error', function (err) {
    console.error(err); // prints nothing
});

// Try to print fs errors
s3Stream
.pipe(fileStream)
.on('error', function (err) {
    console.error('File Stream:', err); // prints nothing
})
.on('data', function (chunk) {
    console.log(chunk); // prints nothing
})
.on('end', function () {
    console.log('All the data in the file has been read'); // prints nothing
})
.on('close', function (err) {
    console.log('Stream has been Closed'); // prints nothing
});

我非常有信心我的参数正确,因为我可以获得一个可以下载文件的预签名URL。

console.log(s3.getSignedUrl('getObject', s3Params));

我还可以使用getObject().promise()读取文件内容。这可能有效,但是我正在解析CSV文件,我宁愿在内存上轻松解析流。

try 
{
    const s3Response = await s3.getObject(s3Params).promise();
    let objectData = s3Response.Body.toString('utf-8'); 
    console.log(objectData);
}
catch (ex) 
{
    console.error(ex);
}

为什么从S3流创建的文件为空?为何没有打印内容?

可能是访问策略问题?如果是这种情况,为什么执行时没有出现任何错误?

0 个答案:

没有答案