ロード バランシングされた 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 インスタンスで実行され、プロジェクト内のロードバランサがフロントエンドにあるシンプルなウェブサイトが作成されます。さらに、環境に合わせてソリューションを変更または拡張するためのコードもすべて用意されています。