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 を使用して CloudSQL インスタンスを作成する
- PSC サービス アタッチメントを有効にします。
- コンシューマ VPC に PSC エンドポイントを作成して CloudSQL データベースに接続する
- プロデューサー 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 コンソールを開き、データベースに使用するプロジェクトを選択します。
- コンソールの右上にある 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 エディタ ビューに切り替えます。[editor] を選択し、インターフェースを読み込めるように必要なプロンプトを許可します。
- 読み込みが完了したら、[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(Terraform)を使用して CloudSQL インスタンスを作成する
Terraform を使用して CloudSQL インスタンスを作成し、接続を許可する PSA オプションを指定します。この構成は、データベース プロジェクトで完了します。
- 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 を使用して CloudSQL インスタンスを作成する場合、最大で 15 分以上かかることがあります。
データベースを確認する
- 完了したら、コンソールの [SQL] に移動し、新しく作成された psc-psa-sql-db データベース インスタンスを選択します。
- 左側の SQL オプションのスライドアウトを開き、[接続] を選択します。
- [概要] タブには、接続に関する情報が表示されます。
- [内部 IP アドレス] をコピーして、システムの任意の場所に保存します。ご覧のとおり、予約した範囲から割り当てられています。
- この IP は、タスク 3 のステップ 5 を完了するために必要になります。
- 左側の SQL オプションのスライドアウトを開き、[ユーザー] を選択します。
- testsql というユーザーがパスワード cloudsql24 で表示されます。(これは後で 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
と入力して実行します。これにより、MariaDB がインストールされた NAT ゲートウェイと 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 に置き換えます。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 分以上かかります。
タイムアウト待機エラーが発生した場合は、進行状況を確認するためのコマンドも表示されます。次のようなメッセージが表示されます。「オペレーションの待機を続行するには、gcloud beta sql operations wait –project を実行してください。」
新しいデータベースは、最初からPSA と PSC を有効にして デプロイできます。
データベースを確認する
- 完了したら、コンソールの [SQL] に移動し、psc-psa-sql-db データベース インスタンスを選択します。
- 左側の SQL オプションのスライドアウトを開き、[接続] を選択します。
- [概要] タブには、接続に関する情報が表示されます。
- Service アタッチメントのアドレスをコピーして、システムの任意の場所に保存します。
- これは、次のタスク 5 のステップ 8 を完了するために必要になります。
7. タスク 5. コンシューマ プロジェクトの環境を設定する(Terraform)
コンシューマ プロジェクトで、ファイアウォール ルールとサブネットを含むカスタム VPC を作成します。Cloud コンソールを開き、使用するプロジェクトを選択します。
- コンソールの上部にある 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 エディタ ビューに切り替えます。[editor] を選択し、インターフェースを読み込めるように必要なプロンプトを許可します。
- 読み込みが完了したら、[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 に PSC エンドポイントから SQL DB アタッチメントを作成します(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 を選択し、[PRIVATE SERVICES ACCESS] を選択します。[Allocated IP Ranges for Services] で、psa-range-database-net を選択し、[Release] オプションを選択します。
- 次に、[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