在运行 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。

目标

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

  • 启用服务联网
  • 设置 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. 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-db-psc 并选择确定以在编辑器中打开该文件夹。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 创建 CloudSQL 实例 (Terraform)

我们来使用 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 地址,并将其保存到系统中的某个位置。如您所见,该 IP 地址是从我们预留的范围内分配的。
  5. 您需要此 IP 地址才能完成任务 3 的第 5 步。

5c00f08b0f44c957.png

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

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

我们来使用 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。
  • 将 Ensure 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. 您需要此信息才能完成下一个任务(步骤 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. 加载完成后,依次前往文件 > 打开文件夹,然后前往 /home/your-user-name/terraform-consumer-psc 并选择确定,以在编辑器中打开该文件夹。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 选项,然后选择数据库。您应该会看到刚刚创建的数据库,即使用方项目虚拟机中的 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,选择专用服务访问通道,在为服务分配的 IP 范围下,选择 psa-range-database-net,然后选择释放选项

e4dbfa8953c5b036.png

  1. 接下来,选择 VPC 网络对等互连,然后选择 servicenetworking-googleapis-com,并选择删除选项

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