How to Deploy A Nodejs App to AWS in EC2’s Server | by Alfonso Valdes Carrales | May, 2022

Utilizing Docker, RDS Amazon Aurora, and Nginx with HTTPS

Picture by Robynne Hu on Unsplash

Thee are a number of methods to deploy your Nodejs app, be it on-cloud or on-premise. Nonetheless, it isn’t nearly deploying your software however deploying it in the fitting means. Safety can also be an necessary facet that should not be ignored. If you happen to accomplish that, the applying received’t stand lengthy, and there’s a excessive likelihood of it getting compromised.

Therefore, right here we’re that will help you with the steps to deploy Nodejs app to AWS. We’ll present you precisely the best way to deploy Nodejs app to server utilizing Docker containers, RDS Amazon Aurora, and Nginx with HTTPS. You’ll be capable of entry it utilizing the area title.

Nodejs Pattern App

A pattern Nodejs app with three APIs: viz, standing, insert, and listing. These APIs can be used to verify the standing of the app, insert knowledge into the database, and fetch and show the info from the database.

AWS EC2 Occasion

An Ubuntu 20.04 LTS Amazon Elastic Compute Cloud (Amazon EC2) occasion can be used to deploy the containerized Nodejs App. We’ll set up Docker on this occasion, on prime of which containers can be created. We may even set up MySql shopper on the occasion. MySql shopper is required to connect with the Aurora Occasion to create a required desk.

AWS RDS Amazon Aurora

Our knowledge can be saved in AWS RDS Amazon Aurora. We’ll retailer easy fields like username, email-id, and age within the AWS RDS Amazon Aurora occasion.

Amazon Aurora is a MySQL and PostgreSQL suitable relational database accessible on AWS.

Docker

Docker is a containerization platform to construct Docker pictures and deploy them utilizing containers. We’ll deploy the Nodejs app to the server, Nginx, and Certbot as Docker containers.

Docker-Compose

To spin up the Nodejs, Nginx, Certbot containers, we are going to use Docker-Compose. Docker Compose helps to scale back container deployment and administration time.

Nginx

This can be used to allow HTTPS for the pattern Nodejs app and redirect all person requests to the Nodejs app. It’ll act as a reverse proxy to redirect person requests to the applying and assist safe the connection by offering the configuration to allow SSL/HTTPS.

Certbot

This may allow us to routinely use Let’s Encrypt for area validation and to subject SSL certificates.

Area

On the finish of the doc, it is possible for you to to entry the pattern Nodejs software utilizing your area title over HTTPS, i.e., your pattern Nodejs can be secured over the web.

PostMan

We’ll use Postman to check our APIs, i.e., to verify standing, insert knowledge, and listing knowledge from the database.

As I mentioned, we are going to “deploy Nodejs app to the server utilizing Docker containers, RDS Amazon Aurora, Nginx with HTTPS, and entry it utilizing the area title.” First, let’s perceive the structure earlier than getting our palms soiled.

The Nodejs app can be accessible on port 3000. This pattern Nodejs app fetches knowledge from the RDS Amazon Aurora occasion created in the identical VPC as that of the EC2 occasion. An Amazon Aurora DB occasion can be personal and therefore accessible inside the similar VPC. The Nodejs software deployed on the EC2 occasion could be accessed utilizing its public IP on port 3000, however we received’t.

Accessing functions on nonstandard ports will not be really helpful. Therefore we can have Nginx act as a reverse proxy and allow SSL Termination. Customers will attempt to entry the applying utilizing the area title, and these requests can be forwarded to Nginx.

Nginx will verify the request, and based mostly on the API, it would redirect that request to the Nodejs app. The applying may even be terminated with the SSL. Because of this, the communication between the shopper and the server can be secured and guarded.

Earlier than we proceed to deploy the Nodejs app to AWS, it’s assumed that you have already got the next conditions:

  1. AWS account
  2. PostMan or some other different in your machine to check APIs
  3. A registered area in your AWS Account

Go to https://AWS.amazon.com/console/ and login into your account.

After you log in, click on within the search bar and sort EC2. Click on on the consequence to go to the EC2 dashboard to create an EC2 occasion.

Then, click on on “Launch Situations” to configure and create an EC2 occasion.

Choose the “Ubuntu Server 20.04 LTS” AMI.

I’d advocate you to pick out t3.small just for take a look at functions. This may have two CPUs and 2GB RAM. You possibly can select the occasion sort as per your want and selection.

You possibly can hold the default settings and proceed forward. Right here, I’ve chosen the default VPC. In order for you, you’ll be able to choose your VPC. Make an observation that I can be creating an occasion within the public subnet.

Higher to place a bigger disk house at 30GB. The remaining could be the default.

Assign a “Title” and “Setting” tag to any values of your selection. You might even skip this step.

Permit connection to port 22 solely out of your IP. If you happen to enable it from 0.0.0.0/0, then your occasion will enable anybody on port 22.

Overview the configuration as soon as, and click on on “Launch.” If every thing seems high quality, create an occasion.

Earlier than the occasion will get created, it wants a key-pair. You possibly can both create a brand new key-pair or use the prevailing one. Click on on the “Launch Situations” button that can provoke the occasion creation.

To go to the console and verify your occasion, click on on the “View situations” button.

Right here, you’ll be able to see that the occasion has been created and is within the “Initiating” part. Inside a minute or two, you’ll be able to see your occasion up and operating.

In the meantime, let’s create an RDS occasion.

Once more click on on the search bar on the prime of the web page, and this time seek for “RDS.” Click on on the consequence to go to the RDS Dashboard.

Click on on the “Create database” button to configure and create the RDS occasion on the RDS Dashboard.

Select the “Straightforward create” methodology, “Amazon Aurora” Engine sort, and “Dev/Take a look at” DB occasion dimension as follows:

Scroll down a bit and specify the “DB cluster identifier” as “my-Nodejs-database.” You possibly can specify any title of your selection as it’s only a title given to the RDS occasion. Nonetheless, I’d recommend utilizing the identical title to keep away from getting confused whereas following the following steps.

Additionally, specify a grasp username as “admin,” its password, after which click on on “Create database.”

This may provoke the RDS Amazon Aurora Occasion creation. Word that you need to not set easy usernames and passwords for manufacturing or dwell environments.

Right here, you’ll be able to see that the occasion is within the “Creating” state. In round 5–10 minutes, you need to have the occasion up and operating.

Listed below are a couple of notes:

  • The RDS Amazon Aurora occasion can be, by default, personal, which implies the RDS Amazon Aurora occasion won’t be reachable from the skin world and can solely be accessible inside the VPC.
  • The EC2 occasion and the RDS occasion belong to the identical VPC.
  • The RDS occasion is reachable from the EC2 occasion.

Now, you’ll be able to hook up with the occasion we created. I cannot get into particulars on connecting to the occasion; I consider you already comprehend it.

We’ll want a MySQL shopper to connect with the RDS Amazon Aurora occasion and create a database in it. Hook up with the EC2 occasion and execute the next instructions from it.

sudo apt replace
sudo apt set up mysql-client

We’ll want a desk in our RDS Amazon Aurora occasion to retailer our software knowledge. To create a desk, hook up with the Amazon RDS Aurora occasion utilizing the MySQL shopper we put in on the EC2 occasion within the earlier step.

Copy the database endpoint from the Amazon Aurora occasion.

Execute the next frequent with the proper values:

mysql -u <user-name> -p<password> -h <host-endpoint>

Right here, my command seems as follows:

mysql -u admin -padmin1234 -h my-Nodejs-database.cluster-cxxjkzcl1hwb.eu-west-3.rds.amazonAWS.com

When you get related to the Amazon RDS Aurora occasion, execute the next instructions to create a ” customers ” desk.

present databases;
use principal;
CREATE TABLE IF NOT EXISTS customers(id int NOT NULL AUTO_INCREMENT, username varchar(30), e mail varchar(255), age int, PRIMARY KEY(id));
choose * from customers;

Check with the next screenshot to know command executions.

Now, let’s create a listing the place we are going to retailer all our codebase and configuration recordsdata.

pwd
cd /dwelling/ubuntu/
mkdir Nodejs-docker
cd Nodejs-docker

Clone my Github repository containing all of the code. That is an optionally available step; I’ve included all of the code on this doc.

pwd
cd /dwelling/ubuntu/
git clone https://github.com/shivalkarrahul/DevOps.git
cp /dwelling/ubuntu/DevOps/AWS/Nodejs-docker/* /dwelling/ubuntu/Nodejs-docker

Word: That is an optionally available step. If you happen to copy all of the recordsdata from the repository to the applying listing, you don’t want to create recordsdata within the upcoming steps; nonetheless, you’ll nonetheless must make the mandatory adjustments.

Why must you use Docker in your EC2 occasion?

Docker is a containerization instrument used to bundle our software program software into a picture that can be utilized to create Docker containers. Docker helps to construct, share, and deploy our functions simply.

Step one of dockerization is putting in Docker.

Set up Docker

  1. Verify Linux model
    cat /and many others/subject
  2. Replace the apt bundle index
    sudo apt-get replace
  3. Set up packages to permit apt to make use of a repository over HTTPS
    sudo apt-get set up apt-transport-https ca-certificates curl gnupg lsb-release
  4. Add Docker’s official GPG key:
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  5. Arrange the steady repository
    echo “deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) steady” | sudo tee /and many others/apt/sources.listing.d/docker.listing > /dev/null
  6. Replace the apt bundle index
    sudo apt-get replace
  7. Set up the most recent model of Docker Engine and contained
    sudo apt-get set up docker-ce docker-ce-cli containerd.io
  8. Verify Docker model
    docker –model
  9. Handle Docker as a non-root person
    Create ‘docker’ group
    sudo groupadd docker
    Add your person to the docker group
    sudo usermod -aG docker <your-user-name>
  10. Exit.
    exit
  11. Login again to the terminal
  12. Confirm you could run docker instructions with out sudo
    docker run hello-world
  13. Upon executing the above run command, you need to see the output as follows:
  1. Check with the next screenshot to see the command that I’ve executed.

After you have Docker put in, the following step is to Dockerize the app. Dockerizing a Nodejs app means writing a Dockerfile with a set of directions to create a Docker Picture.

Let’s create Dockerfile and a pattern Nodejs app.

pwd
cd /dwelling/ubuntu/Nodejs-docker

Create Dockerfile and paste the next into it. Alternatively, you’ll be able to copy the content material from here.

vim Dockerfile

4. Create index.js and paste the next in it. Alternatively, you’ll be able to copy the content material from here. This can be our pattern Nodejs app.

vim index.js

Within the above file, change the values of the next variables with the one relevant to your RDS Amazon Aurora occasion:

5. Create bundle.json, and paste the next into it. Alternatively, you’ll be able to copy the content material from here.

vim bundle.json

To entry the applying, we have to add a rule within the Safety Group to permit connections on port 3000. As I mentioned earlier, we are able to entry the applying on port 3000, however it isn’t really helpful. Maintain studying to know our suggestions.

  1. Go to the EC2 dashboard, choose the occasion, swap to the “Safety” tab, after which click on on the Safety teams hyperlink.

2. Choose the “Inbound Guidelines” tab and click on on the “Edit inbound guidelines” button.

3. Add a brand new rule that can enable exterior connection from “MyIp” on the 3000 port.

  1. Let’s construct a docker picture from the code we have now.
    cd /dwelling/ubuntu/Nodejs-docker
    docker construct -t Nodejs

2. Begin a container utilizing the picture that we simply constructed and expose it on port 3000.

docker run –title Nodejs -d -p 3000:3000 Nodejs

3. You possibly can see the container is operating.
docker ps

4. You possibly can even verify the logs of the container.
docker logs Nodejs

Now we have now our Nodejs app Docker container operating.

5. Now, you’ll be able to entry the applying out of your browser on port 3000.

  • Verify the standing of the applying on /standing api utilizing the browser: http://<public-ip-of-ec2-instance>:3000/standing
  • You possibly can insert some knowledge within the software on /insert api utilizing the Postman app utilizing POST request.
    http://<public-ip-of-ec2-instance>:3000/insert?username=abc&e mail=abc@abc.com&age=2
  • You possibly can listing the info out of your software through the use of /listing api from the browser:
    http://<public-ip-of-ec2-instance>:3000/listing

6. Alternatively, you should use the curl command from inside the EC2 occasion to verify standing, insert knowledge, and listing knowledge.
curl -XGET “http://<public-ip-of-ec2-instance>:3000/listing”
curl -XPOST “http://<public-ip-of-ec2-instance>:3000/insert?username=abc&e mail=abc@abc.com&age=26″

7. Cease and take away the container
docker cease Nodejs
docker rm Nodejs

On this part, we tried to entry APIs accessible for the applying instantly utilizing the Public IP:Port of the EC2 occasion. Nonetheless, exposing nonstandard ports to the exterior world within the Safety Group is in no way really helpful.

Additionally, we tried to entry the applying over the HTTP protocol, which implies the communication that passed off from the browser to the applying was not safe, and an attacker may learn the community packets.

To beat this situation, it is strongly recommended to make use of Nginx.

Let’s create an Nginx conf that can be used inside the Nginx container by way of a Docker Quantity. Create a file, and duplicate the next content material within the file. Alternatively, you’ll be able to copy the content material from here.

cd /dwelling/ubuntu/Nodejs-docker
mkdir nginx-conf
vim nginx-conf/nginx.conf

Within the above file, make adjustments within the three strains talked about under. Exchange my subdomain.area, i.e., Nodejs.devopslee, with the one you need and have:

  1. server_name Nodejs.devopslee.com www.Nodejs.devopslee.com;
  2. ssl_certificate /and many others/letsencrypt/dwell/Nodejs.devopslee.com/fullchain.pem;
  3. ssl_certificate_key /and many others/letsencrypt/dwell/Nodejs.devopslee.com/privkey.pem;

Our Nodejs software runs on a nonstandard port 3000. Nodejs gives a means to make use of HTTPS. Nonetheless, we shouldn’t be involved about configuring the protocol and managing SSL certificates that expire periodically inside the software code base.

To beat these situations, we have to have Nginx in entrance of it with SSL termination and ahead person requests to Nodejs. Nginx is a particular sort of internet server that may act as a reverse proxy, load balancer, mail proxy, and HTTP cache. Right here, we can be utilizing Nginx as a reverse proxy to redirect requests to our Nodejs software and have SSL termination.

Apache can also be an internet server and might act as a reverse proxy. It additionally helps SSL termination. Nonetheless, there are some things that differentiate Nginx from Apache. Because of the following causes, Nginx is usually most well-liked over Apache:

  1. Nginx has a single or a low variety of processes, and it’s asynchronous and event-based. Apache tries to make new processes and new threads for each request in each connection.
  2. Nginx is light-weight, scalable, and straightforward to configure. However, Apache is nice however has the next barrier to studying.

Subsequent, let’s set up docker-compose.

  1. Obtain the present steady launch of Docker Compose
    sudo curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/native/bin/docker-compose
  2. Apply executable permissions to the docker-compose binary we simply downloaded within the above step.
    sudo chmod +x /usr/native/bin/docker-compose
  3. Take a look at if the set up was profitable by checking the docker-compose model
    docker-compose –model
  4. Create a docker-compose.yaml file. Alternatively, you’ll be able to copy the content material from here. This can be used to spin the docker containers of our software tech stack that we have now.
    cd /dwelling/ubuntu/Nodejs-docker
    vim docker-compose.yml

Within the above file, make adjustments within the line talked about under. Exchange my subdomain.area, i.e., Nodejs.devopslee with the one you need and have. Change IP in your private e mail.

–e mail EMAIL. E-mail used for registration and restoration contact.

  1. command: certonly –webroot –webroot-path=/var/www/html –e mail my@e mail.com –agree-tos –no-eff-email –staging -d Nodejs.devopslee.com -d www.Nodejs.devopslee.com

This time, expose ports 80 and 443 within the safety group hooked up to the EC2 occasion. Additionally, take away 3000 since it’s pointless as a result of the applying works by way of port 443.

Right here, I’ve created a subdomain, “Nodejs.devopslee.com,” that can be used to entry the pattern Nodejs software utilizing the area title fairly than accessing utilizing an IP.

You possibly can create your subdomain on AWS if you have already got your area.

Create two “Kind A Recordsets” within the hosted zone with a price as EC2 situations’ public IP.

One Recordset can be subdomain.domain.com, and the opposite can be www.subdomain.domain.com.

Right here, I’ve created Nodejs.devopslee.com and www.Nodejs.devopslee.com, each pointing to the general public IP of the EC2 occasion.

Word: I’ve not assigned any Elastic IP to the EC2 occasion. It is suggested to assign an Elastic IP after which use it within the Recordset. While you restart your EC2 occasion, you don’t must replace the IP within the Recordset as a result of public IPs change after the EC2 occasion is restarted.

Now, copy values of the “Kind NS Recordset.” We’ll want these within the subsequent steps.

Go to the hosted zone of your area and create a brand new “Document” together with your subdomain.domain.com, including the NS values you copied within the earlier step.

Now, you’ve got a subdomain that you should use to entry your software.

In my case, I can use Nodejs.devopslee.com to entry the Nodejs software. We aren’t completed but. The subsequent step is to safe our Nodejs internet software.

Let’s generate our key for Nginx.

  1. cd /dwelling/ubuntu/Nodejs-docker
  2. mkdir views
  3. mkdir dhparam
  4. sudo openssl dhparam -out /dwelling/ubuntu/Nodejs-docker/dhparam/dhparam-2048.pem 2048

We’re all set to start out our Nodejs app utilizing docker-compose.

This may begin our Nodejs app on port 3000, Nginx with SSL on port 80 and 443. Nginx will redirect requests to the Nodejs app when accessed utilizing the area. It’ll even have a Certbot shopper that can allow us to acquire our certificates.

  1. docker-compose up

After you hit the above command, you will note some output as follows. You have to see a message as “Efficiently acquired certificates.”

Word: The above docker-compose command will begin containers and can keep hooked up to the terminal. Now we have not used the -d choice to detach it from the terminal.

You might be all set. Now hit the URL within the browser, and you need to have your Nodejs software accessible on HTTPS.

You may also attempt to hit the applying utilizing the curl command:

  1. Listing the info from the applying
    curl https://Nodejs.devopslee.com/list
  2. Insert an entry within the software
    curl -XPOST “https://Nodejs.devopslee.com/insert?username=abc&email=abc@abc.com&age=28
  3. Once more listing the info to confirm if the info has been inserted or not
    curl https://Nodejs.devopslee.com/list

4. Verify the standing of the applying
https://Nodejs.devopslee.com/status

5. Hit the URL within the browser to get an inventory of entries within the database.
https://Nodejs.devopslee.com/list

Certificates we generate utilizing Let’s Encrypt are legitimate for 90 days. Therefore we have to have a approach to renew our certificates routinely in order that we don’t find yourself with expired certificates.

To automate this course of, let’s create a script that can renew certificates for us and a cronjob to schedule the execution of this script.

  1. Create a script with –dry-run to check our script
    vim renew-cert.sh
#!/bin/bashCOMPOSE="/usr/native/bin/docker-compose --no-ansi"
DOCKER="/usr/bin/docker"
cd /dwelling/ubuntu/Nodejs-docker/
$COMPOSE run certbot renew --dry-run && $COMPOSE kill -s SIGHUP webserver
$DOCKER system prune -af

2. Change the permissions of the script to make it executable.
chmod 774 renew-cert.sh

3. Create a cronjob
sudo crontab -e

*/5 * * * * /dwelling/ubuntu/Nodejs-docker/renew-cert.sh >> /var/log/cron.log 2>&1

4. Listing the cronjobs.
sudo crontab -l

5. Verify logs of the cronjob after 5 minutes, as we have now set a cronjob to be executed each fifth minute
tail -f /var/log/cron.lo

You possibly can see a “Simulating renewal of an present certificates….” within the above screenshot. It’s because we have now specified the –dry-run possibility within the script.

6. Let’s take away the –dry-run possibility from the script.
vim renew-cert.sh

#!/bin/bashCOMPOSE="/usr/native/bin/docker-compose --no-ansi"
DOCKER="/usr/bin/docker"
cd /dwelling/ubuntu/Nodejs-docker/
$COMPOSE run certbot renew && $COMPOSE kill -s SIGHUP webserver
$DOCKER system prune -af

This time, you received’t see a “Simulating renewal of an present certificates” message. Now, the script will verify if there may be any must renew the certificates. If required, it would renew the certificates. If not, it would ignore and say, “Certificates not but due for renewal.”

We’re completed with organising our Nodejs software utilizing Docker on AWS EC2 occasion. Nonetheless, different issues come into the image while you wish to deploy a extremely accessible software for manufacturing and different environments.

The subsequent step is to make use of an orchestrator like ECS or EKS to handle our Nodejs software on the manufacturing stage. Replication, auto-scaling, load balancing, visitors routing, and monitoring container well being doesn’t come out of the field with Docker and Docker-Compose. To handle the container and microservices structure at scale, you want a container orchestration instrument like ECS or EKS.

Additionally, we didn’t use any Docker repository to retailer our Nodejs app Docker picture. You need to use AWS ECR, a completely managed AWS container registry providing high-performance internet hosting.

If you wish to create a cloud-native structure, take a look at our video What’s a Cloud-Native Structure and the best way to undertake it?”

Deploying a Nodejs app to AWS doesn’t imply simply making a Nodejs software and deploying it on the AWS EC2 occasion with a self-managed database. There are numerous elements like containerizing the Nodejs app, SSL termination, and area for the app that come into the image while you wish to pace up your software program improvement, deployment, safety, reliability, and knowledge redundancy.

On this article, we went over the steps to dockerize the pattern Nodejs software. We used AWS RDS Amazon Aurora and deployed the Nodejs app to the EC2 occasion utilizing Docker and Docker-Compose. We enabled SSL termination to our subdomain for use to entry the Nodejs software.

Additionally, we noticed the steps to automate area validation and SSL certificates creation utilizing Certbot, and found a approach to automate the certificates renewal course of, which is legitimate for 90 days.

This is sufficient to get began with a pattern Nodejs software. Nonetheless, on the subject of managing your real-time functions, a whole lot of microservices, 1000’s of containers, volumes, networking, secrets and techniques, and egress-ingress, you want a container orchestration instrument.

There are numerous instruments like self-hosted Kubernetes, AWS ECS, and AWS EKS you could leverage to handle the container life cycle in your real-world functions.

Wish to join with the creator?Article originally posted at ClickIT

More Posts