Verbindung zu Cloud SQL über Private Service Connect herstellen (Terraform)

1. Übersicht

Es gibt mehrere Möglichkeiten, eine Verbindung zu einer privaten Cloud SQL-Instanz aus einem anderen Projekt oder VPCs herzustellen. Mit Private Service Connect (PSC) können Dienstersteller ihre Dienste über Dienstanhänge verfügbar machen. Diese Dienstanhänge können von Nutzern verwendet werden, um PSC-Endpunkte und/oder PSC-Backends in ihrer Umgebung zu erstellen und über eine angegebene private IP-Adresse eine Verbindung zu diesen Diensten des Diensterstellers herzustellen.

Cloud SQL kann PSC-Dienstanhänge verwenden, um private Verbindungen zu ermöglichen. In diesem Lab können Sie die Option konfigurieren und testen.

In diesem Lab erstellen Sie eine einfache Architektur, die die Verwendung des PSC-Endpunktzugriffs mit Cloud SQL veranschaulicht.

Abbildung 1:

1893f48fe1298ea2.png

Für dieses Lab benötigen Sie zwei Projekte oder separate VPCs im selben Projekt.

Ziele

Aufgaben in diesem Lab:

  • Erstellen Sie eine Cloud SQL-Instanz mit einem PSC-Dienstanhang.
  • Statische IP-Adresse erstellen
  • PSC-Endpunkt in der Consumer-VPC erstellen, um eine Verbindung zur CloudSQL-Datenbank herzustellen
  • Prüfen Sie, ob Sie über die IP-Adresse des PSC-Endpunkts von einer Test-VM im Nutzernetzwerk auf die SQL-Datenbank zugreifen können.

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich (kann nach dem Festlegen nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf Ihre Projekt-ID verweisen (in der Regel als PROJECT_ID angegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen Namen versuchen und sehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs kostet wenig oder gar nichts. Wenn Sie Ressourcen herunterfahren möchten, um Kosten zu vermeiden, die über diese Anleitung hinausgehen, können Sie die erstellten Ressourcen oder das Projekt löschen. Neue Google Cloud-Nutzer können am kostenlosen Testzeitraum mit einem Guthaben von 300$ teilnehmen.

Cloud Shell starten

Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Klicken Sie in der Google Cloud Console rechts oben in der Symbolleiste auf das Cloud Shell-Symbol:

55efc1aaa7a4d3ad.png

Die Bereitstellung und Verbindung mit der Umgebung sollte nur wenige Augenblicke dauern. Anschließend sehen Sie in etwa Folgendes:

7ffe5cbb04455448.png

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Alle Aufgaben in diesem Codelab können in einem Browser ausgeführt werden. Sie müssen nichts installieren.

3. Aufgabe 1: Umgebung für Datenbankprojekt einrichten (Terraform)

Im Datenbankprojekt erstellen wir eine benutzerdefinierte VPC mit Firewallregeln und Subnetz. Öffnen Sie die Cloud Console und wählen Sie das Projekt aus, das Sie für die Datenbank verwenden möchten.

  1. Öffnen Sie Cloud Shell oben rechts in der Console. Achten Sie darauf, dass die Projekt-ID der Datenbank für das Datenbankprojekt in Cloud Shell angezeigt wird. Bestätigen Sie alle Aufforderungen, um den Zugriff zu erlauben. 4261e776f64ea978.png
  2. Erstellen Sie einen Ordner mit dem Namen terraform-db und wechseln Sie in den Ordner.
mkdir terraform-db  && cd terraform-db
  1. Erstellen Sie die Dateien main.tf, variable.tf und database.tf.
touch main.tf variable.tf database.tf 
  1. Wechseln Sie zur Ansicht Cloud Shell-Editor. Wählen Sie Editor aus und bestätigen Sie alle erforderlichen Aufforderungen, damit die Benutzeroberfläche geladen werden kann.
  2. Nach dem Laden navigieren Sie zu Datei > Ordner öffnen und rufen Sie /home/Ihr-Nutzername/terraform-db auf. Wählen Sie Ok aus, um den Ordner im Editor zu öffnen. 78f5eb9f2f82f1b0.png
  3. Wählen Sie die Datei variable.tf aus und fügen Sie Folgendes hinzu. Ersetzen Sie den Text your-database-project-id-here durch die ID Ihres tatsächlichen Datenbankprojekts in Anführungszeichen. Ersetzen Sie den Text your-consumer-project-id-here durch die ID Ihres Nutzerprojekts in Anführungszeichen.
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. Öffnen Sie als Nächstes die Datei main.tf. Wir fügen nun Terraform-Code hinzu, um verschiedene Aktionen auszuführen, wie unten beschrieben.

APIs aktivieren

resource "google_project_service" "default"

VPC erstellen

resource "google_compute_network" "default"

Firewallregeln hinzufügen

resource "google_compute_firewall" "allow_icmp"

  1. Kopieren Sie den folgenden Code in die Datei 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. Wechseln Sie zurück zum Cloud Shell-Terminal, prüfen Sie, ob Sie sich im Verzeichnis terraform-db befinden cd terraform-db und führen Sie die folgenden Befehle aus.

terraform init

Initialisiert das Arbeitsverzeichnis. In diesem Schritt werden die für die angegebene Konfiguration erforderlichen Anbieter heruntergeladen.

terraform plan

Erstellt einen Ausführungsplan, der zeigt, welche Aktionen Terraform zum Bereitstellen Ihrer Infrastruktur ausführt.

  1. Führen Sie nun den Befehl terraform apply aus und geben Sie yes ein, um die Ressourcen zu erstellen.

4. Aufgabe 2: Cloud SQL-Instanz mit PSC-Anhang erstellen (Terraform)

Wir erstellen mit Terraform eine Cloud SQL-Instanz mit der PSC-Option, um die Konnektivität zu ermöglichen. Schließen Sie diese Konfiguration im Datenbankprojekt ab.

  1. Wechseln Sie zur Ansicht Cloud Shell-Editor. Sie müssen sich im Ordner terraform-db befinden. Wählen Sie die Datei database.tf aus und fügen Sie Folgendes hinzu.
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. Wechseln Sie zurück zum Cloud Shell-Terminal und prüfen Sie,ob Sie sich im Verzeichnis terraform-db befinden. Führen Sie nun den Befehl terraform apply aus und geben Sie yes ein, um die Ressourcen zu erstellen. Das Erstellen der Cloud SQL-Instanz mit PSC-Anhang kann bis zu 5 Minuten dauern.

Datenbank prüfen

  1. Rufen Sie nach Abschluss in der Konsole SQL auf und wählen Sie die neu erstellte Datenbankinstanz psc-sql-db aus.
  2. Erweitern Sie auf der linken Seite das Einblendmenü mit den SQL-Optionen und wählen Sie Verbindungen aus.
  3. Auf dem Tab „Zusammenfassung“ finden Sie Informationen zur Verbindung.
  4. Kopieren Sie die Service Attachment Address (Adresse der Dienstanhänge) und speichern Sie sie auf Ihrem System.
  5. Sie benötigen diese Angabe für Aufgabe 3, Schritt 8.

Cloud SQL mit PSC-Anhang

  1. Maximieren Sie auf der linken Seite das Einblendmenü für SQL-Optionen und wählen Sie Nutzer aus.
  2. Sie sollten einen Nutzer namens testsql mit dem Passwort cloudsql24 sehen. (Dieser wird später für den Zugriff auf die Datenbank verwendet.)

5. Aufgabe 3: Umgebung für das Nutzerprojekt einrichten (Terraform)

Im Nutzerprojekt erstellen wir eine benutzerdefinierte VPC mit Firewallregeln und Subnetz. Öffnen Sie die Cloud Console und wählen Sie das Projekt aus, das Sie verwenden möchten.

  1. Klicken Sie oben in der Console rechts neben dem Google Cloud-Symbol auf das Drop-down-Menü und wählen Sie dann den Tab Alle aus.

ProjektleisteProjektleiste 2

  1. Wählen Sie aus den aufgeführten Projekten die ID Ihres Verbraucherprojekts aus, um fortzufahren.
  2. Öffnen Sie Cloud Shell oben rechts in der Konsole. Achten Sie darauf, dass die Consumer-Projekt-ID in Cloud Shell angezeigt wird, und bestätigen Sie alle Aufforderungen, den Zugriff zuzulassen.
  3. Erstellen Sie einen Ordner mit dem Namen terraform-consumer und wechseln Sie zu diesem Ordner.
mkdir terraform-consumer  && cd terraform-consumer
  1. Erstellen Sie die Dateien main.tf, variable.tf und psc.tf.
touch main.tf variable.tf psc.tf 
  1. Wechseln Sie zur Ansicht Cloud Shell-Editor für die Nutzerprojekt-ID. Wählen Sie Editor aus und bestätigen Sie alle erforderlichen Aufforderungen, damit die Benutzeroberfläche geladen werden kann.
  2. Rufen Sie nach dem Laden Datei > Ordner öffnen auf, wechseln Sie zu /home/your-user-name/terraform-consumer und wählen Sie Ok aus, um den Ordner im Editor zu öffnen. 78f5eb9f2f82f1b0.png
  3. Wählen Sie die Datei variable.tf aus und fügen Sie Folgendes hinzu. Ersetzen Sie den Text your-consumer-project-id-here durch Ihre tatsächliche Consumer-Projekt-ID in Anführungszeichen. Ersetzen Sie den Text your-psc-attachment-id-here durch die Adresse der PSC-Anhängung in Anführungszeichen. Das ist die ID, die Sie in Aufgabe 2, Abschnitt 2–5 kopiert haben. 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. Öffnen Sie als Nächstes die Datei main.tf. Wir fügen nun Terraform-Code hinzu, um verschiedene Aktionen auszuführen, wie unten beschrieben.

APIs aktivieren

resource "google_project_service"

VPC erstellen

resource "google_compute_network"

NAT-Gateway erstellen

resource "google_compute_router"
resource "google_compute_router_nat"

Firewallregeln hinzufügen

resource "google_compute_firewall"

  1. Kopieren Sie den folgenden Code in die Datei 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. Wechseln Sie zurück zum Cloud Shell-Terminal und prüfen Sie, ob Sie sich im Verzeichnis terraform-consumer cd terraform-consumer im Nutzerprojekt befinden. Führen Sie dann die folgenden Befehle aus:

terraform init

Initialisiert das Arbeitsverzeichnis. In diesem Schritt werden die für die angegebene Konfiguration erforderlichen Anbieter heruntergeladen.

terraform plan

Erstellt einen Ausführungsplan, der zeigt, welche Aktionen Terraform zum Bereitstellen Ihrer Infrastruktur ausführt.

  1. Führen Sie nun den Befehl terraform apply aus und geben Sie yes ein, um die Ressourcen zu erstellen.

6. Aufgabe 4: PSC-Endpunkt für SQL-DB-Anhang im Nutzerprojekt und Test-VM erstellen (Terraform)

Führen Sie diese Konfiguration im Nutzerprojekt aus.

  1. Wechseln Sie zurück zum Cloud Shell-Editor, öffnen Sie das Verzeichnis terraform-consumer und wählen Sie die Datei psc.tf aus. Fügen Sie der Datei den folgenden Terraform-Code hinzu. Dadurch werden eine statische interne IP-Adresse, ein PSC-Endpunkt und eine Test-VM mit installierter MariaDB erstellt.
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. Wechseln Sie zurück zum Cloud Shell-Terminal und prüfen Sie, ob Sie sich im Verzeichnis terraform-consumer cd terraform-consumer im Nutzerprojekt befinden. Führen Sie dann die folgenden Befehle aus:

terraform plan

Erstellt einen Ausführungsplan, der zeigt, welche Aktionen Terraform zum Bereitstellen Ihrer Infrastruktur ausführt.

  1. Führen Sie nun den Befehl terraform apply aus, um die Ressourcen zu erstellen, und geben Sie yes ein, um den Befehl auszuführen.
  2. Da sich unsere VM und unser Endpunkt in verschiedenen Regionen befinden, müssen wir globalen Zugriff auf dem PSC-Endpunkt aktivieren. Das erfolgt über die Konsole.
  3. Rufen Sie in der Console des Nutzerprojekts Private Service Connect auf. Suchen Sie auf dem Tab Verbundener Endpunkt im Bereich „Endpunkt“ nach psc-sql-endpoint und wählen Sie diese Option aus.
  4. Wählen Sie nun BEARBEITEN aus und klicken Sie dann auf das Kästchen neben Globalen Zugriff aktivieren und auf die Option Speichern. 7eeb5a4162f5f79d.png
  5. Fahren Sie mit dem nächsten Schritt fort, um die Verbindung zu überprüfen.

7. Aufgabe 5: Endpunktverbindung von der VM über die PSC-IP-Adresse prüfen

Im Nutzerprojekt ausführen

  1. Rufen Sie die Seite VM-Instanzen auf. Wählen Sie sql-test-vm aus.
  2. Wählen Sie die Option SSH aus, um eine Verbindung zur VM herzustellen.
  3. Stellen Sie mit Folgendem eine Verbindung zur Datenbank über den Endpunkt her:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. Nachdem die Verbindung hergestellt wurde, erstellen wir eine Datenbank mit dem Namen psc-sql-db.
CREATE DATABASE remotesqldb;
  1. Geben Sie nach Abschluss „exit“ ein, um die Verbindung zu beenden.

8. Aufgabe 6: Datenbankeintrag prüfen

Führen Sie diese Bestätigung im Datenbankprojekt aus.

  1. Klicken Sie oben in der Console rechts neben dem Google Cloud-Symbol auf das Drop-down-Menü und wählen Sie dann den Tab Alle aus.

ProjektleisteProjektleiste 2

  1. Wählen Sie in der Liste der Projekte die Projekt-ID Ihres Datenbankprojekts aus, um fortzufahren.
  2. Rufen Sie SQL auf, wählen Sie die Datenbank psc-sql-db aus, maximieren Sie die SQL-Optionen und wählen Sie Datenbanken aus. Die soeben erstellte Datenbank mit dem Namen remotesqldb sollte in der VM des Nutzerprojekts**.** angezeigt werden.

Cloud SQL-Datenbank

9. Bereinigen

Im Datenbankprojekt ausführen

  1. Datenbankprojekt-ID auswählen
  2. Rufen Sie die Cloud Shell auf und prüfen Sie, ob die Projekt-ID der Datenbank angezeigt wird.
  3. Wechseln Sie zum Verzeichnis terraform-db cd terraform-db und führen Sie den folgenden Befehl aus terraform destroy. Geben Sie yes ein. Alle Ressourcen, die Sie in Ihrem Datenbankprojekt mit Terraform erstellt haben, werden entfernt.

Im Nutzerprojekt ausführen

  1. Nutzerprojekt-ID auswählen
  2. Rufen Sie Cloud Shell auf und prüfen Sie, ob die Projekt-ID des Consumer-Projekts angezeigt wird.
  3. Wechseln Sie zum Verzeichnis terraform-consumer cd terraform-consumer und führen Sie den folgenden Befehl terraform destroy aus. Geben Sie yes ein. Alle Ressourcen, die Sie in Ihrem Datenbankprojekt mit Terraform erstellt haben, werden entfernt.

10. Glückwunsch

Sie haben eine Cloud SQL-Instanz mit PSC-Anhang konfiguriert und einen Private Service Connect-Endpunkt in einem anderen VPC-Netzwerk erstellt. Sie konnten erfolgreich eine Verbindung von einer Remote-VM über den PSC-Endpunkt zur Datenbank herstellen.

Weitere Informationen

Weitere Informationen zu Private Service Connect und Cloud SQL