Windows Server VMのライセンス認証(設定編)

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

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つのパターンの検証結果について記載します。

なお、以下の記事を理解しておくことで、後述の検証内容への理解が深まります。

検証

構成図

構成は以下の通りです。通信経路については後述します。

構成図
* 参考:限定公開の Google アクセス / IAP の TCP 転送の仕組み

前提条件

ここでは、以下を前提条件とし、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 によって作成されたリソースを一部確認します。

リソース(VPC)
リソース(GCE)

結果

結果は以下の通りです。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:無
不可

通信経路としては以下のようになっています。

通信経路図

これ以降はパターンごとに実際の画面と、Windows Server VM から KMS サーバー(35.190.247.13)への通信を Google Cloud の 接続テスト で結果を確認していきます。各 VM へは Identity-Aware ProxyTCP 転送 を利用して RDP します。

パターン1

問題なくライセンス認証されています。

結果①(パターン1)

接続テストも問題ありません。

結果②(パターン1)

パターン2

問題なくライセンス認証されています。

結果①(パターン2)

接続テストも問題ありません。

結果②(パターン2)

パターン3

問題なくライセンス認証されています。

結果①(パターン3)

接続テストも問題ありません。

結果②(パターン3)

パターン4

Not activated となっており、ライセンス認証ができていません。

結果①(パターン4)

接続テストの結果、以下のようなエラーが出ています。

パケットはドロップされている可能性があります
内部 IP アドレスのみを持つインスタンスが Google API とサービスにアクセスしようとしています。限定公開の Google アクセスが有効になっていません。

結果②(パターン4)

おわりに

以上で、外部 IP アドレスを持っていない Windows Server VM の場合でも、Private Google Access を On にすることでライセンス認証ができることが確認できました。

藤岡 里美 (記事一覧)

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

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

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