如何确认订阅并在HTTP端点获取SNS通知?

时间:2016-04-30 17:45:00

标签: node.js amazon-web-services amazon-sns amazon-elastic-beanstalk

我使用Amazon Elastic Beanstalk运行nodejs网页。我只想从AWS SNS向此网页发送通知并实时捕获它们。因此,当我发布到HTTP端点时,没有任何反应,我也不知道如何获取通知。

作为Http端点,我设置了我的AWS Elastic-Beanstalk http地址。

我正在阅读亚马逊文档,但我无法找到如何在http端点上捕获一次sns消息。

请,任何帮助将非常感谢。感谢。

4 个答案:

答案 0 :(得分:1)

您提供HTTP / HTTPS端点并从aws控制台创建订阅的那一刻,会发生的事情是,Amazon向该端点发送订阅消息。现在这是一个休息调用,您的应用程序必须有一个此端点的处理程序,否则您将错过捕获此订阅消息。传递处理程序的httpRequest对象需要访问它的SNSMsgTypeHdr头字段。该值为“SubscriptionConfirmation”。您需要先捕获此特定消息,然后获取订阅URL。您可以在应用程序本身中处理它,也可以将其打印出来,然后手动访问该URL以进行订阅。理想情况下,我建议您使用您的邮件ID同时订阅相同的主题,以便每当您的应用程序获得推送的邮件时,您的邮件ID也会收到邮件(虽然令牌会有所不同),但至少您会确保消息已被推送到您的终端。您需要做的就是继续使用您的应用程序,根据您的要求处理该端点上的消息。

答案 1 :(得分:1)

尝试一下:

    const express = require('express');
    const router = express.Router();
    const request = require('request');
    var bodyParser = require('body-parser')


    router.post('/',bodyParser.text(),handleSNSMessage);
    module.exports = router;


    var handleSubscriptionResponse = function (error, response) {
        if (!error && response.statusCode == 200) {
            console.log('Yess! We have accepted the confirmation from AWS');
        }
        else {
            throw new Error(`Unable to subscribe to given URL`);
            //console.error(error)
        }
    }
    async function handleSNSMessage(req, resp, next) {

        try {
            let payloadStr = req.body
            payload = JSON.parse(payloadStr)
            console.log(JSON.stringify(payload))
            if (req.header('x-amz-sns-message-type') === 'SubscriptionConfirmation') {
                const url = payload.SubscribeURL;
                await request(url, handleSubscriptionResponse)
            } else if (req.header('x-amz-sns-message-type') === 'Notification') {
                console.log(payload)
                //process data here
            } else {
                throw new Error(`Invalid message type ${payload.Type}`);
            }
        } catch (err) {
            console.error(err)
            resp.status(500).send('Oops')
        }
        resp.send('Ok')
    }

注意:我没有使用app.use,因为这会影响所有其他端点。

答案 2 :(得分:0)

SNS有3种类型的消息。订阅,取消订阅和通知。在正确处理订阅消息之前,您不会收到任何通知消息。这涉及在收到订阅请求时向AWS发出API请求。

此案例中的电话是ConfirmSubscription:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SNS.html#confirmSubscription-property

一旦你这样做,那么你将开始接收通知消息,你可以在代码允许的情况下处理这些消息。

答案 3 :(得分:0)

订阅终端后,Amazon SNS将向终端发送订阅确认消息。 您应该在端点处拥有从订阅确认邮件中检索 SubscribeURL 值的代码,并访问 SubscribeURL 指定的位置或将其提供给您,以便您可以例如,使用网络浏览器手动访问 SubscribeURL

在确认订阅之前,Amazon SNS不会向端点发送消息。

您可以使用Amazon SNS控制台验证订阅是否已确认:订阅ID将显示订阅的ARN,而不是您第一次添加订阅时看到的 PendingConfirmation 值。