1. Introduction
Présentation
Pour sécuriser le trafic réseau de leurs services et applications, de nombreuses organisations utilisent un réseau Virtual Private Cloud (VPC) sur Google Cloud doté de contrôles de périmètre pour empêcher l'exfiltration de données. Un réseau VPC est une version virtuelle d'un réseau physique, mise en œuvre au sein du réseau de production de Google. Un réseau VPC fournit une connectivité pour vos instances de machines virtuelles (VM) Compute Engine, propose des équilibreurs de charge réseau passthrough internes natifs et des systèmes de proxy pour les équilibreurs de charge d'application internes, se connecte aux réseaux sur site à l'aide de tunnels Cloud VPN et de rattachements de VLAN pour Cloud Interconnect, et distribue le trafic provenant des équilibreurs de charge externes Google Cloud vers les backends.
Contrairement aux VM, les services Cloud Run ne sont associés à aucun réseau VPC particulier par défaut. Cet atelier de programmation explique comment modifier les paramètres d'entrée (connexions entrantes) afin que seul le trafic provenant d'un VPC puisse accéder à un service Cloud Run (par exemple, un service de backend). De plus, cet atelier de programmation vous montre comment faire en sorte qu'un deuxième service (par exemple, un service de frontend) accède au service Cloud Run de backend via un VPC.
Dans cet exemple, le service Cloud Run de backend renvoie "Hello World". Le service Cloud Run de l'interface fournit un champ de saisie pour collecter une URL. Le service de frontend envoie ensuite une requête GET à cette URL (par exemple, le service de backend), ce qui en fait une requête de service à service (au lieu d'une requête de navigateur à service). Lorsque le service frontend parvient à accéder au backend, le message "Hello world" s'affiche dans le navigateur.
Points abordés
- Autoriser uniquement le trafic provenant d'un VPC vers votre service Cloud Run
- Configurer la sortie sur un service Cloud Run pour communiquer avec un service Cloud Run interne uniquement
2. Préparation
Prérequis
- Vous êtes connecté à la console Cloud.
- Vous avez déjà déployé un service Cloud Run. Par exemple, vous pouvez suivre le guide de démarrage rapide pour déployer un service Web à partir du code source pour commencer.
Activer Cloud Shell
- Dans Cloud Console, cliquez sur Activer Cloud Shell
.

Si vous démarrez Cloud Shell pour la première fois, un écran intermédiaire s'affiche pour vous expliquer de quoi il s'agit. Si cet écran s'est affiché, cliquez sur Continuer.

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

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 réaliser une grande partie, voire la totalité, des activités de cet atelier de programmation dans un navigateur.
Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est défini sur votre ID de projet.
- Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
Résultat de la commande
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet :
gcloud config list project
Résultat de la commande
[core] project = <PROJECT_ID>
Si vous obtenez un résultat différent, exécutez cette commande :
gcloud config set project <PROJECT_ID>
Résultat de la commande
Updated property [core/project].
3. Créer les services Cloud Run
Configurer des variables d'environnement
Vous pouvez définir des variables d'environnement qui seront utilisées tout au long de cet atelier de programmation.
REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend BACKEND=backend
Créer le service Cloud Run de backend
Commencez par créer un répertoire pour le code source et accédez-y.
mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-codelab/backend
Créez ensuite un fichier package.json avec le contenu suivant :
{
"name": "backend-service",
"version": "1.0.0",
"description": "",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.1"
}
}
Créez ensuite un fichier source index.js avec le contenu ci-dessous. Ce fichier contient le point d'entrée du service et la logique principale de l'application.
const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: true }));
app.get('/', function (req, res) {
res.send("hello world");
});
const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
console.log(`helloworld: listening on port ${port}`);
});
Enfin, déployez le service Cloud Run en exécutant la commande suivante.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
Créer le service Cloud Run de frontend
Accédez au répertoire de l'interface.
cd ../frontend
Créez ensuite un fichier package.json avec le contenu suivant :
{
"name": "frontend",
"version": "1.0.0",
"description": "",
"scripts": {
"start": "node index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^1.6.6",
"express": "^4.18.2"
}
}
Créez ensuite un fichier source index.js avec le contenu ci-dessous. Ce fichier contient le point d'entrée du service et la logique principale de l'application.
const express = require("express");
const app = express();
const port = 8080;
const path = require('path');
const axios = require('axios');
// serve static content (index.html) using
// built-in middleware function in Express
app.use(express.static('public'));
app.use(express.urlencoded({ extended: true }));
// this endpoint receives a URL in the post body
// and then makes a get request to that URL
// results are sent back to the caller
app.post('/callService', async (req, res) => {
const url = req.body.url;
let message = "";
try {
console.log("url: ", url);
const response = await axios.get(url);
message = response.data;
} catch (error) {
message = error.message;
console.error(error.message);
}
res.send(`
${message}
<p>
</p>
`);
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
Créer un répertoire public pour le fichier index.html
mkdir public touch public/index.html
Mettez à jour le fichier index.html pour qu'il contienne les éléments suivants :
<html>
<script
src="https://unpkg.com/htmx.org@1.9.10"
integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC"
crossorigin="anonymous"
></script>
<body>
<div style="margin-top: 100px; margin-left: 100px">
<h1>I'm the Frontend service on the Internet</h1>
<form hx-trigger="submit" hx-post="/callService" hx-target="#message">
<label for="url"> URL:</label>
<input
style="width: 308px"
type="text"
id="url"
name="url"
placeholder="The backend service URL"
required
/>
<button hx-indicator="#loading" type="submit">Submit</button>
<p></p>
<span class="htmx-indicator" id="loading"> Loading... </span>
<div id="message" style="white-space: pre-wrap"></div>
<p></p>
</form>
</div>
</body>
</html>
Enfin, déployez le service Cloud Run en exécutant la commande suivante.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
Appeler le service de backend
Vérifiez que vous avez bien déployé deux services Cloud Run.
Ouvrez l'URL du service de frontend dans votre navigateur Web.
Dans la zone de texte, saisissez l'URL du service de backend. Notez que cette requête est acheminée de l'instance Cloud Run de frontend vers le service Cloud Run de backend, au lieu d'être acheminée depuis votre navigateur.
Le message "hello world" s'affiche.
4. Définir le service de backend pour l'entrée interne uniquement
Exécutez la commande gcloud suivante pour autoriser uniquement le trafic provenant de votre réseau VPC à accéder à votre service de backend.
gcloud run services update $BACKEND --ingress internal --region $REGION
Pour vérifier que votre service de backend ne peut recevoir du trafic que depuis votre VPC, essayez à nouveau d'appeler votre service de backend depuis votre service de frontend.
Cette fois, le message "Request failed with status code 404" (Échec de la requête avec le code d'état 404) s'affiche.
Cette erreur s'affiche, car la requête sortante (c'est-à-dire la sortie) du service Cloud Run de l'interface utilisateur est d'abord envoyée sur Internet. Google Cloud ne connaît donc pas l'origine de la requête.
Dans la section suivante, vous allez configurer le service frontend pour accéder au VPC. Google Cloud saura ainsi que la requête provient du VPC, qui est reconnu comme une source interne.
5. Configurer le service frontend pour accéder au VPC
Dans cette section, vous allez configurer votre service Cloud Run de frontend pour qu'il communique avec votre service de backend via un VPC.
Pour ce faire, vous devrez ajouter une sortie VPC directe à vos instances Cloud Run de frontend afin de fournir à votre service une adresse IP interne à utiliser dans le VPC. Vous configurerez ensuite la sortie de sorte que toutes les connexions sortantes du service d'interface soient dirigées vers le VPC.
Commencez par exécuter cette commande pour activer la sortie VPC directe :
gcloud beta run services update $FRONTEND \ --network=default \ --subnet=default \ --vpc-egress=all-traffic \ --region=$REGION
Vous pouvez maintenant vérifier que votre service de frontend a accès au VPC :
gcloud beta run services describe $FRONTEND \ --region=$REGION
Le résultat doit ressembler à ce qui suit :
VPC access:
Network: default
Subnet: default
Egress: all-traffic
Réessayez maintenant d'appeler votre service de backend depuis votre service d'interface.
Cette fois, vous verrez "hello world".
Remarque : Votre service d'interface n'aura pas accès à Internet, car tout le trafic sortant a été acheminé vers le VPC. Par exemple, votre service de frontend expirera s'il tente d'accéder à https://curlmyip.org/.
6. Félicitations !
Bravo ! Vous avez terminé cet atelier de programmation.
Nous vous recommandons de consulter la documentation Cloud Run et d'apprendre à configurer la mise en réseau privée pour les services Cloud Run.
Points abordés
- Autoriser uniquement le trafic provenant d'un VPC vers votre service Cloud Run
- Configurer la sortie sur un service Cloud Run pour communiquer avec un service Cloud Run interne uniquement
7. Effectuer un nettoyage
Pour éviter des frais involontaires (par exemple, si les services Cloud Run sont invoqués par inadvertance plus de fois que votre quota mensuel d'invocations Cloud Run dans le niveau sans frais), vous pouvez supprimer Cloud Run ou le projet que vous avez créé à l'étape 2.
Pour supprimer le service Cloud Run, accédez à la console Cloud Run à l'adresse https://console.cloud.google.com/run, puis supprimez les services $FRONTEND et $BACKEND.
Si vous choisissez de supprimer l'intégralité du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis choisir "Supprimer". Si vous supprimez le projet, vous devrez changer de projet dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.