1. 概览
您可以通过多种方式从其他项目或 VPC 网络连接到专用 Cloud SQL 实例。您可以使用专用服务访问通道 (PSA) 通过专用连接来访问 Google 和第三方服务的内部 IP 地址。如需扩展数据库访问权限,您现在还可以启用 Private Service Connect (PSC)。
借助 Private Service Connect (PSC),服务提供方可以通过服务连接公开其服务,使用方可以使用这些服务连接在其环境中创建 PSC 端点和/或 PSC 后端。通过这些 PSC 端点,他们可以通过用户指定的专用 IP 连接到提供方服务。
在本实验中,您可以配置并测试该选项。
在本实验中,您将构建一个简单的架构,用于演示如何将 PSA 和 PSC 端点访问与 CloudSQL 搭配使用。
图 1.

在本实验中,您将需要两个项目或同一项目中的两个单独的 VPC。
目标
在本实验中,您将学习如何执行以下任务:
- 启用服务联网
- 设置 PSA
- 使用 PSA 创建 CloudSQL 实例
- 启用 PSC 服务连接。
- 在使用方 VPC 中创建 PSC 端点以连接到 CloudSQL 数据库
- 验证从提供方和使用方 VPC 中的测试虚拟机访问 SQL 数据库的权限
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。
3. 任务 1. 使用 Terraform 为数据库项目设置环境
在数据库项目中,我们将启用 Service Networking、创建 VPC、创建 PSA 范围、创建 Service Networking 对等互连,并创建防火墙规则。打开 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 编辑器视图。选择编辑器,确保您允许任何必要的提示,以便加载界面。
- 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-db-psc 并选择确定以在编辑器中打开该文件夹。

- 选择 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 创建 CloudSQL 实例 (Terraform)
我们来使用 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 地址是从我们预留的范围内分配的。
- 您需要此 IP 地址才能完成任务 3 的第 5 步。

- 在左侧,展开 SQL 选项滑出式菜单,然后选择用户。
- 您应该会看到一个名为 testsql 的用户,其密码为 cloudsql24(稍后将使用此用户访问数据库)
5. 任务 3. 创建测试虚拟机并从数据库项目内连接到 SQL 实例 (Terraform)
我们来使用 Terraform 创建一个测试虚拟机和 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 的虚拟机。
验证数据库
在使用方项目中完成此操作
- 前往虚拟机实例。选择 db-vm-test
- 选择 SSH 选项以连接到虚拟机。
- 使用以下命令通过您之前复制的本地 IP 连接到数据库:
mysql --host=172.18.0.2 --user=testsql --password=cloudsql24
附注:请将 IP 地址更改为您的实际 IP 地址,以便连接。
- 连接建立后,我们来创建一个包含以下 localvpcsqldb 的数据库。
CREATE DATABASE localvpcsqldb;
- 完成后,输入 exit 以退出连接。再次输入 exit 以关闭虚拟机。
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 分钟以上)。
如果您收到等待超时错误,系统还应提供用于继续查看进度的命令。类似如下内容:“您可以运行 `gcloud beta sql operations wait –project 继续等待操作完成”
请注意,您可以从一开始就部署启用了 PSA 和 PSC 的新数据库。
验证数据库
- 完成后,前往控制台中的 SQL,然后选择 psc-psa-sql-db 数据库实例。
- 在左侧,展开 SQL 选项滑出式菜单,然后选择连接
- 在“摘要”标签页下,您可以查看有关连接的信息。
- 复制服务附件地址,并将其保存到您系统中的某个位置。
- 您需要此信息才能完成下一个任务(步骤 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 编辑器视图。选择编辑器,确保您允许任何必要的提示,以便加载界面。
- 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-consumer-psc 并选择确定,以在编辑器中打开该文件夹。

- 选择 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. 在使用方项目和测试虚拟机中创建 PSC 端点到 SQL 数据库连接(Terraform)
在使用方项目中完成此配置。
- 切换回 Cloud Shell 编辑器,打开 terraform-consumer-psc 目录,然后选择
psc.tf文件。将以下 Terraform 代码添加到文件中。这会创建一个静态内部 IP、一个 PSC 端点和一个安装了 Maria DB 的测试虚拟机。
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 地址建立的端点连接
在使用方项目中完成此操作
- 前往虚拟机实例。选择 remote-sql-test-vm
- 选择 SSH 选项以连接到虚拟机。
- 通过端点连接到数据库,方法如下:
mysql --host=192.168.100.100 --user=testsql --password=cloudsql24
- 建立连接后,我们来创建一个名为 psc-sql-db 的数据库。
CREATE DATABASE remotepscpsasqldb;
- 完成后,输入 exit 以退出连接。再次输入 exit 以关闭虚拟机。
10. 任务 8. 验证数据库条目
在数据库项目中完成此验证
- 在控制台顶部右侧的 Google Cloud 图标旁边,点击下拉菜单,然后选择全部标签页。


- 从列出的项目中选择您的数据库项目 ID 以继续。
- 前往 SQL,选择数据库 psc-psa-sql-db,展开 SQL 选项,然后选择数据库。您应该会看到刚刚创建的数据库,即使用方项目虚拟机中的 remotepscpsasqldb 和数据库项目虚拟机中的 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 创建的大部分资源将被移除。服务联网可能无法删除,并会显示错误。 - 接下来,从 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