Create a VM instance with a custom hostname Stay organized with collections Save and categorize content based on your preferences.
When you create a virtual machine (VM) instance, Google Cloudcreates an internalDNS name from the VM name.Unless you specify a custom hostname, Google Cloud uses the automaticallycreated internal DNS name as the hostname it provides to the VM.
You can create a VM with a custom hostname by specifying any fully qualified DNSname. Custom hostnames are useful to maintain conventions or to supportrequirements for applications that expect a particular hostname.
Even when you specify a custom hostname, Google Cloud creates theCompute Engine internal DNS name. You can connect to your VM by usingthis automatically created internal DNS record. The internal DNS record resolvesto the internal DNS name and not the custom hostname. With custom hostnames,you still need to create a corresponding DNS record in the appropriate zone,for example, by using Cloud DNS.
Before you begin
- If you haven't already, set upauthentication. Authentication verifies your identity for access to Google Cloud services and APIs. To run code or samples from a local development environment, you can authenticate to Compute Engine by selecting one of the following options:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
Install the Google Cloud CLI. After installation,initialize the Google Cloud CLI by running the following command:
gcloudinit
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Note: If you installed the gcloud CLI previously, make sure you have the latest version by runninggcloud components update.- Set a default region and zone.
Terraform
To use the Terraform samples on this page in a local development environment, install and initialize the gcloud CLI, and then set up Application Default Credentials with your user credentials.
Install the Google Cloud CLI.
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Note: If you installed the gcloud CLI previously, make sure you have the latest version by runninggcloud components update.If you're using a local shell, then create local authentication credentials for your user account:
gcloudauthapplication-defaultlogin
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
For more information, see Set up authentication for a local development environment.
Go
To use the Go samples on this page in a local development environment, install and initialize the gcloud CLI, and then set up Application Default Credentials with your user credentials.
Install the Google Cloud CLI.
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Note: If you installed the gcloud CLI previously, make sure you have the latest version by runninggcloud components update.If you're using a local shell, then create local authentication credentials for your user account:
gcloudauthapplication-defaultlogin
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
For more information, see Set up authentication for a local development environment.
Java
To use the Java samples on this page in a local development environment, install and initialize the gcloud CLI, and then set up Application Default Credentials with your user credentials.
Install the Google Cloud CLI.
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Note: If you installed the gcloud CLI previously, make sure you have the latest version by runninggcloud components update.If you're using a local shell, then create local authentication credentials for your user account:
gcloudauthapplication-defaultlogin
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
For more information, see Set up authentication for a local development environment.
Node.js
To use the Node.js samples on this page in a local development environment, install and initialize the gcloud CLI, and then set up Application Default Credentials with your user credentials.
Install the Google Cloud CLI.
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Note: If you installed the gcloud CLI previously, make sure you have the latest version by runninggcloud components update.If you're using a local shell, then create local authentication credentials for your user account:
gcloudauthapplication-defaultlogin
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
For more information, see Set up authentication for a local development environment.
Python
To use the Python samples on this page in a local development environment, install and initialize the gcloud CLI, and then set up Application Default Credentials with your user credentials.
Install the Google Cloud CLI.
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Note: If you installed the gcloud CLI previously, make sure you have the latest version by runninggcloud components update.If you're using a local shell, then create local authentication credentials for your user account:
gcloudauthapplication-defaultlogin
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
For more information, see Set up authentication for a local development environment.
REST
To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.
Install the Google Cloud CLI.
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
Note: If you installed the gcloud CLI previously, make sure you have the latest version by runninggcloud components update.For more information, seeAuthenticate for using REST in the Google Cloud authentication documentation.
Required roles
To get the permissions that you need to create VM with a custom hostname, ask your administrator to grant you theCompute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM role on the project. For more information about granting roles, seeManage access to projects, folders, and organizations.
This predefined role contains the permissions required to create VM with a custom hostname. To see the exact permissions that are required, expand theRequired permissions section:
Required permissions
The following permissions are required to create VM with a custom hostname:
compute.instances.createon the project- To use a custom image to create the VM:
compute.images.useReadOnlyon the image - To use a snapshot to create the VM:
compute.snapshots.useReadOnlyon the snapshot - To use an instance template to create the VM:
compute.instanceTemplates.useReadOnlyon the instance template - To specify a subnet for your VM:
compute.subnetworks.useon the project or on the chosen subnet - To specify a static IP address for the VM:
compute.addresses.useon the project - To assign an external IP address to the VM when using a VPC network:
compute.subnetworks.useExternalIpon the project or on the chosen subnet - To assign alegacy network to the VM:
compute.networks.useon the project - To assign an external IP address to the VM when using a legacy network:
compute.networks.useExternalIpon the project - To set VM instance metadata for the VM:
compute.instances.setMetadataon the project - To set tags for the VM:
compute.instances.setTagson the VM - To set labels for the VM:
compute.instances.setLabelson the VM - To set a service account for the VM to use:
compute.instances.setServiceAccounton the VM - To create a new disk for the VM:
compute.disks.createon the project - To attach an existing disk in read-only or read-write mode:
compute.disks.useon the disk - To attach an existing disk in read-only mode:
compute.disks.useReadOnlyon the disk
You might also be able to get these permissions withcustom roles or otherpredefined roles.
Limitations
You must manually configure the DNS record for your custom hostname. Customhostnames are not resolved by the automatically created records providedbyCompute Engine internalDNS. You can use any of thefollowing to host the DNS record for the custom hostname:
any other public DNS name server
You cannot change a custom hostname after you have created the VM.
Supported operating systems
Custom hostnames are set in the guest environment using hook scripts whichintegrate with the guest networking software. Linux operating systems thatdon't have a script to integrate with the guest network software might not havethe correct hostname.
For the full list of operating system versions that support customhostnames, check the guest environment support inOperating system details.
Naming convention
Custom hostnames must conform toRFC 1035 requirementsfor valid hostnames. To meet these requirements, custom hostnames must meet thefollowing format specifications:
- The hostname contains at least two labels described as follows:
- Each label contains regular expressions that includes only these characters:
[a-z]([-a-z0-9]*[a-z0-9])?. - Labels are concatenated with a dot.
- Each label is 1-63 characters long.
- Each label contains regular expressions that includes only these characters:
- The hostname does not exceed 253 characters.
Not valid: contains a single label
my-host1234
Valid: contains three labels concatenated with dots
my-host1234.example.com
Create a VM with a custom hostname
Console
In the Google Cloud console, go to theCreate an instance page.
Specify aName for your VM. For more information, seeResource naming convention.
Expand theAdvanced options section, and then do thefollowing:
- Expand theNetworking section.
- In theHostname field, specify the custom hostname.
Make additional VM customizations, as needed.
To create and start the VM, clickCreate.
Next step: Configure your DNS records. For more information,seeManaging records.
gcloud
Using the Google Cloud CLI, follow the instructions tocreate an instance from an imageor asnapshot,add the--hostname flag, and use thegcloud compute instances createcommand as follows:
gcloud compute instances createVM_NAME \ --hostname=HOST_NAME
Replace the following:
VM_NAME: thename of the VMHOST_NAME: the fully qualified domain hostnamethat you want to assign
For example, to create a VMmyinstance with the customhostnametest.example.com, run the following command:
gcloud compute instances create myinstance \ --hostname=test.example.com
Next step: Configure your DNS records. For more information,seeManaging records.
Terraform
You can use aTerraformresourceto create an instance with a custom hostname by using thehostname argument.
resource "google_compute_instance" "custom_hostname_instance" { name = "custom-hostname-instance-name" machine_type = "f1-micro" zone = "us-central1-c" # Set a custom hostname below hostname = "hashicorptest.com" boot_disk { initialize_params { image = "debian-cloud/debian-11" } } network_interface { # A default network is created for all GCP projects network = "default" access_config { } }}- In the Google Cloud console, go to theVM instances page.
- ClickCreate instance.
- Specify the parameters you want.
- At the top or bottom of the page, clickEquivalent code, and then click theTerraform tab to view the Terraform code.
Next step: Configure your DNS records. For more information,seeManaging records.
Go
import("context""fmt""io"compute"cloud.google.com/go/compute/apiv1"computepb"cloud.google.com/go/compute/apiv1/computepb""google.golang.org/protobuf/proto")// createInstanceWithCustomHostname creates an instance with custom hostname.funccreateInstanceWithCustomHostname(wio.Writer,projectID,zone,instanceName,hostname,machineType,sourceImage,networkNamestring)error{// projectID := "your_project_id"// zone := "europe-central2-b"// instanceName := "your_instance_name"// hostname := "host.example.com" // Custom hostnames must conform to RFC 1035 requirements for valid hostnames.// machineType := "n1-standard-1"// sourceImage := "projects/debian-cloud/global/images/family/debian-12"// networkName := "global/networks/default"ctx:=context.Background()instancesClient,err:=compute.NewInstancesRESTClient(ctx)iferr!=nil{returnfmt.Errorf("NewInstancesRESTClient: %w",err)}deferinstancesClient.Close()req:=&computepb.InsertInstanceRequest{Project:projectID,Zone:zone,InstanceResource:&computepb.Instance{Name:proto.String(instanceName),// Custom hostnames are not resolved by the automatically created records// provided by Compute Engine internal DNS.// You must manually configure the DNS record for your custom hostname.Hostname:proto.String(hostname),Disks:[]*computepb.AttachedDisk{{// Describe the size and source image of the boot disk to attach to the instance.InitializeParams:&computepb.AttachedDiskInitializeParams{DiskSizeGb:proto.Int64(10),SourceImage:proto.String(sourceImage),},AutoDelete:proto.Bool(true),Boot:proto.Bool(true),Type:proto.String(computepb.AttachedDisk_PERSISTENT.String()),},},MachineType:proto.String(fmt.Sprintf("zones/%s/machineTypes/%s",zone,machineType)),NetworkInterfaces:[]*computepb.NetworkInterface{{// Use the network interface provided in the networkName argument.Name:proto.String(networkName),},},},}op,err:=instancesClient.Insert(ctx,req)iferr!=nil{returnfmt.Errorf("unable to create instance: %w",err)}iferr=op.Wait(ctx);err!=nil{returnfmt.Errorf("unable to wait for the operation: %w",err)}fmt.Fprintf(w,"Instance created\n")returnnil}Java
importcom.google.cloud.compute.v1.AttachedDisk;importcom.google.cloud.compute.v1.AttachedDiskInitializeParams;importcom.google.cloud.compute.v1.InsertInstanceRequest;importcom.google.cloud.compute.v1.Instance;importcom.google.cloud.compute.v1.InstancesClient;importcom.google.cloud.compute.v1.NetworkInterface;importcom.google.cloud.compute.v1.Operation;importjava.io.IOException;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;publicclassCreateInstanceWithCustomHostname{publicstaticvoidmain(String[]args)throwsIOException,ExecutionException,InterruptedException,TimeoutException{// TODO(developer): Replace these variables before running the sample.// hostName: Custom hostname of the new VM instance.// * Custom hostnames must conform to RFC 1035 requirements for valid hostnames.Stringproject="your-project-id";Stringzone="zone-name";// eg: "us-central1-a"StringinstanceName="instance-name";StringhostName="host.example.com";createInstanceWithCustomHostname(project,zone,instanceName,hostName);}// Creates an instance with custom hostname.publicstaticvoidcreateInstanceWithCustomHostname(StringprojectId,Stringzone,StringinstanceName,StringhostName)throwsIOException,ExecutionException,InterruptedException,TimeoutException{// machineType - Machine type for the VM instance specified in the following format:// * "zones/{zone}/machineTypes/{type_name}". For example:// * "zones/europe-west3-c/machineTypes/f1-micro"// * You can find the list of available machine types by using this gcloud command:// * $ gcloud compute machine-types list// sourceImage - Path of the disk image you want to use for your boot// * disk. This image can be one of the public images// * eg: "projects/...// * or a private image you have access to.// * You can check the list of available public images using:// * $ gcloud compute images list// networkName - Name of the network you want the new instance to use.// * For example: global/networks/default - if you want to use the default network.StringmachineType="n1-standard-1";StringsourceImage=String.format("projects/%s/global/images/family/%s","debian-cloud","debian-11");StringnetworkName="global/networks/default";try(InstancesClientinstancesClient=InstancesClient.create()){System.out.printf("Creating the %s instance in %s with hostname %s...",instanceName,zone,hostName);AttachedDiskdisk=AttachedDisk.newBuilder().setBoot(true).setAutoDelete(true).setType(AttachedDisk.Type.PERSISTENT.toString()).setInitializeParams(// Describe the size and source image of the boot disk to attach to the instance.AttachedDiskInitializeParams.newBuilder().setSourceImage(sourceImage).setDiskSizeGb(10).build()).build();// Use the network interface provided in the networkName argument.NetworkInterfacenetworkInterface=NetworkInterface.newBuilder().setName(networkName).build();InstanceinstanceResource=Instance.newBuilder()// Custom hostnames are not resolved by the automatically created records// provided by Compute Engine internal DNS.// You must manually configure the DNS record for your custom hostname..setName(instanceName).setHostname(hostName).addDisks(disk).setMachineType(String.format("zones/%s/machineTypes/%s",zone,machineType)).addNetworkInterfaces(networkInterface).build();InsertInstanceRequestrequest=InsertInstanceRequest.newBuilder().setProject(projectId).setZone(zone).setInstanceResource(instanceResource).build();// Wait for the create operation to complete.Operationresponse=instancesClient.insertAsync(request).get(3,TimeUnit.MINUTES);;if(response.hasError()){System.out.printf("Instance creation failed for instance: %s ; Response: %s ! ! ",instanceName,response);return;}System.out.printf("Instance created : %s",instanceName);System.out.printf("Operation Status for instance %s is %s: ",instanceName,response.getStatus());}}}Node.js
/** * 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 hostname = 'host.example.com'// const machineType = 'n1-standard-1';// const sourceImage = 'projects/debian-cloud/global/images/family/debian-11';// const networkName = 'global/networks/default';constcompute=require('@google-cloud/compute');// Create a new instance with the values provided above in the specified project and zone.asyncfunctioncreateInstanceWithCustomHostname(){constinstancesClient=newcompute.InstancesClient();console.log(`Creating the${instanceName} instance in${zone} with hostname${hostname}...`);const[response]=awaitinstancesClient.insert({instanceResource:{name:instanceName,// Custom hostnames are not resolved by the automatically created records// provided by Compute Engine internal DNS.// You must manually configure the DNS record for your custom hostname.hostname,disks:[{// Describe the size and source image of the boot disk to attach to the instance.initializeParams:{diskSizeGb:'10',sourceImage,},autoDelete:true,boot:true,type:'PERSISTENT',},],machineType:`zones/${zone}/machineTypes/${machineType}`,networkInterfaces:[{// Use the network interface provided in the networkName argument.name:networkName,},],},project:projectId,zone,});letoperation=response.latestResponse;constoperationsClient=newcompute.ZoneOperationsClient();// Wait for the create operation to complete.while(operation.status!=='DONE'){[operation]=awaitoperationsClient.wait({operation:operation.name,project:projectId,zone:operation.zone.split('/').pop(),});}console.log('Instance created.');}createInstanceWithCustomHostname();Python
from__future__importannotationsimportreimportsysfromtypingimportAnyimportwarningsfromgoogle.api_core.extended_operationimportExtendedOperationfromgoogle.cloudimportcompute_v1defget_image_from_family(project:str,family:str)->compute_v1.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. Returns: An Image object. """image_client=compute_v1.ImagesClient()# List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-detailsnewest_image=image_client.get_from_family(project=project,family=family)returnnewest_imagedefdisk_from_image(disk_type:str,disk_size_gb:int,boot:bool,source_image:str,auto_delete:bool=True,)->compute_v1.AttachedDisk:""" Create an AttachedDisk object to be used in VM instance creation. Uses an image as the source for the new disk. Args: disk_type: 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" disk_size_gb: size of the new disk in gigabytes boot: boolean flag indicating whether this disk should be used as a boot disk of an instance source_image: 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}" auto_delete: boolean flag indicating whether this disk should be deleted with the VM that uses it Returns: AttachedDisk object configured to be created using the specified image. """boot_disk=compute_v1.AttachedDisk()initialize_params=compute_v1.AttachedDiskInitializeParams()initialize_params.source_image=source_imageinitialize_params.disk_size_gb=disk_size_gbinitialize_params.disk_type=disk_typeboot_disk.initialize_params=initialize_params# Remember to set auto_delete to True if you want the disk to be deleted when you delete# your VM instance.boot_disk.auto_delete=auto_deleteboot_disk.boot=bootreturnboot_diskdefwait_for_extended_operation(operation:ExtendedOperation,verbose_name:str="operation",timeout:int=300)->Any:""" Waits for the extended (long-running) operation to complete. If the operation is successful, it will return its result. If the operation ends with an error, an exception will be raised. If there were any warnings during the execution of the operation they will be printed to sys.stderr. Args: operation: a long-running operation you want to wait on. verbose_name: (optional) a more verbose name of the operation, used only during error and warning reporting. timeout: how long (in seconds) to wait for operation to finish. If None, wait indefinitely. Returns: Whatever the operation.result() returns. Raises: This method will raise the exception received from `operation.exception()` or RuntimeError if there is no exception set, but there is an `error_code` set for the `operation`. In case of an operation taking longer than `timeout` seconds to complete, a `concurrent.futures.TimeoutError` will be raised. """result=operation.result(timeout=timeout)ifoperation.error_code:print(f"Error during{verbose_name}: [Code:{operation.error_code}]:{operation.error_message}",file=sys.stderr,flush=True,)print(f"Operation ID:{operation.name}",file=sys.stderr,flush=True)raiseoperation.exception()orRuntimeError(operation.error_message)ifoperation.warnings:print(f"Warnings during{verbose_name}:\n",file=sys.stderr,flush=True)forwarninginoperation.warnings:print(f" -{warning.code}:{warning.message}",file=sys.stderr,flush=True)returnresultdefcreate_instance(project_id:str,zone:str,instance_name:str,disks:list[compute_v1.AttachedDisk],machine_type:str="n1-standard-1",network_link:str="global/networks/default",subnetwork_link:str=None,internal_ip:str=None,external_access:bool=False,external_ipv4:str=None,accelerators:list[compute_v1.AcceleratorConfig]=None,preemptible:bool=False,spot:bool=False,instance_termination_action:str="STOP",custom_hostname:str=None,delete_protection:bool=False,)->compute_v1.Instance:""" Send an instance creation request to the Compute Engine API and wait for it to complete. Args: project_id: 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" instance_name: 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. machine_type: 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" network_link: 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. subnetwork_link: name of the subnetwork you want the new instance to use. This value uses the following format: "regions/{region}/subnetworks/{subnetwork_name}" internal_ip: internal IP address you want to assign to the new instance. By default, a free address from the pool of available internal IP addresses of used subnet will be used. external_access: boolean flag indicating if the instance should have an external IPv4 address assigned. external_ipv4: external IPv4 address to be assigned to this instance. If you specify an external IP address, it must live in the same region as the zone of the instance. This setting requires `external_access` to be set to True to work. accelerators: a list of AcceleratorConfig objects describing the accelerators that will be attached to the new instance. preemptible: boolean value indicating if the new instance should be preemptible or not. Preemptible VMs have been deprecated and you should now use Spot VMs. spot: boolean value indicating if the new instance should be a Spot VM or not. instance_termination_action: What action should be taken once a Spot VM is terminated. Possible values: "STOP", "DELETE" custom_hostname: Custom hostname of the new VM instance. Custom hostnames must conform to RFC 1035 requirements for valid hostnames. delete_protection: boolean value indicating if the new virtual machine should be protected against deletion or not. Returns: Instance object. """instance_client=compute_v1.InstancesClient()# Use the network interface provided in the network_link argument.network_interface=compute_v1.NetworkInterface()network_interface.network=network_linkifsubnetwork_link:network_interface.subnetwork=subnetwork_linkifinternal_ip:network_interface.network_i_p=internal_ipifexternal_access:access=compute_v1.AccessConfig()access.type_=compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.nameaccess.name="External NAT"access.network_tier=access.NetworkTier.PREMIUM.nameifexternal_ipv4:access.nat_i_p=external_ipv4network_interface.access_configs=[access]# Collect information into the Instance object.instance=compute_v1.Instance()instance.network_interfaces=[network_interface]instance.name=instance_nameinstance.disks=disksifre.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$",machine_type):instance.machine_type=machine_typeelse:instance.machine_type=f"zones/{zone}/machineTypes/{machine_type}"instance.scheduling=compute_v1.Scheduling()ifaccelerators:instance.guest_accelerators=acceleratorsinstance.scheduling.on_host_maintenance=(compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name)ifpreemptible:# Set the preemptible settingwarnings.warn("Preemptible VMs are being replaced by Spot VMs.",DeprecationWarning)instance.scheduling=compute_v1.Scheduling()instance.scheduling.preemptible=Trueifspot:# Set the Spot VM settinginstance.scheduling.provisioning_model=(compute_v1.Scheduling.ProvisioningModel.SPOT.name)instance.scheduling.instance_termination_action=instance_termination_actionifcustom_hostnameisnotNone:# Set the custom hostname for the instanceinstance.hostname=custom_hostnameifdelete_protection:# Set the delete protection bitinstance.deletion_protection=True# Prepare the request to insert an instance.request=compute_v1.InsertInstanceRequest()request.zone=zonerequest.project=project_idrequest.instance_resource=instance# Wait for the create operation to complete.print(f"Creating the{instance_name} instance in{zone}...")operation=instance_client.insert(request=request)wait_for_extended_operation(operation,"instance creation")print(f"Instance{instance_name} created.")returninstance_client.get(project=project_id,zone=zone,instance=instance_name)defcreate_instance_custom_hostname(project_id:str,zone:str,instance_name:str,hostname:str)->compute_v1.Instance:""" Create a new VM instance with Debian 10 operating system and a custom hostname. Args: project_id: 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" instance_name: name of the new virtual machine (VM) instance. hostname: the hostname you want to use for the new instance. Returns: Instance object. """newest_debian=get_image_from_family(project="debian-cloud",family="debian-11")disk_type=f"zones/{zone}/diskTypes/pd-standard"disks=[disk_from_image(disk_type,10,True,newest_debian.self_link)]instance=create_instance(project_id,zone,instance_name,disks,custom_hostname=hostname)returninstanceREST
Follow the API instructions tocreate an instance from an imageor asnapshot,and specify thehostname field in the request body.
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances{ "name": "VM_NAME", "hostname": "HOST_NAME", ...}Replace the following:
Verify the custom hostname
For Linux VMs, you can verify the hostname by running thehostname -f command on the VM.
You can also verify the custom hostname by using the Google Cloud console or theGoogle Cloud CLI.
Console
To view the custom hostname for your VM, go to theVM instances page.
Click the instance name to open theVM instance details page.
Review theHostname section. TheHostname field is visible onlyif acustom hostname is set.

gcloud
To view the custom hostname for your VMusinggcloud compute, use theinstances describesub-command with a--format flag to filter the output. ReplaceVM_NAME with the name of the VM.
gcloud compute instances describeVM_NAME \ --format='get(hostname)'
For example, to view the custom hostname for a VM namedmyinstance, run the following command.
gcloud compute instances describe myinstance \ --format='get(hostname)'
The output might resemble the following:
test.example.com
If acustom hostname is not set, the outputfor this command is blank.
What's next
Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-12-15 UTC.