1. 概要
別のプロジェクトまたは VPC ネットワークからプライベート Cloud SQL インスタンスに接続する方法はいくつかあります。プライベート サービス アクセス(PSA)を使用すると、プライベート接続を介して Google サービスとサードパーティ サービスの内部 IP アドレスにアクセスできます。データベースへのアクセスを拡張するために、Private Service Connect(PSC)を有効にすることもできます。
Private Service Connect(PSC)を使用すると、サービス プロデューサーはサービス アタッチメントを介してサービスを公開できます。コンシューマーはこれを使用して、環境内に PSC エンドポイントや PSC バックエンドを作成できます。これらの PSC エンドポイントを介して、ユーザーが指定したプライベート IP を使用してプロデューサー サービスに接続できます。
このラボでは、このオプションを構成してテストします。
このラボでは、CloudSQL で PSA と PSC エンドポイント アクセスを使用する方法を示すシンプルなアーキテクチャを構築します。
図 1.

このラボでは、2 つのプロジェクトまたは同じプロジェクト内の個別の VPC が必要になります。
目標
このラボでは、次のタスクの実行方法について学びます。
- サービス ネットワーキングを有効にする
- PSA を設定する
- PSA を使用して Cloud SQL インスタンスを作成する
- PSC サービス アタッチメントを有効にします。
- CloudSQL データベースに接続するコンシューマー VPC に PSC エンドポイントを作成する
- プロデューサー VPC とコンシューマー VPC の両方で、テスト VM から SQL データベースへのアクセスを確認する
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



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

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

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。
3. タスク 1. (Terraform)を使用してデータベース プロジェクトの環境を設定する
データベース プロジェクトで、サービス ネットワーキングを有効にし、VPC を作成し、PSA 範囲を作成し、サービス ネットワーキング ピアリングを作成し、ファイアウォール ルールを作成します。クラウド コンソールを開き、データベースに使用するプロジェクトを選択します。
- コンソールの右上にある Cloud Shell を開き、Cloud Shell にデータベース プロジェクトのデータベース プロジェクト ID が表示されていることを確認し、アクセスを許可するプロンプトが表示されたら確認します。

- terraform-db-psc というフォルダを作成し、そのフォルダに移動します。
mkdir terraform-db-psc && cd terraform-db-psc
- main.tf、variable.tf、nat-vm.tf、database.tf ファイルを作成します。
touch main.tf variable.tf nat-vm.tf database.tf
- Cloud Shell エディタ ビューに切り替えます。[エディタ] を選択し、インターフェースを読み込むために必要なプロンプトを許可します。
- 読み込まれたら、[File] > [Open Folder] に移動し、/home/your-user-name/terraform-db-psc に移動して [OK] を選択し、エディタでフォルダを開きます。

- 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"
}
- 次に、main.tf ファイルを開きます。以下で説明するように、さまざまなアクションを実行する Terraform コードを追加します。
API を有効にする |
|
VPC を作成する |
|
ファイアウォール ルールを追加する |
|
PSA 範囲を作成する |
|
ピアリングを作成する |
|
- 次の内容をコピーして main.tf ファイルに貼り付けます。
resource "google_project_service" "default" {
for_each = toset([
"compute.googleapis.com",
"servicenetworking.googleapis.com",
"sqladmin.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 = true
mtu = 1460
routing_mode = "GLOBAL"
}
resource "google_compute_global_address" "psa_range" {
name = "psa-range-${google_compute_network.default.name}"
project = var.project_id
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 20
address = "172.18.0.0"
network = google_compute_network.default.id
}
resource "google_service_networking_connection" "private_connection" {
network = google_compute_network.default.self_link
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [
google_compute_global_address.psa_range.name,
]
}
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", "172.18.0.0/20"] # Include PSA range
}
- Cloud Shell ターミナルに戻り、terraform-db-psc ディレクトリ
cd terraform-db-pscにいることを確認して、次のコマンドを実行します。
terraform init
作業ディレクトリを初期化します。この手順では、指定された構成に必要なプロバイダがダウンロードされます。
terraform plan
実行プランを生成し、インフラストラクチャをデプロイするために Terraform が実行するアクションを表示します。
- リソースを作成するには、
terraform applyコマンドを実行し、yesと入力して実行します。
4. タスク 2. PSA を使用して Cloud SQL インスタンスを作成する(Terraform)
Terraform を使用して、接続を許可する PSA オプションを指定して CloudSQL インスタンスを作成しましょう。この構成は、データベース プロジェクトで完了します。
- Cloud Shell エディタ ビューに切り替えます。
terraform-db-pscフォルダにいることを確認します。database.tfファイルを選択し、次の内容を追加します。
resource "google_sql_database_instance" "default" {
name = "psc-psa-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 {
ipv4_enabled = "false"
private_network = google_compute_network.default.id
}
}
deletion_protection = false
}
resource "google_sql_user" "users" {
name = "testsql"
instance = google_sql_database_instance.default.name
password = var.db_password
}
- Cloud Shell ターミナルに戻り、terraform-db-psc ディレクトリに移動します。リソースを作成するには、
terraform applyコマンドを実行し、yesと入力して実行します。PSA を使用して Cloud SQL インスタンスを作成するには、15 分以上かかることがあります。
データベースを確認する
- 完了したら、コンソールの [SQL] に移動し、新しく作成した psc-psa-sql-db データベース インスタンスを選択します。
- 左側の SQL オプションのスライドアウトを開き、[接続] を選択します。
- [概要] タブには、接続に関する情報が表示されます。
- [内部 IP アドレス] をコピーして、システム内の任意の場所に保存します。ご覧のとおり、予約した範囲から割り当てられています。
- この IP は、タスク 3 のステップ 5 を完了するために必要になります。

- 左側の SQL オプションのスライドアウトを開き、[ユーザー] を選択します。
- パスワード cloudsql24 の testsql というユーザーが表示されます(これは後で db にアクセスするために使用されます)。
5. タスク 3. テスト VM を作成し、db プロジェクト内から SQL インスタンスに接続する(Terraform)
Terraform を使用して、テスト VM と NAT ゲートウェイを作成しましょう。この構成は、データベース プロジェクトで完了します。
- Cloud Shell エディタ ビューに切り替えます。
terraform-db-pscフォルダにいることを確認します。nat-vm.tfファイルを選択し、次の内容を追加します。
resource "google_compute_router" "default" {
name = "outbound-nat"
region = var.region_id
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_instance" "sql_net_vm" {
name = "db-vm-test"
machine_type = "e2-medium"
zone = "${var.region_id}-b"
project = var.project_id
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = google_compute_network.default.self_link
}
# 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
}
- Cloud Shell ターミナルに戻り、terraform-db-psc ディレクトリに移動します。リソースを作成するには、
terraform plan, then terraform applyコマンドを実行し、yesと入力して実行します。これにより、NAT ゲートウェイと MariaDB がインストールされた VM が作成されます。
データベースを確認する
コンシューマー プロジェクトでこれを完了します
- [VM インスタンス] に移動します。[db-vm-test] を選択します。
- [SSH] オプションを選択して、VM に接続します。
- 次のコマンドを使用して、前にコピーしたローカル IP 経由で DB に接続します。
mysql --host=172.18.0.2 --user=testsql --password=cloudsql24
追伸: 接続するには、IP アドレスを実際の IP に変更してください。
- 接続が確立されたら、次の localvpcsqldb を使用してデータベースを作成します。
CREATE DATABASE localvpcsqldb;
- 完了したら、「exit」と入力して接続を終了します。もう一度「exit」と入力して VM を閉じます。
6. タスク 4. CloudSQL インスタンスで PSC を有効にする
gcloud コマンドを使用して PSC オプションを有効にし、接続を許可します。この構成は、データベース プロジェクトで完了します。
- Cloud Shell ビューに切り替えます。
- Cloud Shell で次のコマンドを実行します。
YOUR_DB_PROJECT_HEREは、データベース プロジェクト ID に置き換えます。- Ensure
YOUR_CONSUMER_PROJECT_HEREは、コンシューマー プロジェクト ID に置き換えます。
project_id=YOUR_DB_PROJECT_HERE
allowed_project=YOUR_CONSUMER_PROJECT_HERE
gcloud beta sql instances patch psc-psa-sql-db \
--project=$project_id \
--enable-private-service-connect \
--allowed-psc-projects=$allowed_project
- これにより、既存のデータベースが PSC アタッチメントで更新されます。これには 10 分以上かかります。
タイムアウト待機エラーが発生した場合は、進行状況を確認するためのコマンドも表示されます。「You can continue waiting for the operation by running `gcloud beta sql operations wait –project`」のようなメッセージが表示されます。
PSA と PSC が有効になっている新しいデータベース は、最初からデプロイできます。
データベースを確認する
- 完了したら、コンソールの [SQL] に移動し、psc-psa-sql-db データベース インスタンスを選択します。
- 左側の SQL オプションのスライドアウトを開き、[接続] を選択します。
- [概要] タブには、接続に関する情報が表示されます。
- サービス アタッチメントのアドレスをコピーして、システムのどこかに保存します。
- これは、次のタスク 5 のステップ 8 を完了するために必要です。

7. タスク 5. コンシューマー プロジェクトの環境を設定する(Terraform)
コンシューマー プロジェクトで、ファイアウォール ルールとサブネットを含むカスタム VPC を作成します。クラウド コンソールを開き、使用するプロジェクトを選択します。
- コンソールの右上にある Google Cloud アイコンの横にあるプルダウンをクリックし、[すべて] タブを選択します。


- 表示されたプロジェクトからコンシューマー プロジェクト ID を選択して続行します。
- コンソールの右上の Cloud Shell を開き、Cloud Shell にコンシューマー プロジェクト IDが表示されていることを確認し、アクセスを許可するプロンプトが表示されたら確認します。
- terraform-consumer-psc という名前のフォルダを作成し、そのフォルダに移動します。
mkdir terraform-consumer-psc && cd terraform-consumer-psc
- main.tf、variable.tf、psc.tf ファイルを作成します。
touch main.tf variable.tf psc.tf
- コンシューマー プロジェクト ID の Cloud Shell エディタ ビューに切り替えます。[エディタ] を選択し、インターフェースを読み込むために必要なプロンプトを許可します。
- 読み込まれたら、[File] > [Open Folder] に移動し、/home/your-user-name/terraform-consumer-psc に移動して [OK] を選択し、エディタでフォルダを開きます。

- variable.tf ファイルを選択し、次の内容を追加します。
your-consumer-project-id-hereテキストは、引用符で囲まれた実際のコンシューマー プロジェクト ID に置き換えます。your-psc-attachment-id-hereテキストは、引用符で囲まれた psc アタッチメント アドレスに置き換えます。これは、タスク 4 のセクション 5 ~ 7 でコピーした ID です。
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-vpc"
}
variable "region_id" {
type = string
default = "us-east1"
}
- 次に、main.tf ファイルを開きます。以下で説明するように、さまざまなアクションを実行する Terraform コードを追加します。
API を有効にする |
|
VPC を作成する |
|
NAT ゲートウェイを作成する |
|
ファイアウォール ルールを追加する |
|
- 次の内容をコピーして 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_pc" {
name = "vm-net"
ip_cidr_range = "192.168.80.0/24"
region = var.region_id
network = google_compute_network.default.name
project = var.project_id
}
resource "google_compute_subnetwork" "psc_subnet_ip" {
name = "psc-subnet"
ip_cidr_range = "192.168.100.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_id
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"]
}
- Cloud Shell ターミナルに戻り、コンシューマー プロジェクトの terraform-consumer-psc ディレクトリ
cd terraform-consumer-pscに移動していることを確認して、次のコマンドを実行します。
terraform init
作業ディレクトリを初期化します。この手順では、指定された構成に必要なプロバイダがダウンロードされます。
terraform plan
実行プランを生成し、インフラストラクチャをデプロイするために Terraform が実行するアクションを表示します。
- リソースを作成するには、
terraform applyコマンドを実行し、yesと入力して実行します。
8. タスク 6. コンシューマー プロジェクトとテスト VM に SQL DB への PSC エンドポイント アタッチメントを作成する(Terraform)
この構成は、コンシューマー プロジェクトで完了します。
- Cloud Shell エディタに戻り、terraform-consumer-psc ディレクトリを開いて
psc.tfファイルを選択します。ファイルに次の Terraform コードを追加します。これにより、静的内部 IP、PSC エンドポイント、Maria DB がインストールされたテスト VM が作成されます。
resource "google_compute_address" "default" {
name = "psc-ip-1"
region = var.region_id
address_type = "INTERNAL"
subnetwork = google_compute_subnetwork.psc_subnet_ip.name
address = "192.168.100.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 = "remote-sql-test-vm"
machine_type = "e2-medium"
zone = "${var.region_id}-b"
project = var.project_id
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
subnetwork = google_compute_subnetwork.vm_subnet_pc.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
}
- Cloud Shell ターミナルに戻り、コンシューマー プロジェクトの terraform-consumer-psc ディレクトリ
cd terraform-consumer-pscに移動していることを確認して、次のコマンドを実行します。
terraform plan
実行プランを生成し、インフラストラクチャをデプロイするために Terraform が実行するアクションを表示します。
- リソースを作成するには、
terraform applyコマンドを実行し、yesと入力して実行します。
9. タスク 7. PSC IP アドレスを介して VM からのエンドポイント接続を確認する
コンシューマー プロジェクトでこれを完了します
- [VM インスタンス] に移動します。[remote-sql-test-vm] を選択します。
- [SSH] オプションを選択して、VM に接続します。
- 次の情報を使用して、エンドポイント経由で DB に接続します。
mysql --host=192.168.100.100 --user=testsql --password=cloudsql24
- 接続が確立されたら、次の psc-sql-db を使用してデータベースを作成します。
CREATE DATABASE remotepscpsasqldb;
- 完了したら、「exit」と入力して接続を終了します。もう一度「exit」と入力して VM を閉じます。
10. タスク 8. データベース エントリを確認する
この確認はデータベース プロジェクトで行います。
- コンソールの右上にある Google Cloud アイコンの横にあるプルダウンをクリックし、[すべて] タブを選択します。


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

11. クリーンアップ
ユーザー プロジェクトでこの操作を行います
- コンシューマー プロジェクト ID を選択する
- Cloud Shell に移動し、ユーザー プロジェクト ID が表示されていることを確認します。
- terraform-consumer-psc ディレクトリ
cd terraform-consumer-pscに移動し、次のコマンドterraform destroyを実行してyesと入力します。Terraform で作成したコンシューマー プロジェクト内のすべてのリソースが削除されます。
データベース プロジェクトで完了する
- データベース プロジェクト ID を選択する
- Cloud Shell に移動し、データベース プロジェクト ID が表示されていることを確認します。
- terraform-db-psc ディレクトリ
cd terraform-db-pscに移動し、次のコマンドterraform destroyを実行してyesと入力します。Terraform で作成した db プロジェクト内のほとんどのリソースが削除されます。サービス ネットワーキングが削除されず、エラーが発生する可能性があります。 - 次に、terraform-db-psc フォルダから次のファイルを削除します。
rm -r terraform.tfstate terraform.tfstate.backup
- 次に、コンソールで [VPC ネットワーク] に移動します。
- database-net VPC を選択し、[プライベート サービス アクセス] を選択します。[サービスに割り当てられた IP 範囲] で、psa-range-database-net を選択し、[リリース] オプションを選択します。

- 次に、[VPC ネットワーク ピアリング] を選択し、[servicenetworking-googleapis-com] を選択して、[削除] オプションを選択します。

- 次に、[VPC ネットワークを削除 ]
を選択します。
12. 完了
お疲れ様でした。PSA と PSC アタッチメントを使用して Cloud SQL インスタンスを構成し、別の VPC に Private Service Connect エンドポイントを作成できました。
その他の情報
Private Service Connect と Cloud SQL の詳細を確認する
その他の関連する Codelab: https://codelabs.developers.google.com/codelabs/cloudsql-psc-terraform