compute/createInstanceWithLocalSSD.js (96 lines of code) (raw):
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
function main(projectId, zone, instanceName) {
// [START compute_instances_create_with_local_ssd]
// TODO(developer): Uncomment and replace these variables before running the sample.
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';
const compute = require('@google-cloud/compute');
// Create a new VM instance with Debian 10 operating system and SSD local disk.
async function createInstanceWithLocalSSD() {
const diskSizeGb = 10;
const boot = true;
const autoDelete = true;
const diskType = `zones/${zone}/diskTypes/pd-standard}`;
const disks = [];
// Get the latest debian image.
// Retrieve the newest image that is part of a given family in a project.
// Args:
// project: project ID or project number of the Cloud project you want to get image from.
// family: name of the image family you want to get image from.
const imagesClient = new compute.ImagesClient();
const [newestDebian] = await imagesClient.getFromFamily({
project: 'debian-cloud',
family: 'debian-11',
});
// Create the disks to be included in the instance.
disks.push(
createDiskFromImage(
diskType,
diskSizeGb,
boot,
newestDebian.selfLink,
autoDelete
)
);
disks.push(createLocalSsdDisk(zone));
// Create the instance.
const [instance] = await createInstance(
projectId,
zone,
instanceName,
disks
);
if (instance !== null) {
console.log(`Instance created with local SSD: ${instance.name}`);
}
}
// Create an AttachedDisk object to be used in VM instance creation. Uses an image as the
// source for the new disk.
//
// Args:
// diskType: the type of disk you want to create. This value uses the following format:
// "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
// For example: "zones/us-west3-b/diskTypes/pd-ssd"
//
// diskSizeGb: size of the new disk in gigabytes.
//
// boot: boolean flag indicating whether this disk should be used as a
// boot disk of an instance.
//
// sourceImage: source image to use when creating this disk.
// You must have read access to this disk. This can be one of the publicly available images
// or an image from one of your projects.
// This value uses the following format: "projects/{project_name}/global/images/{image_name}"
//
// autoDelete: boolean flag indicating whether this disk should be deleted
// with the VM that uses it.
function createDiskFromImage(
diskType,
diskSizeGb,
boot,
sourceImage,
autoDelete
) {
return {
initializeParams: {
sourceImage: sourceImage,
diskSizeGb: diskSizeGb,
},
// Remember to set autoDelete to True if you want the disk to be deleted when you delete
// your VM instance.
autoDelete: autoDelete,
boot: boot,
diskType: diskType,
};
}
// Create an AttachedDisk object to be used in VM instance creation. The created disk contains
// no data and requires formatting before it can be used.
// Args:
// zone: The zone in which the local SSD drive will be attached.
function createLocalSsdDisk(zone) {
return {
type: 'SCRATCH',
autoDelete: true,
initializeParams: {
diskType: `zones/${zone}/diskTypes/local-ssd`,
},
};
}
// Send an instance creation request to the Compute Engine API and wait for it to complete.
// Args:
// projectId: project ID or project number of the Cloud project you want to use.
// zone: name of the zone to create the instance in. For example: "us-west3-b"
// instanceName: name of the new virtual machine (VM) instance.
// disks: a list of compute.v1.AttachedDisk objects describing the disks
// you want to attach to your new instance.
async function createInstance(projectId, zone, instanceName, disks) {
// Instantiates a reusable client object.
// (Node.js will automatically clean it up.)
const instancesClient = new compute.InstancesClient();
// machineType: machine type of the VM being created. This value uses the
// following format: "zones/{zone}/machineTypes/{type_name}".
// For example: "zones/europe-west3-c/machineTypes/f1-micro"
const typeName = 'n1-standard-1';
const machineType = `zones/${zone}/machineTypes/${typeName}`;
// networkLink: name of the network you want the new instance to use.
// For example: "global/networks/default" represents the network
// named "default", which is created automatically for each project.
const networkLink = 'global/networks/default';
// Collect information into the Instance object.
const [response] = await instancesClient.insert({
project: projectId,
zone: zone,
instanceResource: {
name: instanceName,
machineType: machineType,
networkInterfaces: [
{
name: networkLink,
},
],
disks: disks,
},
});
let operation = response.latestResponse;
const operationsClient = new compute.ZoneOperationsClient();
// Wait for the create operation to complete.
while (operation.status !== 'DONE') {
[operation] = await operationsClient.wait({
operation: operation.name,
project: projectId,
zone: operation.zone.split('/').pop(),
});
}
return instancesClient.get({
project: projectId,
zone: zone,
instance: instanceName,
});
}
createInstanceWithLocalSSD();
// [END compute_instances_create_with_local_ssd]
}
main(...process.argv.slice(2));