This page describes how to create and manage instance templates. Instance templates let you specify the machine type, boot disk image, network, and other VM properties that you want to use when creating virtual machine (VM) instances.
You can use instance templates to do the following:
- Create individual VMs.
- Create VMs in a managed instance group (MIG).
- Create reservations for VMs.
Before you begin
- If you want to use the command-line examples in this guide, do the following:
- Install or update to the latest version of the Google Cloud CLI.
- Set a default region and zone.
- If you want to use the API examples in this guide, set up API access.
- Read when and why to create deterministic instance templates.
Limitations
- Shared VPC on interfaces other than
nic0
for instance templates is supported in gcloud CLI and the API, but not in Google Cloud console. - You cannot update an existing instance template or change an instance template after it has been created. If an instance template goes out of date, or you need to make changes to the configuration, create a new instance template.
Create a new instance template
Most of the VM properties that you can specify in a request to create an individual VM instance can also be specified for an instance template, including any VM metadata, startup scripts, persistent disks, service accounts, and so on. You must specify the machine type, boot disk, and network.
Create an instance template through the Google Cloud console, Google Cloud CLI, the API, Terraform, or the Cloud Client Libraries.
Console
In the Google Cloud console, go to the Instance templates page.
The remaining steps will appear automatically in the Google Cloud console.
- Click
Create instance template . For the following fields, either accept the default values or modify them as required. The default values change based on the machine family that you select.
- Select a
Machine type . - To update the boot disk type or image, in the
Boot disk section, click Change. - To update the network interface or IP address settings, click
Advanced options , then click Networking, and then click the network interface you want to edit.
- Select a
Optional: If you chose an image that supports Shielded VM, change the VM's Shielded VM settings:
- Click Management, Security, Disks, Networking, Sole Tenancy, and then click the Security tab.
- If you want to disable Secure Boot, clear the Turn on Secure Boot checkbox. Secure Boot helps protect your VM instances against boot-level and kernel-level malware and rootkits. For more information, see Secure boot.
If you want to disable the virtual trusted platform module (vTPM), clear the Turn on vTPM checkbox. The vTPM enables Measured boot, which validates the VM pre-boot and boot integrity. For more information, see Virtual Trusted Platform Module (vTPM).
If you want to disable integrity monitoring, uncheck the Turn on Integrity Monitoring checkbox. Integrity monitoring lets youn monitor the boot integrity of your Shielded VM instances by using Cloud Monitoring. For more information, see Integrity monitoring.
Optional: Under Management, Security, Disks, Networking, Sole Tenancy, click the tabs to further customize your template. For example, you can add up to 15 secondary non-boot disks.
Optional: Click Equivalent REST to view the REST request body, which includes the JSON representation of your instance template.
Click Create to create the template.
gcloud
In gcloud compute
, create an instance template by using the
instance-templates create
command.
gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME
Replace INSTANCE_TEMPLATE_NAME
with a name for the
instance template.
If you do not provide explicit template settings, gcloud compute
uses
the following default values:
- Machine type: the machine type—for example,
n1-standard-1
- Image: the latest Debian image
- Boot disk: a new standard boot disk named after the VM
- Network: the default VPC network
- IP address: an ephemeral external IP address
You can also explicitly provide these configuration settings. For example:
gcloud compute instance-templates create example-template-custom \ --machine-type=e2-standard-4 \ --image-family=debian-10 \ --image-project=debian-cloud \ --boot-disk-size=250GB
You can add up to 15 secondary non-boot disks. Specify the --create-disk
flag for each secondary disk you create. To create secondary disks from a
public or custom image, specify the image
and image-project
properties
for each disk in the --create-disk
flag. To create a blank disk, do not
include these properties. Optionally, include properties for the disk size
and type
. To specify regional persistent disks, use the replica-zones
property.
gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \ --zone=ZONE \ --create-disk= \ {image=DISK_IMAGE | image-family=DISK_IMAGE_FAMILY}, \ image-project=DISK_IMAGE_PROJECT, \ size=SIZE_GB \ --create-disk= \ device-name=DISK_NAME, \ replica-zones=^:^ZONE:REMOTE_ZONE,boot=false
Replace the following:
INSTANCE_TEMPLATE_NAME
: the name for the new templateZONE
: zone to create the VM in-
DISK_IMAGE
orDISK_IMAGE_FAMILY
: specify one of the following:DISK_IMAGE
: the name of the image that you want to use as a non-boot diskDISK_IMAGE_FAMILY
: an image family to use as a non-boot diskFor more information on image families, see best practices when using image families on Compute Engine.
DISK_IMAGE_PROJECT
: the image project that contains the imageFor blank disks, don't specify the
image-project
property. For more information on public images, see Public images.SIZE_GB
: the size of the secondary diskDISK_NAME
: Optional: the disk name displayed to the guest OS after the VM is created.REMOTE_ZONE
: the zone where the disk should be replicated toFor zonal disks, don't include the
replica-zones
property.
For blank disks, don't specify the image
property.
If you chose an image that supports Shielded VM, you can optionally change the instance's Shielded VM settings using one of the following flags:
--no-shielded-secure-boot
: turns off Secure BootSecure Boot helps protect your VM instances against boot-level and kernel-level malware and rootkits. For more information, see Secure Boot.
--no-shielded-vtpm
: turns off the virtual trusted platform module (vTPM)The vTPM enables Measured Boot, which validates the VM pre-boot and boot integrity. For more information, see Virtual Trusted Platform Module (vTPM).
--no-shielded-integrity-monitoring
: turns off integrity monitoringIntegrity monitoring lets you monitor the boot integrity of your Shielded VM instances using Cloud Monitoring. For more information, see Integrity monitoring.
For a list of all available subcommands and flags, see the
instance-templates
reference.
A template with the default configuration settings might look like the following:
gcloud compute instance-templates describe example-template
creationTimestamp: '2019-09-10T16:18:32.042-07:00' description: '' id: '6057583701980539406' kind: compute#instanceTemplate name: example-template properties: canIpForward: false disks: - autoDelete: true boot: true initializeParams: sourceImage: https://compute.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-10 kind: compute#attachedDisk mode: READ_WRITE type: PERSISTENT machineType: e2-standard-2 networkInterfaces: - accessConfigs: - kind: compute#accessConfig name: external-nat type: ONE_TO_ONE_NAT network: https://compute.googleapis.com/compute/v1/projects/myproject/global/networks/default scheduling: automaticRestart: true onHostMaintenance: MIGRATE serviceAccounts: - email: default scopes: - https://www.googleapis.com/auth/devstorage.read_only selfLink: https://compute.googleapis.com/compute/v1/projects/myproject/global/instanceTemplates/example-template
Terraform
To create an instance template, you can use the google_compute_instance_template
resource.
The following Terraform example is similar to the following gcloud CLI command:
gcloud compute instance-templates create my-instance-template \ --machine-type=e2-standard-4 \ --image-family=debian-9 \ --image-project=debian-cloud \ --boot-disk-size=250GB
To learn how to apply or remove a Terraform configuration, see Basic Terraform commands.
API
To create an instance template, make a POST
request to the
instanceTemplates.insert
method:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates
Replace PROJECT_ID with the project ID.
You can add up to 15 secondary non-boot disks by using the
disks
property, with a field for each additional disk. For each
additional disk, you can do the following:
- Create additional disks with a public or custom image.
- To add a blank disk, define the
initializeParams
entry with nosourceImage
value. - To create regional persistent disks, define the
initializeParams
entry with the propertyreplicaZones
.
In the body of the request, provide the template properties:
{ "name": "INSTANCE_TEMPLATE_NAME", "properties": { "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE", "networkInterfaces": [ { "network": "global/networks/default", "accessConfigs": [ { "name": "external-IP", "type": "ONE_TO_ONE_NAT" } ] } ], "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "initializeParams": { "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE" } }, { "type": "PERSISTENT", "boot": false, "deviceName": "DISK_NAME", "initializeParams": { "replicaZones": [ "projects/PROJECT_NAME/zones/ZONE", "projects/PROJECT_NAME/zones/REMOTE_ZONE" ] } } ] } }
Replace the following:
INSTANCE_TEMPLATE_NAME
: the name of the instance templateZONE
: the zone where VMs are locatedMACHINE_TYPE
: the machine type of the VMs-
IMAGE_PROJECT
: the image project that contains the imageFor more information on public images, see Public images.
-
IMAGE
orIMAGE_FAMILY
: specify one of the following:-
IMAGE
: a specific version of the imageFor example,
"sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"
-
IMAGE_FAMILY
: an image familyThis creates the VM from the most recent, non-deprecated OS image. For example, if you specify
"sourceImage": "projects/debian-cloud/global/images/family/debian-10"
, Compute Engine creates a VM from the latest version of the OS image in the Debian 10 image family.For more information on image families, see best practices when using image families on Compute Engine.
-
DISK_NAME
: Optional: the disk name displayed to the guest OS after the VM is created.PROJECT_NAME
: the project associated with the VMREMOTE_ZONE
: the zone where the regional disk should be replicated to
You can specify one of the following options for the disks
property:
Specify
initializeParams
to create persistent boot disks for each instance. You can add up to 15 secondary non-boot disks by using theinitializeParams
property for each additional disk. You can create disks by using public or custom images (or image families) in thesourceImage
as shown in the preceding example. To add blank disks, do not specify asourceImage
.Specify
source
to attach an existing persistent boot disk. If you attach an existing boot disk, you can only create one instance from your template.
Optionally, you can specify the diskSizeGb
, diskType
, and labels
properties for initializeParams
and the diskSizeGb
property for
source
.
If you chose an image that supports Shielded VM, you can optionally change the VM's Shielded VM settings by using the following Boolean request body items:
enableSecureBoot
: turns on or off Secure BootSecure Boot helps protect your VM instances against boot-level and kernel-level malware and rootkits. For more information, see Secure Boot.
enableVtpm
: turns on or off the virtual trusted platform module (vTPM)The vTPM enables Measured Boot, which validates the VM pre-boot and boot integrity. For more information, see Virtual Trusted Platform Module (vTPM).
enableIntegrityMonitoring
: turns on or off integrity monitoringIntegrity monitoring lets you monitor and verify the runtime boot integrity of your Shielded VM instances by using Cloud Monitoring reports. For more information, see Integrity monitoring.
To learn more about request parameters, see the instanceTemplates.insert
method.
Go
Java
Node.js
Python
Create an instance template based on an existing instance
You can use the Compute Engine API or gcloud CLI to save the configuration of an existing VM instance as an instance template. You can optionally override how the source disks are defined in the template.
If you need to override other properties, first create an instance template based on an existing instance, then create a similar template with additional overrides.
gcloud
Use the
gcloud compute instance-templates create
command
with the --source-instance
and --source-instance-zone
flags.
gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \ --source-instance=SOURCE_INSTANCE \ --source-instance-zone=SOURCE_INSTANCE_ZONE
To override how the source instance's disks are defined, add one or more
--configure-disk
flags:
gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \ --source-instance=SOURCE_INSTANCE \ --source-instance-zone=SOURCE_INSTANCE_ZONE \ --configure-disk= \ device-name=SOURCE_DISK, \ instantiate-from=INSTANTIATE_OPTIONS, \ auto-delete=AUTO_DELETE
Replace the following:
INSTANCE_TEMPLATE_NAME
is the name of the template to create.SOURCE_INSTANCE
is the name of the instance to use as a model for the new template.SOURCE_INSTANCE_ZONE
is the zone that contains the source instance.SOURCE_DISK
is the name of a source-instance disk that you want to override within the template.INSTANTIATE_OPTIONS
specifies whether to include the disk and which image to use. Valid values depend on the type of disk:source-image
orsource-image-family
(valid only for boot and other persistent read/write disks). Specify this option if you want to use the same source image or source image family that was used to create the disk in the source VM instance.custom-image
(valid only for boot and other persistent read/write disks). If you want to retain applications and settings from the source VMs in your instance template, you can create a custom image and then specify it when you create the template. If specified, then provide the path or URL for the custom image, as shown in the following example. Alternatively, you can specify an image family using the following format:--configure-disk=device-name=DATA_DISK_NAME,instantiate-from=custom-image,
custom-image=projects/PROJECT_ID/global/images/family/IMAGE_FAMILY_NAMEattach-read-only
(valid only for read-only disks).blank
(valid only for non-boot persistent disks and local SSDs). If specified, then, when the template is used to create a new instance, the disk is created unformatted. You must format and mount the disk in a startup script before you can use it in a scalable setup.do-not-include
(valid only for non-boot persistent disks and read-only disks).
AUTO_DELETE
specifies whether the disk is auto-deleted when the instance is deleted. Valid values are:false
,no
,true
, andyes
.
For example, the following command creates an instance template based on
my-source-instance
, with the option to use the original image from
data-disk-a
, but set auto-delete to true
and replace data-disk-b
with a custom image.
gcloud compute instance-templates create my-instance-template \ --source-instance=my-source-instance \ --configure-disk=device-name=data-disk-a,instantiate-from=source-image, \ auto-delete=true --configure-disk=device-name=data-disk-b,instantiate-from=custom-image, \ custom-image=projects/cps-cloud/global/images/cos-89-16108-403-15
API
Call the
instanceTemplates.insert
method
and specify the sourceInstance
field. To override how the source
instance's disks are defined, add one or more diskConfigs
fields.
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates { "name": "INSTANCE_TEMPLATE_NAME", "sourceInstance": "zones/SOURCE_INSTANCE_ZONE/instances/SOURCE_INSTANCE", "sourceInstanceParams": { "diskConfigs": [ { "deviceName": "SOURCE_DISK", "instantiateFrom": "INSTANTIATE_OPTIONS", "autoDelete": false } ] } }
Replace the following:
PROJECT_ID
: the project ID for the requestINSTANCE_TEMPLATE_NAME
: the name for the new templateSOURCE_INSTANCE_ZONE
: the zone of the source instanceSOURCE_INSTANCE
: the name of the source instance to use as a model for this instance templateSOURCE_DISK
: the name of a source-instance disk that you want to override within the templateINSTANTIATE_OPTIONS
: specifies whether to include the disk and which image to useValid values depend on the type of disk:
source-image
orsource-image-family
(valid only for boot and other persistent read/write disks).custom-image
(valid only for boot and other persistent read/write disks). If you want to retain applications and settings from the source VMs in your instance template, you can create a custom image and then specify it when you create the template. If specified, then provide the path or URL for the custom image, as shown in the following example. Alternatively, you can specify an image family using the following format:--configure-disk=device-name=DATA_DISK_NAME,instantiate-from=custom-image,
custom-image=projects/PROJECT_ID/global/images/family/IMAGE_FAMILY_NAMEattach-read-only
(valid only for read-only disks).blank
(valid only for non-boot persistent disks and local SSDs). If specified, then, when the template is used to create a new instance, the disk is created unformatted. You must format and mount the disk in a startup script before you can use it in a scalable setup.do-not-include
(valid only for non-boot persistent disks and read-only disks).
The following example creates a new instance template based on
my-source-instance
. In the instance template, the image for data-disk-a
is replaced with projects/cos-cloud/global/images/cos-89-16108-403-15
.
POST https://compute.googleapis.com/compute/v1/projects/my_project/global/instanceTemplates { "name": "my-instance-template", "sourceInstance": "zones/us-central1-a/instances/my-source-instance", "sourceInstanceParams": { "diskConfigs": [ { "deviceName": "data-disk-a", "instantiateFrom": "custom-image", "customImage": "projects/cos-cloud/global/images/cos-89-16108-403-15" } ] } }
Go
Java
Node.js
Python
The following table shows how the options for overriding disks are defined in the template.
Disk type | Options |
---|---|
Boot disk |
|
Other read/write persistent disks |
|
Read-only disk(s) |
|
Local SSD(s) |
|
For each disk, you can also override the auto-delete
attribute to specify
whether the disk should be deleted when its associated instance is
deleted.
By default, if no override options are specified, the disk configuration in the template matches the source instance.
Create an instance template based on an existing template
You cannot update an existing instance template. But, if an instance template goes out of date or if you need to make changes, you can create another one with similar properties by using the console.
Go to the Instance templates page.
Click on the instance template that you want to copy and update.
Click Create similar.
Update the configuration in the new template.
Click Create.
Create an instance template with a container image
You can specify a container image in an instance template. By default, Compute Engine also includes in the template a Container-Optimized OS image with Docker installed. When you use the template to create a new instance, the container is launched automatically as the instance starts up.
Console
Go to the Instance templates page.
Click Create instance template.
In the Container section, click Deploy Container.
In the Configure container dialog, specify the Container image to use.
- You can specify an image from Container Registry
or Artifact Registry.
For example:
gcr.io/cloud-marketplace/google/nginx1:TAG
, where TAG is the tag defined for a specific version of NGINX container image available on Google Cloud Marketplace.us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
selects a samplehello-app
image stored in Artifact Registry.
- If you use a container image from Docker Hub, always specify the
full Docker image name. For example, specify the following image name
to deploy an Apache container image:
docker.io/httpd:2.4
.
- You can specify an image from Container Registry
or Artifact Registry.
For example:
Optionally, click Advanced container options. For more information, see Configuring options to run your Container.
Click Create.
gcloud
Use the
gcloud compute instance-templates create-with-container
command:
gcloud compute instance-templates create-with-container INSTANCE_TEMPLATE_NAME \ --container-image=CONTAINER_IMAGE
Replace the following:
INSTANCE_TEMPLATE_NAME
: The name of the template to create.CONTAINER_IMAGE
: The full name of the container image to use.
For example, the following command creates a new instance template named
nginx-vm
. A VM instance created from this template launches and
runs the container image, gcr.io/cloud-marketplace/google/nginx1:TAG
,
when the VM starts.
gcloud compute instance-templates create-with-container nginx-vm \ --container-image=gcr.io/cloud-marketplace/google/nginx1:TAG
Replace TAG
with the tag defined for a specific
version of NGINX container image available on Google Cloud Marketplace.
You can also configure options to run your container.
Create an instance template that specifies a subnet
gcloud
Use the --subnet
flag to place instances that are created from the template
into the subnet of your choice. The --subnet
flag requires the --region
flag.
gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \ --region=REGION \ --subnet=SUBNET_NAME_OR_URL
Replace the following:
INSTANCE_TEMPLATE_NAME
: the name for the instance templateREGION
: the region of the subnetSUBNET_NAME_OR_URL
: either the name of the subnet or its URL
The following example creates a template called template-qa
that only creates
instances in the subnet-us-qa
subnet.
gcloud compute instance-templates create template-qa \
--region=us-central1 \
--subnet=subnet-us-qa
Created [https://compute.googleapis.com/compute/latest/projects/PROJECT_ID/global/instanceTemplates/template-qa].
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP
template-qa e2-standard-2 2019-12-23T20:34:00.791-07:00