Se connecter à CloudSQL via Private Service Connect (Terraform)

1. Présentation

Il existe plusieurs options pour vous connecter à une instance Cloud SQL privée à partir d'un autre projet ou de VPC. Private Service Connect (PSC) permet aux producteurs de services d'exposer leurs services via des rattachements de service. Les clients peuvent utiliser ces pièces jointes de service pour créer des points de terminaison et/ou des backends PSC dans leur environnement, et se connecter à ces services de production via une adresse IP privée spécifiée.

Cloud SQL peut utiliser le rattachement de service PSC pour autoriser les connexions privées. Dans cet atelier, vous allez configurer et tester l'option.

Dans cet atelier, vous allez créer une architecture simple qui illustre l'utilisation de l'accès au point de terminaison PSC avec CloudSQL.

Figure 1.

1893f48fe1298ea2.png

Pour cet atelier, vous aurez besoin de deux projets ou de VPC distincts dans le même projet.

Objectifs

Dans cet atelier, vous allez apprendre à effectuer la tâche suivante:

  • Créez une instance Cloud SQL avec un rattachement de service PSC.
  • Créer une adresse IP statique
  • Créer un point de terminaison PSC dans le VPC du client pour se connecter à la base de données CloudSQL
  • Vérifiez l'accès à la base de données SQL à partir d'une VM de test dans le réseau client via l'adresse IP du point de terminaison PSC.

2. Préparation

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. Si vous n'avez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pourrez toujours le modifier.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Google Cloud Shell pour cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Dans la console Google Cloud, cliquez sur l'icône Cloud Shell dans la barre d'outils supérieure :

55efc1aaa7a4d3ad.png

Le provisionnement et la connexion à l'environnement prennent quelques instants seulement. Une fois l'opération terminée, le résultat devrait ressembler à ceci :

7ffe5cbb04455448.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez effectuer toutes les tâches de cet atelier de programmation dans un navigateur. Vous n'avez rien à installer.

3. Tâche 1 : Configurer l'environnement pour un projet de base de données avec Terraform

Dans le projet de base de données,nous allons créer un VPC personnalisé avec des règles de pare-feu et un sous-réseau. Ouvrez Cloud Console, puis sélectionnez le projet que vous utiliserez pour la base de données.

  1. Ouvrez Cloud Shell en haut à droite de la console. Assurez-vous que l'ID de projet de la base de données s'affiche pour le projet de base de données dans Cloud Shell, puis confirmez les invites pour autoriser l'accès. 4261e776f64ea978.png
  2. Créez un dossier nommé terraform-db et déplacez-vous vers ce dossier.
mkdir terraform-db  && cd terraform-db
  1. Créez des fichiers main.tf, variable.tf et database.tf.
touch main.tf variable.tf database.tf 
  1. Accédez à la vue Éditeur Cloud Shell. Sélectionnez Éditeur, puis assurez-vous d'autoriser les invites nécessaires pour que l'interface puisse se charger.
  2. Une fois le fichier chargé, accédez à File > Open Folder (Fichier > Ouvrir le dossier), puis accédez à /home/votre-nom-utilisateur/terraform-db et sélectionnez Ok (OK) pour ouvrir le dossier dans l'éditeur. 78f5eb9f2f82f1b0.png
  3. Sélectionnez le fichier variable.tf, puis ajoutez les éléments suivants. Remplacez le texte your-database-project-id-here par l'ID réel de votre projet de base de données entre guillemets. Remplacez le texte your-consumer-project-id-here par l'ID réel de votre projet client entre guillemets.
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. Ouvrez ensuite le fichier main.tf. Nous allons ajouter du code Terraform pour effectuer diverses actions, comme expliqué ci-dessous.

Activer les API

resource "google_project_service" "default"

Créer un VPC

resource "google_compute_network" "default"

Ajouter des règles de pare-feu

resource "google_compute_firewall" "allow_icmp"

  1. Copiez et collez le code suivant dans le fichier 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. Revenez au terminal Cloud Shell, assurez-vous d'être dans le répertoire cd terraform-db terraform-db, puis exécutez les commandes suivantes.

terraform init

Initialise le répertoire de travail. Cette étape télécharge les fournisseurs requis pour la configuration donnée.

terraform plan

Génère un plan d'exécution, qui indique les actions que Terraform effectuera pour déployer votre infrastructure.

  1. Pour créer les ressources, exécutez la commande terraform apply, puis saisissez yes pour l'exécuter.

4. Tâche 2 : Créer une instance Cloud SQL avec un rattachement PSC (Terraform)

Créons une instance Cloud SQL à l'aide de Terraform, avec l'option PSC pour autoriser la connectivité. Effectuez cette configuration dans le projet de base de données.

  1. Accédez à la vue Éditeur Cloud Shell. Assurez-vous d'être dans le dossier terraform-db. Sélectionnez le fichier database.tf, puis ajoutez ce qui suit.
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. Revenez au terminal Cloud Shell et assurez-vous d'être dans le répertoire terraform-db. Pour créer les ressources, exécutez la commande terraform apply, puis saisissez yes pour l'exécuter. La création de l'instance Cloud SQL avec un rattachement PSC peut prendre jusqu'à cinq minutes ou plus.

Vérifier la base de données

  1. Une fois l'opération terminée, accédez à SQL dans la console, puis sélectionnez l'instance de base de données psc-sql-db nouvellement créée.
  2. Sur la gauche, développez le panneau des options SQL et sélectionnez Connexions.
  3. Dans l'onglet "Récapitulatif", vous pouvez consulter des informations sur la connexion.
  4. Copiez l'adresse de l'attachement de service, puis enregistrez-la sur votre système.
  5. Vous en aurez besoin pour effectuer l'étape 8 de la tâche 3.

Cloud SQL avec attachement PSC

  1. Sur la gauche, développez le panneau des options SQL, puis sélectionnez Utilisateurs.
  2. Un utilisateur appelé testsql avec le mot de passe cloudsql24(qui servira à accéder à la base de données plus tard) doit s'afficher.

5. Tâche 3 : Configurer l'environnement pour le projet de consommateur (Terraform)

Dans le projet client,nous allons créer un VPC personnalisé avec des règles de pare-feu et un sous-réseau. Ouvrez la console Cloud, puis sélectionnez le projet que vous utiliserez.

  1. En haut à droite de la console, à côté de l'icône Google Cloud, cliquez sur le menu déroulant, puis sélectionnez l'onglet Tout.

barre de projetbarre de projet 2

  1. Dans la liste des projets, sélectionnez l'ID de votre projet client pour continuer.
  2. Ouvrez Cloud Shell en haut à droite de la console, assurez-vous que l'ID de projet client s'affiche dans Cloud Shell, puis confirmez les invites pour autoriser l'accès.
  3. Créez un dossier nommé terraform-consumer et déplacez-vous vers ce dossier.
mkdir terraform-consumer  && cd terraform-consumer
  1. Créez des fichiers main.tf, variable.tf et psc.tf.
touch main.tf variable.tf psc.tf 
  1. Accédez à la vue de l'éditeur Cloud Shell pour l'ID de projet client. Sélectionnez Éditeur, puis assurez-vous d'autoriser les invites nécessaires pour que l'interface puisse se charger.
  2. Une fois le fichier chargé, accédez à File > Open Folder (Fichier > Ouvrir le dossier), puis accédez à /home/votre-nom-utilisateur/terraform-consumer et sélectionnez Ok (OK) pour ouvrir le dossier dans l'éditeur. 78f5eb9f2f82f1b0.png
  3. Sélectionnez le fichier variable.tf, puis ajoutez les éléments suivants. Remplacez le texte your-consumer-project-id-here par votre ID de projet client réel entre guillemets. Remplacez le texte your-psc-attachment-id-here par votre adresse d'attachement psc entre guillemets. Il s'agit de l'ID que vous avez copié dans la section 2-5 de la tâche 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. Ouvrez ensuite le fichier main.tf. Nous allons ajouter du code Terraform pour effectuer diverses actions, comme expliqué ci-dessous.

Activer les API

resource "google_project_service"

Créer un VPC

resource "google_compute_network"

Créer une passerelle NAT

resource "google_compute_router"
resource "google_compute_router_nat"

Ajouter des règles de pare-feu

resource "google_compute_firewall"

  1. Copiez et collez le code suivant dans le fichier 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. Revenez au terminal Cloud Shell, assurez-vous d'être dans le répertoire cd terraform-consumer terraform-consumer du projet client, puis exécutez les commandes suivantes.

terraform init

Initialise le répertoire de travail. Cette étape télécharge les fournisseurs requis pour la configuration donnée.

terraform plan

Génère un plan d'exécution, qui indique les actions que Terraform effectuera pour déployer votre infrastructure.

  1. Pour créer les ressources, exécutez la commande terraform apply, puis saisissez yes pour l'exécuter.

6. Tâche 4 : Créer le point de terminaison PSC pour le rattachement à la base de données SQL dans le projet utilisateur et la VM de test (Terraform)

Effectuez cette configuration dans le projet client.

  1. Revenez à l'éditeur Cloud Shell, ouvrez le répertoire terraform-consumer, puis sélectionnez le fichier psc.tf. Ajoutez le code Terraform suivant au fichier. Une adresse IP interne statique, un point de terminaison PSC et une VM de test avec Maria DB installé sont créés.
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. Revenez au terminal Cloud Shell, assurez-vous d'être dans le répertoire cd terraform-consumer terraform-consumer du projet client, puis exécutez les commandes suivantes.

terraform plan

Génère un plan d'exécution, qui indique les actions que Terraform effectuera pour déployer votre infrastructure.

  1. Pour créer les ressources, exécutez la commande terraform apply, puis saisissez yes pour l'exécuter.
  2. Étant donné que notre VM et notre point de terminaison se trouvent dans des régions différentes, nous devons activer l' accès mondial sur le point de terminaison PSC. Nous le faisons via la console.
  3. Dans la console du projet client, accédez à Private Service Connect. Dans l'onglet Connected Endpoint (Point de terminaison connecté), recherchez la section "Endpoint" (Point de terminaison) et sélectionnez psc-sql-endpoint.
  4. Sélectionnez maintenant MODIFIER,puis cochez la case à côté de Activer l'accès global et cliquez sur Enregistrer. 7eeb5a4162f5f79d.png
  5. Passez à l'étape suivante pour vérifier la connectivité.

7. Tâche 5 : Vérifier la connectivité des points de terminaison à partir de la VM via l'adresse IP du PSC

Effectuez cette opération dans le projet client.

  1. Accédez à Instance de VM. Sélectionnez sql-test-vm.
  2. Sélectionnez l'option SSH pour vous connecter à la VM.
  3. Connectez-vous à la base de données via le point de terminaison avec les éléments suivants:
mysql --host=192.168.90.100 --user=testsql --password=cloudsql24
  1. Une fois la connexion établie, créez une base de données avec psc-sql-db.
CREATE DATABASE remotesqldb;
  1. Une fois la connexion établie, saisissez "exit" pour la quitter.

8. Tâche 6 : Vérifier la saisie dans la base de données

Effectuez cette vérification dans le projet de base de données.

  1. En haut à droite de la console, à côté de l'icône Google Cloud, cliquez sur le menu déroulant, puis sélectionnez l'onglet Tout.

barre de projetbarre de projet 2

  1. Dans la liste des projets, sélectionnez l'ID de votre projet de base de données pour continuer.
  2. Accédez à SQL, sélectionnez la base de données psc-sql-db, développez les options SQL, puis sélectionnez Databases (Bases de données). La base de données que vous venez de créer, appelée remotesqldb, devrait s'afficher à partir de la VM du projet client.**.**

base de données cloud sql

9. Effectuer un nettoyage

Effectuez cette opération dans le projet de base de données.

  1. Sélectionner l'ID du projet de base de données
  2. Accédez à Cloud Shell et assurez-vous que l'ID du projet de base de données s'affiche.
  3. Accédez au répertoire cd terraform-db terraform-db et exécutez la commande terraform destroy suivante, puis saisissez yes. Toutes les ressources que vous avez créées dans votre projet de base de données avec Terraform seront supprimées.

Effectuez cette opération dans le projet client.

  1. Sélectionner l'ID du projet client
  2. Accédez à Cloud Shell et assurez-vous que l'ID du projet client s'affiche.
  3. Accédez au répertoire cd terraform-consumer terraform-consumer et exécutez la commande terraform destroy suivante, puis saisissez yes. Toutes les ressources que vous avez créées dans votre projet de base de données avec Terraform seront supprimées.

10. Félicitations

Félicitations ! Vous avez correctement configuré une instance Cloud SQL avec un rattachement PSC et créé un point de terminaison Private Service Connect dans un autre VPC. Vous avez réussi à vous connecter à la base de données depuis une VM distante via le point de terminaison PSC.

En savoir plus

Pour en savoir plus sur Private Service Connect et Cloud SQL,