Подключение к CloudSQL через Private Service Connect (Terraform)

1. Обзор

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

Cloud SQL имеет возможность использовать вложение службы PSC для обеспечения частного подключения. В этой лабораторной работе вы можете настроить и протестировать эту опцию.

В этой лабораторной работе вы создадите простую архитектуру, иллюстрирующую использование доступа к конечной точке PSC с CloudSQL.

Рисунок 1.

1893f48fe1298ea2.png

Для этой лабораторной работы вам понадобятся два проекта или отдельные VPC в одном проекте.

Цели

В ходе этой лабораторной работы вы научитесь выполнять следующую задачу:

  • Создайте экземпляр CloudSQL с прикрепленным сервисом PSC.
  • Создайте статический IP-адрес
  • Создайте конечную точку PSC в потребительском VPC для подключения к базе данных CloudSQL.
  • Проверьте доступ к базе данных SQL с тестовой виртуальной машины в потребительской сети через IP-адрес конечной точки PSC.

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Google Cloud Shell , среду командной строки, работающую в облаке.

В Google Cloud Console щелкните значок Cloud Shell на верхней правой панели инструментов:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

3. Задача 1. Настройка среды для проекта базы данных с помощью (Terraform)

В проекте базы данных мы создадим собственный VPC с правилами брандмауэра и подсетью. Откройте облачную консоль и выберите проект, который вы будете использовать для базы данных.

  1. Откройте Cloud Shell, расположенный в верхней части консоли справа. Убедитесь, что вы видите идентификатор проекта базы данных для проекта базы данных в Cloud Shell, подтвердите все запросы на разрешение доступа. 4261e776f64ea978.png
  2. Создайте папку с именем terraform-db и перейдите в нее.
mkdir terraform-db  && cd terraform-db
  1. Создайте файл main.tf,variable.tf и data.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 фактическим идентификатором проекта базы данных в кавычках. Замените текст 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"
}
  1. Затем откройте файл main.tf. Мы собираемся добавить код терраформирования для выполнения различных действий, как описано ниже.

Включить API

resource "google_project_service" "default"

Создать VPC

resource "google_compute_network" "default"

Добавить правила брандмауэра

resource "google_compute_firewall" "allow_icmp"

  1. Скопируйте и вставьте следующее в основной файл .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. Создать экземпляр CloudSQL с прикрепленным PSC (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 для запуска. Создание экземпляра CloudSQL с вложением PSC может занять до 5+ минут.

Проверить базу данных

  1. После завершения перейдите к SQL в консоли и выберите вновь созданный экземпляр базы данных psc-sql-db .
  2. С левой стороны разверните слайдер параметров SQL и выберите «Соединения».
  3. На вкладке «Сводка» вы можете увидеть информацию о соединении.
  4. Скопируйте адрес вложения службы и сохраните его где-нибудь в своей системе.
  5. Это понадобится вам для выполнения задания 3 шага 8.

Cloud sql с вложением psc

  1. В левой части разверните слайдер «Параметры SQL» и выберите «Пользователи».
  2. Вы должны увидеть пользователя с именем testsql с паролем cloudsql24 (позже он будет использоваться для доступа к базе данных).

5. Задача 3. Настройка среды потребительского проекта (Terraform)

В потребительском проекте мы создадим собственный VPC с правилами и подсетью брандмауэра. Откройте облачную консоль и выберите проект, который вы будете использовать.

  1. В верхней части консоли, справа от значка Google Cloud, щелкните раскрывающийся список и выберите вкладку «Все» .

панель проектапанель проекта 2

  1. Из списка проектов выберите идентификатор потребительского проекта, чтобы продолжить.
  2. Откройте Cloud Shell, расположенный в верхней части консоли справа. Убедитесь, что вы видите идентификатор потребительского проекта в Cloud Shell, подтвердите все запросы на разрешение доступа.
  3. Создайте папку с именем terraform-consumer и перейдите в нее.
mkdir terraform-consumer  && cd terraform-consumer
  1. Создайте файлы main.tf,variable.tf и psc.tf.
touch main.tf variable.tf psc.tf 
  1. Переключитесь в режим редактора Cloud Shell для идентификатора потребительского проекта . Выберите редактор и убедитесь, что вы разрешили все необходимые запросы, чтобы интерфейс мог загрузиться.
  2. После загрузки перейдите в меню «Файл» > «Открыть папку» , перейдите в /home/your-user-name/terraform-consumer и выберите «ОК» , чтобы открыть папку в редакторе. 78f5eb9f2f82f1b0.png
  3. Выберите файлvariable.tf и добавьте следующее. Замените текст your-consumer-project-id-here фактическим идентификатором потребительского проекта в кавычках. Замените текст your-psc-attachment-id-here адресом вложения psc в кавычках. Это идентификатор, который вы скопировали в разделе 2–5 задачи 2. 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. Мы собираемся добавить код терраформирования для выполнения различных действий, как описано ниже.

Включить 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. Скопируйте и вставьте следующее в основной файл .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. Проверка подключения конечной точки от виртуальной машины через IP-адрес PSC.

Завершите это в потребительском проекте

  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. Из перечисленных проектов выберите идентификатор проекта базы данных , чтобы продолжить.
  2. Перейдите к SQL , выберите базу данных psc-sql-db , разверните параметры SQL и выберите «Базы данных» . Вы должны увидеть только что созданную базу данных под названием Remotesqldb из виртуальной машины потребительского проекта** . **

облачная база данных SQL

9. Очистка

Завершите это в проекте базы данных.

  1. Выберите идентификатор проекта базы данных
  2. Перейдите в Cloud Shell и убедитесь, что вы видите идентификатор проекта базы данных.
  3. Перейдите в каталог terraform-db cd terraform-db и выполните следующую команду terraform destroy и введите yes все ресурсы, которые вы создали в своем проекте базы данных с помощью Terraform, будут удалены.

Завершите это в проекте Consumer.

  1. Выберите идентификатор потребительского проекта
  2. Перейдите в Cloud Shell и убедитесь, что вы видите идентификатор потребительского проекта.
  3. Перейдите в каталог terraform-consumer cd terraform-consumer и выполните следующую команду terraform destroy и введите yes все ресурсы, которые вы создали в своем проекте базы данных с помощью Terraform, будут удалены.

10. Поздравления

Поздравляем, вы успешно настроили экземпляр Cloud SQL с подключением PSC и создали конечную точку Private Service Connect в другом VPC. Вам удалось успешно подключиться к базе данных с удаленной виртуальной машины через конечную точку PSC.

Узнать больше

Вы можете узнать больше о Private Service Connect и Cloud SQL.