我使用Amazon Elastic Beanstalk运行nodejs网页。我只想从AWS SNS向此网页发送通知并实时捕获它们。因此,当我发布到HTTP端点时,没有任何反应,我也不知道如何获取通知。
作为Http端点,我设置了我的AWS Elastic-Beanstalk http地址。
我正在阅读亚马逊文档,但我无法找到如何在http端点上捕获一次sns消息。
请,任何帮助将非常感谢。感谢。
答案 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 值。