G-gen の藤岡です。当記事では、Google Cloud(旧称 GCP)の Compute Engine(以下 GCE)において、Windows Server のオンデマンドライセンスを使用した場合のライセンス認証の設定編について紹介します。
はじめに
以下の記事で Windows Server のオンデマンドライセンスを使用した場合のライセンス認証についての概要や確認方法を紹介しました。 blog.g-gen.co.jp
上記を踏まえ、外部 IP アドレスを持たない Windows Server VM でライセンス認証を行うには、限定公開の Google アクセス(以下 Private Google Access)を有効にする必要があります。 そのため当記事では、外部 IP アドレスの有無と Private Google Access の On/Off の観点 から4つのパターンの検証結果について記載します。
なお、以下の記事を理解しておくことで、後述の検証内容への理解が深まります。
検証
構成図
構成は以下の通りです。通信経路については後述します。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184742.png)
前提条件
ここでは、以下を前提条件とし、Terraform を用い環境を構築します。
- 請求アカウントが紐付いたプロジェクトが作成済みである
- 本検証で必要な API が有効化されている
- 実行ユーザーに適切な権限が付与されている
- Private Google Access では デフォルトのドメイン名を利用 する
- Terraform はCloudShell で実行する
Terraform のコード
実行する Terraform のコードは以下のとおりです。variable "project"
の ${PROJECT_ID}
を自身のプロジェクト ID に置き換えた上で実行します。
/* 変数定義 https://developer.hashicorp.com/terraform/language/values/variables */ variable "project" { type = string default = "${PROJECT_ID}" // プロジェクト ID } variable "region" { type = string default = "asia-northeast1" } variable "zone" { type = string default = "asia-northeast1-a" } variable "subnet-cidr-a" { type = string default = "10.0.10.0/24" } variable "subnet-cidr-b" { type = string default = "10.0.20.0/24" } variable "instance_os" { type = string default = "windows-cloud/windows-2022" } variable "instance_type" { type = string default = "n2-standard-2" } /* プロバイダー定義 https://developer.hashicorp.com/terraform/language/providers/configuration */ provider "google" { project = var.project region = var.region zone = var.zone } /* terraform 設定 https://developer.hashicorp.com/terraform/language/settings */ terraform { required_version = "~> 1.2" required_providers { google = ">= 4.32.0" } } /* vpc 作成 https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_network */ resource "google_compute_network" "vpc" { name = "vpc" auto_create_subnetworks = "false" routing_mode = "GLOBAL" } /* subnet 作成 https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_subnetwork */ resource "google_compute_subnetwork" "subnet_a" { // Private Google Access: ON name = "subnet-a" ip_cidr_range = var.subnet-cidr-a network = google_compute_network.vpc.name private_ip_google_access = true } resource "google_compute_subnetwork" "subnet_b" { // Private Google Access: OFF name = "subnet-b" ip_cidr_range = var.subnet-cidr-b network = google_compute_network.vpc.name } /* firewall 作成 https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_firewall */ resource "google_compute_firewall" "allow_iap" { // IAP 用 name = "allow-ingress-from-iap" network = google_compute_network.vpc.name direction = "INGRESS" allow { protocol = "tcp" ports = ["3389"] } source_ranges = ["35.235.240.0/20"] } /* サービスアカウント作成 https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_service_account */ resource "google_service_account" "service_account_for_vm" { account_id = "service-account-for-vm" display_name = "VM 用サービスアカウント" } /* サービスアカウント権限付与 https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam */ resource "google_project_iam_member" "service_account_for_vm_role" { project = var.project role = "roles/compute.admin" member = "serviceAccount:${google_service_account.service_account_for_vm.email}" } /* vm 作成 x4 https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance */ resource "google_compute_instance" "vm_a_1" { // パターン1 name = "vm-a-1" machine_type = var.instance_type service_account { email = google_service_account.service_account_for_vm.email scopes = ["cloud-platform"] } boot_disk { initialize_params { image = var.instance_os } } network_interface { network = google_compute_network.vpc.name subnetwork = google_compute_subnetwork.subnet_a.name network_ip = "10.0.10.2" access_config {} } allow_stopping_for_update = true } resource "google_compute_instance" "vm_a_2" { // パターン2 name = "vm-a-2" machine_type = var.instance_type service_account { email = google_service_account.service_account_for_vm.email scopes = ["cloud-platform"] } boot_disk { initialize_params { image = var.instance_os } } network_interface { network = google_compute_network.vpc.name subnetwork = google_compute_subnetwork.subnet_a.name network_ip = "10.0.10.3" } allow_stopping_for_update = true } resource "google_compute_instance" "vm_b_1" { // パターン3 name = "vm-b-1" machine_type = var.instance_type service_account { email = google_service_account.service_account_for_vm.email scopes = ["cloud-platform"] } boot_disk { initialize_params { image = var.instance_os } } network_interface { network = google_compute_network.vpc.name subnetwork = google_compute_subnetwork.subnet_b.name network_ip = "10.0.20.2" access_config {} } allow_stopping_for_update = true } resource "google_compute_instance" "vm_b_2" { // パターン4 name = "vm-b-2" machine_type = var.instance_type service_account { email = google_service_account.service_account_for_vm.email scopes = ["cloud-platform"] } boot_disk { initialize_params { image = var.instance_os } } network_interface { network = google_compute_network.vpc.name subnetwork = google_compute_subnetwork.subnet_b.name network_ip = "10.0.20.3" } allow_stopping_for_update = true }
リソースの確認
terraform apply
によって作成されたリソースを一部確認します。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184722.png)
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184725.png)
結果
結果は以下の通りです。Private Google Access が On の場合は、外部 IP アドレスの有無に関わらずライセンス認証が可能です。対して、Private Google Access が Off の場合は、外部 IP アドレスがないとライセンス認証はできません。
パターン名 | 詳細 | ライセンス認証の結果 |
---|---|---|
パターン1 | Private Google Access:On 外部 IP:有 |
可 |
パターン2 | Private Google Access:On 外部 IP:無 |
可 |
パターン3 | Private Google Access:Off 外部 IP:有 |
可 |
パターン4 | Private Google Access:Off 外部 IP:無 |
不可 |
通信経路としては以下のようになっています。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184728.png)
これ以降はパターンごとに実際の画面と、Windows Server VM から KMS サーバー(35.190.247.13)への通信を Google Cloud の 接続テスト で結果を確認していきます。各 VM へは Identity-Aware Proxy の TCP 転送 を利用して RDP します。
パターン1
問題なくライセンス認証されています。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184731.png)
接続テストも問題ありません。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184745.png)
パターン2
問題なくライセンス認証されています。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184734.png)
接続テストも問題ありません。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184748.png)
パターン3
問題なくライセンス認証されています。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184737.png)
接続テストも問題ありません。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184751.png)
パターン4
Not activated
となっており、ライセンス認証ができていません。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184740.png)
接続テストの結果、以下のようなエラーが出ています。
パケットはドロップされている可能性があります 内部 IP アドレスのみを持つインスタンスが Google API とサービスにアクセスしようとしています。限定公開の Google アクセスが有効になっていません。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/g/ggen-sugimura/20230917/20230917184755.png)
おわりに
以上で、外部 IP アドレスを持っていない Windows Server VM の場合でも、Private Google Access を On にすることでライセンス認証ができることが確認できました。
藤岡 里美 (記事一覧)
クラウドソリューション部
数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。
Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024
Follow @fujioka57621469