Changing a Google Cloud (GCP) Compute Engine (GCE) virtual machine size or disk size are typical “Day 2” activities that an operations team may perform as the needs of the application running in the VM evolve past what was initially specified during deployment.
As a best practice, all infrastructure deployment and modifications should be performed via Infrastructure-as-Code (IaC) where resources are defined using a declarative language such as Terraform and then a deployment process runs to create or update the resource using cloud APIs.
Changing machine size
For a given GCP Terraform google_compute_instance
, change the machine_type
value to one which meets the cpu/memory requirement:
- See API machine type names (third-party site)
- See GCP Terraform provider documentation
- In the
google_compute_instance
setallow_stopping_for_update = true
to avoid having to manually stop the VM prior to making the update in Terraform. With this argument set, Terraform will stop the instance duringterraform apply
and then start the instance when complete.
- In the
Increasing disk size
See Working with persistent disks | Compute Engine Documentation
Disk sizes may only be increased, not decreased.
Google recommends taking a snapshot of a disk prior to increasing its size. The snapshot is for safekeeping in case there is an issue with the overall process so that the data is not lost.
If a smaller size is set, terraform will plan to destroy the disk and create a new one.
- This can be prevented by setting the
lifecycle
argument on thegoogle_compute_disk
resource causing the plan to fail:
lifecycle {
prevent_destroy = true
}
Increasing the size of a disk can be done via Google Cloud Console, gcloud command line, or API/terraform. For IaC purposes, only terraform should be used.
Increasing boot disk size
VMs using public images automatically resize the root partition and file system after you’ve resized the boot disk on the VM and restarted the VM. If you are using an image that does not support this functionality, you must manually resize the root partition and file system.
Working with persistent disks | Compute Engine documentation
If the VM was created in terraform and did not have a boot disk created separately with a specific size, setting a new boot disk size in the google_compute_instance
resource will cause terraform to recreate the VM.
VMs should be created in terraform with separate/independently-created boot & data disk google_compute_disk
resources in order to safely increase the size of the disks in the future.
Create VMs in terraform with separate/independent boot & data disks.
Example:
data "google_compute_image" "debian9" {
project = "debian-cloud"
name = "debian-9-stretch-v20211105"
}
resource "google_compute_disk" "test-np5-boot" {
project = <project_id>
name = "test-np5-boot"
type = "pd-standard"
zone = "us-central1-a"
size = 30
image = data.google_compute_image.debian9.self_link
}
resource "google_compute_disk" "test-np5-data1" {
project = <project_id>
name = "test-np5-data1"
type = "pd-standard"
zone = "us-central1-a"
size = 10
}
resource "google_compute_instance" "test-np5" {
name = "test-np5"
machine_type = "e2-micro"
zone = "us-central1-a"
project = <project_id>
allow_stopping_for_update = true
boot_disk {
source = google_compute_disk.test-np5-boot.name
}
attached_disk {
source = google_compute_disk.test-np5-data1.id
}
network_interface {
subnetwork = "uscentral1"
subnetwork_project = shared_vpc_host_project
}
metadata = {
serial-port-logging-enable = true
serial-port-enable = true
}
}
Be sure to specify a specific name
for the google_compute_image
(as shown) so that the boot disk is not flagged to be recreated when a new version is released.
By default, a boot disk created separately from the VM will still be deleted when the instance is deleted. Set auto-delete = false
in the boot_disk
section of the google_compute_instance
to prevent this behavior.
To increase the size of the boot disk, change the size
value for the google_compute_disk
called by google_compute_instance
boot_disk
argument:
resource "google_compute_disk" "test-np5-boot" {
project = <project_id>
name = "test-np5-boot"
type = "pd-standard"
zone = "us-central1-a"
size = 40
image = data.google_compute_image.debian9.self_link
}
Terraform will update the size of the boot disk. The VM will not be restarted automatically, even if google_compute_instance
has allow_stopping_for_update
set to true
because the change is being made to the google_compute_disk
resource, not the VM instance.
Manually restart the VM during a maintenance window. If using a public image, or an image customized from a public image, the OS boot disk and partition should be expanded automatically.
If not, see Resize the file system and partitions.
Adding a new data disk
In terraform, create a new disk using the google_compute_disk resource. Example:
resource "google_compute_disk" "data1" {
project = <project_id>
name = "test-np4-data1"
type = "pd-standard"
zone = "us-central1-a"
size = 10
lifecycle {
prevent_destroy = true
}
}
Modify the terraform VM google_compute_instance resource to include the attached_disk
argument which references the google_compute_disk
resource.
Example:
attached_disk {
source = google_compute_disk.data1.id
}
Increasing data disk size
Modify the terraform google_compute_disk
data disk size
argument:
resource "google_compute_disk" "test-np5-data1" {
project = <project_id>
name = "test-np5-data1"
type = "pd-standard"
zone = "us-central1-a"
size = 20
}
Terraform will update the size of the data disk. The VM will not be restarted automatically, even if google_compute_instance
has allow_stopping_for_update
set to true
because the change is being made to the google_compute_disk
resource, not the VM instance.
Modern OSs should automatically detect the capacity change of the data disk. If not, perform a rescan using the method provided by the operating system.
For exact steps to increase the size of a filesystem after increasing the disk size, see Resize the file system and partitions (select “Linux instances” or “Windows instances”).