【发布时间】:2015-07-17 21:18:17
【问题描述】:
您能否使用由 node.js 支持的 AWS Lambda 函数将消息发布到 SNS 主题?
【问题讨论】:
标签: amazon-web-services aws-lambda amazon-sns
您能否使用由 node.js 支持的 AWS Lambda 函数将消息发布到 SNS 主题?
【问题讨论】:
标签: amazon-web-services aws-lambda amazon-sns
是的,您可以编写一个发布到 SNS 主题的 Lambda 函数。在 Lambda 中运行的代码可以访问适用于 Java 或 Javascript 的完整 AWS 开发工具包,无论您使用的是哪个函数。您只需确保授予执行函数访问权限的 IAM 角色以发布到您的主题。在 JavaScript 中:
console.log("Loading function");
var AWS = require("aws-sdk");
exports.handler = function(event, context) {
var eventText = JSON.stringify(event, null, 2);
console.log("Received event:", eventText);
var sns = new AWS.SNS();
var params = {
Message: eventText,
Subject: "Test SNS From Lambda",
TopicArn: "arn:aws:sns:us-west-2:123456789012:test-topic1"
};
sns.publish(params, context.done);
};
还可以使用 Lambda 函数处理 SNS 消息。您可以查看通过 Lambda 控制台上的创建 Lambda 函数按钮提供的 sns-message 函数蓝图。
【讨论】:
TargetArn 发送通知,但是,我收到一个异常,即 Lambda 函数没有调用 SNS 通知的权限。这只能通过TopicArn 实现吗?还是我们可以使用 AWS LAmbda 向各个端点发送通知?
首先,您需要使用正确的IAM policy 授予您的Lambda IAM role 发布到您的SNS topic 的权限。
{
"Action" : [
"sns:Publish",
"sns:Subscribe"
],
"Effect" : "Allow",
"Resource" : [
{ "Ref" : "<your SNS topic ARN>" }
]
}
然后您可以使用以下代码将SNS publish 从您的其他Lambda 或Node.js 代码转换为您的SNS topic。
var message = {};
var sns = new AWS.SNS();
sns.publish({
TopicArn: "<your SNS topic ARN>",
Message: JSON.stringify(message)
}, function(err, data) {
if(err) {
console.error('error publishing to SNS');
context.fail(err);
} else {
console.info('message published to SNS');
context.succeed(null, data);
}
});
【讨论】:
sns:Publish 就可以了。
.done 切换到 .succeed 但对我有用
要将 SNS 响应发送到 lambda,请使用以下命令:
await sns.publish({
Message: snsPayload,
MessageStructure: 'json',
TargetArn: endPointArn}).promise()
(已回复here)
【讨论】: