Skip to main content

Introduction to AWS SNS using Nodejs

What is AWS SNS?

Amazon Simple Notification Service(SNS) is a web service that is used to manage the notifications for a web server,application,email and SMS.

Let's try to understand this concept with an example, Let's say you have a server instances running in AWS. you as a developer, wants to know when the server reaches the maximum CPU level.

At the same time, you don't want to constantly check the server which is very time consuming. you can automate this process using AWS SNS.

Another example would be Sending Notification for you Application Crash in the server. you can use AWS SNS to send you the Crash log to you email, so that you can debug it in an efficient way.

aws sns

AWS SNS Use-Cases

There are some use cases where SNS will be the right choice. we will see those use cases.

Fan-out/Pub-sub

Let's take the previous scenario here. you want to get notified about your server health check in email, SMS and also to the other web server which uses this server.

In that case, AWS SNS will be right choice to go with.

Application System Alerts

When you want to get notified about your application status and usage metrics, you can use AWS SNS to do that.

Email and SMS Notification

Like it said before, email and SMS are the default medium that are provided by AWS SNS for notifications.

Push Notification

AWS SNS is also the best option for push notification for mobile and web applications.

AWS Setup for SNS

Mainly, the Usecase that we will take here is sending application status to email using AWS SNS.

Requirement for this article is to have an account in AWS. Once you create an Account, you need to generate credentials for accessing the AWS SNS.

To do that, you need to create an Identity Acess Management(IAM) for an user with AWS SNS Full Access.

Go to AWS Console -> IAM user -> create an user

iam iser 1

After that, you need to add the user to group. Group is where we set the access for the service.

you can select the services that you want to give access to the users in the group.

Once you done with the process, you can be able to get the credentials for the user to access the services you specified.

iam user success

Store the credentials in you machine to refer for the rest of the article.

Implementing AWS SNS in Nodejs Application

Firstly, create a boilerplate for express application and install the aws-sdk using the command,

1npm init --yes
2npm install --save express aws-sdk

Once, you installed the dependencies,we can start implementing the logic for our usecase.

aws sns Page 2

AWS SNS works in the pattern of publisher/subscriber. create an app.js file and add the basic express application setup.

1const express = require("express")
2const app = express()
3
4app.get("/", async (req, res) => {
5 res.send("Welcome")
6})
7
8app.listen(3004, () => {
9 console.log("Server is running in port 3004")
10})

After that, add the aws setup in the application to access the SNS service.

1const express = require("express")
2const app = express()
3
4const AWS_ACCESS_KEY_ID = ""
5const AWS_SECRET_ACCESS_KEY = ""
6
7AWS.config.update({
8 region: "us-east-2",
9 accessKeyId: AWS_ACCESS_KEY_ID,
10 secretAccessKey: AWS_SECRET_ACCESS_KEY,
11})
12
13app.get("/", async (req, res) => {
14 res.send("Welcome")
15})
16
17app.listen(3004, () => {
18 console.log("Server is running in port 3004")
19})

Logic that we are going to follow is when you hit the base url, we will check if the topic is already exists in the SNS, if not we will create it and returns the topicArn.

So, create a file called checkIfTopicExists.js to check if the topic exists or not,

1module.exports = (AWS, topicName) => {
2 return new Promise((resolve, reject) => {
3 try {
4 const listTopics = new AWS.SNS({ apiVersion: "2010-03-31" })
5 .listTopics({})
6 .promise()
7
8 listTopics
9 .then(data => {
10 if (data.Topics.includes(topicName)) {
11 resolve(true)
12 } else {
13 resolve(false)
14 }
15 })
16 .catch(err => {
17 throw err
18 })
19 } catch (e) {
20 reject(e)
21 }
22 })
23}

Above code check if the topic is already exists in SNS service or not.

After that, create a file called createTopic.js that create a topic in SNS service.

1module.exports = (AWS, topicName) => {
2 return new Promise((resolve, reject) => {
3 try {
4 const createTopic = new AWS.SNS({ apiVersion: "2010-03-31" })
5 .createTopic({
6 Name: topicName,
7 })
8 .promise()
9 createTopic
10 .then(data => {
11 console.log(`Created Topic - ${topicName}`)
12 console.log("data", data)
13 resolve(data.TopicArn)
14 // topicARN = data.TopicArn;
15 })
16 .catch(err => {
17 throw err
18 })
19 } catch (e) {
20 reject(e)
21 }
22 })
23}

Once the topic is created, you need to subscribe to the topic using the email that you want to get notified.

create a subscription in AWS SNS console.

create subscription

console subscription

Once you create the email subscription, you will get an email to confirm the subscription.

subscription confirmation

That's the setup for Email subscription for the topic.

finally, add those two files in the app.js to implement the logic.

1const AWS = require("aws-sdk")
2
3const AWS_ACCESS_KEY_ID = ""
4const AWS_SECRET_ACCESS_KEY = ""
5let topicARN = ""
6AWS.config.update({
7 region: "us-east-2",
8 accessKeyId: AWS_ACCESS_KEY_ID,
9 secretAccessKey: AWS_SECRET_ACCESS_KEY,
10})
11
12const express = require("express")
13
14const checkIfTopicExists = require("./checkIfTopicExists")
15const createTopic = require("./createTopic")
16const publishToTopic = require("./publishToTopic")
17
18const app = express()
19
20app.get("/", async (req, res) => {
21 const ifTopicExists = await checkIfTopicExists(AWS, "ON_POST_CREATED")
22
23 if (!ifTopicExists) {
24 let topicARN = await createTopic(AWS, "ON_POST_CREATED")
25 topicARN = topicARN
26 res.send(topicARN)
27 } else {
28 res.send(ifTopicExists)
29 }
30})
31
32app.get("/publish", async (req, res) => {
33 const ifTopicExists = await checkIfTopicExists(AWS, "ON_POST_CREATED")
34
35 if (!ifTopicExists) {
36 await publishToTopic(
37 AWS,
38 "arn:aws:sns:us-east-2:602909638965:ON_POST_CREATED",
39 "Hello World"
40 )
41 }
42})
43
44app.listen(3004, () => {
45 console.log("Server is running in port 3004")
46})

Once you have done that, it is time to test the code. run the code using node app.js

you can see the output like

demo

it shows that the message sent successfully, which means you should get a mail with a message like this,

notification

Recommended Course

There are some wonderful courses to learn AWS Concepts. i recommend you to get this awesome course

Comments

Popular posts from this blog

4 Ways to Communicate Across Browser Tabs in Realtime

1. Local Storage Events You might have already used LocalStorage, which is accessible across Tabs within the same application origin. But do you know that it also supports events? You can use this feature to communicate across Browser Tabs, where other Tabs will receive the event once the storage is updated. For example, let’s say in one Tab, we execute the following JavaScript code. window.localStorage.setItem("loggedIn", "true"); The other Tabs which listen to the event will receive it, as shown below. window.addEventListener('storage', (event) => { if (event.storageArea != localStorage) return; if (event.key === 'loggedIn') { // Do something with event.newValue } }); 2. Broadcast Channel API The Broadcast Channel API allows communication between Tabs, Windows, Frames, Iframes, and  Web Workers . One Tab can create and post to a channel as follows. const channel = new BroadcastChannel('app-data'); channel.postMessage(data); And oth...

Certbot SSL configuration in ubuntu

  Introduction Let’s Encrypt is a Certificate Authority (CA) that provides an easy way to obtain and install free  TLS/SSL certificates , thereby enabling encrypted HTTPS on web servers. It simplifies the process by providing a software client, Certbot, that attempts to automate most (if not all) of the required steps. Currently, the entire process of obtaining and installing a certificate is fully automated on both Apache and Nginx. In this tutorial, you will use Certbot to obtain a free SSL certificate for Apache on Ubuntu 18.04 and set up your certificate to renew automatically. This tutorial will use a separate Apache virtual host file instead of the default configuration file.  We recommend  creating new Apache virtual host files for each domain because it helps to avoid common mistakes and maintains the default files as a fallback configuration. Prerequisites To follow this tutorial, you will need: One Ubuntu 18.04 server set up by following this  initial ...

Working with Node.js streams

  Introduction Streams are one of the major features that most Node.js applications rely on, especially when handling HTTP requests, reading/writing files, and making socket communications. Streams are very predictable since we can always expect data, error, and end events when using streams. This article will teach Node developers how to use streams to efficiently handle large amounts of data. This is a typical real-world challenge faced by Node developers when they have to deal with a large data source, and it may not be feasible to process this data all at once. This article will cover the following topics: Types of streams When to adopt Node.js streams Batching Composing streams in Node.js Transforming data with transform streams Piping streams Error handling Node.js streams Types of streams The following are four main types of streams in Node.js: Readable streams: The readable stream is responsible for reading data from a source file Writable streams: The writable stream is re...