Подключение к 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 и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Запустить Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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 и database.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. Мы собираемся добавить в него код Terraform для выполнения различных действий, как описано ниже.

Включить 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. Это понадобится вам для выполнения шага 8 задания 3.

Облачный 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, раздел 2-5. 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. Скопируйте и вставьте следующий текст в основной файл .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 в проекте 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 в проекте consumer и выполните следующие команды.

terraform plan

Генерирует план выполнения, показывающий, какие действия Terraform предпримет для развертывания вашей инфраструктуры.

  1. Теперь, чтобы создать ресурсы, выполните команду terraform apply и введите yes для запуска.
  2. Поскольку наша виртуальная машина и конечная точка находятся в разных регионах, нам необходимо включить глобальный доступ на конечной точке PSC . Мы делаем это через консоль.
  3. В консоли проекта потребителя перейдите в раздел Private Service Connect . На вкладке Connected Endpoint в разделе Endpoint выберите 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 destroy cd terraform-db и введите yes Все ресурсы, созданные вами в проекте базы данных с помощью Terraform, будут удалены.

Выполните это в проекте «Потребитель».

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

10. Поздравляем!

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

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

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