ElasticSearch Cluster + NodeJS Application on Azure Infrastructure (Microsoft Windows Server)

Hello Guys! few days ago, I was working on a project of planning and deployment for ElasticSearch Cluster + NodeJS on Microsoft Azure Infrastructure by using Windows Server virtual machines. Below is my client requirement:


I have developed an application in NodeJS + Elasticsearch. I need to deploy it on Azure. The application will have heavy traffic, so the deployment architecture should be scalable. The OS has to be windows if VMs are used. 

For Elasticsearch, windows server VM cluster can be setup
For NodeJS application, one of the following deployment options can be excersized:

Deployment on Windows VM with Load Balancer and Auto Scaling Group configuration
Deployment to App Service for REST Node JS App

Note: I don’t want to host ElasticSearch Cluster on linux VMs. I need Microsoft Windows Server VMs.

With the above requirement, I started googling and I didn’t find any article to Setup and deployed ElasticSearch Cluster on Windows Server Infrastructure. Just found articles on Ubuntu. So, I planned to work on this requirement myself and after a huge struggle I succeeded.

ElasticSearch Cluster + NodeJS App Sizing and Cost Estimation on Azure

Service type Custom name Region Description Estimated Cost
Virtual Machines Elasticsearch (Data Nodes) Canada Central 2 E2s V3 (2 vCPU(s), 16 GB RAM) x 730 Hours; Windows – (OS Only); Pay as you go $5221.22
Virtual Machines Elasticsearch (Master Nodes)
Canada Central
3 DS1 v2 (1 vCPU(s), 3.5 GB RAM) x 730 Hours; Windows – (OS Only); Pay as you go $306.60
Virtual Machines Elasticsearch (Kibana Instance)
Canada Central
3 DS1 v2 (1 vCPU(s), 3.5 GB RAM) x 730 Hours; Windows – (OS Only); Pay as you go $306.60
IP Addresses Public IP
Canada Central
1 Static IP Addresses $3.65
Storage 4 SSD Disk (2 for each) Data Node
Canada Central
Managed Disks, Premium SSD, P10 Disk Type 4 Disks $80.02

App Service
NodeJS Application
Canada Central
Standard Tier; 1 S1 (1 Core(s), 1.75 GB RAM, 50 GB Storage) x 730 Hours; Windows OS
$87.60
Monthly Total $1,311.69
Annual Total $15,740.23


NodeJS Application Deployment and high-level steps

Below are the requirement to complete this deployment:

  • Require an Azure Subscription (PAYG/CSP/EA)
  • Create a new Resource Group in Canada Central Region
  • Create an App service plan (1 core, 1.75GB RAM)
  • Create Web App services
  • Deploy Node.js code
  • Testing and validation

Deploy NodeJS WebApp from Azure ARM Template

I have created a custom Azure ARM Template for WebApp deployment. You can download the template from my GitHub Repositories.
Download Link: https://github.com/adeelaleem/nodejs.git
Please follow below the steps for deployment:

  1. Connect to your Azure Subscription via PowerShell.

Note: If you are aware with this step, skip to step 2.

1.1 Azure PowerShell requires your connecting machine to be running PowerShell version 5.0. To check, run command $PSVersionTable.PSVersion and confirm the Major build is 5.






1.2 The next step installs the required Azure PowerShell modules from the PowerShell Gallery. Launch PowerShell as an administrator and run command Install-Module AzureRM.

1.2 The next step installs the required Azure PowerShell modules from the PowerShell Gallery. Launch PowerShell as an administrator and run command Install-Module AzureRM.

1.3 You will be prompted to install NuGet if you have a version earlier than 2.8.5.201 or do not have it at all. Type y and press Enter.

1.4 To trust the PowerShell Gallery as a repository, type a and press Enter.

1.5 After a few moments numerous AzureRM modules will download and install on your machine.

1.6 Once complete, issue command Import-Module AzureRM.

If you get following error then run Set-Executionpolicy -executionpolicy unrestricted

Enter y to apply policy settings, and issue command Import-Module AzureRM again.

1.7 Now run command Connect-AzureRmAccount.

Enter credentials to manage your Azure tenant.

1.8 If successful, you will be returned some information from your tenant. Run a test command such as Get-AzureRmTenant and confirm that they issue correctly.


2.1 Extract the provide package “NodeJS” and place on drive D of your local complete.

2.2 Open Administrator: PowerShell. And connect the directory.

2.3 Select PowerShell deploy.ps1 script and hit enter.

2.4 Enter your Azure credentials.

2.5 Enter to Start deployment.

2.6 Provide suitable name to your app. As if, we provide NodeAppCC1.

2.7 Deployment will took a while to complete. And succeeded message with details will be appear as following. 

ElasticSearch Deployment and high-level steps

Below are the requirement to complete this deployment:

  • Require an Azure Subscription (PAYG/CSP/EA)
  • Create a new Resource Group in Canada Central Region
  • Create 1 virtual network, address space and subnet
  • Create Elasticsearch Master node (3 virtual machines)
  • Create Data node (2 virtual machines)
  • Create Kibana node (2 virtual machines)
  • Create 2 SSD disks for each data node
  • Create Storage account for Diagnostic boot log
  • Create 3 Availability sets, each for Master, Data and Kibana VMs
  • Create 1 Public IP address
  • Create Network security groups for Data and Master nodes
  • Create 1 Internal Load Balancer

Deploy ElasticSearch Cluster on Windows Azure Virtual Machines

I have created a custom Azure ARM Template for ElasticSearch Cluster deployment. You can download the template from my GitHub Repositories.
Download Link: https://github.com/adeelaleem/elasticsearch

This template deploys Virtual Machines, Storage Accounts, a Virtual Network, Availability Sets, Public IP addresses, a Load Balancer, and Network Interfaces.

Once you setup your infrastructure on Azure with the provided template, Please follow the below instruction to Install ElasticSearch on Windows Virtual Machines.

Installation and Configurations of ElasticSearch 6.6.0

First of all, download “Java SE Development Kit 8” and “ElasticSearch 6.6.0“.

Servers Details & Configurations

Below are the details of servers and roles:

SR.NO VM-NAME Resource Group Location Private IP Public IP Roles Installed
1 elasticsearch-data-vm0 ElasticSearch-RG Canada Central 10.0.1.4 Data
2 elasticsearch-data-vm1 ElasticSearch-RG Canada Central 10.0.1.5 Data
3 elasticsearch-master-vm0 ElasticSearch-RG Canada Central 10.0.0.10 Master+Ingest
4 elasticsearch-master-vm1 ElasticSearch-RG Canada Central 10.0.0.11 Master+Ingest
5 elasticsearch-master-vm2 ElasticSearch-RG Canada Central 10.0.0.12 Master+Ingest

Installation of Elasticsearch 6.6.0 on all server step- by-step

Server: master-vm0 [10.0.0.10]

Open the MSI file and select “Use default directories” option and click Next button


Select options as described in given below image:

Choose cluster name, node (VM) name, Host IP, and Port number. Select “Master” and “Ingest” Roles for this node

Leave default Plugins setting and click Next button

Click on “Enable X-Pack Security” and then click Next button

Now elasticsearch has successfully installed

To verify, open web browser and type the IP address and port number, you should see like below screen

ElasticSearch “Master” and “Ingest” roles has installed on “elasticsearch-master-vm0“. Now do the same above steps on “elasticsearch-master-vm1” and “elasticsearch-master-vm2” for installation of Master + Ingest roles.

Server: elasticsearch-data-vm0  10.0.1.4

Now, we’ll install “Data” role on “elasticsearch-data-vm0” and “elasticsearch-data-vm1″

Open the MSI file and select “Use default directories” option and click Next button

Select options as described in given below image:

Choose cluster name, node (VM) name, Host IP, and Port number. Select “Data” Role for this node

Leave default Plugins setting and click Next button

Click on “Enable X-Pack Security” and then click Next button

Now elasticsearch has successfully installed

To verify, open web browser and type the IP address and port number, you should see like below screen

ElasticSearch “Data” role has installed on “elasticsearch-data-vm0”. Now do the same above steps on “elasticsearch-data-vm1”.

After you finished installation on “elasticssearch-data-vm1”, your Search Cluster Services is ready for use 🙂