GCE の内部 DNS タイプとインスタンス名の関係

記事タイトルとURLをコピーする

G-gen の藤岡です。当記事では、Google Cloud(旧称 GCP)の Compute Engine(以下 GCE)のインスタンス名の重複について、2 種類の内部 DNS タイプの観点から深堀していきます。

はじめに

インスタンス名の重複

コンソールや gcloud コマンドで GCE インスタンスを作成する際に、以下のようなエラーが出る場合があります。これはインスタンス名が既存のものと重複している場合に表示されます。

ERROR: (gcloud.compute.instances.create) Could not fetch resource:
 - The resource 'projects/demo-project/zones/asia-northeast1-a/instances/my-instance' already exists

コンソールのインスタンス名重複エラー

実際にはゾーンが異なる場合、gcloud コマンドでは同じインスタンス名でインスタンスを作成することができます。但し、作成の際に留意すべき点があります。そこで今回は、2 種類の内部 DNS タイプの観点からこのエラーを深堀していきます。

同一インスタンス名

検証結果

結論から書くと、以下のような結果になりました。

  • 両者の内部 DNS タイプが ゾーン DNS の時は、異なるゾーンにインスタンスを作成することができる
  • 一方の内部 DNS タイプが グローバル DNS のときは、グローバル DNS インスタンスを先に作成すれば、次に ゾーン DNS のインスタンスを作成することができる

このことから、インスタンス名の名前空間はゾーンである (しかしインスタンスの作成順によってはバリデーションに引っかかる) ということがわかりました。

ここから、詳細な検証の過程を記載していきます。

サービスの概要

メタデータサーバー

メタデータサーバーには、GCE インスタンスに関する様々な情報である メタデータ が保存されています。メタデータは key:value の形で保存されており、適用範囲の異なる以下の 2 種類があります。

  • プロジェクトメタデータ:プロジェクト内のすべて の VM に適用
  • インスタンスメタデータ:単一 の VM にのみ適用

さらにその中で、デフォルトのメタデータ とユーザーが定義する カスタムメタデータ があります。詳細は以下の記事の「メタデータ」の項目をご参照ください。

blog.g-gen.co.jp

後述の「検証」の項目では、インスタンスメタデータで内部 DNS タイプを指定します。

GCE と内部 DNS

GCE インスタンスを作成すると、インスタンスメタデータhostname にインスタンス名やプロジェクト ID、ゾーン名等が含まれる完全修飾ドメイン名(以下 FQDN)が保存されます。

この FQDN は後述する内部 DNS タイプによって異なります。また、GCE インスタンスの命名規則は ドキュメント に記載の通りです。

内部 DNS

内部 DNS は、同じネットワーク内 の仮想マシン(以下 VM)が内部 DNS 名で相互にアクセスができるようにするサービスで、Virtual Private Cloud(VPC) の機能の 1 つです。.internal の DNS ゾーンに VM の内部 A レコードが作成されます。

内部 DNS タイプ

内部 DNS タイプには、以下の 2 種類があります。

  • ゾーン DNS
  • グローバル DNS

デフォルトの内部 DNS タイプがどちらになるかは、プロジェクトで Compute Engine API を有効にしたタイミング によって決まります。タイプ別の FQDN やプロジェクトのデフォルトは以下の表の通りです。 VM は ゾーンリソース です。個々のゾーンへの DNS 登録で発生した障害を分離するためにゾーン DNS が推奨されています。

内部 DNS タイプ FQDN プロジェクトのデフォルトタイプ 備考
ゾーン DNS < VM 名>.<ゾーン名>.c.<プロジェクト ID>.internal 2018 年 9 月 6 日以降 に Compute Engine API を有効にした組織またはスタンドアロンプロジェクトのデフォルトタイプ VM 名は 各ゾーンで一意 。ゾーンが異なる場合、同じ VM 名をつけることができる。
グローバル DNS < VM 名>.c.<プロジェクト ID>.internal 2018 年 9 月 6 日より前 に Compute Engine API を有効にした組織またはスタンドアロンプロジェクトのデフォルトタイプ VM 名は プロジェクト全体で一意

設定方法

2023 年 3 月時点で Google Cloud の利用を開始し、GCE インスタンスを作成すると上述の通り、内部 DNS タイプはゾーン DNS になります。但し、カスタムメタデータキーとして、VmDnsSetting を設定することで内部 DNS タイプを指定することができます。

gcloud コマンドで GCE インスタンスを作成する場合、以下のオプションを追加することで内部 DNS タイプを指定できます。

  • グローバル DNS : --metadata=VmDnsSetting=GlobalDefault
  • ゾーン DNS : --metadata=VmDnsSetting=ZonalOnly

コンソール上からもメタデータの設定はできます。しかし、後述の「例外」の項目にある通り コンソールからは ゾーンに関わらず既存の GCE インスタンスと同じ名前は使えません

確認方法

Linux の場合、以下のコマンドで GCE インスタンスの FQDN を確認できます。デフォルトで VM のメタデータサーバー(169.254.169.254)が名前解決します。

curl "http://metadata.google.internal/computeMetadata/v1/instance/hostname" \
  -H "Metadata-Flavor: Google"
# 実行例
fujioka@my-instance:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/hostname" \
  -H "Metadata-Flavor: Google"
my-instance.c.demo-project.internal
fujioka@my-instance:~$ 

fujioka@my-instance:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/hostname" \
  -H "Metadata-Flavor: Google"
my-instance.asia-northeast1-a.c.demo-project.internal
fujioka@my-instance:~$ 

検証

内部 DNS タイプを明示的に指定し、同じインスタンス名で作成可能な組み合わせを検証していきます。

前提条件

  • CloudShell からコマンドを実行
  • 作成するGCE インスタンスの OS は debian-11
  • インスタンス名は my-instance
  • VPC やサブネットの構成は以下の通り
    構成

例外

  • 2023 年 3 月時点で、コンソール画面からはゾーンに関係なく、既存のインスタンス名と同じ名前の場合 名前 はすでに使用中です。 (英語表記:Name is already in use)のエラーが表示されます。そのため、検証は gcloud コマンドで GCE インスタンスを作成します。
    コンソールのインスタンス名重複エラー

作成コマンド

ゾーンごと、内部 DNS タイプごとに以下の 4 種類のコマンドで GCE インスタンスを作成します。

###################################
 ゾーン:asia-northeast1-a
###################################

# ① 内部 DNS タイプ:ゾーン DNS
# 作成される FQDN:my-instance.asia-northeast1-a.c.demo-project.internal
gcloud compute instances create my-instance \
--machine-type=e2-micro \
--image-project debian-cloud \
--image-family debian-11 \
--zone asia-northeast1-a \
--network=demo-vpc \
--subnet=demo-subnet \
--metadata=VmDnsSetting=ZonalOnly

# ② 内部 DNS タイプ:グローバル DNS
# 作成される FQDN:my-instance.c.demo-project.internal
gcloud compute instances create my-instance \
--machine-type=e2-micro \
--image-project debian-cloud \
--image-family debian-11 \
--zone asia-northeast1-a \
--network=demo-vpc \
--subnet=demo-subnet \
--metadata=VmDnsSetting=GlobalDefault


###################################
 ゾーン:asia-northeast1-b
###################################

# ③ 内部 DNS タイプ:ゾーン DNS
# 作成される FQDN:my-instance.asia-northeast1-b.c.demo-project.internal
gcloud compute instances create my-instance \
--machine-type=e2-micro \
--image-project debian-cloud \
--image-family debian-11 \
--zone asia-northeast1-b \
--network=demo-vpc \
--subnet=demo-subnet \
--metadata=VmDnsSetting=ZonalOnly


# ④ 内部 DNS タイプ:グローバル DNS
# 作成される FQDN:my-instance.c.demo-project.internal
gcloud compute instances create my-instance \
--machine-type=e2-micro \
--image-project debian-cloud \
--image-family debian-11 \
--zone asia-northeast1-b \
--network=demo-vpc \
--subnet=demo-subnet \
--metadata=VmDnsSetting=GlobalDefault

作成順序

結果は 作成順序によって結果が異なる ため、図にします。赤枠の縦軸のインスタンスを 1 つ作成し、それに対し横軸のインスタンスを 1 つ作成し結果を確認していきます。それを全ての縦軸のインスタンスごとに確認していきます。

グローバル DNS の場合、ドキュメント に以下の記載があることから、表には 2 つの FQDN(<VM 名>.<ゾーン名>.c.<プロジェクト ID>.internal / <VM 名>.c.<プロジェクト ID>.internal)を記載しています。

VM がグローバルとゾーンの両方の DNS 名を登録するように VmDnsSetting=GlobalDefault を設定しますが、デフォルトのドメイン名と検索パスのエントリにはグローバル名のみを使用します。

作成順序

結果

結果は以下の表の通りです。項番ごとに結果と理由を確認していきます。

結果

項番 結果 理由
(1) 不可 FQDN が同じのため
(2) 不可 グローバル DNS の場合は、ゾーン DNS 名も登録され FQDN が同じのため
(3) 不可 グローバル DNS の場合は、ゾーン DNS 名も登録され FQDN が同じのため
(4) 不可 FQDN が同じのため
(5) FQDN が異なるため
(6) 不可 ※後述
(7) ※後述
(8) 不可 FQDN が同じのため

以上の結果から、(6), (7) は作成ゾーンが異なり、FQDN も異なることからどちらも「可」となるはずが、(6) は「不可」となっています。その理由は、ドキュメント の以下の部分です。

推奨: VmDnsSetting=ZonalOnly を設定すると、VM の参照はゾーン DNS 名でのみ可能になります。VM は引き続き、ゾーンとグローバルの両方の検索パスを保持しますが、グローバル DNS 名は機能しなくなります。

グローバル DNS 名は機能しなくなるということは、(6) で先にゾーン DNS によって my-instance.asia-northeast1-b.c.demo-project.internal が作成された後、そのグローバル DNS 名である my-instance.c.demo-project.internal は機能しなくなります。つまり、ゾーン DNS を作成した後にグローバル DNS を作成しようとするとエラーとなります。そのため、(7) では「可」だった結果が (6) では「不可」となります。

それに対して、(7) のように先にグローバル DNS によって my-instance.c.demo-project.internal が作成されている場合は、その後にゾーン DNS 名の my-instance.asia-northeast1-a.c.demo-project.internal を作成することができます。

まとめ

以上の結果から、同一インスタンス名で作成が可能なパターンは以下の通りです。

  • 両者の内部 DNS タイプが ゾーン DNS の時に異なるゾーンにインスタンスを作成する
  • 一方の内部 DNS タイプが グローバル DNS のインスタンスを先に作成し、次に ゾーン DNS のインスタンスを作成する

このことから、インスタンス名の名前空間はゾーンである (しかしインスタンスの作成順によってはバリデーションに引っかかる) ということがわかりました。

なお補足すると、あくまで推奨の内部 DNS タイプはゾーン DNS であり、現在はデフォルトの設定もゾーン DNS となっています。今回は検証のため、グローバル DNS も設定し確認しました。

藤岡 里美 (記事一覧)

クラウドソリューション部

数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。

Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024