Łączenie z CloudSQL przez Private Service Connect (Terraform)

1. Przegląd

Istnieje kilka opcji łączenia się z prywatnąinstancją Cloud SQL z innego projektu lub sieci VPC. Private Service Connect (PSC) umożliwia producentom usług udostępnianie usług za pomocą przyłączy usługi. Przyłącza usług mogą być używane przez klientów do tworzenia w ich środowisku punktów końcowych PSC lub backendów PSC i łączenia się z tymi usługami dostawcy za pomocą określonego prywatnego adresu IP.

Cloud SQL może korzystać z przyłącza usługi PSC, aby zezwalać na połączenia prywatne. W tym module możesz skonfigurować i przetestować tę opcję.

W tym module utworzysz prostą architekturę, która ilustruje użycie dostępu do punktu końcowego PSC w Cloud SQL.

Rysunek 1.

1893f48fe1298ea2.png

Na potrzeby tego modułu potrzebujesz 2 projektów lub oddzielnych sieci VPC w tym samym projekcie.

Cele

Z tego modułu dowiesz się, jak:

  • Utwórz instancję Cloud SQL z przyłączem usługi PSC.
  • Tworzenie statycznego adresu IP
  • Utwórz punkt końcowy PSC w sieci VPC klienta, aby połączyć się z bazą danych Cloud SQL.
  • Sprawdź dostęp do bazy danych SQL z testowej maszyny wirtualnej w sieci konsumenta za pomocą adresu IP punktu końcowego PSC.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się tym przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module praktycznym będziesz używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

55efc1aaa7a4d3ad.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno wyświetlić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Wszystkie zadania w tym laboratorium możesz wykonać w przeglądarce. Nie musisz niczego instalować.

3. Zadanie 1. Konfigurowanie środowiska projektu bazy danych za pomocą Terraform

W projekcie bazy danych utworzymy niestandardową sieć VPC z regułami zapory sieciowej i podsiecią. Otwórz konsolę Google Cloud i wybierz projekt, którego będziesz używać w przypadku bazy danych.

  1. Otwórz Cloud Shell w prawym górnym rogu konsoli. Sprawdź, czy w Cloud Shell widzisz identyfikator projektu bazy danych w projekcie bazy danych. Potwierdź wszystkie prośby o przyznanie dostępu. 4261e776f64ea978.png
  2. Utwórz folder o nazwie terraform-db i przenieś się do niego.
mkdir terraform-db  && cd terraform-db
  1. Utwórz pliki main.tf, variable.tfdatabase.tf.
touch main.tf variable.tf database.tf 
  1. Przełącz się na widok edytora Cloud Shell. Wybierz edytor i zaakceptuj wszystkie niezbędne prośby, aby interfejs mógł się załadować.
  2. Po załadowaniu przejdź do Plik > Otwórz folder i otwórz /home/your-user-name/terraform-db, a następnie kliknij OK, aby otworzyć folder w edytorze. 78f5eb9f2f82f1b0.png
  3. Wybierz plik variable.tf i dodaj do niego te informacje: Zastąp tekst your-database-project-id-here rzeczywistym identyfikatorem projektu bazy danych w cudzysłowie. Zastąp tekst your-consumer-project-id-here rzeczywistym identyfikatorem projektu konsumenckiego w cudzysłowie.
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. Następnie otwórz plik main.tf. Dodamy kod Terraform, aby wykonać różne działania opisane poniżej.

Włączanie interfejsów API

resource "google_project_service" "default"

Utwórz VPC

resource "google_compute_network" "default"

Dodawanie reguł zapory sieciowej

resource "google_compute_firewall" "allow_icmp"

  1. Skopiuj poniższy kod i wklej go do pliku 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. Wróć do terminala Cloud Shell i upewnij się, że jesteś w katalogu terraform-db cd terraform-db. Następnie uruchom te polecenia:

terraform init

Inicjuje katalog roboczy. Ten krok pobiera dostawców wymaganych w danej konfiguracji.

terraform plan

Generuje plan wykonania, który pokazuje, jakie działania Terraform podejmie w celu wdrożenia infrastruktury.

  1. Aby utworzyć zasoby, uruchom polecenie terraform apply i wpisz yes.

4. Zadanie 2. Tworzenie instancji Cloud SQL z przyłącznikiem PSC (Terraform)

Użyjemy Terraform, aby utworzyć instancję Cloud SQL z opcją PSC, która umożliwia połączenie. Skonfiguruj to w projekcie bazy danych.

  1. Przełącz się na widok edytora Cloud Shell. Upewnij się, że jesteś w folderze terraform-db. Wybierz plik database.tf i dodaj te elementy:
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. Wróć do terminala Cloud Shell i upewnij się,że jesteś w katalogu terraform-db. Aby utworzyć zasoby, uruchom polecenie terraform apply i wpisz yes. Tworzenie instancji Cloud SQL z załącznikiem PSC może potrwać ponad 5 minut.

Weryfikowanie bazy danych

  1. Po zakończeniu otwórz SQL w konsoli i wybierz nowo utworzoną instancję bazy danych psc-sql-db.
  2. Po lewej stronie rozwiń wysuwane menu opcji SQL i wybierz Połączenia.
  3. Na karcie podsumowania znajdziesz informacje o połączeniu.
  4. Skopiuj adres załącznika usługi i zapisz go w systemie.
  5. Będzie on potrzebny do wykonania kroku 8 w zadaniu 3.

Cloud SQL z przyłączem PSC

  1. Po lewej stronie rozwiń panel opcji SQL i kliknij Użytkownicy.
  2. Powinien pojawić się użytkownik o nazwie testsql z hasłem cloudsql24(będzie ono później używane do uzyskiwania dostępu do bazy danych).

5. Zadanie 3. Konfigurowanie środowiska projektu konsumenta (Terraform)

W projekcie klienta utworzymy niestandardową sieć VPC z regułami zapory sieciowej i podsiecią. Otwórz konsolę Google Cloud i wybierz projekt, którego będziesz używać.

  1. W prawym górnym rogu konsoli obok ikony Google Cloud kliknij menu i wybierz kartę wszystkie.

pasek projektupasek projektu 2

  1. Z wyświetlonej listy projektów wybierz identyfikator projektu konsumenckiego, aby kontynuować.
  2. Otwórz Cloud Shell w prawym górnym rogu konsoli. Sprawdź, czy w Cloud Shell widzisz identyfikator projektu klienta, i potwierdź wszystkie prośby o zezwolenie na dostęp.
  3. Utwórz folder o nazwie terraform-consumer i przejdź do niego.
mkdir terraform-consumer  && cd terraform-consumer
  1. Utwórz pliki main.tf, variable.tfpsc.tf.
touch main.tf variable.tf psc.tf 
  1. Przełącz się na widok edytora Cloud Shell dla identyfikatora projektu klienta. Wybierz edytor i zaakceptuj wszystkie niezbędne prośby, aby interfejs mógł się załadować.
  2. Po załadowaniu przejdź do Plik > Otwórz folder i otwórz folder /home/your-user-name/terraform-consumer. Następnie kliknij OK, aby otworzyć folder w edytorze. 78f5eb9f2f82f1b0.png
  3. Wybierz plik variable.tf i dodaj do niego te informacje: Zastąp tekst your-consumer-project-id-here rzeczywistym identyfikatorem projektu klienta w cudzysłowie. Zastąp tekst your-psc-attachment-id-here adresem załącznika PSC w cudzysłowie. Jest to identyfikator skopiowany w sekcji 2–5 zadania 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. Następnie otwórz plik main.tf. Dodamy kod Terraform, aby wykonać różne działania opisane poniżej.

Włączanie interfejsów API

resource "google_project_service"

Utwórz VPC

resource "google_compute_network"

Tworzenie bramy NAT

resource "google_compute_router"
resource "google_compute_router_nat"

Dodawanie reguł zapory sieciowej

resource "google_compute_firewall"

  1. Skopiuj poniższy kod i wklej go do pliku 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. Wróć do terminala Cloud Shell i upewnij się, że znajdujesz się w katalogu terraform-consumer cd terraform-consumer w projekcie klienta. Następnie uruchom te polecenia:

terraform init

Inicjuje katalog roboczy. Ten krok pobiera dostawców wymaganych w danej konfiguracji.

terraform plan

Generuje plan wykonania, który pokazuje, jakie działania Terraform podejmie w celu wdrożenia infrastruktury.

  1. Aby utworzyć zasoby, uruchom polecenie terraform apply i wpisz yes.

6. Zadanie 4. Tworzenie punktu końcowego PSC do przyłączenia bazy danych SQL w projekcie klienta i testowanie maszyny wirtualnej (Terraform)

Dokończ tę konfigurację w projekcie konsumenta.

  1. Wróć do edytora Cloud Shell, otwórz katalog terraform-consumer i wybierz plik psc.tf. Dodaj do pliku ten kod Terraform. Spowoduje to utworzenie statycznego wewnętrznego adresu IP, punktu końcowego usługi PSC i maszyny wirtualnej z zainstalowaną bazą danych MariaDB.
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. Wróć do terminala Cloud Shell i upewnij się, że znajdujesz się w katalogu terraform-consumer cd terraform-consumer w projekcie klienta. Następnie uruchom te polecenia:

terraform plan

Generuje plan wykonania, który pokazuje, jakie działania Terraform podejmie w celu wdrożenia infrastruktury.

  1. Aby utworzyć zasoby, uruchom polecenie terraform apply i wpisz yes.
  2. Ponieważ nasza maszyna wirtualna i punkt końcowy znajdują się w różnych regionach, musimy włączyć globalny dostęp do punktu końcowego PSC. Robimy to za pomocą konsoli.
  3. W konsoli projektu konsumenta otwórz Private Service Connect. Na karcie Połączony punkt końcowy w sekcji Punkt końcowy wybierz psc-sql-endpoint.
  4. Następnie wybierz EDYTUJ i kliknij pole wyboru obok opcji Włącz dostęp globalny oraz Zapisz. 7eeb5a4162f5f79d.png
  5. Aby sprawdzić połączenie, przejdź do następnego kroku

7. Zadanie 5. Sprawdzanie połączenia punktu końcowego z maszyny wirtualnej za pomocą adresu IP PSC

Wykonaj to w projekcie konsumenta

  1. Otwórz instancję maszyny wirtualnej. Wybierz sql-test-vm.
  2. Aby połączyć się z maszyną wirtualną, wybierz opcję SSH.
  3. Połącz się z bazą danych za pomocą punktu końcowego w następujący sposób:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. Po nawiązaniu połączenia utwórz bazę danych o nazwie psc-sql-db.
CREATE DATABASE remotesqldb;
  1. Po zakończeniu wpisz exit, aby zamknąć połączenie.

8. Zadanie 6. Weryfikowanie wpisu w bazie danych

Przeprowadź weryfikację w projekcie bazy danych.

  1. W prawym górnym rogu konsoli obok ikony Google Cloud kliknij menu i wybierz kartę wszystkie.

pasek projektupasek projektu 2

  1. Aby kontynuować, z listy projektów wybierz identyfikator projektu bazy danych.
  2. Otwórz SQL, wybierz bazę danych psc-sql-db, rozwiń opcje SQL i kliknij Bazy danych. Powinna być widoczna utworzona przez Ciebie baza danych o nazwie remotesqldb z maszyny wirtualnej projektu klienta**.**

baza danych Cloud SQL

9. Czyszczenie

Wykonaj to w projekcie bazy danych

  1. Wybierz identyfikator projektu bazy danych
  2. Otwórz Cloud Shell i sprawdź, czy widzisz identyfikator projektu bazy danych.
  3. Przejdź do katalogu terraform-db cd terraform-db i uruchom to polecenie terraform destroy, a następnie wpisz yes wszystkie zasoby utworzone w projekcie bazy danych za pomocą Terraform. Zostaną one usunięte.

Wykonaj te czynności w projekcie konsumenta

  1. Wybierz identyfikator projektu konsumenta
  2. Otwórz Cloud Shell i sprawdź, czy widzisz identyfikator projektu konsumenta.
  3. Przejdź do katalogu terraform-consumer cd terraform-consumer i uruchom to polecenie terraform destroy. Wpisz yes wszystkie zasoby utworzone w projekcie bazy danych za pomocą Terraform. Zostaną one usunięte.

10. Gratulacje

Gratulacje. Udało Ci się skonfigurować instancję Cloud SQL z przyłączem PSC i utworzyć punkt końcowy Private Service Connect w innej sieci VPC. Udało Ci się połączyć z bazą danych z maszyny wirtualnej za pomocą punktu końcowego PSC.

Więcej informacji

Więcej informacji o Private Service Connect i Cloud SQL