如何在节点js中将HTTP终结点订阅到SNS?

时间:2019-04-11 15:39:27

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

我正在尝试将我的端点订阅到某个主题(我正在使用EC2实例),我曾尝试在浏览器中访问我的端点(GET请求)以调用sns.subscribe,但是我没有收到POST请求之后。

通过致电sns.subscribe得到的响应就是这个。

{ ResponseMetadata: { RequestId: 'xxxx-xxxx-xxxx-xxx-xxxx' },
  SubscriptionArn: 'arn:aws:sns:topic_location:xxxx:topic_name:xxxx-xxxx-xxxx-xxx-xxxx' }

这是我的代码。

const express = require("express");
const AWS = require('aws-sdk');
const request = require('request')
const bodyParser = require('body-parser')
const app = express();
var SNS_TOPIC_ARN = "arn:aws:sns:topic_location:xxxx:topic_name";

// configure AWS
AWS.config.update({
    'accessKeyId': 'mykey',
    'secretAccessKey': 'mysecretkey',
    "region":"myregion"
});
const sns = new AWS.SNS();

app.get('/', (req, res) => {
    var params = {
        Protocol: 'http', /* required */   //http , https ,application
        TopicArn: SNS_TOPIC_ARN, /* required */   // topic you want to subscribe
        Endpoint: 'http://ec2-xx-xx-xx-xxx.myregion.compute.amazonaws.com/:80', // the endpoint that you want to receive notifications.
        ReturnSubscriptionArn: true //|| false
    };

    sns.subscribe(params, function (err, data) {
        if (err) {
            console.log(err);
        } else {
            console.log(data);

        }
    });
    res.end();
});

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.post('/', (req, res) => {
  let body = ''

  req.on('data', (chunk) => {
    body += chunk.toString()
  })

  req.on('end', () => {
    let payload = JSON.parse(body)

    if (payload.Type === 'SubscriptionConfirmation') {
      const promise = new Promise((resolve, reject) => {
        const url = payload.SubscribeURL

        request(url, (error, response) => {
          if (!error && response.statusCode == 200) {
            console.log('Yess! We have accepted the confirmation from AWS')
            return resolve()
          } else {
            return reject()
          }
        })
      })

      promise.then(() => {
        res.end("ok")
      })
    }
  })
})

app.listen(80, process.env.IP, function(request, response){
    console.log("## SERVER STARTED ##");
});

1 个答案:

答案 0 :(得分:0)

呼叫sns.subscribe时,我必须从端点删除端口号!现在已经确认了我的订阅:D新的端点如下所示。

Endpoint: 'http://ec2-xx-xx-xx-xxx.myregion.compute.amazonaws.com/