In this article, we will see what is AWS SNS and it's usecases. also, we will see a real time example where we can use AWS SNS using Node.js. Introduction to AWS SNS using Nodejs
How to Run MongoDB as a Docker Container in Development
Crafting multi-stage builds with Docker in Node.js
Learn MongoDB Aggregation with real world example
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.
There are some use cases where SNS will be the right choice. we will see those use cases.
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.
When you want to get notified about your application status and usage metrics, you can use AWS SNS to do that.
Like it said before, email and SMS are the default medium that are provided by AWS SNS for notifications.
AWS SNS is also the best option for push notification for mobile and web applications.
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
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.
Store the credentials in you machine to refer for the rest of the article.
Firstly, create a boilerplate for express application and install the aws-sdk using the command,
1npm init --yes2npm install --save express aws-sdk
Once, you installed the dependencies,we can start implementing the logic for our usecase.
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()34app.get("/", async (req, res) => {5 res.send("Welcome")6})78app.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()34const AWS_ACCESS_KEY_ID = ""5const AWS_SECRET_ACCESS_KEY = ""67AWS.config.update({8 region: "us-east-2",9 accessKeyId: AWS_ACCESS_KEY_ID,10 secretAccessKey: AWS_SECRET_ACCESS_KEY,11})1213app.get("/", async (req, res) => {14 res.send("Welcome")15})1617app.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()78 listTopics9 .then(data => {10 if (data.Topics.includes(topicName)) {11 resolve(true)12 } else {13 resolve(false)14 }15 })16 .catch(err => {17 throw err18 })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 createTopic10 .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 err18 })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.
Once you create the email subscription, you will get an email to confirm the subscription.
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")23const 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})1112const express = require("express")1314const checkIfTopicExists = require("./checkIfTopicExists")15const createTopic = require("./createTopic")16const publishToTopic = require("./publishToTopic")1718const app = express()1920app.get("/", async (req, res) => {21 const ifTopicExists = await checkIfTopicExists(AWS, "ON_POST_CREATED")2223 if (!ifTopicExists) {24 let topicARN = await createTopic(AWS, "ON_POST_CREATED")25 topicARN = topicARN26 res.send(topicARN)27 } else {28 res.send(ifTopicExists)29 }30})3132app.get("/publish", async (req, res) => {33 const ifTopicExists = await checkIfTopicExists(AWS, "ON_POST_CREATED")3435 if (!ifTopicExists) {36 await publishToTopic(37 AWS,38 "arn:aws:sns:us-east-2:602909638965:ON_POST_CREATED",39 "Hello World"40 )41 }42})4344app.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
it shows that the message sent successfully, which means you should get a mail with a message like this,
There are some wonderful courses to learn AWS Concepts. i recommend you to get this awesome course
No spam, ever. Unsubscribe anytime.