How to Deploy a Node.js Application to Elastic Beanstalk with Semaphore

December 09, 2015 | about 10 minutes to read

Introduction

With AWS Elastic Beanstalk, you can quickly deploy and manage applications in the AWS cloud without having to worry about the infrastructure that supports those applications. AWS Elastic Beanstalk automatically handles all the details of application version history, capacity provisioning, load balancing, scaling, and application health monitoring.

This tutorial explains how to set up continuous deployment for your Node.js application on Elastic Beanstalk using Semaphore. First, we will initialize an environment on the Elastic Beanstalk console and add some changes to the configuration of our Node.js application. After that, we will show you how to set up deployment on Semaphore.

Prerequisites

Before starting, you will need to do the following:

  • Create an AWS account
  • Add your project to Semaphore. Go here to learn how.

Initializing an Elastic Beanstalk Environment

An Elastic Beanstalk application is a logical collection of Elastic Beanstalk components, including environments, versions, and environment configurations. In Elastic Beanstalk, an application is conceptually similar to a folder. An environment is a version that is deployed onto AWS resources. Each environment runs only one application version at a time.

Creating an Application

The first step we need to take is to create an application on the Elastic Beanstalk console. In the upper right corner, select the region in which you would like to create the Elastic Beanstalk application.

Elastic Beanstalk console home

Next, click on “Create New Application” and choose a name for your Elastic Beanstalk application.

Enter Node.js app name

You can also do this from the command line:

$ aws elasticbeanstalk create-application --application-name nodejs-application

Creating the Environment

The next step is to create an environment. Choose the “Create web server” option.

Node.js new environment

Your predefined configuration should be set to Node.js. For the time being, you can choose “Single instance” as your environment type. You can upgrade to the load-balancing, autoscaling environment once the application is ready for production.

Node.js environment type

You can select “Sample application” for the initial application version. This is just a temporary Elastic Beanstalk application, which we will use to check whether our configuration is correct.

Node.js Application version

Next, you will need to choose a URL for your application and check its availability.

Node.js environment name

If your application requires a database, you will need to add an RDS DB instance. For more information on how you can configure your database for deploying to Elastic Beanstalk, you can visit the AWS Elastic Beanstalk documentation for using Amazon RDS with Node.js.

Node.js Additional resources

Next, you need to enter the configuration details, as shown in the screenshot below. Adding the EC2 keypair is optional, but you may need it later for additional configuration, and you can’t add a keypair to a running instance without stopping it. If you don’t have an EC2 keypair, you can learn how to create one here. You may also prefer to import your own public key created using a third-party tool instead. You can do so by following these instructions.

Node.js Configuration Details

When creating a new environment, you can specify tags to categorize the environment. Tags can help you identify environments in cost allocation reports, which is especially useful if you have many to manage. These are optional, so we’ll leave these fields empty.

Node.js Environment tags

In this example, we are using MySQL as our DB engine, but you can choose your own from the select box “DB engine”.

Node.js RDS configuration

The last step is to define permissions for your environment. When you create a new environment, AWS Elastic Beanstalk prompts you to provide two AWS Identity and Access Management (IAM) roles, a service role, and an instance profile.

Node.js Permissions

A role is essentially a set of permissions that grant access to actions and resources in AWS. An instance profile is a container for an IAM role that you can use to pass role information to an EC2 instance when the instance starts. This allows the Elastic Beanstalk service to monitor environment resources on your behalf. You can read more about permissions in the Elastic Beanstalk documentation.

For most environments, the service role and instance profile that the AWS Management Console prompts you to create with 1-click role creation when you launch your environment include all of the permissions you need. We will use those in our example.

The final step is to review the information and confirm it. Once you’ve clicked “Launch”, the environment should start initializing. If you have selected the option to create a RDS database, this process can take a while.

You can also create an Elastic Beanstalk environment from your command line using the following commands:

$ aws elasticbeanstalk create-environment --application-name nodejs-application --environment-name nodejs-application-env --version-label version-1 --solution-stack-name "64bit Amazon Linux 2015.03 v2.0.1 running Node.js"

The solution stack name determines your server configuration. We are using "64bit Amazon Linux 2015.03 v2.0.1 running Node.js", but you can explore other options that can be listed using the following command:

$ aws elasticbeanstalk list-available-solution-stacks

When the environment status turns green, you can click the URL on the console. If it takes you to the welcome screen of the sample application, that means that your environment has been properly configured.

Node.js test application

Retrieving Security Credentials

Before moving on to deployment, you will need to retrieve security credentials, which you will use to provide Semaphore with access to your application. You can get your credentials by clicking on your name in the upper right corner of Elastic Beanstalk management console, and selecting “Security credentials”.

Click on “Users” in the left navigation bar and create a new user. Choose a name for your user, download the credentials, and store them somewhere safe — you will need those to configure Semaphore in one of the following steps.

Create a New User

Next, you need to define a set of permissions for the newly created user. These are the permissions you will delegate to Semaphore in order to deploy your application.

AWS Users

In the users list, click on the previously created user. AWS uses managed policies to define these permissions. A policy can be attached to a user or a group. If you have many users, groups provide an easy way to manage their permissions. However, if this is the first time you are using Elastic Beanstalk, and you just want to try it out, you can attach a policy straight to your user.

Attach Policy Button

The “Attach Policy” button under “Permissions” will take you to a page listing predefined AWS policies. Select the ElasticBeanstalkFullAccess policy.

Attach Policy

Deploying the Application with Semaphore

Now that you’ve initialized your environment and configured your Node.js application, it’s time to finally deploy it. Go to the Semaphore home page, log in, find your project, and add a new deployment server. Select the Elastic Beanstalk deployment server.

Node.js Choose deployment

Choosing the Deployment Strategy

For the purpose of this tutorial, we will use the Automatic deployment strategy. This means that every successful build on the branch you choose will launch a deploy. There is also the Manual deployment strategy, which allows you to choose when to deploy a specific branch. If needed, you can later change the deployment strategy in server settings.

Node.js Choose deployment strategy

Next, you need to choose the branch you wish to deploy.

Node.js Choose branch

Entering the AWS Credentials

Enter the AWS credentials you retrieved in the “Security Credentials” step of this tutorial and select the region. This will enable Semaphore to list the application and the environments you have in the region you specified.

Node.js AWS Credentials

Selecting the Application and the Environment

Next, you will need to select your target application and environment. In this example, we see that Semaphore found nodejs-application and its environment. You will also need to select the S3 bucket where your project .zip file will be uploaded. This is where Elastic Beanstalk will look for your application files.

In this tutorial, we are assuming that you are using the default Elastic Beanstalk deployment process. However, the same setup on Semaphore will also work if you are using Elastic Beanstalk with Docker in a single container environment.

You can use the bucket named something similar to elasticbeanstalk-us-west-2-057267302678, which should have been created when you created the Elastic Beanstalk application. You can also select some other bucket with a more descriptive name. You can also create a new S3 bucket by clicking the “Create new S3 Bucket” link. Alternatively, you can go to the S3 Management Console and create one there, and then hit refresh on the Semaphore page.

Node.js Select application

Naming the Server and Deploying the Application

The next step is to name the server and create it.

Node.js Create server

Once you’ve created the server, click on “Deploy” to deploy your application.

Node.js Click deploy

Now all that’s left to do is wait for the deploy commands to finish executing.

Node.js Deploy success

Congratulations! You’ve successfully deployed your Node.js application to AWS Elastic Beanstalk.


This article was originally posted on Semaphore Blog


Tagged as: JavaScriptNode.jsAWS

Written by Nikola Đuza who lives and works in Novi Sad, spreading knowledge to folks through blogging and talking. He likes to build awesome things with mostly JavaScript and Ruby. You can follow him on Twitter.

Join the newsletter!

Subscribe to get latest content by email.

    I will send you an email only when new content is posted. No spam. Unsubscribe at any time.

    © 2020 Nikola Đuza