我正在尝试在AWS Lambda中创建一个非常简单的“ hello world”。我尝试了一些仅调用AWS开发工具包的服务,只是尝试阅读。我的回调永远不会被调用。我必须丢失一些东西。任何帮助表示赞赏!
var AWS = require("aws-sdk");
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
var s3 = new AWS.S3(); // confirmed this is not null
s3.listBuckets({}, function(err, data) {
// never reaches here!
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
return response;
};
我确实创建了该Lambda使用的具有S3访问权限的角色。 :-)
答案 0 :(得分:1)
这是一个同步问题。
在调用回调之前,您的return response
代码已执行。
您必须将return语句放入回调中或使用async/await
返回您的回调:
var AWS = require("aws-sdk");
exports.handler = async (event) => {
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
var s3 = new AWS.S3();
s3.listBuckets({}, function (err, data) {
if (err) {
console.log(err, err.stack);
return {
statusCode: 500,
message: 'some error'
}
}
return response
});
}
使用异步/等待:
var AWS = require("aws-sdk");
exports.handler = async (event) => {
const response = {
statusCode: 200
};
var s3 = new AWS.S3();
await s3.listBuckets().promise();
return response;
}
我会使用async / await方法,因为它更干净,更易读。使用promise比使用回调还容易。
编辑:OP声称它不起作用。因此,我决定自己进行测试。上面的代码可以工作,只需要很小的更改即可将列出的存储桶添加到响应中。这是最终的代码:
var AWS = require("aws-sdk");
exports.handler = async (event) => {
const response = {
statusCode: 200
};
var s3 = new AWS.S3();
const buckets = await s3.listBuckets().promise();
response.body = JSON.stringify(buckets);
return response;
}
这是CloudWatch Logs中的输出:
答案 1 :(得分:1)
似乎,因为我选择了Node 8.x运行时,所以我需要使用其中一种异步构造。这行得通...
let AWS = require('aws-sdk');
let s3 = new AWS.S3();
exports.handler = async (event) => {
return await s3.listBuckets().promise() ;
};