ロード バランシングされた VM は、VM のクラスタを設定し、VM にパブリック ルートを公開するようにロードバランサを構成するインフラストラクチャ構築スクリプトです。
- コンピューティング - VM - Compute Engine
- コンピューティング - クラスタ - マネージド インスタンス グループ
- コンピューティング - マシン テンプレート - インスタンス テンプレート
- ネットワーキング - ロード バランシング - Cloud ロードバランサ
このサンプル アプリケーションでは、NGINX を使用してシンプルな静的 HTML サイトを設定し、クラスタ間でロード バランシングを行います。
スタートガイド
Cloud Shell でソースコードのコピーへの次のリンクをクリックします。その後、1 つのコマンドでプロジェクト内のアプリケーションの作業コピーがスピンアップされます。
ロード バランシングされた VM コンポーネント
ロード バランシングされた VM アーキテクチャでは、いくつかのプロダクトを使用しています。 以下に、関連動画、プロダクト ドキュメント、インタラクティブ チュートリアルへのリンクを含めた、コンポーネントの詳細を示します。スクリプト
インストール スクリプトでは、go と Terraform CLI ツールで記述された実行ファイルを使用して、空のプロジェクトを作成し、そこにアプリケーションをインストールします。出力は、機能するアプリケーションとロード バランシング IP アドレスの URL になります。
./main.tf
サービスを有効化する
Google Cloud サービスは、デフォルトではプロジェクトで無効になっています。 次の必要なサービスを有効にします。
- Compute Engine - 仮想マシンとネットワーク サービス(ロードバランサなど)
variable "gcp_service_list" {
  description = "The list of apis necessary for the project"
  type        = list(string)
  default = [
      "compute.googleapis.com",
  ]
}
resource "google_project_service" "all" {
  for_each                   = toset(var.gcp_service_list)
  project                    = var.project_number
  service                    = each.key
  disable_dependent_services = false
  disable_on_destroy         = false
}
マネージド VM のベースとなるインスタンス エグザンプラを作成する
次のコマンドは、VM を作成して必要なソフトウェアをインストールし、コードをデプロイします。
resource "google_compute_instance" "exemplar" {
    name         = "${var.basename}-exemplar"
    machine_type = "n1-standard-1"
    zone         = var.zone
    project      = var.project_id
    tags                    = ["http-server"]
    metadata_startup_script = "apt-get update -y \n apt-get install nginx -y \n  printf '${data.local_file.index.content}'  | tee /var/www/html/index.html \n chgrp root /var/www/html/index.html \n chown root /var/www/html/index.html \n chmod +r /var/www/html/index.html"
    boot_disk {
        auto_delete = true
        device_name = "${var.basename}-exemplar"
        initialize_params {
        image = "family/debian-10"
        size  = 200
        type  = "pd-standard"
        }
    }
    network_interface {
        network = "default"
        access_config {
        // Ephemeral public IP
        }
    }
    depends_on = [google_project_service.all]
}
スナップショットとディスク イメージを作成する
次のコマンドは、VM を使用してスナップショットを作成します。スナップショットを使用してディスク イメージが作成されます。クラスタ内のすべての VM はこのイメージに基づいています。
resource "google_compute_snapshot" "snapshot" {
    project           = var.project_id
    name              = "${var.basename}-snapshot"
    source_disk       = google_compute_instance.exemplar.boot_disk[0].source
    zone              = var.zone
    storage_locations = ["${var.region}"]
    depends_on        = [time_sleep.startup_completion]
}
resource "google_compute_image" "exemplar" {
    project         = var.project_id
    name            = "${var.basename}-latest"
    family          = var.basename
    source_snapshot = google_compute_snapshot.snapshot.self_link
    depends_on      = [google_compute_snapshot.snapshot]
}
インスタンス テンプレートを作成。
次のコマンドは、クラスタ内のすべての VM の設定と構成を含むテンプレートを作成します。前のコマンドで作成したディスク イメージが使用されます。
このコマンドには、クラスタ内の VM によって提供される HTML をカスタマイズする起動スクリプトが含まれています。
 resource "google_compute_instance_template" "default" {
    project     = var.project_id
    name        = "${var.basename}-template"
    description = "This template is used to create app server instances."
    tags        = ["httpserver"]
    metadata_startup_script = "sed -i.bak \"s/\{\{NODENAME\}\}/$HOSTNAME/\" /var/www/html/index.html"
    instance_description = "BasicLB node"
    machine_type         = "n1-standard-1"
    can_ip_forward       = false
    // Create a new boot disk from an image
    disk {
        source_image = google_compute_image.exemplar.self_link
        auto_delete  = true
        boot         = true
    }
    network_interface {
        network = "default"
    }
    depends_on = [google_compute_image.exemplar]
}
マネージド インスタンス グループを作成
このグループの一部として管理されるインスタンス テンプレートのマシンを N 台リクエストします。
resource "google_compute_instance_group_manager" "default" {
    project            = var.project_id
    name               = "${var.basename}-mig"
    zone               = var.zone
    target_size        = var.nodes
    base_instance_name = "${var.basename}-mig"
    version {
        instance_template = google_compute_instance_template.default.id
    }
    named_port {
        name = "http"
        port = "80"
    }
    depends_on = [google_compute_instance_template.default]
}
外部 IP アドレスを作成する
ホストをドメイン名にバインドし、一般的にインターネット上で通信する必要があります。
resource "google_compute_global_address" "default" {
    project    = var.project_id
    name       = "${var.basename}-ip"
    ip_version = "IPV4"
}
ロードバランサを作成
次のコマンドは、ロードバランサを作成し、ヘルスチェックとバックエンド サービスを実装します。インスタンス グループに接続するようにロードバランサを構成します。
resource "google_compute_health_check" "http" {
    project = var.project_id
    name    = "${var.basename}-health-chk"
    tcp_health_check {
        port = "80"
    }
}
resource "google_compute_firewall" "allow-health-check" {
    project       = var.project_id
    name          = "allow-health-check"
    network       = local.defaultnetwork
    source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]
    allow {
        protocol = "tcp"
        ports    = ["80"]
    }
}
resource "google_compute_backend_service" "default" {
    project               = var.project_id
    name                  = "${var.basename}-service"
    load_balancing_scheme = "EXTERNAL"
    protocol              = "HTTP"
    port_name             = "http"
    backend {
        group = google_compute_instance_group_manager.default.instance_group
    }
    health_checks = [google_compute_health_check.http.id]
    }
    resource "google_compute_url_map" "lb" {
    project         = var.project_id
    name            = "${var.basename}-lb"
    default_service = google_compute_backend_service.default.id
}
HTTP を有効にする
次のコマンドは、ロードバランサのポート 80 がサービスを指すネットワーク ルールを構成します。
resource "google_compute_target_http_proxy" "default" {
    project = var.project_id
    name    = "${var.basename}-lb-proxy"
    url_map = google_compute_url_map.lb.id
}
resource "google_compute_forwarding_rule" "google_compute_forwarding_rule" {
    project               = var.project_id
    name                  = "${var.basename}-http-lb-forwarding-rule"
    provider              = google-beta
    region                = "none"
    load_balancing_scheme = "EXTERNAL"
    port_range            = "80"
    target                = google_compute_target_http_proxy.default.id
    ip_address            = google_compute_global_address.default.id
}
まとめ
実行すると、複数の Compute Engine インスタンスで実行され、プロジェクトのロードバランサがフロントエンドにあるシンプルなウェブサイトが作成されます。さらに、環境に合わせてソリューションを変更または拡張するためのコードもすべて用意されています。