Lambda SDK 调用无响应
Lambda SDK Calls No Response
我正在尝试在 AWS Lambda 中做一个非常简单的 "hello world"。我尝试了一些只调用 AWS SDK 的服务,只是尝试阅读。我的回调永远不会被调用。我必须错过一些东西。任何帮助表示赞赏!
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 访问权限的角色。 :-)
这是一个同步问题。
您的 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
});
}
使用async/await:
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 中的输出:
似乎因为我选择了 Node 8.x 运行时,所以我需要使用其中一种异步构造。这有效...
let AWS = require('aws-sdk');
let s3 = new AWS.S3();
exports.handler = async (event) => {
return await s3.listBuckets().promise() ;
};
我正在尝试在 AWS Lambda 中做一个非常简单的 "hello world"。我尝试了一些只调用 AWS SDK 的服务,只是尝试阅读。我的回调永远不会被调用。我必须错过一些东西。任何帮助表示赞赏!
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 访问权限的角色。 :-)
这是一个同步问题。
您的 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
});
}
使用async/await:
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 中的输出:
似乎因为我选择了 Node 8.x 运行时,所以我需要使用其中一种异步构造。这有效...
let AWS = require('aws-sdk');
let s3 = new AWS.S3();
exports.handler = async (event) => {
return await s3.listBuckets().promise() ;
};