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

1. Omówienie

Istnieje kilka opcji nawiązywania połączenia z prywatną instancją Cloud SQL z innego projektu lub sieci VPC. Private Service Connect (PSC) umożliwia producentom usług udostępnianie ich za pomocą załączników usług. Użytkownicy mogą używać tych przyłączy usługi do tworzenia w swoim środowisku punktów końcowych PSC lub zaplecza PSC oraz do łączenia się z tymi usługami producenta za pomocą określonego prywatnego adresu IP.

Cloud SQL może korzystać z usługi PSC, aby umożliwić połączenie prywatne. W tym laboratorium możesz skonfigurować i przetestować tę opcję.

W tym module utworzysz prostą architekturę, która ilustruje korzystanie z dostępu do punktu końcowego PSC w CloudSQL.

Rysunek 1.

1893f48fe1298ea2.png

Do wykonania tego ćwiczenia potrzebne będą 2 projekty lub osobne środowiska VPC w tym samym projekcie.

Cele

Z tego modułu dowiesz się, jak wykonać te czynności:

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

2. Konfiguracja i wymagania

Konfiguracja środowiska w samodzielnym tempie

  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órego nie używają interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest niepowtarzalny w ramach wszystkich projektów Google Cloud i nie można go zmienić (po ustawieniu). Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie ma znaczenia, jaki to ciąg. W większości laboratoriów z kodem trzeba podać identyfikator projektu (zwykle oznaczony jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować inny losowy. Możesz też spróbować użyć własnego adresu e-mail, aby sprawdzić, czy jest on dostępny. Nie można go zmienić po wykonaniu tego kroku. Pozostanie on na stałe w ramach projektu.
  • Informacyjnie: istnieje jeszcze 3 wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów i interfejsów API Cloud. Przejście przez ten samouczek nie będzie kosztowne, a być może nawet bezpłatne. Aby wyłączyć zasoby i uniknąć obciążenia opłatami po zakończeniu samouczka, możesz usunąć utworzone zasoby lub usunąć 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

Google Cloud można obsługiwać zdalnie z laptopa, ale w tym ćwiczeniu będziesz korzystać z 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 jego zakończeniu powinno wyświetlić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie poprawia wydajność sieci i uwierzytelnianie. Wszystkie zadania w tym CodeLab 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ć do bazy danych.

  1. Otwórz Cloud Shell, który znajduje się u góry konsoli po prawej stronie. Upewnij się, że w Cloud Shell widzisz identyfikator projektu bazy danych. Potwierdź wszystkie monity, aby zezwolić na dostęp. 4261e776f64ea978.png
  2. Utwórz folder o nazwie terraform-db i przenieś go do folderu
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 Edytor Cloud Shell. Wybierz Edytor i potwierdź wszystkie wymagane prompty, aby umożliwić wczytanie interfejsu.
  2. Po załadowaniu przejdź do Plik > Otwórz folder, przejdź do katalogu /home/nazwa_użytkownika/terraform-db i kliknij OK, aby otworzyć folder w edytorze. 78f5eb9f2f82f1b0.png
  3. Wybierz plik variable.tf i dodaj te informacje. Zastąp tekst your-database-project-id-here cudzysłowami z identyfikatorem swojego projektu bazy danych. Zastąp tekst your-consumer-project-id-here swoim identyfikatorem projektu konsumenta 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, który 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"

Dodaj reguły zapory sieciowej

resource "google_compute_firewall" "allow_icmp"

  1. Skopiuj i wklej ten kod do głównego pliku .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. Na tym etapie pobierani są dostawcy wymagani w danej konfiguracji.

terraform plan

Tworzy plan wykonania, który pokazuje, jakie działania Terraform wykona, aby wdrożyć Twoją infrastrukturę.

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

4. Zadanie 2. Tworzenie instancji CloudSQL z dołączonym PSC (Terraform)

Utwórz instancję CloudSQL za pomocą Terraform, korzystając z opcji PSC, aby umożliwić połączenie. Przeprowadź tę konfigurację w projekcie bazy danych.

  1. Przełącz się na widok Edytor Cloud Shell. Upewnij się, że jesteś w folderze terraform-db. Wybierz plik database.tf i dodaj te informacje.
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 sprawdź,czy jesteś w katalogu terraform-db. Aby utworzyć zasoby, uruchom polecenie terraform apply i wpisz yes, aby je uruchomić. Utworzenie instancji CloudSQL z dołączonym PSC może potrwać ponad 5 minut.

Weryfikowanie bazy danych

  1. Po zakończeniu przejdź w konsoli do sekcji SQL i wybierz nowo utworzoną instancję bazy danych psc-sql-db.
  2. Po lewej stronie rozwiń panel opcji SQL i wybierz Połączenia.
  3. Na karcie Podsumowanie znajdziesz informacje o połączeniu.
  4. Skopiuj adres załącznika usługi i zapisz go w swoim systemie.
  5. Potrzebujesz tego, aby wykonać krok 8 zadania 3.

Cloud SQL z podłączeniem PSC

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

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

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

  1. U góry konsoli po prawej stronie obok ikony Google Cloud kliknij menu i wybierz kartę all (Wszystkie).

pasek projektupasek projektu 2

  1. Aby kontynuować, wybierz z listy identyfikator projektu dla konsumentów.
  2. Otwórz Cloud Shell, który znajduje się u góry konsoli po prawej stronie. Upewnij się, że w Cloud Shell widać identyfikator projektu konsumenta. Potwierdź wyświetlone prośby o dostęp.
  3. Utwórz folder o nazwie terraform-consumer i przenieś go do folderu
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 pozwól na wyświetlanie wszystkich wymaganych komunikatów, aby umożliwić wczytanie interfejsu.
  2. Po załadowaniu przejdź do Plik > Otwórz folder, przejdź do folderu /home/nazwa_użytkownika/terraform-consumer i kliknij OK, aby otworzyć folder w edytorze. 78f5eb9f2f82f1b0.png
  3. Wybierz plik variable.tf i dodaj te informacje. Zastąp tekst your-consumer-project-id-here cudzy tekst rzeczywistym identyfikatorem projektu w cudzysłowie. Zastąp tekst your-psc-attachment-id-here adresem załącznika psc w cudzysłowie. To identyfikator skopiowany w kroku 2, sekcja 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. Następnie otwórz plik main.tf. Dodamy kod terraform, który 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"

Dodaj reguły zapory sieciowej

resource "google_compute_firewall"

  1. Skopiuj i wklej ten kod do głównego pliku .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 terminalu Cloud Shell i upewnij się, że znajdujesz się w katalogu terraform-consumer cd terraform-consumer w projekcie konsumenta. Następnie uruchom te polecenia.

terraform init

Inicjuje katalog roboczy. Na tym etapie pobierani są dostawcy wymagani w danej konfiguracji.

terraform plan

Tworzy plan wykonania, który pokazuje, jakie działania Terraform wykona, aby wdrożyć Twoją infrastrukturę.

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

6. Zadanie 4. Tworzenie w projekcie konsumenta połączenia punktu końcowego PSC z bazą danych SQL i testowanie maszyny wirtualnej (Terraform)

Przeprowadź tę konfigurację w projekcie konsumenta.

  1. Wróć do edytora Cloud Shell, otwórz katalog terraform-consumer i wybierz plik psc.tf. Dodaj do tego pliku ten kod Terraform. Spowoduje to utworzenie stałego wewnętrznego adresu IP, punktu końcowego PSC i testowej 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 terminalu Cloud Shell i upewnij się, że znajdujesz się w katalogu terraform-consumer cd terraform-consumer w projekcie konsumenta. Następnie uruchom te polecenia.

terraform plan

Tworzy plan wykonania, który pokazuje, jakie działania Terraform wykona, aby wdrożyć Twoją infrastrukturę.

  1. Aby utworzyć zasoby, uruchom polecenie terraform apply i wpisz yes, aby je uruchomić.
  2. Ponieważ maszyna wirtualna i punkt końcowy znajdują się w różnych regionach, musimy włączyć dostęp globalny w punkcie końcowym PSC. Robimy to w 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. Teraz wybierz EDYTUJ,a następnie kliknij pole wyboru obok opcji Włącz dostęp globalny i Zapisz. 7eeb5a4162f5f79d.png
  5. Przejdź do następnego kroku, aby sprawdzić połączenie

7. Zadanie 5. Sprawdzanie łączności 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, korzystając z tych opcji:
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 zakończyć połączenie.

8. Zadanie 6. Weryfikowanie wpisu w bazie danych

Przeprowadź tę weryfikację w projekcie bazy danych.

  1. U góry konsoli po prawej stronie obok ikony Google Cloud kliknij menu i wybierz kartę all (Wszystkie).

pasek projektupasek projektu 2

  1. Aby kontynuować, wybierz z listy identyfikator projektu bazy danych.
  2. Otwórz SQL, wybierz bazę danych psc-sql-db, rozwiń opcje SQL i wybierz Bazy danych. Na maszynie wirtualnej projektu dla konsumenta powinna być widoczna właśnie utworzona baza danych o nazwie remotesqldb.**.**

cloud sql db

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. Otwórz katalog terraform-db cd terraform-db i uruchom to polecenie: terraform destroy, a następnie wpisz yes. W ten sposób wszystkie zasoby utworzone w projekcie bazy danych za pomocą Terraform zostaną usunięte.

Wykonaj to w projekcie dotyczącym konsumentów

  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, a następnie wpisz yes. Wszystkie zasoby utworzone w projekcie bazy danych za pomocą Terraform zostaną usunięte.

10. Gratulacje

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

Więcej informacji

Więcej informacji o Private Service Connect i Cloud SQL