Présentation
Les fonctions Cloud Run vous permettent de vous connecter directement à votre réseau VPC, ce qui permet à vos fonctions d'accéder aux instances de VM Compute Engine, aux instances Memorystore et à d'autres ressources disposant d'une adresse IP interne.
Dans cet atelier, vous allez utiliser l'accès au VPC sans serveur pour connecter une fonction à votre réseau VPC et accéder aux données d'une instance Memorystore exécutée sur votre réseau.
Vous utiliserez également le connecteur pour accéder à un serveur Web exécuté sur une instance de VM de votre réseau.
Objectifs
Au cours de cet atelier, vous allez :
- configurer une instance Memorystore pour Redis ;
- créer un connecteur d'accès au VPC sans serveur pour activer l'accès au VPC sans serveur ;
- écrire une fonction basée sur des événements Pub/Sub qui utilise le connecteur pour stocker le contenu du message dans la base de données Redis ;
- écrire une fonction HTTP pour extraire des données de la base de données Redis à l'aide du connecteur, puis renvoyer les données du message dans une réponse HTTP ;
- écrire une fonction HTTP pour accéder à un serveur Web exécuté sur une instance de VM de votre réseau VPC.
Voici une présentation générale des ressources que vous allez créer dans cet atelier :

Préparation
Avant de cliquer sur le bouton "Démarrer l'atelier"
Remarque : Lisez ces instructions.
Les ateliers sont minutés, et vous ne pouvez pas les mettre en pause. Le minuteur, qui démarre lorsque vous cliquez sur Démarrer l'atelier, indique combien de temps les ressources Google Cloud resteront accessibles.
Cet atelier pratique Qwiklabs vous permet de suivre vous-même les activités dans un véritable environnement cloud, et non dans un environnement de simulation ou de démonstration. Des identifiants temporaires vous sont fournis pour vous permettre de vous connecter à Google Cloud le temps de l'atelier.
Conditions requises
Pour réaliser cet atelier, vous devez :
- avoir accès à un navigateur Internet standard (nous vous recommandons d'utiliser Chrome) ;
- disposer de suffisamment de temps pour effectuer l'atelier en une fois.
Remarque : Si vous possédez déjà votre propre compte ou projet Google Cloud, veillez à ne pas l'utiliser pour réaliser cet atelier.
Remarque : Si vous utilisez un Pixelbook, veuillez exécuter cet atelier dans une fenêtre de navigation privée.
Activer Google Cloud Shell
Google Cloud Shell est une machine virtuelle qui contient de nombreux outils pour les développeurs. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud.
Google Cloud Shell vous permet d'accéder à vos ressources Google Cloud grâce à une ligne de commande.
-
Dans la barre d'outils située en haut à droite dans la console Cloud, cliquez sur le bouton "Ouvrir Cloud Shell".

-
Cliquez sur Continuer.
Le provisionnement et la connexion à l'environnement prennent quelques instants. Une fois connecté, vous êtes en principe authentifié et le projet est défini sur votre ID_PROJET. Par exemple :

gcloud est l'outil de ligne de commande pour Google Cloud. Il est préinstallé sur Cloud Shell et permet la complétion par tabulation.
- Vous pouvez lister les noms des comptes actifs à l'aide de cette commande :
gcloud auth list
Résultat :
Credentialed accounts:
- @.com (active)
Exemple de résultat :
Credentialed accounts:
- google1623327_student@qwiklabs.net
- Vous pouvez lister les ID de projet à l'aide de cette commande :
gcloud config list project
Résultat :
[core]
project =
Exemple de résultat :
[core]
project = qwiklabs-gcp-44776a13dea667a6
Remarque : Pour consulter la documentation complète sur gcloud, accédez au guide de présentation de la gcloud CLI.
Tâche 1 : Activer les API
Avant de créer des fonctions Cloud Run, vous devez activer les API appropriées.
-
Pour définir les variables d'environnement PROJECT_ID
et REGION
, activez Cloud Shell, puis exécutez les commandes suivantes :
PROJECT_ID=$(gcloud config get-value project)
REGION={{{project_0.default_region|set at lab start}}}
-
Exécutez la commande suivante pour activer tous les services nécessaires :
gcloud services enable \
artifactregistry.googleapis.com \
cloudfunctions.googleapis.com \
cloudbuild.googleapis.com \
eventarc.googleapis.com \
run.googleapis.com \
logging.googleapis.com \
pubsub.googleapis.com \
redis.googleapis.com \
vpcaccess.googleapis.com
Tâche 2 : Configurer une instance Memorystore pour Redis
Memorystore est un service Google Cloud qui fournit une solution de mise en cache en mémoire entièrement gérée, à disponibilité élevée, évolutive et sécurisée pour Redis et Memcached.
Dans cette tâche, vous allez configurer une instance Memorystore pour Redis dans votre projet Google Cloud. Cette instance est utilisée par la fonction Cloud Run pour stocker les données que vous allez développer dans une autre tâche de l'atelier.
Créer l'instance Memorystore
-
Définissez une variable d'environnement pour le nom de l'instance Memorystore :
REDIS_INSTANCE=customerdb
-
Pour créer une instance Memorystore pour Redis de 2 Gio, exécutez la commande suivante :
gcloud redis instances create $REDIS_INSTANCE \
--size=2 --region=$REGION \
--redis-version=redis_6_x
La création de l'instance Memorystore pour Redis prend quelques minutes. Vous pouvez dès à présent passer à la tâche 3 pour configurer l'accès au VPC sans serveur. Vous reviendrez ensuite à la tâche 2 afin d'effectuer les étapes restantes une fois l'instance Redis créée.
-
Pour afficher les détails de l'instance une fois que vous l'avez créée, exécutez la commande suivante :
gcloud redis instances describe $REDIS_INSTANCE --region=$REGION
Créer des variables d'environnement
-
Enregistrez l'adresse IP de l'hôte de l'instance Memorystore dans une variable d'environnement.
REDIS_IP=$(gcloud redis instances describe $REDIS_INSTANCE --region=$REGION --format="value(host)"); echo $REDIS_IP
-
Enregistrez le port de l'instance Memorystore dans une variable d'environnement :
REDIS_PORT=$(gcloud redis instances describe $REDIS_INSTANCE --region=$REGION --format="value(port)"); echo $REDIS_PORT
Vous utiliserez les valeurs de l'hôte et du port dans une autre tâche pour vous connecter à l'instance.
Cliquez sur Vérifier ma progression pour valider l'objectif.
Configurer une instance Memorystore pour Redis
Tâche 3 : Configurer l'accès au VPC sans serveur
Pour envoyer des requêtes à partir de fonctions Cloud Run vers des ressources de votre réseau VPC et recevoir les réponses correspondantes sans utiliser l'Internet public, vous devez configurer l'accès au VPC sans serveur.
Configurer un connecteur d'accès au VPC sans serveur
-
Dans le menu de navigation de la console Google Cloud (
), sous Mise en réseau, cliquez sur Réseau VPC, puis sélectionnez Accès au VPC sans serveur.
-
Pour créer un connecteur d'accès au VPC sans serveur, cliquez sur Créer un connecteur.
-
Pour le Nom du connecteur, saisissez test-connector.
-
Pour Région, sélectionnez .
-
Pour Sous-réseau, sélectionnez Plage d'adresses IP personnalisée.
-
Dans le champ Plage d'adresses IP, saisissez 10.8.0.0.
Remarque : La plage d'adresses IP doit être un sous-réseau interne /28 non réservé spécifié au format CIDR. Cette plage d'adresses IP ne doit pas chevaucher les réservations d'adresses IP existantes sur votre réseau VPC. Elle est utilisée lors du scaling pour créer des instances de connecteur supplémentaires.La région spécifiée pour le connecteur doit être la même que celle où vos fonctions Cloud Run sont hébergées.
-
Conservez les autres paramètres par défaut, puis cliquez sur Créer.
Une coche verte apparaît à côté du nom du connecteur lorsque celui-ci est prêt à être utilisé.
-
Pour vérifier les détails du connecteur, exécutez la commande suivante dans Cloud Shell :
gcloud compute networks vpc-access connectors \
describe test-connector \
--region $REGION
Cliquez sur Vérifier ma progression pour valider l'objectif.
Créer un connecteur d'accès au VPC sans serveur
Si vous êtes passé à cette tâche pendant la création de l'instance Redis, revenez à la tâche 2 pour effectuer les étapes restantes.
Tâche 4 : Créer une fonction basée sur des événements pour Pub/Sub
Maintenant que vous avez créé le connecteur d'accès au VPC sans serveur, vous pouvez développer une fonction pour accéder aux données de l'instance Memorystore Redis à l'aide du connecteur.
Dans cette tâche, vous allez créer une fonction basée sur des événements Pub/Sub en Python pour stocker et récupérer des données vers et depuis l'instance Memorystore.
Créer un sujet Pub/Sub
-
Vous devez d'abord créer un sujet sur lequel la fonction écoutera les messages. Définissez une variable d'environnement pour le nom du sujet :
TOPIC=add_redis
-
Pour créer un sujet, exécutez la commande suivante :
gcloud pubsub topics create $TOPIC
Écrire le code de la fonction
-
Exécutez la commande suivante pour créer le dossier et les fichiers de la fonction, puis accédez au dossier :
mkdir ~/redis-pubsub && cd $_
touch main.py && touch requirements.txt
-
Dans la barre d'outils de Cloud Shell, cliquez sur le bouton Ouvrir l'éditeur. Vous pouvez passer de Cloud Shell à l'éditeur de code et vice versa en cliquant sur les icônes Ouvrir l'éditeur et Ouvrir le terminal selon le cas.
-
Dans l'éditeur Cloud Shell, sélectionnez le dossier redis-pubsub
.
-
Dans l'éditeur, ajoutez le code suivant au fichier redis-pubsub/main.py
:
import os
import base64
import json
import redis
import functions_framework
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.StrictRedis(host=redis_host, port=redis_port)
# Triggered from a message on a Pub/Sub topic.
@functions_framework.cloud_event
def addToRedis(cloud_event):
# The Pub/Sub message data is stored as a base64-encoded string in the cloud_event.data property
# The expected value should be a JSON string.
json_data_str = base64.b64decode(cloud_event.data["message"]["data"]).decode()
json_payload = json.loads(json_data_str)
response_data = ""
if json_payload and 'id' in json_payload:
id = json_payload['id']
data = redis_client.set(id, json_data_str)
response_data = redis_client.get(id)
print(f"Added data to Redis: {response_data}")
else:
print("Message is invalid, or missing an 'id' attribute")
-
Pour spécifier les dépendances du code de la fonction, ajoutez le contenu suivant au fichier redis-pubsub/requirements.txt
:
functions-framework==3.2.0
redis==4.3.4
Déployer et tester la fonction
-
Pour déployer la fonction, exécutez la commande suivante dans Cloud Shell :
gcloud functions deploy python-pubsub-function \
--runtime=python310 \
--region=$REGION \
--source=. \
--entry-point=addToRedis \
--trigger-topic=$TOPIC \
--vpc-connector projects/$PROJECT_ID/locations/$REGION/connectors/test-connector \
--set-env-vars REDISHOST=$REDIS_IP,REDISPORT=$REDIS_PORT
-
Dans la fenêtre pop-up Lier le rôle au compte de service, saisissez n
.
La fonction est déployée avec un sujet de déclencheur Pub/Sub, le connecteur d'accès au VPC sans serveur et des variables d'environnement qui fournissent à la fonction l'adresse IP et le port de l'hôte de l'instance Memorystore Redis.
Remarque : En cas d'erreur d'autorisation, veuillez attendre quelques minutes, puis réessayez d'effectuer le déploiement.
-
Pour tester la fonction, publiez un message sur le sujet :
gcloud pubsub topics publish $TOPIC --message='{"id": 1234, "firstName": "Lucas" ,"lastName": "Sherman", "Phone": "555-555-5555"}'
Afficher les journaux de la fonction
-
Dans la console Google Cloud, accédez à la page de présentation des fonctions Cloud Run, puis cliquez sur le nom python-pubsub-function
.
-
Cliquez sur Journaux.
-
Vérifiez l'entrée de journal qui indique que la charge utile de données JSON envoyée dans le message Pub/Sub est ajoutée à Redis.

Cliquez sur Vérifier ma progression pour valider l'objectif.
Créer une fonction basée sur des événements pour Pub/Sub
Tâche 5 : Créer une fonction HTTP
Dans cette tâche, vous allez créer une fonction HTTP en Python pour interroger l'instance Memorystore pour Redis et renvoyer des données en fonction d'un identifiant transmis dans la requête.
Écrire le code de la fonction
-
Exécutez la commande suivante pour créer un dossier et des fichiers pour la fonction HTTP, puis accédez au dossier :
mkdir ~/redis-http && cd $_
touch main.py && touch requirements.txt
-
Dans la barre d'outils Cloud Shell, cliquez sur Open Editor (Ouvrir l'éditeur).
-
Dans l'éditeur Cloud Shell, sélectionnez le dossier redis-http
.
-
Dans l'éditeur, ajoutez le code suivant au fichier redis-http/main.py
:
import os
import redis
from flask import request
import functions_framework
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.StrictRedis(host=redis_host, port=redis_port)
@functions_framework.http
def getFromRedis(request):
response_data = ""
if request.method == 'GET':
id = request.args.get('id')
try:
response_data = redis_client.get(id)
except RuntimeError:
response_data = ""
if response_data is None:
response_data = ""
return response_data
-
Pour spécifier les dépendances du code de la fonction, ajoutez les lignes suivantes au fichier redis-http/requirements.txt
:
functions-framework==3.2.0
redis==4.3.4
Nous vous recommandons de séparer les dépendances de votre fonction pour chaque fonction. De cette façon, seuls les modules nécessaires à votre fonction seront chargés au démarrage de l'instance de fonction. Cela permet de réduire la latence des fonctions lors des démarrages à froid.
Déployer et tester la fonction
-
Pour déployer la fonction, exécutez la commande suivante dans Cloud Shell :
gcloud functions deploy http-get-redis \
--gen2 \
--runtime python310 \
--entry-point getFromRedis \
--source . \
--region $REGION \
--trigger-http \
--timeout 600s \
--max-instances 1 \
--vpc-connector projects/$PROJECT_ID/locations/$REGION/connectors/test-connector \
--set-env-vars REDISHOST=$REDIS_IP,REDISPORT=$REDIS_PORT \
--no-allow-unauthenticated
Remarque : En cas d'erreur d'autorisation, veuillez attendre quelques minutes, puis réessayez d'effectuer le déploiement.
-
Une fois que vous avez déployé la fonction, récupérez l'URI HTTP de la fonction et stockez-la dans une variable d'environnement :
FUNCTION_URI=$(gcloud functions describe http-get-redis --gen2 --region $REGION --format "value(serviceConfig.uri)"); echo $FUNCTION_URI
-
Pour tester la fonction, exécutez la commande curl
suivante :
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?id=1234"
Remarque : Transmettez la même valeur de paramètre id que celle utilisée pour tester le déclencheur de fonction Pub/Sub dans la tâche précédente.
-
Vérifiez que la réponse de la fonction HTTP correspond aux données JSON précédemment stockées dans l'instance Redis :
{"id": 1234, "firstName": "Lucas" ,"lastName": "Sherman", "Phone": "555-555-5555"}
Cliquez sur Vérifier ma progression pour valider l'objectif.
Créer une fonction HTTP pour se connecter à Redis
Tâche 6 : Se connecter à une instance de VM depuis une fonction HTTP
Pour vous connecter aux ressources de votre réseau VPC à partir de fonctions Cloud Run, vous devez utiliser un connecteur d'accès au VPC sans serveur.
Dans cette tâche, vous allez créer une VM et une fonction HTTP pour vous connecter à l'instance de VM.
Créer un script de démarrage de VM
-
Dans Cloud Shell, avant de créer une VM, téléchargez un script de démarrage qui installe et exécute un serveur Web simple :
gcloud storage cp gs://cloud-training/CBL492/startup.sh .
-
Pour afficher le contenu du script de démarrage de la VM, exécutez la commande suivante :
cat startup.sh
Créer une VM
-
Définissez une variable d'environnement pour la zone dans laquelle la VM sera créée :
ZONE={{{project_0.default_zone|set at lab start}}}
-
Pour créer une VM avec le script de démarrage, exécutez la commande suivante :
gcloud compute instances create webserver-vm \
--image-project=debian-cloud \
--image-family=debian-11 \
--metadata-from-file=startup-script=./startup.sh \
--machine-type e2-standard-2 \
--tags=http-server \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--zone $ZONE
-
Ajoutez une règle de pare-feu au réseau VPC pour permettre au trafic HTTP d'atteindre la VM :
gcloud compute --project=$PROJECT_ID \
firewall-rules create default-allow-http \
--direction=INGRESS \
--priority=1000 \
--network=default \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=0.0.0.0/0 \
--target-tags=http-server
-
Pour vérifier que la VM est créée et exécutée, dans la console Google Cloud, accédez à Compute Engine, puis cliquez sur Instances de VM.
Vous devez voir une VM ainsi qu'une coche verte indiquant qu'elle est en cours d'exécution :

-
Enregistrez les adresses IP interne et externe de la VM dans des variables d'environnement. Vous utiliserez ces variables plus tard pour tester la fonction.
VM_INT_IP=$(gcloud compute instances describe webserver-vm --format='get(networkInterfaces[0].networkIP)' --zone $ZONE); echo $VM_INT_IP
VM_EXT_IP=$(gcloud compute instances describe webserver-vm --format='get(networkInterfaces[0].accessConfigs[0].natIP)' --zone $ZONE); echo $VM_EXT_IP
Écrire le code de la fonction
Dans cette tâche secondaire, vous allez rédiger la fonction HTTP qui, lorsqu'elle est déclenchée, se connecte à la VM que vous avez créée.
-
Exécutez la commande suivante pour créer un dossier et des fichiers pour le code de la fonction HTTP, puis accédez au dossier :
mkdir ~/vm-http && cd $_
touch main.py && touch requirements.txt
-
Dans la barre d'outils Cloud Shell, cliquez sur Open Editor (Ouvrir l'éditeur).
-
Dans l'éditeur Cloud Shell, sélectionnez le dossier vm-http
.
-
Dans l'éditeur, ajoutez le code suivant au fichier vm-http/main.py
:
import functions_framework
import requests
@functions_framework.http
def connectVM(request):
resp_text = ""
if request.method == 'GET':
ip = request.args.get('ip')
try:
response_data = requests.get(f"http://{ip}")
resp_text = response_data.text
except RuntimeError:
print ("Error while connecting to VM")
return resp_text
La fonction envoie une requête HTTP GET au serveur Web exécuté sur la VM. L'adresse IP du point de terminaison du serveur Web est transmise à la fonction en tant que paramètre de requête dans l'URL de la fonction.
-
Dans l'éditeur, ajoutez le code suivant au fichier vm-http/requirements.txt
:
functions-framework==3.2.0
Werkzeug==2.3.7
flask==2.1.3
requests==2.28.1
Déployer la fonction
-
Pour déployer la fonction, exécutez la commande suivante dans Cloud Shell :
gcloud functions deploy vm-connector \
--runtime python310 \
--entry-point connectVM \
--source . \
--region $REGION \
--trigger-http \
--timeout 10s \
--max-instances 1 \
--no-allow-unauthenticated
-
Une fois que vous avez déployé la fonction, exécutez la commande suivante pour extraire son URL :
FUNCTION_URI=$(gcloud functions describe vm-connector --region $REGION --format='value(url)'); echo $FUNCTION_URI
Tester la fonction
-
Testez la fonction en fournissant l'adresse IP externe de la VM dans l'URL de la fonction :
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?ip=$VM_EXT_IP"
La commande doit renvoyer la réponse HTML du serveur Web exécuté sur la VM :
<html><body><p>Linux startup script from a local file.</p></body></html>
Par défaut, les fonctions Cloud Run peuvent accéder à des adresses IP ou URL externes publiques. Vous pouvez changer ce comportement en modifiant les paramètres de sortie de la fonction pour acheminer le trafic de votre fonction par le biais de votre réseau VPC avec un connecteur.
-
Répétez le test en fournissant l'adresse IP interne de la VM à l'URL de la fonction :
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?ip=$VM_INT_IP"
La fonction expire au bout de 10 secondes environ, car par défaut, elle ne peut pas accéder à la VM sur son adresse IP interne.
Une erreur est signalée :
upstream request timeout
Utiliser le connecteur VPC
Pour accéder à la VM ou à d'autres ressources internes de votre réseau VPC à partir de votre fonction, vous devez utiliser un connecteur d'accès au VPC sans serveur.
-
Réactivez l'API Cloud Functions :
gcloud services disable cloudfunctions.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
-
Redéployez la fonction HTTP en définissant le connecteur VPC que vous avez créé précédemment dans cet atelier :
gcloud functions deploy vm-connector \
--runtime python310 \
--entry-point connectVM \
--source . \
--region $REGION \
--trigger-http \
--timeout 10s \
--max-instances 1 \
--no-allow-unauthenticated \
--vpc-connector projects/$PROJECT_ID/locations/$REGION/connectors/test-connector
Remarque : En cas d'erreur d'autorisation, veuillez attendre quelques minutes, puis réessayez d'effectuer le déploiement.
-
Une fois que vous avez redéployé la fonction, testez la connexion interne à la VM :
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?ip=$VM_INT_IP"
La fonction renvoie désormais la réponse HTML du serveur Web exécuté sur la VM :
<html><body><p>Linux startup script from a local file.</p></body></html>
Cliquez sur Vérifier ma progression pour valider l'objectif.
Créer une fonction HTTP pour se connecter à une VM
Félicitations !
Dans cet atelier, vous avez créé une instance Memorystore pour Redis et configuré l'accès au VPC sans serveur pour connecter les fonctions Cloud Run à l'instance sur votre réseau VPC. Vous avez ensuite créé une fonction basée sur des événements Pub/Sub pour vous connecter à l'instance Redis et stocker le contenu du message. Vous avez également créé une fonction HTTP pour vous connecter à l'instance Redis et récupérer les données de l'instance en fonction d'un identifiant transmis à la fonction dans la requête. Enfin, vous avez créé une VM et utilisé un connecteur d'accès au VPC sans serveur pour connecter une fonction HTTP à la VM en utilisant son adresse IP interne.
Étapes suivantes et informations supplémentaires
Pour en savoir plus sur Memorystore, consultez la documentation :
Pour en savoir plus sur l'accès au VPC sans serveur, consultez la documentation :
Copyright 2020 Google LLC Tous droits réservés. Google et le logo Google sont des marques de Google LLC. Tous les autres noms d'entreprises et de produits peuvent être des marques des entreprises auxquelles ils sont associés.