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 にのみ適用
さらにその中で、デフォルトのメタデータ とユーザーが定義する カスタムメタデータ があります。詳細は以下の記事の「メタデータ」の項目をご参照ください。
後述の「検証」の項目では、インスタンスメタデータで内部 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 名は プロジェクト全体で一意 。 |
- 参考:内部 DNS 名のタイプ
設定方法
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
Follow @fujioka57621469