在运行 PSA 的现有 Cloud SQL 实例上启用 Private Service Connect (Terraform)

1. 概览

您可以通过多种方式从其他项目或 VPC 网络连接到专用 Cloud SQL 实例。您可以使用专用服务访问通道 (PSA) 通过专用连接访问 Google 和第三方服务的内部 IP 地址。现在,您还可以启用 Private Service Connect (PSC),以扩大对数据库的访问权限。

借助 Private Service Connect (PSC),服务提供方可以通过服务连接公开其服务,使用方可以使用这些连接在其环境中创建 PSC 端点和/或 PSC 后端。通过这些 PSC 端点,它们可以通过用户指定的专用 IP 地址连接到提供方服务。

在本实验中,您可以配置和测试该选项。

在本实验中,您将构建一个简单的架构,演示如何将 PSA 和 PSC 端点访问权限与 CloudSQL 搭配使用。

图 1.

e0e0f83704cc9d62.png

在本实验中,您需要两个项目或同一项目中的单独 VPC。

目标

在本实验中,您将学习如何执行以下任务:

  • 启用 Service Networking
  • 设置 PSA
  • 使用 PSA 创建 CloudSQL 实例
  • 启用 PSC 服务连接。
  • 在使用方 VPC 中创建 PSC 端点以连接到 CloudSQL 数据库
  • 验证是否可以从提供方和使用方 VPC 中的测试虚拟机访问 SQL 数据库

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。

3. 任务 1. 使用 Terraform 为数据库项目设置环境

数据库项目中,我们将启用 Service Networking、创建 VPC、创建 PSA 范围、创建 Service Networking 对等互连,并创建防火墙规则。打开 Cloud 控制台,然后选择要用于数据库的项目。

  1. 打开控制台右上角的 Cloud Shell,确保您在 Cloud Shell 中看到数据库项目的数据库项目 ID,然后确认任何提示以允许访问。4261e776f64ea978.png
  2. 创建一个名为 terraform-db-psc 的文件夹,并将其移至
mkdir terraform-db-psc  && cd terraform-db-psc
  1. 创建 main.tf、variable.tf、nat-vm.tfdatabase.tf 文件。
touch main.tf variable.tf nat-vm.tf database.tf 
  1. 切换到 Cloud Shell 编辑器视图。选择编辑器,确保允许所有必要的提示,以便界面加载。
  2. 加载完毕后,依次选择 File > Open Folder,然后前往 /home/your-user-name/terraform-db-psc,然后选择 Ok 以在编辑器中打开该文件夹。78f5eb9f2f82f1b0.png
  3. 选择 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"
}
  1. 接下来,打开 main.tf 文件。我们将添加一些 Terraform 代码来执行各种操作,如下所述。

启用 API

resource "google_project_service" "default"

创建 VPC

resource "google_compute_network" "default"

添加防火墙规则

resource "google_compute_firewall" "allow_icmp"

创建 PSA 范围

resource "google_compute_global_address" "psa_range"

创建对等互连

resource "google_service_networking_connection" "private_connection"

  1. 将以下内容复制并粘贴到 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
}
  1. 切换回 Cloud Shell 终端,确保您位于 terraform-db-psc 目录 cd terraform-db-psc 中,然后运行以下命令

terraform init

初始化工作目录。此步骤会下载给定配置所需的提供程序。

terraform plan

生成执行计划,显示 Terraform 将执行哪些操作来部署基础架构。

  1. 现在,运行 terraform apply 命令并输入 yes 以运行,以创建资源。

4. 任务 2. 使用 PSA (Terraform) 创建 CloudSQL 实例

我们将使用 Terraform 创建一个 CloudSQL 实例,并使用 PSA 选项来允许连接。在数据库项目中完成此配置。

  1. 切换到 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 
}

  1. 切换回 Cloud Shell 终端,确保您位于 terraform-db-psc 目录中。现在,运行 terraform apply 命令并输入 yes 以运行,以创建资源。使用 PSA 创建 CloudSQL 实例最多可能需要 15 分钟以上。

验证数据库

  1. 完成后,在控制台中前往 SQL,然后选择新创建的 psc-psa-sql-db 数据库实例。
  2. 在左侧,展开 SQL 选项滑出式菜单,然后选择连接
  3. 在“摘要”标签页下,您可以查看与连接相关的信息。
  4. 复制内部 IP 地址,并将其保存到系统上的某个位置。如您所见,它是从我们预留的范围分配的。
  5. 您需要此 IP 才能完成第 3 步骤 5。

5c00f08b0f44c957.png

  1. 在左侧,展开 SQL 选项滑出式菜单,然后选择用户
  2. 您应该会看到一个名为 testsql 的用户,其密码为 cloudsql24(稍后将用于访问数据库)

5. 任务 3. 创建测试虚拟机,并从数据库项目 (Terraform) 中连接到 SQL 实例

我们将使用 Terraform 创建测试虚拟机和 NAT 网关。在数据库项目中完成此配置。

  1. 切换到 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
}
  1. 切换回 Cloud Shell 终端,确保您位于 terraform-db-psc 目录中。现在,运行 terraform plan, then terraform apply 命令并输入 yes 以运行,以创建资源。这将创建一个 NAT 网关和安装了 MariaDB 的虚拟机。

验证数据库

在使用方项目中完成此操作

  1. 前往虚拟机实例。选择 db-vm-test
  2. 选择 SSH 选项以连接到虚拟机。
  3. 使用以下命令通过您之前复制的本地 IP 地址连接到数据库:
mysql --host=172.18.0.2 --user=testsql --password=cloudsql24

附注:请将 IP 地址更改为您的实际 IP 地址,以便连接。

  1. 建立连接后,使用以下 localvpcsqldb 创建数据库。
CREATE DATABASE localvpcsqldb;
  1. 完成后,输入 exit 以退出连接。再次输入 exit 以关闭虚拟机。

6. 任务 4. 在 CloudSQL 实例上启用 PSC

我们来使用 gcloud 命令启用 PSC 选项以允许连接。在数据库项目中完成此配置。

  1. 切换到 Cloud Shell 视图。
  2. 在 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
  1. 这将使用 PSC 附件更新现有数据库。此过程需要 10 分钟以上的时间。

如果您收到超时等待错误,系统应该也会提供继续查看进度的命令。例如:“您可以通过运行 `gcloud beta sql operations wait –project 继续等待操作”

请注意,您可以从一开始就部署已启用 PSA 和 PSC 的新数据库

验证数据库

  1. 完成后,在控制台中前往 SQL,选择 psc-psa-sql-db 数据库实例。
  2. 在左侧,展开 SQL 选项滑出式菜单,然后选择连接
  3. 在“摘要”标签页下,您可以查看与连接相关的信息。
  4. 复制服务附件地址,并将其保存到系统上的某个位置。
  5. 您需要此信息来完成下一个任务 5 步骤 8。

2cf5ce71eceea326.png

7. 任务 5. 为使用方项目设置环境 (Terraform)

使用方项目中,我们将创建包含防火墙规则和子网的自定义 VPC。打开 Cloud 控制台,然后选择要使用的项目。

  1. 在控制台顶部的右侧,点击 Google Cloud 图标旁边的下拉菜单,然后选择全部标签页。

项目栏项目栏 2

  1. 从列出的项目中选择您的使用方项目 ID 以继续。
  2. 打开位于控制台右上角的 Cloud Shell,确保您在 Cloud Shell 中看到使用方项目 ID,然后确认所有提示以允许访问。
  3. 创建一个名为 terraform-consumer-psc 的文件夹,并将其移至
mkdir terraform-consumer-psc  && cd terraform-consumer-psc
  1. 创建 main.tf、variable.tfpsc.tf 文件。
touch main.tf variable.tf psc.tf 
  1. 切换到使用方项目 IDCloud Shell 编辑器视图。选择编辑器,确保允许所有必要的提示,以便界面加载。
  2. 加载完毕后,依次选择 File > Open Folder,然后前往 /home/your-user-name/terraform-consumer-psc,选择 Ok 以在编辑器中打开该文件夹。78f5eb9f2f82f1b0.png
  3. 选择 variable.tf 文件,然后添加以下内容。将 your-consumer-project-id-here 文本替换为带引号的实际使用方项目 ID。将 your-psc-attachment-id-here 文本替换为带引号的 psc 附件地址。这是您在第 4 步第 5-7 节复制的 ID d7ac9629a59abfc6.png
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"
}

  1. 接下来,打开 main.tf 文件。我们将添加一些 Terraform 代码来执行各种操作,如下所述。

启用 API

resource "google_project_service"

创建 VPC

resource "google_compute_network"

创建 NAT 网关

resource "google_compute_router"
resource "google_compute_router_nat"

添加防火墙规则

resource "google_compute_firewall"

  1. 将以下内容复制并粘贴到 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"]
 }
  1. 切换回 Cloud Shell 终端,确保您位于使用方项目中的 terraform-consumer-psc 目录 cd terraform-consumer-psc 中,然后运行以下命令

terraform init

初始化工作目录。此步骤会下载给定配置所需的提供程序。

terraform plan

生成执行计划,显示 Terraform 将执行哪些操作来部署基础架构。

  1. 现在,运行 terraform apply 命令并输入 yes 以运行,以创建资源。

8. 任务 6. 在使用方项目和测试虚拟机中创建 PSC 端点到 SQL 数据库附件 (Terraform)

使用方项目中完成此配置。

  1. 切换回 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
}
  1. 切换回 Cloud Shell 终端,确保您位于使用方项目中的 terraform-consumer-psc 目录 cd terraform-consumer-psc 中,然后运行以下命令

terraform plan

生成执行计划,显示 Terraform 将执行哪些操作来部署基础架构。

  1. 现在,运行 terraform apply 命令以创建资源,然后输入 yes 以运行

9. 任务 7. 通过 PSC IP 地址验证虚拟机与端点的连接

在使用方项目中完成此操作

  1. 前往虚拟机实例。选择 remote-sql-test-vm
  2. 选择 SSH 选项以连接到虚拟机。
  3. 使用以下命令通过端点连接到数据库:
mysql --host=192.168.100.100 --user=testsql --password=cloudsql24
  1. 建立连接后,使用以下 psc-sql-db 创建数据库。
CREATE DATABASE remotepscpsasqldb;
  1. 完成后,输入 exit 以退出连接。再次输入 exit 以关闭虚拟机。

10. 任务 8. 验证数据库条目

数据库项目中完成此验证

  1. 在控制台顶部的右侧,点击 Google Cloud 图标旁边的下拉菜单,然后选择全部标签页。

项目栏项目栏 2

  1. 从列出的项目中选择您的数据库项目 ID 以继续。
  2. 前往 SQL,选择数据库 psc-psa-sql-db,展开 SQL 选项,然后选择 Databases。您应该会在使用方项目虚拟机中看到您刚刚创建的名为 remotepscpsasqldb 的数据库,以及数据库项目虚拟机中的 localvpcsqldb**.**

36f5c03124ca20f6.png

11. 清理

在使用方项目中完成此操作

  1. 选择使用方项目 ID
  2. 前往 Cloud Shell,确保您看到了使用方项目 ID
  3. 前往 terraform-consumer-psc 目录 cd terraform-consumer-psc,运行以下命令 terraform destroy,然后输入 yes,您在使用 Terraform 的使用方项目中创建的所有资源都将被移除。

在“数据库”项目中完成此操作

  1. 选择数据库项目 ID
  2. 前往 Cloud Shell,确保您看到数据库项目 ID
  3. 前往 terraform-db-psc 目录 cd terraform-db-psc,运行以下命令 terraform destroy,然后输入 yes,您在数据库项目中使用 Terraform 创建的大多数资源将被移除。系统可能无法删除服务网络,并会显示错误消息。
  4. 接下来,从 terraform-db-psc 文件夹中删除以下文件。
rm -r terraform.tfstate terraform.tfstate.backup
  1. 接下来,在控制台中前往 VPC 网络
  2. 选择 database-net VPC,选择 PRIVATE SERVICES ACCESS,在 Allocated IP Ranges for Services 下,选择 psa-range-database-net,然后选择 Release 选项

e4dbfa8953c5b036.png

  1. 接下来,依次选择 VPC 网络对等互连servicenetworking-googleapis-comDelete(删除)选项

4deab14044461d2d.png

  1. 接下来,选择删除 VPC 网络 2f4e96399b73d405.png

12. 恭喜

恭喜,您已成功配置了具有 PSA 和 PSC 连接的 Cloud SQL 实例,并在另一个 VPC 中创建了 Private Service Connect 端点。

了解详情

您可以详细了解 Private Service Connect 和 Cloud SQL

其他相关 Codelab:https://codelabs.developers.google.com/codelabs/cloudsql-psc-terraform