【发布时间】:2018-12-29 18:48:21
【问题描述】:
我有一个简单的 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:*:*:*"
}
]
}
...
}
这里出了什么问题?任何帮助都非常感谢。
【问题讨论】:
-
几件事:1. 不确定资源部分中的 ::* 会做什么。我会将其更改为 "Resource": "*" 开始,然后在您开始工作后将 sns arn 放入其中。 2. 设置您的 lambda 以写入 cloudwatch(LambdaFullAccess 或等效项),然后在其中放置一些写入行,例如验证 env 变量是否被正确读取等。我将从这两个步骤开始。
-
@Zaxxon 感谢您的建议,尽管我无需这样做就能解决它
标签: node.js amazon-web-services aws-lambda amazon-sns serverless