通过 Private Service Connect (Terraform) 连接到 CloudSQL

1. 概览

您可以通过多种方式从其他项目或 VPC 连接到专用 Cloud SQL 实例。借助 Private Service Connect (PSC),服务提供方可以通过服务连接公开其服务。使用方可以使用这些服务附件在其环境中创建 PSC 端点和/或 PSC 后端,并通过指定的专用 IP 地址连接到这些提供方服务。

Cloud SQL 能够利用 PSC 服务连接来允许建立专用连接。在本实验中,您可以配置和测试该选项。

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

图 1.

1893f48fe1298ea2.png

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

目标

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

  • 创建具有 PSC 服务连接的 CloudSQL 实例。
  • 创建静态 IP 地址
  • 在使用方 VPC 中创建 PSC 端点以连接到 CloudSQL 数据库
  • 验证是否可以通过 PSC 端点 IP 从使用方网络中的测试虚拟机访问 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 为数据库项目设置环境

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

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

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

terraform init

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

terraform plan

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

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

4. 任务 2. 创建具有 PSC 附件的 CloudSQL 实例 (Terraform)

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

  1. 切换到 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 
}
  1. 切换回 Cloud Shell 终端,确保您位于 terraform-db 目录中。现在,运行 terraform apply 命令并输入 yes 以运行,以创建资源。创建具有 PSC 附件的 CloudSQL 实例最多可能需要 5 分钟以上。

验证数据库

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

具有 PSC 附加项的 Cloud SQL

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

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

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

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

项目栏项目栏 2

  1. 从列出的项目中选择您的使用方项目 ID 以继续。
  2. 打开位于控制台右上角的 Cloud Shell,确保您在 Cloud Shell 中看到使用方项目 ID,然后确认所有提示以允许访问。
  3. 创建一个名为 terraform-consumer 的文件夹,并将其移至
mkdir terraform-consumer  && cd terraform-consumer
  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,然后选择 Ok 以在编辑器中打开该文件夹。78f5eb9f2f82f1b0.png
  3. 选择 variable.tf 文件,然后添加以下内容。将 your-consumer-project-id-here 文本替换为带引号的实际使用方项目 ID。将 your-psc-attachment-id-here 文本替换为带引号的 psc 附件地址。这是您在第 2 部分 2-5 的任务 2 中复制的 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-net"
}

variable "region_id" {
  type = string
  default = "us-east1"
}

variable "region_id2" {
  type = string
  default = "us-central1"
}
  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" {
  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"]
 }
  1. 切换回 Cloud Shell 终端,确保您位于使用方项目中的 terraform-consumer 目录 cd terraform-consumer 中,然后运行以下命令

terraform init

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

terraform plan

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

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

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

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

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

terraform plan

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

  1. 现在,运行 terraform apply 命令以创建资源,然后输入 yes 以运行
  2. 由于我们的虚拟机和端点位于不同的区域,因此我们需要 为 PSC 端点启用全球访问权限。我们通过控制台执行此操作
  3. 在使用方项目控制台中,前往 Private Service Connect。在已连接的端点标签页下,找到“端点”部分,然后选择 psc-sql-endpoint
  4. 现在,选择修改,然后点击启用全球访问权限旁边的复选框,并点击保存选项。7eeb5a4162f5f79d.png
  5. 继续执行下一步以验证连接

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

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

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

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

数据库项目中完成此验证

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

项目栏项目栏 2

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

Cloud SQL 数据库

9. 清理

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

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

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

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

10. 恭喜

恭喜,您已成功配置了具有 PSC 附件的 Cloud SQL 实例,并在另一个 VPC 中创建了 Private Service Connect 端点。您已成功通过 PSC 端点从远程虚拟机连接到数据库。

了解详情

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