1. 概要
別のプロジェクトまたは VPC からプライベート Cloud SQL インスタンスに接続するには、いくつかの方法があります。Private Service Connect(PSC)を使用すると、サービス プロデューサーはサービス アタッチメントを介してサービスを公開できます。これらのサービス アタッチメントを使用すると、コンシューマは環境内に PSC エンドポイントや PSC バックエンドを作成し、指定されたプライベート IP 経由でこれらのプロデューサー サービスに接続できます。
Cloud SQL には、PSC サービス アタッチメントを使用してプライベート接続を許可する機能があります。このラボでは、このオプションを構成してテストします。
このラボでは、CloudSQL で PSC エンドポイント アクセスを使用するシンプルなアーキテクチャを構築します。
図 1.
このラボでは、2 つのプロジェクトまたは同じプロジェクト内の個別の VPC が必要です。
目標
このラボでは、次のタスクの実行方法について学びます。
- PSC サービス アタッチメントを使用して CloudSQL インスタンスを作成します。
- 静的 IP アドレスを作成
- コンシューマ VPC に PSC エンドポイントを作成して CloudSQL データベースに接続する
- PSC エンドポイント IP 経由でコンシューマ ネットワーク内のテスト 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 を作成します。Cloud コンソールを開き、データベースに使用するプロジェクトを選択します。
- コンソールの右上にある Cloud Shell を開き、Cloud Shell にデータベース プロジェクトのデータベース プロジェクト ID が表示されていることを確認します。アクセスを許可するよう求めるプロンプトが表示されたら、そのプロンプトに沿って操作します。
- terraform-db というフォルダを作成し、そのフォルダに移動します。
mkdir terraform-db && cd terraform-db
- main.tf、variable.tf、database.tf ファイルを作成します。
touch main.tf variable.tf database.tf
- Cloud Shell エディタ ビューに切り替えます。[editor] を選択し、インターフェースを読み込めるように必要なプロンプトを許可します。
- 読み込みが完了したら、[File] > [Open Folder] に移動し、/home/your-user-name/terraform-db に移動して [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 を作成する |
|
ファイアウォール ルールを追加する |
|
- 次の内容をコピーして 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"] }
- Cloud Shell ターミナルに戻り、terraform-db ディレクトリ
cd terraform-db
にいることを確認して、次のコマンドを実行します。
terraform init
作業ディレクトリを初期化します。このステップでは、指定した構成に必要なプロバイダがダウンロードされます。
terraform plan
実行プランを生成します。このプランには、Terraform がインフラストラクチャのデプロイに行う操作が示されます。
- リソースを作成するには、
terraform apply
コマンドを実行し、yes
と入力して実行します。
4. タスク 2. PSC アタッチメントを使用して CloudSQL インスタンスを作成する(Terraform)
Terraform を使用して CloudSQL インスタンスを作成し、接続を許可する PSC オプションを指定します。この構成は、データベース プロジェクトで完了します。
- 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
}
- Cloud Shell ターミナルに戻り、terraform-db ディレクトリにいることを確認します。リソースを作成するには、
terraform apply
コマンドを実行し、yes
と入力して実行します。PSC アタッチメントを使用して CloudSQL インスタンスを作成する場合、最大で 5 分以上かかることがあります。
データベースを確認する
- 完了したら、コンソールの [SQL] に移動し、新しく作成された psc-sql-db データベース インスタンスを選択します。
- 左側の SQL オプションのスライドアウトを開き、[接続] を選択します。
- [概要] タブには、接続に関する情報が表示されます。
- サービス アタッチメント アドレスをコピーして、システムの任意の場所に保存します。
- これは、タスク 3 ステップ 8 を完了するために必要になります。
- 左側の SQL オプションのスライドアウトを開き、[ユーザー] を選択します。
- testsql というユーザーがパスワード cloudsql24 で表示されます。(これは後で DB へのアクセスに使用されます)
5. タスク 3. コンシューマ プロジェクトの環境を設定する(Terraform)
コンシューマ プロジェクトで、ファイアウォール ルールとサブネットを含むカスタム VPC を作成します。Cloud コンソールを開き、使用するプロジェクトを選択します。
- コンソールの上部にある Google Cloud アイコンの横にあるプルダウンをクリックし、[すべて] タブを選択します。
- 表示されたプロジェクトから、コンシューマ プロジェクト ID を選択して続行します。
- コンソールの右上にある Cloud Shell を開き、Cloud Shell にコンシューマ プロジェクト ID が表示されていることを確認します。アクセスを許可するよう求められたら、プロンプトに沿って操作します。
- terraform-consumer というフォルダを作成し、そのフォルダに移動します。
mkdir terraform-consumer && cd terraform-consumer
- 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 に移動して [OK] を選択して、エディタでフォルダを開きます。
- variable.tf ファイルを選択し、次のように追加します。
your-consumer-project-id-here
テキストは、実際のコンシューマ プロジェクト ID に置き換えます。your-psc-attachment-id-here
テキストは、PSC アタッチメント アドレスに置き換えます。これは、タスク 2 セクション 2-5 でコピーした 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-net" } variable "region_id" { type = string default = "us-east1" } variable "region_id2" { type = string default = "us-central1" }
- 次に、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" { 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"] }
- Cloud Shell ターミナルに戻り、コンシューマ プロジェクトの terraform-consumer ディレクトリ
cd terraform-consumer
にいることを確認して、次のコマンドを実行します。
terraform init
作業ディレクトリを初期化します。このステップでは、指定した構成に必要なプロバイダがダウンロードされます。
terraform plan
実行プランを生成します。このプランには、Terraform がインフラストラクチャのデプロイに行う操作が示されます。
- リソースを作成するには、
terraform apply
コマンドを実行し、yes
と入力して実行します。
6. タスク 4. コンシューマ プロジェクトとテスト用 VM に PSC エンドポイントから SQL DB アタッチメントを作成します(Terraform)
この構成は、コンシューマ プロジェクトで完了します。
- 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 }
- Cloud Shell ターミナルに戻り、コンシューマ プロジェクトの terraform-consumer ディレクトリ
cd terraform-consumer
にいることを確認して、次のコマンドを実行します。
terraform plan
実行プランを生成します。このプランには、Terraform がインフラストラクチャのデプロイに行う操作が示されます。
- リソースを作成するには、
terraform apply
コマンドを実行し、yes
と入力して実行します。 - VM とエンドポイントが異なるリージョンにあるため、 PSC エンドポイントのグローバル アクセスを有効にする必要があります。この操作はコンソールで行います。
- コンシューマ プロジェクトのコンソールで、[Private Service Connect] に移動します。[接続エンドポイント] タブの [エンドポイント] セクションで、[psc-sql-endpoint] を選択します。
- [編集] を選択し、[グローバル アクセスを有効にする] の横にあるチェックボックスと [保存] オプションをクリックします。
- 次のステップに進んで接続を確認する
7. タスク 5. PSC IP アドレス経由で VM からエンドポイントへの接続を確認します。
コンシューマ プロジェクトで完了する
- [VM インスタンス] に移動します。sql-test-vm を選択します。
- [SSH] オプションを選択して VM に接続します。
- 次のように、エンドポイント経由で DB に接続します。
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
- 接続が確立されたら、次の psc-sql-db を使用してデータベースを作成します。
CREATE DATABASE remotesqldb;
- 完了したら、exit と入力して接続を終了します。
8. タスク 6. データベースのエントリを確認する
この確認はデータベース プロジェクトで完了します。
- コンソールの上部にある Google Cloud アイコンの横にあるプルダウンをクリックし、[すべて] タブを選択します。
- 表示されたプロジェクトからデータベース プロジェクト ID を選択して続行します。
- [SQL] に移動し、データベース psc-sql-db を選択して SQL オプションを開き、[データベース] を選択します。コンシューマ プロジェクトの VM
.
から、作成した remotesqldb というデータベースが表示されます。
9. クリーンアップ
データベース プロジェクトで完了する
- データベース プロジェクト ID を選択する
- Cloud Shell に移動し、データベース プロジェクト ID が表示されていることを確認します。
- terraform-db ディレクトリ
cd terraform-db
に移動し、次のコマンドterraform destroy
を実行してyes
と入力すると、Terraform で db プロジェクトに作成したすべてのリソースが削除されます。
コンシューマ プロジェクトで完了する
- コンシューマ プロジェクト ID を選択する
- Cloud Shell に移動し、コンシューマ プロジェクト ID が表示されていることを確認します。
- 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 をご覧ください。