1. 概览
您可以通过多种方式从其他项目或 VPC 连接到专用 Cloud SQL 实例。借助 Private Service Connect (PSC),服务提供方可以通过服务连接公开其服务。使用方可以使用这些服务连接在其环境中创建 PSC 端点和/或 PSC 后端,并通过指定的专用 IP 连接到这些提供方服务。
Cloud SQL 能够利用 PSC 服务连接来实现专用连接。在本实验中,您可以配置并测试该选项。
在本实验中,您将构建一个简单的架构,演示如何将 PSC 端点访问与 CloudSQL 搭配使用。
图 1.

在本实验中,您将需要两个项目或同一项目中的两个单独的 VPC。
目标
在本实验中,您将学习如何执行以下任务:
- 创建具有 PSC 服务连接的 CloudSQL 实例。
- 创建静态 IP 地址
- 在使用方 VPC 中创建 PSC 端点以连接到 CloudSQL 数据库
- 验证是否可以通过 PSC 端点 IP 从使用方网络中的测试虚拟机访问 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)
在数据库项目中,我们将创建一个带有防火墙规则和子网的自定义 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 编辑器视图。选择编辑器,确保您允许任何必要的提示,以便加载界面。
- 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-db 并选择确定以在编辑器中打开该文件夹。

- 选择 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(稍后将使用此用户访问数据库)
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 编辑器视图。选择编辑器,确保您允许任何必要的提示,以便加载界面。
- 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-consumer 并选择确定以在编辑器中打开该文件夹。

- 选择 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. 在使用方项目和测试虚拟机中创建 PSC 端点到 SQL 数据库连接(Terraform)
在使用方项目中完成此配置。
- 切换回 Cloud Shell 编辑器,打开 terraform-consumer 目录,然后选择
psc.tf文件。将以下 Terraform 代码添加到文件中。这会创建一个静态内部 IP、一个 PSC 端点和一个安装了 Maria DB 的测试虚拟机。
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以运行 - 由于我们的虚拟机和端点位于不同的区域,因此我们需要在 PSC 端点上启用 全球访问权限。我们通过控制台来实现此目的
- 在使用方项目控制台中,前往 Private Service Connect。在已连接的端点标签页下,找到“端点”部分,然后选择 psc-sql-endpoint
- 现在,选择修改,然后点击启用全局访问权限旁边的复选框和保存选项。

- 继续执行下一步以验证连接
7. 任务 5. 验证从虚拟机通过 PSC IP 地址建立的端点连接
在使用方项目中完成此操作
- 前往虚拟机实例。选择 sql-test-vm
- 选择 SSH 选项以连接到虚拟机。
- 通过端点连接到数据库,方法如下:
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 选项,然后选择数据库。您应该会看到刚刚从使用方项目虚拟机**
.** 创建的名为 remotesqldb 的数据库

9. 清理
在数据库项目中完成此操作
- 选择数据库项目 ID
- 前往 Cloud Shell,确保您看到数据库项目 ID
- 前往 terraform-db 目录
cd terraform-db,然后运行以下命令terraform destroy,并输入yes,这样一来,您在数据库项目中通过 Terraform 创建的所有资源都将被移除。
在使用方项目中完成此操作
- 选择使用方项目 ID
- 前往 Cloud Shell,确保您看到的是消费项目 ID
- 前往 terraform-consumer 目录
cd terraform-consumer,然后运行以下命令terraform destroy并输入yes,这样一来,您在数据库项目中通过 Terraform 创建的所有资源都将被移除。
10. 恭喜
恭喜!您已成功配置具有 PSC 连接的 Cloud SQL 实例,并在另一个 VPC 中创建了 Private Service Connect 端点。您已能够通过 PSC 端点从远程虚拟机成功连接到数据库。