Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 无法在aws lambda中从aws s3执行getobject_Amazon Web Services_Amazon S3_Aws Lambda_Aws Api Gateway - Fatal编程技术网

Amazon web services 无法在aws lambda中从aws s3执行getobject

Amazon web services 无法在aws lambda中从aws s3执行getobject,amazon-web-services,amazon-s3,aws-lambda,aws-api-gateway,Amazon Web Services,Amazon S3,Aws Lambda,Aws Api Gateway,我是aws lambda和aws-s3的新手。我正在尝试使用api网关、aws s3和aws lambda创建一个微服务。 我已经编写了lambda函数来从s3检索对象,但它发送null并且没有抛出任何错误。我不确定出了什么问题。 我已经设置了角色并授予了对s3的访问权,并将该角色用于lambda const AWS = require('aws-sdk'); var s3 = new AWS.S3(); exports.handler = async (event) => {

我是aws lambda和aws-s3的新手。我正在尝试使用api网关、aws s3和aws lambda创建一个微服务。 我已经编写了lambda函数来从s3检索对象,但它发送null并且没有抛出任何错误。我不确定出了什么问题。 我已经设置了角色并授予了对s3的访问权,并将该角色用于lambda

const AWS = require('aws-sdk'); 
var s3 = new AWS.S3();
exports.handler = async (event) => {
    var params = {
      "Bucket": "bucketname",
      "Key": "keyname"
        };

    s3.getObject(params, function(err, data){
      if(err) {
          return "error while fetching data";
      } else {
          return data;
      }

    });
};

我做错了什么?

您应该以API网关代理所需的正确响应格式返回数据,并使用回调参数进行回复,因此将函数更改为如下所示:

const AWS = require('aws-sdk'); 
var s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {
    var params = {
        "Bucket": "bucketname",
        "Key": "keyname"
    };

    s3.getObject(params, function(err, data){
        if(err) {
            return callback(new Error("error while fetching data"));
        } else {
            let response = {
                statusCode: 200,
                headers: {
                    "x-custom-header" : "my custom header value"
                },
                body: JSON.stringify(data)
            };
            return callback(null, response);
        }
    });
};

如果您没有使用API网关代理Lambda集成,那么您可以简单地将响应更改为只返回callbacknull,data

您应该尝试在其中添加一些调试语句,这将帮助您理解它在哪里中断。实际上是无法从S3获取文件,还是无法响应或介于两者之间?这不是返回文件内容的好方法。首先,API网关的有效负载大小限制为10MB。您还代理文件下载,这并不理想。更好的解决方案是将预签名的URL返回给客户端,然后让客户端直接从S3获取对象。至于代码中的问题,您的“return data”语句没有执行您认为它正在执行的操作,它没有从导出的处理函数返回。该return语句在getObject回调函数的作用域内,因此它是从该作用域内返回的。这是基本的JavaScript异步回调行为。