【问题标题】:AWS Lambda return a fileAWS Lambda 返回一个文件
【发布时间】:2019-02-12 00:35:12
【问题描述】:

我正在使用 Lambda 从 S3 读取一个 CSV 文件,并希望将该文件返回给 lambda 函数的调用者。我不想通过outputstream 打印文件 - 我想返回实际文件。有没有办法做到这一点?我得到这样的 S3 文件:

override def handleRequest(inputStream: InputStream,
                             outputStream: OutputStream,
                             context: Context): Unit = {
    ...
    val s3File = s3Client.getObject(bucketName, bucketKey)
}

如何返回实际文件(而不是将其转换为字符串并通过outputStream 打印)?

【问题讨论】:

  • 你不能那样做。您的 file 句柄仅在您的 lambda 函数的上下文中有意义,在它之外没有任何意义。
  • “实际文件”是什么意思?谁将调用 lambda 以及如何处理 "file"? - 我相信您对 java.io.File 的含义、S3 的含义和工作原理以及网络的工作原理有很大的误解。
  • Lambda 函数是如何被调用的?
  • 如果你有api网关+lambda设置,那么可以按照here描述的方式实现
  • 它正在通过 API 网关调用。 @Rishikesh Darandale 该链接显示了 API 网关方面,但是 lambda 函数需要哪些代码才能实际返回它?

标签: scala amazon-web-services amazon-s3 aws-lambda aws-java-sdk


【解决方案1】:

以上可以使用nodejs aws lambda 和express 服务器来完成。您可以使用提供的 aws package

// lambda.js
'use strict'
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app')
const server = awsServerlessExpress.createServer(app)

exports.handler = (event, context) => { awsServerlessExpress.proxy(server, event, context) }


// app.js
// refer the examples for complete code
// https://github.com/awslabs/aws-serverless-express/blob/master/examples/basic-starter/app.js
...
router.get('/download', (req, res) => {
  s3.getObject({Bucket: myBucket, Key: myFile},function(err,data){

    if (err) {
      // report error and return the server error
      return res.status(500).send("Error!");
    }

    // set the http Headers
    res.set("Content-Length",data.ContentLength)
       .set("Content-Type",data.ContentType);

    // send the data
    res.send(data.Body);

  });

});
...

PS:上面的代码我没有测试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2019-05-03
    • 2021-08-22
    • 2021-07-29
    相关资源
    最近更新 更多