通过 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. 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-db 并选择确定以在编辑器中打开该文件夹。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. 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-consumer 并选择确定以在编辑器中打开该文件夹。78f5eb9f2f82f1b0.png
  3. 选择 variable.tf 文件,然后添加以下内容。将 your-consumer-project-id-here 文本替换为您的实际使用方项目 ID(用英文引号括起来),将 your-psc-attachment-id-here 文本替换为您的 PSC 附加地址(用英文引号括起来)。这是您在任务 2 第 2-5 步中复制的 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 选项,然后选择数据库。您应该会看到刚刚从使用方项目虚拟机**.** 创建的名为 remotesqldb 的数据库

Cloud SQL 数据库

9. 清理

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

  1. 选择数据库项目 ID
  2. 前往 Cloud Shell,确保您看到数据库项目 ID
  3. 前往 terraform-db 目录 cd terraform-db,然后运行以下命令 terraform destroy,并输入 yes,这样一来,您在数据库项目中通过 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