您是否可以使用由node.js支持的AWS Lambda函数将消息发布到SNS主题?


Answers:


121

是的,您可以编写发布到SNS主题的Lambda函数。在Lambda中运行的代码可以访问完整的适用于JavaJavascript的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消息。您可能会看一下sns-message通过Lambda控制台上的“创建Lambda函数”按钮提供的函数蓝图。


我正在使用Python,并且尝试向发送通知TargetArn,但是,我遇到了一个例外,即Lambda函数没有调用SNS通知的权限。这仅在TopicArn使用AWS LAmbda或将通知发送到个人终端时才可行吗?
Parthapratim Neog '16

我还没有尝试过,但是我相信如果您具有create_platform_endpoint()中的EndpointArn ,则可以发送到特定的端点,然后调用publish(),并在TopicArn字段中传递EndpointArn。
詹姆斯

感谢您的答复,我拥有端点ARN,但是我的lambda函数没有访问SNS的权限,于是我发现,我要做的就是给他访问使用Lambda函数角色的权限,如上所述。 @kixorz答案的前半部分。然后工作正常。
Parthapratim Neog '16

@James可以从节点js中读取和更新现有主题的消息数据吗?
redblood's

@ redblood,SNS主题本身是只写的。但是您可以订阅Lambda函数以侦听该主题,然后处理发送给该主题的消息。我建议不要使用相同的Lambda函数来编写和订阅主题,因为这会导致无限循环。
詹姆斯

55

首先,您需要使用适当的Lambda IAM role权限授予发布到您的权限。SNS topicIAM policy

{
    "Action" : [
        "sns:Publish",
        "sns:Subscribe"
    ],
    "Effect" : "Allow",
    "Resource" : [
        { "Ref" : "<your SNS topic ARN>" }
    ]
}

然后你可以使用下面的代码SNS publish到您SNS topic从您的其他LambdaNode.js代码。

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);
    }
});

4
为什么您认为自己需要“ sns:Subscribe”?
Cristian Măgherușan-Stanciu

好吧,我不喜欢太多限制。这使我可以对发布者和订阅者使用相同的策略。在这种情况下,您只需使用just即可sns:Publish
kixorz

1
需要切换.done.succeed,但为我工作
亚历克斯·摩尔-涅米

1
提到政策的必要性真是太好了,我想知道自己做错了什么。
纳吉布·伊哈卜

0

要将SNS响应发送到lambda,请使用以下命令:

await sns.publish({
    Message: snsPayload,
    MessageStructure: 'json',
    TargetArn: endPointArn}).promise()

在这里回答)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.