Se connecter au service Cloud SQL privé depuis Cloud Run

1. Présentation

Dans cet atelier, vous allez créer le service de menu Cymbal Eats, en affichant des API RESTful permettant d'ajouter, de mettre à jour, de supprimer et de lister des éléments de menu. Vous allez créer une base de données Cloud SQL en tant que base de données backend pour le service de menu, qui s'exécutera dans Cloud Run. Comme Cloud Run ne se trouve pas sur le même VPC que la base de données Cloud SQL, vous devez configurer un connecteur d'accès au VPC sans serveur pour permettre à Cloud Run de communiquer avec Cloud SQL via une adresse IP privée.

19c7b05f35789fda.png

Objectifs de l'atelier

Dans cet atelier, vous allez apprendre à effectuer les tâches suivantes :

  • Configurer un réseau VPC privé
  • Créer une base de données Cloud SQL privée Postgres
  • Connecter Cloud Run à un VPC privé
  • Déployer sur Cloud Run un service qui se connecte à la base de données Cloud SQL

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.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 pouvez le modifier à tout moment.
  • 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. généralement, vous ne vous souciez pas de ce que c’est. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (il est généralement identifié comme PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre au hasard. Vous pouvez également essayer la vôtre pour voir si elle est disponible. Il ne peut pas être modifié après cette étape et restera actif pendant toute la durée du projet.
  • Pour votre information, il existe une troisième valeur, le numéro de projet, utilisé par certaines API. 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 arrêter les ressources afin d'éviter que des frais ne vous soient facturés au-delà de ce tutoriel, vous pouvez supprimer les ressources que vous avez créées ou l'ensemble du projet. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai gratuit pour bénéficier d'un crédit de 300 $.

Configuration de l'environnement

  1. Créer des variables d'environnement liées au projet et aux ressources
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

export SERVERLESS_VPC_CONNECTOR=cymbalconnector
export DB_INSTANCE_NAME=menu-catalog
export DB_INSTANCE_PASSWORD=password123
export DB_DATABASE=menu-db
export DB_USER=menu-user
export DB_PASSWORD=menupassword123
  1. Clonez le dépôt et accédez au répertoire.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service
  1. Activer les services
gcloud services enable \
    sqladmin.googleapis.com \
    run.googleapis.com \
    vpcaccess.googleapis.com \
    servicenetworking.googleapis.com

3. Configurer l'accès privé

L'accès aux services privés est fourni sous la forme d'un lien d'appairage VPC entre votre réseau VPC et le réseau VPC Google Cloud sous-jacent, où se trouve votre instance Cloud SQL. La connexion privée permet aux instances de VM de votre réseau VPC et aux services que vous utilisez de communiquer uniquement via des adresses IP internes. Pour accéder aux services disponibles via l'accès aux services privés, les instances de VM ne nécessitent pas de connectivité Internet ni d'adresses IP externes.

  1. Allouer une plage d'adresses IP
gcloud compute addresses create google-managed-services-default \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=20 \
    --network=projects/$PROJECT_ID/global/networks/default

Exemple de résultat :

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-2-348215/global/addresses/google-managed-services-default].
  1. Créez une connexion privée.
gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-default \
    --network=default \
    --project=$PROJECT_ID

Exemple de résultat :

Operation "operations/pssn.p24-528514492617-2f2b507f-e4e5-4d53-a4de-9ddaceb4e92f" finished successfully.

4. Configurer Cloud SQL

Cloud SQL est un service de base de données entièrement géré qui facilite la configuration, la maintenance, la gestion et l'administration de vos bases de données relationnelles PostgreSQL et MySQL dans le cloud. Chaque instance Cloud SQL est alimentée par une machine virtuelle (VM) qui s'exécute sur un serveur hôte Google Cloud. L'option de haute disponibilité inclut également une VM de secours dans une autre zone avec la même configuration que la VM principale. La base de données est conservée sur un périphérique de stockage réseau évolutif et durable, appelé "disque persistant", qui est connecté à la VM. Une adresse IP statique est attribuée à chaque VM pour que l'adresse IP à laquelle une application se connecte reste constante pendant toute la durée de vie de l'instance Cloud SQL.

219cb722c2dd1b82.png

Vous allez créer une base de données Postgres Cloud SQL avec une adresse IP privée.

Créer une base de données et un utilisateur

  1. Créer une instance Postgres Cloud SQL pour utiliser une adresse IP privée
gcloud sql instances create $DB_INSTANCE_NAME \
    --project=$PROJECT_ID \
    --network=projects/$PROJECT_ID/global/networks/default \
    --no-assign-ip \
    --database-version=POSTGRES_12 \
    --cpu=2 \
    --memory=4GB \
    --region=$REGION \
    --root-password=${DB_INSTANCE_PASSWORD}

Exemple de résultat :

Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/cymbal1/instances/menu-instance].
NAME: menu-instance
DATABASE_VERSION: POSTGRES_12
LOCATION: us-east1-a
TIER: db-custom-2-4096
PRIMARY_ADDRESS: -
PRIVATE_ADDRESS: 10.8.80.5
STATUS: RUNNABLE
  1. Ajouter une base de données à l'instance de base de données
gcloud sql databases create $DB_DATABASE --instance=$DB_INSTANCE_NAME

Exemple de résultat :

Created database [menu-db].
instance: menu-catalog
name: menu-db
project: cymbal1
  1. Créer un utilisateur SQL
gcloud sql users create ${DB_USER} \
    --password=$DB_PASSWORD \
    --instance=$DB_INSTANCE_NAME

Exemple de résultat :

Created user [menu-user].
  1. Stocker l'adresse IP de la base de données
export DB_INSTANCE_IP=$(gcloud sql instances describe $DB_INSTANCE_NAME \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")
  1. Ajouter le rôle "Client Cloud SQL" au compte de service Compute Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/cloudsql.client"

Exemple de résultat :

Updated IAM policy for project [cymbal1].
[...]

5. VPC sans serveur

L'accès au VPC sans serveur vous permet de vous connecter directement à votre réseau cloud privé virtuel à partir d'environnements sans serveur tels que Cloud Run, App Engine ou Cloud Functions. La configuration de l'accès au VPC sans serveur permet à votre environnement sans serveur d'envoyer des requêtes à votre réseau VPC à l'aide d'un DNS interne et d'adresses IP internes (telles que définies par les normes RFC 1918 et RFC 6598). Les réponses à ces requêtes utilisent également votre réseau interne.

Vous allez créer un connecteur d'accès au VPC sans serveur pour que le service Cloud Run se connecte à Cloud SQL.

19c7b05f35789fda.png

  1. Créez un connecteur d'accès au VPC sans serveur dans le même réseau VPC que votre instance Cloud SQL.
gcloud compute networks vpc-access connectors create ${SERVERLESS_VPC_CONNECTOR} \
    --region=${REGION} \
    --range=10.8.0.0/28

Exemple de résultat :

Created connector [cymbalconnector].

6. Déployer sur Cloud Run

Vous allez créer et déployer une image Docker dans Cloud Run, puis connecter Cloud Run au connecteur VPC sans serveur pour accéder à la base de données Cloud SQL.

  1. Compiler l'application à l'aide de Maven
./mvnw package -DskipTests

Exemple de résultat :

[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  42.864 s
[INFO] Finished at: 2022-04-28T16:15:33Z
[INFO] ------------------------------------------------------------------------
  1. Créez une image Docker:
docker build -f src/main/docker/Dockerfile.jvm \
    --tag gcr.io/$PROJECT_NAME/menu-service .

Exemple de résultat :

[...]
Successfully built 4ef5d7a3befc
Successfully tagged gcr.io/cymbal1/menu-service:latest
  1. Transférez l'image Docker dans Container Registry:
docker push gcr.io/$PROJECT_NAME/menu-service

Exemple de résultat :

Using default tag: latest
The push refers to repository [gcr.io/cymbalsql/menu-service]
17b374963800: Pushed
d9a51c06430d: Pushed
fff5d2a2cfc9: Pushed
f21fceb558c6: Pushed
5ffbbbf218dd: Pushed
60609ec85f86: Layer already exists
f2c4302f03b8: Layer already exists
latest: digest: sha256:f64cb7c288dbf4ad9b12bd210c23c5aec1048dee040450ff2d9dbdf96e83a426 size: 1789
  1. Service du menu de déploiement:
gcloud run deploy $MENU_SERVICE_NAME \
    --image=gcr.io/$PROJECT_NAME/menu-service:latest \
    --region $REGION \
    --allow-unauthenticated \
    --set-env-vars DB_USER=$DB_USER \
    --set-env-vars DB_PASS=$DB_PASSWORD \
    --set-env-vars DB_DATABASE=$DB_DATABASE \
    --set-env-vars DB_HOST=$DB_INSTANCE_IP \
    --vpc-connector $SERVERLESS_VPC_CONNECTOR \
    --project=$PROJECT_ID \
    --quiet

Exemple de résultat :

[...]
Done.
Service [menu-service] revision [menu-service-00002-xox] has been deployed and is serving 100 percent of traffic.
Service URL: https://menu-service-g2mfphytdq-uk.a.run.app

Google vous recommande d'utiliser Secret Manager pour stocker les informations sensibles telles que les identifiants SQL. Vous pouvez transmettre des secrets en tant que variables d'environnement ou les installer en tant que volume avec Cloud Run.

  1. URL du service Menu du magasin:
MENU_SERVICE_URL=$(gcloud run services describe menu-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Vérifier l'URL du service de menu
echo $MENU_SERVICE_URL

Exemple de résultat :

https://menu-service-g2mfphytdq-uk.a.run.app

7. Tester le service

  1. Créez un élément de menu en envoyant une requête POST:
curl -X POST "${MENU_SERVICE_URL}/menu" \
  -H 'Content-Type: application/json' \
  -d '{
       "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "itemName": "Curry Plate",
       "itemPrice": 12.5,
       "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
       "spiceLevel": 3,
       "status": "Ready",
       "tagLine": "Spicy touch for your taste buds!!"
   }'

Exemple de résultat :

{
    "id": 16,
    "createDateTime": "2022-04-28T18:14:04.17225",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.5,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 3,
    "status": "Processing",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T18:14:04.172298"
}
  1. Modifiez l'état de l'élément de menu en envoyant une requête PUT:
curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Ready"}'

Exemple de résultat :

{
    "id": 1,
    "createDateTime": "2022-04-28T17:21:02.369093",
    "itemImageURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "itemName": "Curry Plate",
    "itemPrice": 12.50,
    "itemThumbnailURL": "https://images.unsplash.com/photo-1631452180519-c014fe946bc7?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1587&q=80",
    "spiceLevel": 0,
    "status": "Ready",
    "tagLine": "Spicy touch for your taste buds!!",
    "updateDateTime": "2022-04-28T17:21:02.657636"
}

8. Félicitations !

Félicitations, vous avez terminé cet atelier de programmation.

Étapes suivantes :

Découvrez d'autres ateliers de programmation Cymbal Eats:

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez chaque ressource individuellement.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.