Use Azure SDKs to manage a virtual machine

Use Azure SDK to stop, start, and list virtual machines.

Set up your development environment

Gather information about your Virtual machine

In order to programmatically stop and start your virtual machine, you need to collect and use several values:

  • Service principal
    • Tenant ID
    • Client ID
    • Client secret
  • Virtual machine
    • Subscription ID
    • Resource group
    • Virtual machine resource name

List subscription virtual machines

To get the virtual machine resource name, use the following script to see all virtual machines in the subscription. Use the returned JSON's name value as the virtual machine resource name.

const { ClientSecretCredential, DefaultAzureCredential } = require("@azure/identity");
const { ComputeManagementClient }  = require('@azure/arm-compute');

// Azure authentication in environment variables for DefaultAzureCredential
let credentials = null;
const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; 
const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; 
const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";

if(process.env.production){

  // production
  credentials = new DefaultAzureCredential();

}else{

  // development
  credentials = new ClientSecretCredential(tenantId, clientId, secret);
  console.log("development");
}

const listVMs = async () => {

    const computeClient = new ComputeManagementClient(credentials, subscriptionId);
    const result = await computeClient.virtualMachines.listAll();
    console.log(JSON.stringify(result));
}

listVMs().then((result)=>{
    console.log(result);
}).catch(ex => {
    console.log(ex);
});

SDK methods used in this script include:

Get status of subscription virtual machines

To get the virtual machine resource status, use the following script. Use the statusOnly: "true" parameter to return just the status values for each virtual machine in the subscription.

const {
    ClientSecretCredential,
    DefaultAzureCredential,
  } = require("@azure/identity");
  const { ComputeManagementClient } = require("@azure/arm-compute");
  
  // Azure authentication in environment variables for DefaultAzureCredential
  let credentials = null;
  const tenantId =
    process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID";
  const clientId =
    process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID";
  const secret =
    process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
  const subscriptionId =
    process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";

  if (process.env.production) {
    // production
    credentials = new DefaultAzureCredential();
  } else {
    // development
    credentials = new ClientSecretCredential(tenantId, clientId, secret);
  }
  
  const listVMsStatus = async () => {
  
    // Set params to only ask for status
    const virtualMachinesListAllOptionalParams = {
      statusOnly: "true",
    };
  
    const computeClient = new ComputeManagementClient(
      credentials,
      subscriptionId
    );
    const result = await computeClient.virtualMachines.listAll(
      virtualMachinesListAllOptionalParams
    );
    result.map((vm) => {
      console.log(`${vm.name}`);
      vm.instanceView.statuses.map((status) => {

        console.log(`---${status.displayStatus} ${(status.time) ? status.time : ""}`

          /*
          Example: 

            johnsmithvm6859
            ---Provisioning succeeded Thu Oct 28 2021 10:41:03 GMT-0700 (Pacific Daylight Time)
            ---VM running

          */
        );
      });
    });
  };
  
  listVMsStatus()
    .then((result) => {
      console.log("done");
    })
    .catch((ex) => {
      console.log(ex);
    });

SDK methods used in this script include:

Stop a virtual machine

You may want to stop (power off) your virtual machine when you aren't using it.

  1. Create a file named stop-vm or copy the file from GitHub.

    const { ClientSecretCredential, DefaultAzureCredential } = require("@azure/identity");
    const { ComputeManagementClient }  = require('@azure/arm-compute');
    
    // Azure authentication in environment variables for DefaultAzureCredential
    let credentials = null;
    const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; 
    const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; 
    const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
    const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
    
    const resourceGroupName = "REPLACE-WITHYOUR-RESOURCE_GROUP-NAME";
    const vmResourceName = "REPLACE-WITHYOUR-RESOURCE-NAME";
    
    if(process.env.production){
    
      // production
      credentials = new DefaultAzureCredential();
    
    }else{
    
      // development
      credentials = new ClientSecretCredential(tenantId, clientId, secret);
      console.log("development");
    }
    
    const stopVM = async () => {
    
        const computeClient = new ComputeManagementClient(credentials, subscriptionId);
        const result = await computeClient.virtualMachines.powerOff(resourceGroupName, vmResourceName);
        console.log(JSON.stringify(result));
    }
    
    stopVM().then((result)=>{
        console.log(result);
    }).catch(ex => {
        console.log(ex);
    });
    
    /*
    
    Stop operation results:
    
    {
      "startTime":"2021-10-27T16:35:59.6006484+00:00",
      "endTime":"2021-10-27T16:35:59.850632+00:00",
      "status":"Succeeded",
      "name":"1773c5e7-d904-4f98-b2a6-6e2f2465407f"
    }
    
    */
    

    SDK methods used in this script include:

  2. Install the npm packages used in the Azure work:

    npm init -y && install @azure/identity @azure/arm-compute
    
  3. For local development, change variables in file for authentication:

    // Azure authentication in environment variables for DefaultAzureCredential
    const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; 
    const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; 
    const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
    const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
    
  4. Change variables for resource naming:

    const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME";
    const vmResourceName = "REPLACE-WITH-YOUR-RESOURCE-NAME";
    
  5. Run the code to create a VM:

    node stop-vm.js
    

    The output includes the operation ID:

    {
      "startTime":"2021-10-27T16:35:59.6006484+00:00",
      "endTime":"2021-10-27T16:35:59.850632+00:00",
      "status":"Succeeded",
      "name":"1773c5e7-d904-4f98-b2a6-6e2f2465407f"
    }
    

Start a virtual machine

You may want to start your virtual machine if it is powered off.

  1. Create a file named start-vm or copy the file from GitHub.

    const { ClientSecretCredential, DefaultAzureCredential } = require("@azure/identity");
    const { ComputeManagementClient }  = require('@azure/arm-compute');
    
    // Azure authentication in environment variables for DefaultAzureCredential
    let credentials = null;
    const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; 
    const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; 
    const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
    const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
    
    const resourceGroupName = "REPLACE-WITHYOUR-RESOURCE_GROUP-NAME";
    const vmResourceName = "REPLACE-WITHYOUR-RESOURCE-NAME";
    
    if(process.env.production){
    
      // production
      credentials = new DefaultAzureCredential();
    
    }else{
    
      // development
      credentials = new ClientSecretCredential(tenantId, clientId, secret);
      console.log("development");
    }
    
    const startVM = async () => {
    
        const computeClient = new ComputeManagementClient(credentials, subscriptionId);
        const result = await computeClient.virtualMachines.start(resourceGroupName, vmResourceName);
        console.log(JSON.stringify(result));
    }
    
    startVM().then((result)=>{
        console.log(result);
    }).catch(ex => {
        console.log(ex);
    });
    
    /*
    
    Start operation results:
    
    {
      "startTime":"2021-10-27T16:35:59.6006484+00:00",
      "endTime":"2021-10-27T16:35:59.850632+00:00",
      "status":"Succeeded",
      "name":"1773c5e7-d904-4f98-b2a6-6e2f2465407f"
    }
    
    */
    

    SDK methods used in this script include:

  2. Install the npm packages used in the Azure work:

    npm init -y && install @azure/identity @azure/arm-compute
    
  3. For local development, change variables in file for authentication:

    // Azure authentication in environment variables for DefaultAzureCredential
    const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; 
    const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; 
    const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
    const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
    
  4. Change variables for resource naming:

    const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME";
    const vmResourceName = "REPLACE-WITH-YOUR-RESOURCE-NAME";
    
  5. Run the code to create a VM:

    node start-vm.js
    

    The output includes the operation ID:

    {
      "startTime":"2021-10-27T16:35:59.6006484+00:00",
      "endTime":"2021-10-27T16:35:59.850632+00:00",
      "status":"Succeeded",
      "name":"1773c5e7-d904-4f98-b2a6-6e2f2465407f"
    }
    

Clean up resources

When you are done with the virtual machine, delete the resource group.

  1. Create a file named delete-resources.js or copy the file from GitHub.

    const { ClientSecretCredential, DefaultAzureCredential } = require("@azure/identity");
    const { ResourceManagementClient } = require("@azure/arm-resources");
    
    // Azure authentication in environment variables for DefaultAzureCredential
    let credentials = null;
    const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; 
    const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; 
    const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
    const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
    
    const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME";
    
    if(process.env.production){
    
      // production
      credentials = new DefaultAzureCredential();
    
    }else{
    
      // development
      credentials = new ClientSecretCredential(tenantId, clientId, secret);
      console.log("development");
    }
    
    const deleteResourceGroup = async () => {
    
        const resourceClient = new ResourceManagementClient(
            credentials,
            subscriptionId
        );
        const result = await resourceClient.resourceGroups.deleteMethod(resourceGroupName);
        console.log(JSON.stringify(result));
    }
    
    deleteResourceGroup().then((result)=>{
        console.log(result);
    }).catch(ex => {
        console.log(ex);
    });
    
  2. For local development, change variables in file for authentication:

    // Azure authentication in environment variables for DefaultAzureCredential
    const tenantId =
      process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID";
    const clientId =
      process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID";
    const secret =
      process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET";
    const subscriptionId =
      process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";    
    
  3. Get the resource group name, which was returned as the last line from the creation script and change the variable in the delete script:

    const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME";
    
  4. Run the code to create a VM:

    node delete-resources.js
    

    The delete may take a few minutes.

    SDK methods used in this script include:

Next steps