如何在不占用Lambda内存的情况下将大文件从S3上传到服务器?

时间:2019-05-28 15:57:24

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

我正在开发看起来像这样的管道-

(NodeJS)文件上传-> S3-> Lambda(用nodejs编写,从file:created事件触发)-> Java Server(使用CXF / JAX-RS)。希望Lambda可以避免在将大文件转发到我的Java服务器之前将其加载到内存中。在联系Java服务器之前,我还需要与S3文件关联的元数据(因此,我不能只转发流,还需要签出关联的元数据,然后再转发文件内容)。

我一直在阅读AWS文档(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property),这使我相信s3.getObject()。createReadStream()可能是我最好的选择,用于加载文件内容而不加载整个一次归档。我注意到可以对createReadStream()进行管道传输,但是在将管道作为分段上传的一部分进行工作时,我没有取得任何成功(我认为我需要这样做)。看起来pipe()可能仅适用于可写文件流。

var requestToJavaService = https.request(options, res => {
    console.log('Service Response statusCode:', res.statusCode);
    console.log('Service Response headers:', res.headers);

    res.setEncoding('utf8');
    res.on('data', chunk => {
      console.log('Service Response: ' + chunk);
    });
    res.on('end', () => {
      console.log('Connection to Service closed');
    });
    res.on('error', e => {
      callback(new Error(e));
      console.log('Encountered an error while attempting to connect     to Service: ' + e.message);
    });
  });

s3.getObject({ Bucket: srcBucket, Key: srcKey })
    .createReadStream()
    .on('error', function(err) {
      console.log('encountered error from s3 read: ' + err);
    })
    .pipe(
      requestToJavaService,
      { end: true }
    )

我不喜欢在这里提出的任何想法,因此,我们将不胜感激任何其他投入/建议。

0 个答案:

没有答案