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 编辑器视图。选择编辑器,确保允许所有必要的提示,以便界面加载。
- 加载完毕后,依次选择 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(稍后将用于访问数据库)
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 编辑器视图。选择编辑器,确保允许所有必要的提示,以便界面加载。
- 加载完毕后,依次选择 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 的任务 2 中复制的 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 选项,然后选择 Databases。您应该会在使用方项目虚拟机中看到您刚刚创建的名为 remotesqldb 的数据库**
.
**
9. 清理
在“数据库”项目中完成此操作
- 选择数据库项目 ID
- 前往 Cloud Shell,确保您看到数据库项目 ID
- 前往 terraform-db 目录
cd terraform-db
,运行以下命令terraform destroy
,然后输入yes
,您在 db 项目中使用 Terraform 创建的所有资源都将被移除。
在使用方项目中完成此操作
- 选择使用方项目 ID
- 前往 Cloud Shell,确保您看到了使用方项目 ID
- 前往 terraform-consumer 目录
cd terraform-consumer
,运行以下命令terraform destroy
,然后输入yes
,您在数据库项目中使用 Terraform 创建的所有资源都将被移除。
10. 恭喜
恭喜,您已成功配置了具有 PSC 附件的 Cloud SQL 实例,并在另一个 VPC 中创建了 Private Service Connect 端点。您已成功通过 PSC 端点从远程虚拟机连接到数据库。