我有一个简单的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:*:*:*"
}
]
}
...
}
这是怎么回事?任何帮助都非常感谢。
答案 0 :(得分:5)
好,所以我知道了。
有两个问题。首先是我没有使用Lambda隐式使用Node的“ callback”参数。第二个是默认情况下该函数是异步的,因此它期望稍后某个地方“等待”。我决定只删除“异步”并使其同步运行,因为它只是一个简单的函数,反正不需要它。
这是我更新的工作代码:
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));
}
});
};