AWS Lambda函数总是返回null(Node/Javascript)



我有一个简单的Lambda函数,它应该获取事件数据并向SNS主题发送消息。

运行时为Node.js 8.10。

这是我的完整Lambda代码:

const AWS = require("aws-sdk");
exports.handler = async (event) => {
const sns = new AWS.SNS();
const emailBody = 
`
New Message
From: ${event.name}
Contact: ${event.contact}
Message: ${event.message}
`;
const snsMessageParams = {
TopicArn: process.env.snsTopicArn,
Message: emailBody
};
sns.publish(snsMessageParams, (err, data) => {
if(err) {
return err;
} else {
return data;
}
});
};

每次运行函数时,我总是得到null作为响应。没有返回错误,但我的电子邮件中从未收到来自SNS的消息,所以这里有问题。我就是搞不明白是什么。

我能够从SNS控制台和本地计算机上的Node SDK成功地将消息发布到我的SNS主题。这些工作非常完美。我已经通过直接从我成功的本地代码和SNS控制台复制和粘贴来检查我的env变量中的snsTopicArn是否正确。

我在Lambda函数上有一个执行角色,它应该允许我向SNS发布我帐户中的任何主题。在为Lambda配置角色时,我选择了默认的"SNSPublish"选项,只是为了测试所有内容。但作为参考,以下是我的执行角色的策略:

{
"roleName": <MyRoleName>,
"policies": [
{
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:*:*:*"
}
]
}
...
}

这里出了什么问题?任何帮助我们都将不胜感激。

好的,所以我想明白了。

有两个问题。首先,我没有使用Lambda为Node隐式使用的"callback"参数。第二个原因是,该函数默认情况下是异步的,因此它期望稍后某个时间出现"等待"。我决定去掉"async",让它同步运行,因为它只是一个简单的函数,根本不需要它。

这是我更新的工作代码:

const AWS = require("aws-sdk");
const sns = new AWS.SNS();
exports.handler = (event, context, callback) => {
const emailBody = 
`
Message
From: ${event.name}
Contact: ${event.contact}
Message: ${event.message}
`;
const snsMessageParams = {
TopicArn: process.env.snsTopicArn,
Message: emailBody
};
sns.publish(snsMessageParams, (err, data) => {
if(err) {
return err;
} else {
callback(null, JSON.stringify(data));
}
});
};

在我的例子中,我只是试图执行基本的helloWorld处理程序。

exports.helloWorld = (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
return {
statusCode: 200,
body: 'Hello World'
}
}

我尝试使用上面的函数,但得到的响应是nullconsole.log运行良好。但在将async添加到函数后,显示出适当的响应。

exports.helloWorld = async (event, context) => {

最新更新