1. Обзор
Существует несколько вариантов подключения к частному экземпляру Cloud SQL из другого проекта или VPC. Private Service Connect (PSC) позволяет производителям сервисов предоставлять доступ к своим сервисам через сервисные вложения. Эти сервисные вложения могут использоваться потребителями для создания конечных точек PSC и/или бэкэндов PSC в своей среде и подключения к этим сервисам-производителям через указанный частный IP-адрес.
Cloud SQL обладает возможностью использования подключения к службе PSC для обеспечения частного соединения. В этой лабораторной работе вы можете настроить и протестировать эту опцию.
В этой лабораторной работе вы создадите простую архитектуру, иллюстрирующую использование доступа к конечным точкам PSC с помощью CloudSQL.
Рисунок 1.

Для выполнения этой лабораторной работы вам потребуется два проекта или отдельные VPC в рамках одного проекта.
Цели
В этой лабораторной работе вы научитесь выполнять следующее задание:
- Создайте экземпляр CloudSQL с подключением сервиса PSC.
- Создайте статический IP-адрес.
- Создайте конечную точку PSC в потребительской VPC для подключения к базе данных CloudSQL.
- Проверьте доступ к базе данных SQL с тестовой виртуальной машины в сети потребителя через IP-адрес конечной точки PSC.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

Подготовка и подключение к среде займут всего несколько минут. После завершения вы должны увидеть что-то подобное:

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Вся работа в этом практическом задании может выполняться в браузере. Вам не нужно ничего устанавливать.
3. Задание 1. Настройка среды для проекта базы данных с использованием Terraform.
В проекте базы данных мы создадим пользовательскую VPC с правилами брандмауэра и подсетью. Откройте консоль облака и выберите проект, который вы будете использовать для базы данных.
- Откройте Cloud Shell, расположенный в верхней части консоли справа. Убедитесь, что в Cloud Shell отображается идентификатор проекта базы данных , и подтвердите все запросы на предоставление доступа.

- Создайте папку с именем terraform-db и переместите в неё содержимое.
mkdir terraform-db && cd terraform-db
- Создайте файлы main.tf, variable.tf и database.tf .
touch main.tf variable.tf database.tf
- Переключитесь в режим редактора Cloud Shell . Выберите редактор и убедитесь, что вы разрешили все необходимые запросы, чтобы интерфейс загрузился.
- После загрузки перейдите в меню «Файл» > «Открыть папку» , выберите папку /home/your-user-name/terraform-db и нажмите «ОК» , чтобы открыть папку в редакторе.

- Выберите файл variable.tf и добавьте следующее. Замените текст
your-database-project-id-hereна фактический идентификатор вашего проекта базы данных в кавычках. Замените текстyour-consumer-project-id-hereна фактический идентификатор вашего потребительского проекта в кавычках.
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 | |
Добавить правила брандмауэра | |
- Скопируйте и вставьте следующий текст в основной файл .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. Создайте экземпляр CloudSQL с подключением PSC (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для запуска. Создание экземпляра CloudSQL с подключением PSC может занять до 5 минут и более.
Проверьте базу данных
- После завершения перейдите в консоль в раздел SQL и выберите только что созданный экземпляр базы данных psc-sql-db .
- В левой части экрана разверните выдвижную панель параметров SQL и выберите «Подключения».
- На вкладке «Сводка» вы можете увидеть информацию о соединении.
- Скопируйте адрес вложения услуги и сохраните его где-нибудь на своем компьютере.
- Это понадобится вам для выполнения шага 8 задания 3.

- В левой части экрана разверните выдвижную панель параметров SQL и выберите «Пользователи».
- Вы должны увидеть пользователя с именем testsql и паролем cloudsql24 (он будет использоваться для доступа к базе данных позже).
5. Задание 3. Настройка среды для потребительского проекта (Terraform)
В проекте для потребителей мы создадим пользовательскую VPC с правилами брандмауэра и подсетью. Откройте консоль облака и выберите проект, который будете использовать.
- В верхней части консоли справа, рядом со значком Google Cloud, щелкните раскрывающееся меню и выберите вкладку «Все» .


- Выберите из списка проектов идентификатор вашего потребительского проекта , чтобы продолжить.
- Откройте Cloud Shell, расположенный в верхней части консоли справа, убедитесь, что в Cloud Shell отображается идентификатор проекта потребителя , и подтвердите все запросы на предоставление доступа.
- Создайте папку с именем terraform-consumer и переместите в неё содержимое.
mkdir terraform-consumer && cd terraform-consumer
- Создайте файлы main.tf, variable.tf и psc.tf.
touch main.tf variable.tf psc.tf
- Переключитесь в редактор Cloud Shell для идентификатора потребительского проекта . Выберите редактор и убедитесь, что вы разрешили все необходимые запросы, чтобы интерфейс загрузился.
- После загрузки перейдите в меню «Файл» > «Открыть папку» , найдите папку /home/your-user-name/terraform-consumer и нажмите «ОК» , чтобы открыть папку в редакторе.

- Выберите файл variable.tf и добавьте следующее. Замените текст
your-consumer-project-id-hereна фактический идентификатор вашего потребительского проекта в кавычках. Замените текстyour-psc-attachment-id-hereна адрес вашего PSC-вложения в кавычках. Это идентификатор, который вы скопировали в задании 2, раздел 2-5.
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-шлюз | |
Добавить правила брандмауэра | |
- Скопируйте и вставьте следующий текст в основной файл .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в проекте 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в проекте consumer и выполните следующие команды.
terraform plan
Генерирует план выполнения, показывающий, какие действия Terraform предпримет для развертывания вашей инфраструктуры.
- Теперь, чтобы создать ресурсы, выполните команду
terraform applyи введитеyesдля запуска. - Поскольку наша виртуальная машина и конечная точка находятся в разных регионах, нам необходимо включить глобальный доступ на конечной точке PSC . Мы делаем это через консоль.
- В консоли проекта потребителя перейдите в раздел Private Service Connect . На вкладке Connected Endpoint в разделе Endpoint выберите psc-sql-endpoint.
- Теперь выберите «Редактировать», затем установите флажок рядом с пунктом «Включить глобальный доступ» и сохраните изменения .

- Перейдите к следующему шагу для проверки подключения.
7. Задание 5. Проверьте подключение конечной точки с виртуальной машины по IP-адресу PSC.
Выполните это в рамках потребительского проекта.
- Перейдите в раздел «Экземпляр виртуальной машины» . Выберите 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, щелкните раскрывающееся меню и выберите вкладку «Все» .


- Из списка проектов выберите идентификатор вашего проекта базы данных , чтобы продолжить.
- Перейдите в раздел SQL , выберите базу данных psc-sql-db , разверните параметры SQL и выберите «Базы данных» . Вы должны увидеть только что созданную базу данных с именем remotesqldb из виртуальной машины проекта потребителя**
.**

9. Уборка
Выполните это в проекте «База данных».
- Выберите идентификатор проекта базы данных.
- Перейдите в Cloud Shell и убедитесь, что вы видите идентификатор проекта базы данных.
- Перейдите в каталог terraform-db , выполните команду `cd
terraform destroycd terraform-dbи введитеyesВсе ресурсы, созданные вами в проекте базы данных с помощью Terraform, будут удалены.
Выполните это в проекте «Потребитель».
- Выберите идентификатор потребительского проекта.
- Перейдите в Cloud Shell и убедитесь, что вы видите идентификатор проекта потребителя.
- Перейдите в каталог terraform-consumer , выполните команду `cd
terraform destroycd terraform-consumerи введитеyesВсе ресурсы, созданные вами в проекте базы данных с помощью Terraform, будут удалены.
10. Поздравляем!
Поздравляем, вы успешно настроили экземпляр Cloud SQL с подключением PSC и создали конечную точку Private Service Connect в другой VPC. Вам удалось успешно подключиться к базе данных с удаленной виртуальной машины через конечную точку PSC.
Узнать больше
Вы можете узнать больше о Private Service Connect и Cloud SQL.