Get started with the Azure modules for Node.js

This guide walks you through installing Azure Node.js modules, authenticating to Azure with a service principal, and running sample code that creates resources in your Azure subscription and connects to Azure cloud services.


Launch Azure Cloud Shell

The Azure Cloud Shell is a free bash shell that you can run directly within the Azure Portal. It has the Azure CLI preinstalled and configured to use with your account. Click the Cloud Shell button on the menu in the upper-right of the Azure portal.

Cloud Shell

The button launches an interactive shell that you can use to run all of the steps in this topic:

Screenshot showing the Cloud Shell window in the portal

Prepare your environment

Create a new project in an empty directory and install the following npm modules:

cd azure-node-quickstart
npm init -y
npm install --save azure ms-rest-azure azure-arm-compute azure-arm-network azure-storage azure-arm-storage

Set up authentication

Your Node.js applications need read and create permissions in your Azure subscription to run the sample code in this guide. Create a service principal and configure your application to run with its credentials. Service principals are a non-interactive account associated with your identity to which you grant only the privileges your app needs to run.

Create a service principal using the Azure CLI 2.0 and capture the output. You'll need to provide a secure password in the password argument instead of MY_SECURE_PASSWORD.

az ad sp create-for-rbac --name AzureNodeTest --password MY_SECURE_PASSWORD
  "appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
  "displayName": "AzureNodeTest",
  "name": "http://AzureNodeTest",
  "password": password,
  "tenant": ""

Export the values for appId, password and tenant as environment variables:

export AZURE_ID a487e0c1-82af-47d9-9a0b-af184eb87646d
export AZURE_PASS password

Get the ID for your subscription with az account show

az account show
   "environmentName": "AzureCloud",
   "id": "306943934-0323-4ae4d-a42b-f6613d1664ac",
   "isDefault": true

Export the subscription ID as an environment variable

export AZURE_SUB 306943934-0323-4ae4d-a42b-f6613d1664ac

Create a Linux virtual machine

Create a new file createVM.js in the current directory with the following code. Update the value of adminPass with a good password.

'use strict';

const MsRest = require('ms-rest-azure');
const ComputeManagementClient = require('azure-arm-compute');
const NetworkManagementClient = require('azure-arm-network');

    process.env.AZURE_ID, process.env.AZURE_PASS, process.env.AZURE_TENANT, (err, credentials) => {

        let adminPass = YOUR_VALUE_HERE;
        const networkClient = new NetworkManagementClient(credentials, process.env.AZURE_SUB);
        const computeClient = new ComputeManagementClient(credentials, process.env.AZURE_SUB);

        let nicParameters = {
            location: "eastus",
            ipConfigurations: [
                    name: "vmnetinterface",
                    privateIPAllocationMethod: 'Dynamic',

        const vnetParameters = {
            location: "eastus",
            addressSpace: {
                addressPrefixes: ['']
            dhcpOptions: {
                dnsServers: ['', '']
            subnets: [{ name: "mynodesubnet", addressPrefix: '' }],

        let vmParameters = {
            location: "eastus",
            osProfile: {
                computerName: "newLinuxVM",
                adminUsername: "testadmin",
                adminPassword: admin_password
            hardwareProfile: {
                vmSize: 'Basic_A1'
            networkProfile: {
                networkInterfaces: [
                        primary: true
            storageProfile: {
                imageReference: {
                    publisher: 'Canonical',
                    offer: 'UbuntuServer',
                    sku: '16.04-LTS',
                    version: 'latest'

        let publicIPParameters = {
            location: "eastus",
            publicIPAllocationMethod: 'Dynamic'

        networkClient.virtualNetworks.createOrUpdate("myResourceGroup", "mynodevnet", vnetParameters)
            .then(function (vnetwork) {
                networkClient.subnets.get("myResourceGroup", "mynodevnet", "mynodesubnet")
                    .then(function (subnetInfo) {
                        nicParameters.ipConfigurations[0].subnet = subnetInfo;
                        networkClient.publicIPAddresses.createOrUpdate("myResourceGroup", "myLinuxPublicIP", publicIPParameters)
                            .then(function (publicIP) {
                                nicParameters.ipConfigurations[0].publicIPAddress = publicIP;
                                networkClient.networkInterfaces.createOrUpdate("myResourceGroup", "vmnetinterface", nicParameters)
                                    .then(function (vmNetworkInterface) {
                                        vmParameters.networkProfile.networkInterfaces[0].id =;
                                        computeClient.virtualMachines.createOrUpdate("myResourceGroup", "newLinuxVM", vmParameters, (err, data) => {
                                            if (err) return console.log(err);
                                            console.log("Created new Linux VM");

Run the code from the command line:

node createVM.js

Once the code completes, get the IP of your new virtual machine and log in with SSH using the value for adminPass from your code.

az vm list-ip-addresses --name newLinuxVM
ssh testadmin@*vm_ip_address*

Write a blob to Azure Storage

Create a new file uploadFile.js in the current directory with the following code.

'use strict'

const MsRest = require('ms-rest-azure');
const storage = require('azure-storage');
const storageManagementClient = require('azure-arm-storage');

MsRest.loginWithServicePrincipalSecret(process.env.AZURE_ID, process.env.AZURE_PASS, process.env.AZURE_TENANT, (err, credentials) => {
    const client = new storageManagementClient(credentials, process.env.AZURE_SUB);

    const createParameters = {
        location: 'eastus',
        sku: {
            name: 'Standard_LRS'
        kind: 'BlobStorage',
        accessTier: 'Hot'

    const blobAccountName = "nodedemo" + Math.random().toString(10).substr(4, 7);

    client.storageAccounts.create("myResourceGroup", blobAccountName, createParameters, (err, result, httpRequest, response) => {
        if (err) console.log(err);

        // get a connection string for the account
        client.storageAccounts.listKeys("myResourceGroup", blobAccountName, (err, result) => {
            if (err) console.log(err);

            // get a storage key and use it to connect to the azure-storage module
            const blobSvc = storage.createBlobService(blobAccountName, result.keys[0].value);
            blobSvc.createContainerIfNotExists('mycontainer', { publicAccessLevel: 'blob' }, function (error, result, response) {
                if (!error) {
                    blobSvc.createBlockBlobFromText('mycontainer', 'myblob', 'Hello Azure!', function (error, result, response) {
                        if (!error) {
                            console.log("File uploaded to " + "https://" + blobAccountName + "");


Run the command and then copy and paste the URL from the output into your web browser to view the file in Azure Storage:

node uploadFile.js

Clean up resources

Delete the resource group to remove the resources created in this guide.

az group delete --name myResourceGroup

Next steps

Explore more sample Node.js code you can use in your apps.


A reference is available for all packages.

Get help and give feedback

Post questions to the community on Stack Overflow. Report bugs and open issues against the Azure modules for Node.js on the project GitHub.