【问题标题】:Can you publish a message to an SNS topic using an AWS Lambda function backed by node.js?您可以使用由 node.js 支持的 AWS Lambda 函数将消息发布到 SNS 主题吗?
【发布时间】:2015-07-17 21:18:17
【问题描述】:

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

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-sns


    【解决方案1】:

    是的,您可以编写一个发布到 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 消息。您可以查看通过 Lambda 控制台上的创建 Lambda 函数按钮提供的 sns-message 函数蓝图。

    【讨论】:

    • 我正在使用 Python,我正在尝试向 TargetArn 发送通知,但是,我收到一个异常,即 Lambda 函数没有调用 SNS 通知的权限。这只能通过TopicArn 实现吗?还是我们可以使用 AWS LAmbda 向各个端点发送通知?
    • 我没有尝试过,但我相信如果你有来自create_platform_endpoint() 的 EndpointArn,你可以发送到特定的端点,然后调用 publish() 在 TopicArn 字段中传递 EndpointArn。
    • 感谢回复,我有端点 ARN,但是我的 lambda 函数没有访问 SNS 的权限,然后我发现我所要做的就是在 lambda 函数的如@kixorz答案的前半部分所述,使用亚马逊的IAM角色。然后效果很好。
    • @James 是否可以从节点 js 读取和更新现有主题的消息数据??
    • @redblood,SNS 主题本身是只写的。但是您可以订阅一个 Lambda 函数来监听该主题,然后处理发送给它的消息。我建议不要使用同一个 Lambda 函数来编写和订阅一个主题,以免出现死循环。
    【解决方案2】:

    首先,您需要使用正确的IAM policy 授予您的Lambda IAM role 发布到您的SNS topic 的权限。

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

    然后您可以使用以下代码将SNS publish 从您的其他LambdaNode.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:Subscribe”?
    • 好吧,我不喜欢太多的限制。这允许我对发布者和订阅者使用相同的策略。在这种特殊情况下,您只需 sns:Publish 就可以了。
    • 需要将 .done 切换到 .succeed 但对我有用
    • 很高兴你提到了政策的必要性,我想知道我做错了什么。
    【解决方案3】:

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

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

    (已回复here

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2021-02-15
      • 2020-07-08
      • 2019-11-05
      • 2017-02-22
      • 2016-03-05
      相关资源
      最近更新 更多