Use Azure SDKs to manage a virtual machine
Use Azure SDK to stop, start, and list virtual machines.
Set up your development environment
- An Azure user account with an active subscription. Create one for free.
- Node.js LTS with NPM, the Node.js package manager installed to your local machine.
- Visual Studio Code installed to your local machine.
- Create a service principal and copy the
Tenant Id,Client ID,Client secret. - Use the Azure portal's subscription page to find your subscription ID, copy that value to use in these scripts.
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");
}
async function listVMs() {
// use credential to authenticate with Azure SDKs
const client = new ComputeManagementClient(credentials, subscriptionId);
// get details of each subscription
const listResult = new Array();
for await (const item of client.virtualMachines.listAll()) {
listResult.push(item);
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);
}
async function listVMsStatus() {
// Set params to only ask for status
const virtualMachinesListAllOptionalParams = { statusOnly: "true" };
const computeClient = new ComputeManagementClient(
credentials,
subscriptionId
);
const result = new Array();
for await (const item of computeClient.virtualMachines.listAll(
virtualMachinesListAllOptionalParams
)) {
result.push(item);
}
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.
Create a file named
stop-vmor 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"); } async function stopVM() { const computeClient = new ComputeManagementClient( credentials, subscriptionId ); const result = await computeClient.virtualMachines.powerOff( resourceGroupName, vmResourceName ); return result; } stopVM() .then((result) => { console.log(JSON.stringify(result)); }) .catch((err) => { console.log(err); }); /* 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:
Install the npm packages used in the Azure work:
npm init -y && install @azure/identity @azure/arm-computeFor 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";Change variables for resource naming:
const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME"; const vmResourceName = "REPLACE-WITH-YOUR-RESOURCE-NAME";Run the code to create a VM:
node stop-vm.jsThe 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.
Create a file named
start-vmor 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"); } async function startVM() { const computeClient = new ComputeManagementClient( credentials, subscriptionId ); const result = await computeClient.virtualMachines.start( resourceGroupName, vmResourceName ); return result; } startVM() .then((result) => { console.log(JSON.stringify(result)); }) .catch((err) => { console.log(err); }); /* 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:
Install the npm packages used in the Azure work:
npm init -y && install @azure/identity @azure/arm-computeFor 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";Change variables for resource naming:
const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME"; const vmResourceName = "REPLACE-WITH-YOUR-RESOURCE-NAME";Run the code to create a VM:
node start-vm.jsThe 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.
Create a file named
delete-resources.jsor 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"); } async function deleteResourceGroup() { // Create Azure SDK client for Resource Management such as resource groups 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); });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";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";Run the code to create a VM:
node delete-resources.jsThe delete may take a few minutes.
SDK methods used in this script include:
- Resource groups - resourceClient.resourcegroups.delete
Next steps
Povratne informacije
Pošalјite i prikažite povratne informacije za