我正在尝试通过Cognito识别的lambda函数访问私有S3存储桶中的文件。
我设法获得了一个预签名的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流创建的文件为空?为何没有打印内容?
可能是访问策略问题?如果是这种情况,为什么执行时没有出现任何错误?