1. 概览
您可以通过多种方式从其他项目或 VPC 网络连接到专用 Cloud SQL 实例。您可以使用专用服务访问通道 (PSA) 通过专用连接访问 Google 和第三方服务的内部 IP 地址。现在,您还可以启用 Private Service Connect (PSC),以扩大对数据库的访问权限。
借助 Private Service Connect (PSC),服务提供方可以通过服务连接公开其服务,使用方可以使用这些连接在其环境中创建 PSC 端点和/或 PSC 后端。通过这些 PSC 端点,它们可以通过用户指定的专用 IP 地址连接到提供方服务。
在本实验中,您可以配置和测试该选项。
在本实验中,您将构建一个简单的架构,演示如何将 PSA 和 PSC 端点访问权限与 CloudSQL 搭配使用。
图 1.
在本实验中,您需要两个项目或同一项目中的单独 VPC。
目标
在本实验中,您将学习如何执行以下任务:
- 启用 Service Networking
- 设置 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 编辑器视图。选择编辑器,确保允许所有必要的提示,以便界面加载。
- 加载完毕后,依次选择 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(稍后将用于访问数据库)
5. 任务 3. 创建测试虚拟机,并从数据库项目 (Terraform) 中连接到 SQL 实例
我们将使用 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。 - 将
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 选项滑出式菜单,然后选择连接
- 在“摘要”标签页下,您可以查看与连接相关的信息。
- 复制服务附件地址,并将其保存到系统上的某个位置。
- 您需要此信息来完成下一个任务 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 编辑器视图。选择编辑器,确保允许所有必要的提示,以便界面加载。
- 加载完毕后,依次选择 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. 在使用方项目和测试虚拟机中创建 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 选项,然后选择 Databases。您应该会在使用方项目虚拟机中看到您刚刚创建的名为 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,选择 PRIVATE SERVICES ACCESS,在 Allocated IP Ranges for Services 下,选择 psa-range-database-net,然后选择 Release 选项
- 接下来,依次选择 VPC 网络对等互连、servicenetworking-googleapis-com 和 Delete(删除)选项
- 接下来,选择删除 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