Amazon web services 无法在aws lambda中从aws s3执行getobject
我是aws lambda和aws-s3的新手。我正在尝试使用api网关、aws s3和aws lambda创建一个微服务。 我已经编写了lambda函数来从s3检索对象,但它发送null并且没有抛出任何错误。我不确定出了什么问题。 我已经设置了角色并授予了对s3的访问权,并将该角色用于lambdaAmazon 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) => {
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异步回调行为。