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

91

您能使用由Node.js支持的AWS Lambda函数向SNS主题发布消息吗?

3个回答

147

是的,您可以编写一个Lambda函数来发布到SNS主题。运行在Lambda中的代码可以访问JavaJavascript的完整AWS SDK,取决于您的函数使用哪种语言。您只需要确保授予执行函数的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控制台上提供的sns-message函数蓝图,通过创建Lambda函数按钮访问该蓝图。


我正在使用Python,尝试向TargetArn发送通知,但是出现了异常,Lambda函数没有调用SNS通知的权限。这只能通过TopicArn实现吗?还是我们可以使用AWS Lambda向单个端点发送通知? - Parthapratim Neog
我没有尝试过,但我相信如果你有来自create_platform_endpoint()的EndpointArn,那么你可以发送到特定的端点,然后在TopicArn字段中传递EndpointArn调用publish() - James
1
感谢您的回复,我有端点ARN,但我的Lambda函数没有访问SNS的权限,后来我发现我只需要在Lambda函数的角色中使用Amazon的IAM授予它访问权限,就像@kixorz答案的前半部分所提到的那样。然后它就正常工作了。 - Parthapratim Neog
@James 从 Node.js 中读取和更新现有主题消息数据是否可能? - redblood
@redblood,SNS主题本身是只写的。但是你可以订阅一个Lambda函数来监听该主题,然后处理发送到它的消息。我建议不要使用同一个Lambda函数来同时写入和订阅主题,以免出现无限循环的情况。 - James

65

首先,您需要授予您的Lambda IAM角色发布到您的SNS主题的权限,使用适当的IAM策略

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

接下来,您可以使用以下代码从其他 LambdaNode.js 代码向您的 SNS 主题 发布 SNS 消息

然后您可以使用以下代码,从其他Lambda或Node.js代码向您的SNS主题发布SNS消息。
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);
    }
});

6
为什么您认为在您的角色中需要“sns:Subscribe”? - Cristian Măgherușan-Stanciu
1
好的,我不喜欢太多的限制。这样我就可以为发布者和订阅者使用相同的策略。在这种情况下,您只需要使用sns:Publish就可以了。 - adamkonrad
1
需要将.done切换为.succeed,但对我起作用了。 - Alex Moore-Niemi
2
谢谢你提到需要一个政策,我一直在想我做错了什么。 - Naguib Ihab
1
如果您想允许帐户中的任何资源使用该策略,请修改资源以只包含 "Resource": "arn:aws:sns:*:your-account-id:*"。请注意提及政策,加1分。 - Metro Smurf
显示剩余2条评论

2
使用以下代码将 SNS 响应发送到 Lambda:

```

```

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

(已在此处回答)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接