Linux
Windows
仮想マシン(VM)インスタンスを作成すると、Google Cloud は VM 名から内部 DNS 名を作成します。カスタムホスト名を指定しない限り、Google Cloud は自動的に作成された内部 DNS 名を VM に提供するホスト名として使用します。
カスタムホスト名を使用する VM を作成するには、完全修飾 DNS 名を指定します。カスタムホスト名は、命名規則を維持する場合や特定のホスト名を待ち受けるアプリケーションの要件をサポートする場合に役立ちます。
カスタムホスト名を指定しても、Google Cloud は Compute Engine の内部 DNS 名を作成します。自動的に作成された内部 DNS レコードを使用して VM に接続できます。内部 DNS レコードは、カスタムホスト名ではなく内部 DNS 名に解決されます。カスタムホスト名を使用する場合、該当するゾーンに対応する DNS レコードを作成する必要があります(たとえば、Cloud DNS を使用します)。
始める前に
必要なロール
カスタムホスト名を持つ VM を作成するために必要な権限を取得するには、プロジェクトに対する Compute インスタンス管理者(v1)(roles/compute.instanceAdmin.v1
)IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセス権の管理をご覧ください。
この事前定義ロールには、カスタムホスト名を持つ VM を作成するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
カスタムホスト名を持つ VM を作成するには、次の権限が必要です。
- プロジェクトに対する
compute.instances.create
-
カスタム イメージを使用して VM を作成する場合: イメージに対する
compute.images.useReadOnly
-
スナップショットを使用して VM を作成する場合: スナップショットに対する
compute.snapshots.useReadOnly
-
インスタンス テンプレートを使用して VM を作成する場合: インスタンス テンプレートに対する
compute.instanceTemplates.useReadOnly
- VM にレガシー ネットワークを割り当てる場合: プロジェクトに対する
compute.networks.use
-
VM の静的 IP アドレスを指定する場合: プロジェクトに対する
compute.addresses.use
-
レガシー ネットワークを使用する際に VM に外部 IP アドレスを割り当てる場合: プロジェクトに対する
compute.networks.useExternalIp
- VM のサブネットを指定する場合: プロジェクトまたは選択したサブネットに対する
compute.subnetworks.use
-
VPC ネットワークの使用時に VM に外部 IP アドレスを割り当てる場合: プロジェクトまたは選択したサブネットに対する
compute.subnetworks.useExternalIp
-
VM の VM インスタンス メタデータを設定する場合: プロジェクトに対する
compute.instances.setMetadata
-
VM にタグを設定する場合: VM に対する
compute.instances.setTags
-
VM にラベルを設定する場合: VM に対する
compute.instances.setLabels
-
VM が使用するサービス アカウントを設定する場合: VM に対する
compute.instances.setServiceAccount
-
VM 用の新しいディスクを作成する場合: プロジェクトに対する
compute.disks.create
-
既存のディスクを読み取り専用モードまたは読み取り / 書き込みモードでアタッチする場合: ディスクに対する
compute.disks.use
-
既存のディスクを読み取り専用モードでアタッチする場合: ディスクに対する
compute.disks.useReadOnly
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
制限事項
命名規則
カスタムホスト名は、有効なホスト名に関する RFC 1035 の要件を満たしている必要があります。これらの要件を満たすには、カスタムホスト名が次の形式仕様を満たす必要があります。
- ホスト名には、次に示すような 2 つ以上のラベルが含まれています。
- 各ラベルには次の文字のみを使用した正規表現が含まれます。
[a-z]([-a-z0-9]*[a-z0-9])?
。
- ラベルはドットで連結されます。
- 各ラベルの長さは 1~63 文字です。
- ホスト名は 253 文字以内です。
無効: ラベルが 1 つしか含まれていない
my-host1234
有効: ドットで連結された 3 つのラベルが含まれている
my-host1234.example.com
カスタムホスト名で VM を作成する
コンソール
Google Cloud コンソールで、[インスタンスの作成] ページに移動します。
[インスタンスの作成] に移動
VM の名前を指定します。詳しくは、リソースの命名規則をご覧ください。
[詳細オプション] セクションを開き、次の操作を行います。
- [ネットワーキング] セクションを開きます。
- [ホスト名] フィールドに、カスタムホスト名を指定します。
必要に応じて、VM をさらにカスタマイズします。
VM を作成して起動するには、[作成] をクリックします。
次のステップ: DNS レコードを構成する。詳しくはレコードの管理をご覧ください。
gcloud
Google Cloud CLI を使用して、イメージまたはスナップショットからインスタンスを作成するか、--hostname
フラグを追加して、次のように gcloud compute instances create
コマンドを実行します。
gcloud compute instances create VM_NAME \
--hostname=HOST_NAME
次のように置き換えます。
VM_NAME
: VM の名前
HOST_NAME
: 割り当てる完全修飾ドメインホスト名
たとえば、カスタムホスト名 test.example.com
を指定して VM myinstance
を作成するには、次のコマンドを実行します。
gcloud compute instances create myinstance \
--hostname=test.example.com
次のステップ: DNS レコードを構成する。詳しくはレコードの管理をご覧ください。
Terraform リソースで hostname
引数を使用すると、カスタムホスト名を持つインスタンスを作成できます。
Terraform コードを生成するには、Google Cloud コンソールの同等のコード コンポーネントを使用します。
- Google Cloud コンソールで [VM インスタンス] ページに移動します。
[VM インスタンス] に移動
- [インスタンスを作成] をクリックします。
- 必要なパラメータを指定します。
- ページの上部または下部で [同等のコード] をクリックし、[Terraform] タブをクリックして Terraform コードを表示します。
次のステップ: DNS レコードを構成する。詳しくはレコードの管理をご覧ください。
Python
from __future__ import annotations
import re
import sys
from typing import Any
import warnings
from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1
def get_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-details
newest_image = image_client.get_from_family(project=project, family=family)
return newest_image
def disk_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_image
initialize_params.disk_size_gb = disk_size_gb
initialize_params.disk_type = disk_type
boot_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_delete
boot_disk.boot = boot
return boot_disk
def wait_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)
if operation.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)
raise operation.exception() or RuntimeError(operation.error_message)
if operation.warnings:
print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
for warning in operation.warnings:
print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)
return result
def create_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_link
if subnetwork_link:
network_interface.subnetwork = subnetwork_link
if internal_ip:
network_interface.network_i_p = internal_ip
if external_access:
access = compute_v1.AccessConfig()
access.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name
access.name = "External NAT"
access.network_tier = access.NetworkTier.PREMIUM.name
if external_ipv4:
access.nat_i_p = external_ipv4
network_interface.access_configs = [access]
# Collect information into the Instance object.
instance = compute_v1.Instance()
instance.network_interfaces = [network_interface]
instance.name = instance_name
instance.disks = disks
if re.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$", machine_type):
instance.machine_type = machine_type
else:
instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"
instance.scheduling = compute_v1.Scheduling()
if accelerators:
instance.guest_accelerators = accelerators
instance.scheduling.on_host_maintenance = (
compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name
)
if preemptible:
# Set the preemptible setting
warnings.warn(
"Preemptible VMs are being replaced by Spot VMs.", DeprecationWarning
)
instance.scheduling = compute_v1.Scheduling()
instance.scheduling.preemptible = True
if spot:
# Set the Spot VM setting
instance.scheduling.provisioning_model = (
compute_v1.Scheduling.ProvisioningModel.SPOT.name
)
instance.scheduling.instance_termination_action = instance_termination_action
if custom_hostname is not None:
# Set the custom hostname for the instance
instance.hostname = custom_hostname
if delete_protection:
# Set the delete protection bit
instance.deletion_protection = True
# Prepare the request to insert an instance.
request = compute_v1.InsertInstanceRequest()
request.zone = zone
request.project = project_id
request.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.")
return instance_client.get(project=project_id, zone=zone, instance=instance_name)
def create_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
)
return instance
REST
API の手順に沿って、イメージからインスタンスを作成するか、スナップショットから作成して、リクエスト本文で hostname
フィールドを指定します。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
"name": "VM_NAME",
"hostname": "HOST_NAME",
...
}
次のように置き換えます。
PROJECT_ID
: プロジェクト ID
ZONE
: VM を作成するゾーン
VM_NAME
: VM の名前
HOST_NAME
: 割り当てる完全修飾ドメインホスト名
カスタムホスト名を確認する
Linux VM の場合、VM で hostname -f
コマンドを実行してホスト名を確認します。
Google Cloud コンソールまたは Google Cloud CLI を使用して、カスタムホスト名の確認することもできます。
コンソール
VM のカスタムホスト名を表示するには、[VM インスタンス] ページに移動します。
[VM インスタンス] に移動
インスタンス名をクリックして、[VM インスタンスの詳細] ページを開きます。
[ホスト名] セクションを確認します。[ホスト名] フィールドは、カスタムホスト名が設定されている場合にのみ表示されます。
gcloud
gcloud compute
を使用して VM のカスタムホスト名を表示するには、--format
フラグを指定して instances describe
サブコマンドを実行し、出力をフィルタリングします。VM_NAME
は VM の名前に置き換えます。
gcloud compute instances describe VM_NAME \
--format='get(hostname)'
たとえば、myinstance
という名前の VM のカスタムホスト名を表示するには、次のコマンドを実行します。
gcloud compute instances describe myinstance \
--format='get(hostname)'
出力は次のようになります。
test.example.com
カスタムホスト名が設定されていない場合、このコマンドの出力は空白になります。
次のステップ