user7496277
user7496277

Reputation:

How to subscribe a HTTP endpoint to SNS in node js?

I am trying to subscribe my endpoint to a topic (I am using an EC2 instance), I have tried visiting my endpoint in a browser (GET request) to call sns.subscribe but I am not receiving a POST request afterwards.

The response I get from calling sns.subscribe is this.

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

This is my code.

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 ##");
});

Upvotes: 1

Views: 3069

Answers (1)

user7496277
user7496277

Reputation:

I had to remove my port number from the endpoint when calling sns.subscribe! My subscription has now been confirmed :D The new endpoint looks like this.

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

Upvotes: 1

Related Questions