Aller au contenu

Cloud SQL et déploiement

Provisionnement de l'instance PostgreSQL via Cloud SQL avec Private IP, initialisation du schéma Guacamole, build de l'image Packer et déploiement de la VM.


Private Service Access

Cloud SQL avec Private IP nécessité une plage d'adresses réservée dans votre VPC et un peering avec le réseau des services Google.

Réseau default

Ces commandes utilisent le réseau default. Si vous utilisez un VPC custom, remplacez default par le nom de votre réseau dans toutes les commandes ci-dessous.

Réserver une plage d'adresses

gcloud compute addresses create google-managed-services-default \
  --global \
  --purpose=VPC_PEERING \
  --prefix-length=16 \
  --network=default

Activer le peering VPC

gcloud services vpc-peerings connect \
  --service=servicenetworking.googleapis.com \
  --ranges=google-managed-services-default \
  --network=default

Cette opération prend quelques minutes. Verifiez que le peering est actif :

gcloud services vpc-peerings list --network=default

Création de l'instance Cloud SQL

Coût

db-f1-micro est le tier le moins cher (partagé, 0.6 Go RAM). Pour un usage production, utilisez au minimum db-g1-small. L'instance Cloud SQL est facturee à l'heure même si elle est inactive.

gcloud sql instances create guacamole-db \
  --database-version=POSTGRES_15 \
  --tier=db-f1-micro \
  --region=europe-west1 \
  --no-assign-ip \
  --network=default \
  --availability-type=zonal \
  --storage-size=10GB \
  --storage-type=SSD
Parametre Valeur Description
--database-version POSTGRES_15 PostgreSQL 15
--tier db-f1-micro Tier partage, minimal
--no-assign-ip Pas d'IP publique
--network default VPC pour Private IP
--availability-type zonal Pas de haute dispo (coûts reduits)

Recuperez l'adresse Private IP de l'instance :

gcloud sql instances describe guacamole-db \
  --format="value(ipAddresses[0].ipAddress)"

Notez cette adresse, elle sera utilisée comme cloudsql_host dans Packer.


Base de données et utilisateur

Mot de passe

Remplacez CHOISIR_UN_MOT_DE_PASSE_FORT par un mot de passe robuste. Ce mot de passe sera encode dans l'image Packer via la variable Ansible guacamole_db_password. Ne commitez jamais ce mot de passe dans votre dépôt Git.

Créer la base de données

gcloud sql databases create guacamole \
  --instance=guacamole-db

Créer l'utilisateur

gcloud sql users create guacamole \
  --instance=guacamole-db \
  --password=CHOISIR_UN_MOT_DE_PASSE_FORT

Initialisation du schéma

Le schéma SQL de Guacamole ne peut pas être appliqué directement depuis votre poste car Cloud SQL n'a pas d'IP publique. Utilisez une VM temporaire dans le même VPC.

Créer une VM temporaire

gcloud compute instances create guacamole-init \
  --zone=europe-west1-b \
  --machine-type=e2-micro \
  --image-family=debian-12 \
  --image-project=debian-cloud \
  --no-address

Se connecter via IAP

gcloud compute ssh guacamole-init \
  --zone=europe-west1-b \
  --tunnel-through-iap

Installer psql et télécharger les scripts

Sur la VM temporaire :

sudo apt-get update && sudo apt-get install -y postgresql-client wget

GUAC_VERSION="1.5.5"
wget "https://apache.org/dyn/closer.lua/guacamole/${GUAC_VERSION}/binary/guacamole-auth-jdbc-${GUAC_VERSION}.tar.gz?action=download" \
  -O guacamole-auth-jdbc.tar.gz

tar xzf guacamole-auth-jdbc.tar.gz

Appliquer le schéma

CLOUDSQL_HOST="10.X.X.X"  # Adresse Private IP relevee precedemment

psql "host=${CLOUDSQL_HOST} port=5432 dbname=guacamole user=guacamole" \
  -f guacamole-auth-jdbc-${GUAC_VERSION}/postgresql/schema/001-create-schema.sql

psql "host=${CLOUDSQL_HOST} port=5432 dbname=guacamole user=guacamole" \
  -f guacamole-auth-jdbc-${GUAC_VERSION}/postgresql/schema/002-create-admin-user.sql

Le script 002-create-admin-user.sql crée le compte guacadmin avec le mot de passe par défaut guacadmin. Changez-le immédiatement après le premier login.

Supprimer la VM temporaire

gcloud compute instances delete guacamole-init \
  --zone=europe-west1-b \
  --quiet

Build de l'image Packer

Mettez à jour packer/guacamole.auto.pkrvars.hcl avec l'adresse Private IP Cloud SQL :

project_id    = "MON-PROJET-GCP"
zone          = "europe-west1-b"
cloudsql_host = "10.X.X.X"  # Adresse Private IP Cloud SQL

Lancez le build :

cd packer/
packer init .
packer build \
  -var-file=guacamole.auto.pkrvars.hcl \
  guacamole.pkr.hcl
Durée du build

Le build prend entre 15 et 25 minutes. La compilation de guacd depuis les sources est l'étape la plus longue (~10 min). Vous pouvez suivre la progression dans la sortie Packer. En cas d'échec réseau, relancez simplement packer build — les étapes sont idempotentes grâce aux conditions creates:.

Recuperez le nom de l'image créée :

gcloud compute images list \
  --filter="family=guacamole" \
  --sort-by="~creationTimestamp" \
  --format="value(name)" \
  --limit=1

Déploiement de la VM

IMAGE_NAME=$(gcloud compute images list \
  --filter="family=guacamole" \
  --sort-by="~creationTimestamp" \
  --format="value(name)" \
  --limit=1)

gcloud compute instances create guacamole-vm \
  --zone=europe-west1-b \
  --machine-type=e2-standard-2 \
  --image=${IMAGE_NAME} \
  --image-project=MON-PROJET-GCP \
  --no-address \
  --service-account=guacamole-vm@MON-PROJET-GCP.iam.gserviceaccount.com \
  --scopes=cloud-platform

Recuperez l'IP interne de la VM :

gcloud compute instances describe guacamole-vm \
  --zone=europe-west1-b \
  --format="value(networkInterfaces[0].networkIP)"

Vérification

Test HTTP depuis une VM du même réseau

curl -s -o /dev/null -w "%{http_code}" http://IP_INTERNE_VM:8080/guacamole/

La réponse attendue est 200.

Vérification des services

gcloud compute ssh guacamole-vm \
  --zone=europe-west1-b \
  --tunnel-through-iap \
  --command="systemctl is-active tomcat9 guacd"

Les deux services doivent répondre active.

Premier login

Ouvrez http://IP_INTERNE_VM:8080/guacamole/ dans votre navigateur (via un tunnel SSH ou un bastion).

Identifiants par défaut : guacadmin / guacadmin

Changez le mot de passe immédiatement via Parametres → Utilisateurs → guacadmin → Modifier le mot de passe.