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 アドレスを作成
  • CloudSQL データベースに接続するコンシューマー VPC に PSC エンドポイントを作成する
  • 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 を作成します。クラウド コンソールを開き、データベースに使用するプロジェクトを選択します。

  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 エディタ ビューに切り替えます。[エディタ] を選択し、インターフェースを読み込めるように必要なプロンプトを許可します。
  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 アタッチメントを使用して Cloud SQL インスタンスを作成する(Terraform)

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

  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 アタッチメントを使用して Cloud SQL インスタンスを作成するには、5 分以上かかることがあります。

データベースを確認する

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

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

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

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

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

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

プロジェクト バープロジェクト バー 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 エディタ ビューに切り替えます。[エディタ] を選択し、インターフェースを読み込めるように必要なプロンプトを許可します。
  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 に SQL DB への PSC エンドポイント アタッチメントを作成する(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 アイコンの横にあるプルダウンをクリックし、[すべて] タブを選択します。

プロジェクト バープロジェクト バー 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 エンドポイントを作成できました。PSC エンドポイントを介してリモート VM からデータベースに正常に接続できました。

その他の情報

Private Service Connect と Cloud SQL の詳細を確認する