Private Service Connect 経由で CloudSQL に接続する(Terraform)

1. 概要

別のプロジェクトまたは VPC からプライベート Cloud SQL インスタンスに接続するには、いくつかの方法があります。Private Service Connect(PSC)を使用すると、サービス プロデューサーはサービス アタッチメントを介してサービスを公開できます。これらのサービス アタッチメントを使用すると、コンシューマは環境内に PSC エンドポイントや PSC バックエンドを作成し、指定されたプライベート IP 経由でこれらのプロデューサー サービスに接続できます。

Cloud SQL には、PSC サービス アタッチメントを使用してプライベート接続を許可する機能があります。このラボでは、このオプションを構成してテストします。

このラボでは、CloudSQL で PSC エンドポイント アクセスを使用するシンプルなアーキテクチャを構築します。

図 1.

1893f48fe1298ea2.png

このラボでは、2 つのプロジェクトまたは同じプロジェクト内の個別の VPC が必要です。

目標

このラボでは、次のタスクの実行方法について学びます。

  • PSC サービス アタッチメントを使用して CloudSQL インスタンスを作成します。
  • 静的 IP アドレスを作成
  • コンシューマ VPC に PSC エンドポイントを作成して CloudSQL データベースに接続する
  • PSC エンドポイント IP 経由でコンシューマ ネットワーク内のテスト VM から SQL データベースへのアクセスを確認します。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

55efc1aaa7a4d3ad.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

7ffe5cbb04455448.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

3. タスク 1. Terraform を使用してデータベース プロジェクトの環境を設定する

データベース プロジェクトで、ファイアウォール ルールとサブネットを含むカスタム VPC を作成します。Cloud コンソールを開き、データベースに使用するプロジェクトを選択します。

  1. コンソールの右上にある Cloud Shell を開き、Cloud Shell にデータベース プロジェクトのデータベース プロジェクト ID が表示されていることを確認します。アクセスを許可するよう求めるプロンプトが表示されたら、そのプロンプトに沿って操作します。4261e776f64ea978.png
  2. terraform-db というフォルダを作成し、そのフォルダに移動します。
mkdir terraform-db  && cd terraform-db
  1. main.tf、variable.tfdatabase.tf ファイルを作成します。
touch main.tf variable.tf database.tf 
  1. Cloud Shell エディタ ビューに切り替えます。[editor] を選択し、インターフェースを読み込めるように必要なプロンプトを許可します。
  2. 読み込みが完了したら、[File] > [Open Folder] に移動し、/home/your-user-name/terraform-db に移動して [OK] を選択して、エディタでフォルダを開きます。78f5eb9f2f82f1b0.png
  3. variable.tf ファイルを選択し、次のように追加します。your-database-project-id-here テキストは、実際のデータベース プロジェクト ID に置き換えます。your-consumer-project-id-here テキストを、実際のコンシューマ プロジェクト ID に置き換えます(引用符付き)。
variable "project_id" {
  type = string
  default = "your-database-project-id-here"
}

variable "project_id_consumer" {
  type = set(string)
  default = ["your-consumer-project-id-here"]
}

variable "network_id" {
  type = string
  default = "database-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "db_password" {
  type = string
  default = "cloudsql24"
}
  1. 次に、main.tf ファイルを開きます。以下で説明するように、さまざまなアクションを実行する Terraform コードを追加します。

API を有効にする

resource "google_project_service" "default"

VPC を作成する

resource "google_compute_network" "default"

ファイアウォール ルールを追加する

resource "google_compute_firewall" "allow_icmp"

  1. 次の内容をコピーして main.tf ファイルに貼り付けます。
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "sqladmin.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = true
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-icmp"]
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}

resource "google_compute_firewall" "allow_sql" {
  name    = "allow-sql-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["3306"]
  }

  source_ranges = ["0.0.0.0/0"]
 }

resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["10.128.0.0/9"]
 }
  1. Cloud Shell ターミナルに戻り、terraform-db ディレクトリ cd terraform-db にいることを確認して、次のコマンドを実行します。

terraform init

作業ディレクトリを初期化します。このステップでは、指定した構成に必要なプロバイダがダウンロードされます。

terraform plan

実行プランを生成します。このプランには、Terraform がインフラストラクチャのデプロイに行う操作が示されます。

  1. リソースを作成するには、terraform apply コマンドを実行し、yes と入力して実行します。

4. タスク 2. PSC アタッチメントを使用して CloudSQL インスタンスを作成する(Terraform)

Terraform を使用して CloudSQL インスタンスを作成し、接続を許可する PSC オプションを指定します。この構成は、データベース プロジェクトで完了します。

  1. Cloud Shell エディタ ビューに切り替えます。terraform-db フォルダ内にいることを確認します。database.tf ファイルを選択し、次のように追加します。
resource "google_sql_database_instance" "default" {
  name             = "psc-sql-db"
  region           = var.region_id
  database_version = "MYSQL_8_0"
  settings {
    tier              = "db-f1-micro"
    availability_type = "REGIONAL"
    backup_configuration {
      enabled            = true
      binary_log_enabled = true
    }
    ip_configuration {
      psc_config {
        psc_enabled               = true
        allowed_consumer_projects = var.project_id_consumer
      }
      ipv4_enabled = false
    }
  }
  deletion_protection = false 
}

resource "google_sql_user" "users" {
  name     = "testsql"
  instance = google_sql_database_instance.default.name
  password = var.db_password 
}
  1. Cloud Shell ターミナルに戻り、terraform-db ディレクトリにいることを確認します。リソースを作成するには、terraform apply コマンドを実行し、yes と入力して実行します。PSC アタッチメントを使用して CloudSQL インスタンスを作成する場合、最大で 5 分以上かかることがあります。

データベースを確認する

  1. 完了したら、コンソールの [SQL] に移動し、新しく作成された psc-sql-db データベース インスタンスを選択します。
  2. 左側の SQL オプションのスライドアウトを開き、[接続] を選択します。
  3. [概要] タブには、接続に関する情報が表示されます。
  4. サービス アタッチメント アドレスをコピーして、システムの任意の場所に保存します。
  5. これは、タスク 3 ステップ 8 を完了するために必要になります。

PSC アタッチメントを使用した Cloud SQL

  1. 左側の SQL オプションのスライドアウトを開き、[ユーザー] を選択します。
  2. testsql というユーザーがパスワード cloudsql24 で表示されます。(これは後で DB へのアクセスに使用されます)

5. タスク 3. コンシューマ プロジェクトの環境を設定する(Terraform)

コンシューマ プロジェクトで、ファイアウォール ルールとサブネットを含むカスタム VPC を作成します。Cloud コンソールを開き、使用するプロジェクトを選択します。

  1. コンソールの上部にある Google Cloud アイコンの横にあるプルダウンをクリックし、[すべて] タブを選択します。

プロジェクトバーproject bar 2

  1. 表示されたプロジェクトから、コンシューマ プロジェクト ID を選択して続行します。
  2. コンソールの右上にある Cloud Shell を開き、Cloud Shell にコンシューマ プロジェクト ID が表示されていることを確認します。アクセスを許可するよう求められたら、プロンプトに沿って操作します。
  3. terraform-consumer というフォルダを作成し、そのフォルダに移動します。
mkdir terraform-consumer  && cd terraform-consumer
  1. main.tf、variable.tfpsc.tf ファイルを作成します。
touch main.tf variable.tf psc.tf 
  1. コンシューマ プロジェクト IDCloud Shell エディタ ビューに切り替えます。[editor] を選択し、インターフェースを読み込めるように必要なプロンプトを許可します。
  2. 読み込みが完了したら、[File] > [Open Folder] に移動し、/home/your-user-name/terraform-consumer に移動して [OK] を選択して、エディタでフォルダを開きます。78f5eb9f2f82f1b0.png
  3. variable.tf ファイルを選択し、次のように追加します。your-consumer-project-id-here テキストは、実際のコンシューマ プロジェクト ID に置き換えます。your-psc-attachment-id-here テキストは、PSC アタッチメント アドレスに置き換えます。これは、タスク 2 セクション 2-5 でコピーした ID です。d7ac9629a59abfc6.png
variable "project_id" {
  type = string
  default = "your-consumer-project-id-here"
}

variable "psc_attachment_id" {
  type = string
  default = "your-psc-attachment-id-here"
}

variable "network_id" {
  type = string
  default = "psc-endpoint-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "region_id2" {
  type = string
  default = "us-central1"
}
  1. 次に、main.tf ファイルを開きます。以下で説明するように、さまざまなアクションを実行する Terraform コードを追加します。

API を有効にする

resource "google_project_service"

VPC を作成する

resource "google_compute_network"

NAT ゲートウェイを作成する

resource "google_compute_router"
resource "google_compute_router_nat"

ファイアウォール ルールを追加する

resource "google_compute_firewall"

  1. 次の内容をコピーして main.tf ファイルに貼り付けます。
resource "google_project_service" "default" {
  for_each = toset([
    "compute.googleapis.com",
    "cloudresourcemanager.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = false
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_subnetwork" "vm_subnet" {
  name          = "vm-subnet"
  ip_cidr_range = "192.168.50.0/24"
  region        = var.region_id2
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_subnetwork" "psc_subnet" {
  name          = "psc-subnet"
  ip_cidr_range = "192.168.90.0/24"
  region        = var.region_id
  network       = google_compute_network.default.name
  project       = var.project_id
}

resource "google_compute_router" "default" {
  name    = "outbound-nat"
  region  = var.region_id2
  network = google_compute_network.default.id

 bgp {
  asn = 64514
  }
}

resource "google_compute_router_nat" "default" {
  name = "outbound-nat-gw"
  router = google_compute_router.default.name
  region = google_compute_router.default.region
  nat_ip_allocate_option = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"

  log_config {
    enable = true
    filter = "ERRORS_ONLY"
  }
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}


resource "google_compute_firewall" "allow_internal" {
  name    = "allow-internal-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
    }


  allow {
    protocol = "tcp"
    ports    = ["0-65535"]
  }
  allow {
    protocol = "udp"
    ports    = ["0-65535"]
  }

  source_ranges = ["192.168.0.0/16"]
 }
  1. Cloud Shell ターミナルに戻り、コンシューマ プロジェクトの terraform-consumer ディレクトリ cd terraform-consumer にいることを確認して、次のコマンドを実行します。

terraform init

作業ディレクトリを初期化します。このステップでは、指定した構成に必要なプロバイダがダウンロードされます。

terraform plan

実行プランを生成します。このプランには、Terraform がインフラストラクチャのデプロイに行う操作が示されます。

  1. リソースを作成するには、terraform apply コマンドを実行し、yes と入力して実行します。

6. タスク 4. コンシューマ プロジェクトとテスト用 VM に PSC エンドポイントから SQL DB アタッチメントを作成します(Terraform)

この構成は、コンシューマ プロジェクトで完了します。

  1. Cloud Shell エディタに戻り、terraform-consumer ディレクトリを開くpsc.tf ファイルを選択します。ファイルに次の Terraform コードを追加します。これにより、静的内部 IP、PSC エンドポイント、Maria DB がインストールされたテスト VM が作成されます。
resource "google_compute_address" "default" {
  name = "psc-ip"
  region = var.region_id
  address_type = "INTERNAL"
  subnetwork = google_compute_subnetwork.psc_subnet.name
  address = "192.168.90.100" 
}

resource "google_compute_forwarding_rule" "default" {
  name = "psc-sql-endpoint"
  region = var.region_id
  network = google_compute_network.default.name
  ip_address = google_compute_address.default.self_link
  load_balancing_scheme = ""
  target = var.psc_attachment_id
}


resource "google_compute_instance" "sql_test_vm" {
  name         = "sql-test-vm"
  machine_type = "e2-medium"
  zone         = "${var.region_id2}-b"
  project      = var.project_id

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  network_interface {
    subnetwork = google_compute_subnetwork.vm_subnet.name
  }

  # No external IP address
  network_performance_config {
    total_egress_bandwidth_tier = "DEFAULT"
  }

  tags = ["allow-icmp", "allow-ssh", "allow-internal", "allow-health-check"]

  # Install MariaDB at startup
  metadata_startup_script = <<EOF
#!/bin/bash
apt-get update
apt-get install -y mariadb-server
systemctl enable mariadb
EOF
}
  1. Cloud Shell ターミナルに戻り、コンシューマ プロジェクトの terraform-consumer ディレクトリ cd terraform-consumer にいることを確認して、次のコマンドを実行します。

terraform plan

実行プランを生成します。このプランには、Terraform がインフラストラクチャのデプロイに行う操作が示されます。

  1. リソースを作成するには、terraform apply コマンドを実行し、yes と入力して実行します。
  2. VM とエンドポイントが異なるリージョンにあるため、 PSC エンドポイントのグローバル アクセスを有効にする必要があります。この操作はコンソールで行います。
  3. コンシューマ プロジェクトのコンソールで、[Private Service Connect] に移動します。[接続エンドポイント] タブの [エンドポイント] セクションで、[psc-sql-endpoint] を選択します。
  4. [編集] を選択し、[グローバル アクセスを有効にする] の横にあるチェックボックスと [保存] オプションをクリックします。7eeb5a4162f5f79d.png
  5. 次のステップに進んで接続を確認する

7. タスク 5. PSC IP アドレス経由で VM からエンドポイントへの接続を確認します。

コンシューマ プロジェクトで完了する

  1. [VM インスタンス] に移動します。sql-test-vm を選択します。
  2. [SSH] オプションを選択して VM に接続します。
  3. 次のように、エンドポイント経由で DB に接続します。
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. 接続が確立されたら、次の psc-sql-db を使用してデータベースを作成します。
CREATE DATABASE remotesqldb;
  1. 完了したら、exit と入力して接続を終了します。

8. タスク 6. データベースのエントリを確認する

この確認はデータベース プロジェクトで完了します。

  1. コンソールの上部にある Google Cloud アイコンの横にあるプルダウンをクリックし、[すべて] タブを選択します。

プロジェクトバーproject bar 2

  1. 表示されたプロジェクトからデータベース プロジェクト ID を選択して続行します。
  2. [SQL] に移動し、データベース psc-sql-db を選択して SQL オプションを開き、[データベース] を選択します。コンシューマ プロジェクトの VM . から、作成した remotesqldb というデータベースが表示されます。

cloud sql db

9. クリーンアップ

データベース プロジェクトで完了する

  1. データベース プロジェクト ID を選択する
  2. Cloud Shell に移動し、データベース プロジェクト ID が表示されていることを確認します。
  3. terraform-db ディレクトリ cd terraform-db に移動し、次のコマンド terraform destroy を実行して yes と入力すると、Terraform で db プロジェクトに作成したすべてのリソースが削除されます。

コンシューマ プロジェクトで完了する

  1. コンシューマ プロジェクト ID を選択する
  2. Cloud Shell に移動し、コンシューマ プロジェクト ID が表示されていることを確認します。
  3. terraform-consumer ディレクトリ cd terraform-consumer に移動し、次のコマンド terraform destroy を実行して yes と入力すると、Terraform を使用して db プロジェクトで作成したすべてのリソースが削除されます。

10.完了

これで、PSC アタッチメントを使用して Cloud SQL インスタンスを構成し、別の VPC に Private Service Connect エンドポイントを作成できました。リモート VM から PSC エンドポイントを介してデータベースに正常に接続できました。

その他の情報

詳細については、Private Service Connect と Cloud SQL をご覧ください。