Insset GCP M1 2026M1 Informatique
Tous les projets

Groupe 1 / Distribution et scalabilité

StreamBox

Une rentrée à préparer

Votre mission

Lundi matin, l’équipe de StreamBox vous confie son infrastructure. La plateforme diffuse des vidéos pédagogiques, et une campagne doit bientôt attirer de nouveaux établissements. Lors des premières démonstrations, le catalogue répondait bien, mais les lectures simultanées ralentissaient. Le responsable produit veut une version de laboratoire, avec des preuves, avant de s’engager sur un déploiement plus large.

« Je veux que les utilisateurs trouvent une vidéo et puissent la regarder, même quand plusieurs classes se connectent en même temps. Et montrez-moi ce que ça va coûter. »

Ce dont le produit a besoin

  • Consulter un catalogue, puis lire un contenu de démonstration.
  • Distribuer les fichiers sans faire passer tous leurs octets par le code de l’API.
  • Contrôler qui peut lire quel contenu.
  • Mesurer l’effet du cache et la réaction de l’API quand le trafic varie.

Le périmètre du laboratoire

Vous réalisez le catalogue sur Cloud Run, le stockage objet, la distribution par Load Balancer et CDN, et une identité dédiée. Le transcodage, les DRM, les comptes abonnés et un vrai frontend sont hors périmètre.

Le formateur vous donnera les volumes métier quand vous les lui demanderez. Ils servent à raisonner, pas à être reproduits : les essais de charge du laboratoire ont leurs propres limites, fixées à l’étape 5.

Le cœur du module, c’est l’infrastructure

L’application sert seulement à faire passer des requêtes ou des messages. Votre travail porte sur Terraform, le réseau, IAM, le pipeline, le monitoring et la reprise. Personne ne vous demande une application métier complète, et elle ne sera pas évaluée. Le kit de démarrage est là pour vous éviter de l’écrire.

Ce qui compte en premier

Le parcours suit six étapes, et le temps passe vite. Le socle, c’est ce que vous devez pouvoir montrer quoi qu’il arrive. La version complète vient ensuite, si le temps le permet. Un socle solide et bien expliqué vaut mieux qu’une version complète vérifiée à moitié. À chaque étape, notez en quelques lignes ce que vous avez décidé et ce que vous avez mesuré.

ÉtapeSocleVersion complète
01 CadrerUne fiche d’hypothèses et trois critères de réussite validés par le formateur.Les volumes obtenus, une limite de coût et ce que vous écartez, écrits noir sur blanc.
02 ArchitectureLe schéma cible expliqué flux par flux, avec votre découpage Terraform.Trois choix d’infrastructure argumentés, avec les alternatives écartées.
03 ConstruireLe chemin nominal déployé par Terraform, avec un état distant et des identités dédiées : une requête au catalogue et la lecture d’un fichier, toutes deux par le Load Balancer.Des modules documentés, un plan sans dérive et un test négatif, c’est-à-dire un refus ou une erreur attendus.
04 AutomatiserUne CI qui s’authentifie par fédération d’identité et lance fmt, validate et plan à chaque changement.L’apply du plan relu après approbation, un test du parcours nominal et une destruction approuvée.
05 ÉprouverUn dashboard, une alerte, un essai de charge borné et une analyse argumentée de la nouvelle contrainte.Deux alertes dont la notification a bien été reçue, une expérience menée jusqu’au retour au service, et un essai borné sur la nouvelle contrainte.
06 Présenter20 minutes sur ce qui fonctionne vraiment, un ordre de grandeur des coûts et le nettoyage des ressources.Un calcul de coûts détaillé et les écarts avec une cible de production.

Avant de commencer

Avant de créer la moindre ressource, faites le point avec le formateur :

  • Le projet GCP du laboratoire. La facturation doit être active, les API et les quotas disponibles, et vous devez pouvoir créer les ressources et déléguer les permissions nécessaires.
  • La région, le préfixe de votre groupe, les labels à poser et le plafond de dépense. Une alerte de budget prévient, elle ne coupe rien.
  • Vos outils : Terraform, Git et gcloud. Si votre sujet utilise des conteneurs, il vous faut aussi de quoi construire une image et un registre pour la stocker.
  • Un dépôt Git pour le groupe et une plateforme de CI. En local, vous travaillez avec les identifiants prévus par le cours. En CI, vous préparerez une identité fédérée aux droits limités.
  • Un endroit où ranger vos preuves : schémas, captures, résultats horodatés et décisions, sans aucun secret. L’un exécute, l’autre relit, le troisième mesure, et vous changez de rôle régulièrement.

Votre jeu de démonstration

Trois entrées de catalogue et un petit fichier média de moins de 1 Mo, dont vous avez les droits. Une API JSON minimale suffit, sans lecteur vidéo élaboré. Le kit ci-dessous fournit les deux.

Avant de continuer

Vous savez dans quel projet vous travaillez, ce que vous avez le droit de créer et comment tout arrêter puis supprimer. S’il vous manque un accès, demandez-le plutôt que de le contourner avec des permissions trop larges.

Kit de démarrage

Ce kit vous évite d’écrire l’application. Il contient le code à déployer, avec une interface qui montre ce que fait votre infrastructure, et un docker compose qui imite les services GCP pour tout faire tourner sur votre machine avant le premier déploiement. Il ne contient pas de Terraform : l’écrire reste le cœur du TP.

Vous pouvez le modifier, mais il ne sera pas évalué. Lisez-le avant de l’utiliser, car vous devrez pouvoir l’expliquer comme n’importe quel code que vous n’avez pas écrit vous-même.

Une API catalogue et son interface, prêtes à tourner sur Cloud Run. L’interface montre par où passe chaque requête : le catalogue par Cloud Run, les vidéos par le Load Balancer et le CDN, avec le statut du cache. En local, nginx imite le Load Balancer, Cloud CDN et le bucket, et trois vidéos de test sont fabriquées au premier lancement.

Télécharger le kit, archive zip

RôleEn localSur GCP
Point d’entrée et routagenginx, local/edge.confApplication Load Balancer et URL map
Cachecache nginx, en-tête X-Cache-StatusCloud CDN sur le backend bucket
Vidéosdossier bucket/mediabucket Cloud Storage, objets media/...
API et interfaceconteneur catalogueCloud Run, derrière un serverless NEG

Pour l’essayer : décompressez l’archive, puis lancez docker compose up --build dans le dossier streambox et ouvrez http://localhost:8080. Le README de l’archive explique comment passer sur GCP.

docker-compose.yml, le lancement local
# StreamBox en local : docker compose up --build, puis http://localhost:8080
name: streambox-local

services:
  # Génère les vidéos de test une seule fois, dans ./bucket/media.
  medias:
    image: alpine:3.20
    command: ["sh", "/scripts/medias.sh"]
    volumes:
      - ./local/medias.sh:/scripts/medias.sh:ro
      - ./bucket:/bucket

  # Le code à déployer sur Cloud Run.
  catalogue:
    build: ./catalogue
    environment:
      APP_VERSION: local

  # Joue le rôle du Load Balancer, de Cloud CDN et du bucket.
  edge:
    image: nginx:stable-alpine
    ports:
      - "8080:80"
    volumes:
      - ./local/edge.conf:/etc/nginx/conf.d/default.conf:ro
      - ./bucket:/bucket:ro
    depends_on:
      catalogue:
        condition: service_started
      medias:
        condition: service_completed_successfully
catalogue/server.mjs, l’API catalogue
// API catalogue et interface de démonstration pour StreamBox.
// Node.js 22 ou plus récent, sans dépendance. Écoute sur $PORT (8080 par défaut).
// Sur GCP, ce service tourne sur Cloud Run derrière le Load Balancer : /api/* et la page d'accueil
// arrivent ici, /media/* part vers le backend bucket et Cloud CDN.
import http from 'node:http';
import fs from 'node:fs';
import os from 'node:os';
import { metadata, bloc, blocCloudRun, blocIdentite, enCache } from './gcp.mjs';

const here = new URL('.', import.meta.url);
const catalogue = JSON.parse(fs.readFileSync(new URL('catalogue.json', here), 'utf8'));
const version = process.env.APP_VERSION || 'dev';
const assets = {
  '/': ['index.html', 'text/html; charset=utf-8'],
  '/app.js': ['app.js', 'text/javascript; charset=utf-8'],
  '/kit.css': ['kit.css', 'text/css; charset=utf-8'],
  '/carte.js': ['carte.js', 'text/javascript; charset=utf-8'],
};

// Sur Cloud Run, K_SERVICE et K_REVISION sont fournis, et le serveur de métadonnées donne la région.
const plateforme = process.env.K_SERVICE ? 'Cloud Run' : 'local';
const region = (await metadata('instance/region'))?.split('/').pop() || 'local';
const instance = process.env.K_REVISION || os.hostname();

// La part de la carte que le serveur peut établir seul. Le navigateur ajoute ensuite ce qu'il observe
// lui-même : le passage par le Load Balancer, le routage des médias et le cache.
const deploiement = enCache(async () => ({
  plateforme,
  blocs: [
    blocCloudRun('API sur Cloud Run'),
    await blocIdentite(),
    bloc('obs', 'Logging et Monitoring', 'manuel', 'logs du Load Balancer, dashboard et alertes : invisibles depuis l’application, montrez-les dans la console'),
  ],
}));

function send(res, status, body, type = 'application/json; charset=utf-8') {
  res.writeHead(status, { 'Content-Type': type, 'Cache-Control': 'no-store' });
  res.end(type.startsWith('application/json') ? JSON.stringify(body) : body);
}

const server = http.createServer((req, res) => {
  const { pathname } = new URL(req.url, 'http://localhost');
  // Une ligne JSON par requête : Cloud Logging la lit comme un journal structuré.
  console.log(JSON.stringify({ severity: 'INFO', message: `${req.method} ${pathname}` }));

  if (req.method !== 'GET' && req.method !== 'HEAD') return send(res, 405, { erreur: 'méthode non autorisée' });
  if (pathname === '/healthz') return send(res, 200, { statut: 'ok', version });
  if (pathname === '/api/catalogue') return send(res, 200, { version, plateforme, region, instance, videos: catalogue });
  if (pathname === '/api/deploiement') return deploiement().then((carte) => send(res, 200, carte));

  const route = pathname.match(/^\/api\/catalogue\/([a-z0-9-]+)$/);
  if (route) {
    const video = catalogue.find((item) => item.id === route[1]);
    return video ? send(res, 200, video) : send(res, 404, { erreur: 'vidéo inconnue' });
  }
  if (assets[pathname]) {
    const [file, type] = assets[pathname];
    return send(res, 200, fs.readFileSync(new URL(`public/${file}`, here)), type);
  }
  if (pathname.startsWith('/media/')) {
    // Si une vidéo arrive ici, c'est que le routage vers le bucket ne s'est pas fait.
    return send(res, 404, { erreur: 'les médias ne sont pas servis par Cloud Run : passez par le Load Balancer', chemin: pathname });
  }
  send(res, 404, { erreur: 'route inconnue', chemin: pathname });
});

server.listen(Number(process.env.PORT || 8080), () => {
  console.log(JSON.stringify({ severity: 'INFO', message: `catalogue prêt sur le port ${server.address().port}, version ${version}` }));
});
process.on('SIGTERM', () => server.close(() => process.exit(0)));
local/edge.conf, le Load Balancer et le CDN imités
# Émulation locale de l'Application Load Balancer, de Cloud CDN et du bucket.
# Ce fichier ne se déploie jamais : sur GCP, ces rôles reviennent à l'URL map,
# au backend bucket avec Cloud CDN et à Cloud Storage.

proxy_cache_path /var/cache/nginx/cdn levels=1:2 keys_zone=cdn:10m max_size=200m inactive=10m use_temp_path=off;

# Le faux bucket Cloud Storage : il sert les objets tels qu'ils sont rangés dans ./bucket.
# Le débit est volontairement bridé pour que la différence avec le cache se voie.
server {
    listen 8081;
    root /bucket;
    location /media/ {
        limit_rate 256k;
        add_header Cache-Control "public, max-age=60";
    }
}

# Le point d'entrée : l'équivalent de l'URL map.
server {
    listen 80;

    # /media/* : backend bucket derrière le CDN.
    location /media/ {
        proxy_pass http://127.0.0.1:8081;
        proxy_cache cdn;
        proxy_cache_key $uri;
        proxy_cache_valid 200 60s;
        add_header X-Cache-Status $upstream_cache_status always;
    }

    # Tout le reste, API et page d'accueil : backend service vers Cloud Run.
    location / {
        proxy_pass http://catalogue:8080;
        proxy_set_header Host $host;
    }
}
README.md, le passage sur GCP
# StreamBox, kit de démarrage

Une petite API catalogue avec son interface, prête à tourner sur Cloud Run, et de quoi tout faire fonctionner sur votre machine avant de toucher à GCP. Le kit est un démonstrateur : il sert à vérifier votre infrastructure, il n’est pas évalué.

## Ce qu’il contient

```text
catalogue/            Le code à déployer sur Cloud Run
  server.mjs          API (/api/catalogue) et page d’accueil, sans dépendance
  catalogue.json      Les trois vidéos de démonstration
  public/             Interface : lecteur, chemin de l’API, chemin des médias
  Dockerfile
local/                Ce qui remplace GCP en local, jamais déployé
  edge.conf           nginx dans le rôle du Load Balancer, de Cloud CDN et du bucket
  medias.sh           Fabrique les vidéos de test avec ffmpeg
docker-compose.yml
```

## Lancer en local

Il faut Docker avec Compose. Le premier lancement télécharge les images et fabrique les vidéos, ce qui prend une minute.

```sh
docker compose up --build
```

Ouvrez ensuite http://localhost:8080. Cliquez sur « Télécharger la vidéo » plusieurs fois : le premier essai est un `MISS`, les suivants des `HIT`, et le temps chute. Les vidéos sont rangées dans `bucket/media/`, exactement comme les objets du futur bucket.

| Rôle | En local | Sur GCP |
| --- | --- | --- |
| Point d’entrée et routage | nginx, `local/edge.conf` | Application Load Balancer et URL map |
| Cache | cache nginx et en-tête `X-Cache-Status` | Cloud CDN sur le backend bucket |
| Stockage des vidéos | dossier `bucket/media` | Bucket Cloud Storage, objets `media/...` |
| API et interface | conteneur `catalogue` | Cloud Run, derrière un serverless NEG |

Le cache local n’est qu’une imitation : il montre le principe, pas le comportement exact de Cloud CDN.

## Passer sur GCP

Le code de `catalogue/` se déploie tel quel. Ce qui l’entoure, vous l’écrivez en Terraform : c’est le cœur du TP.

1. Construire et pousser l’image, puis noter son digest :

```sh
REGION=europe-west9
PROJECT_ID=votre-projet
IMAGE="$REGION-docker.pkg.dev/$PROJECT_ID/streambox/catalogue:v1"
gcloud builds submit --tag "$IMAGE" catalogue
gcloud artifacts docker images describe "$IMAGE" --format='value(image_summary.digest)'
```

2. Copier les vidéos dans le bucket, en gardant le préfixe `media/` :

```sh
gcloud storage cp bucket/media/*.mp4 gs://VOTRE_BUCKET/media/
```

3. Dans votre URL map, `/media/*` va vers le backend bucket. L’API et la page d’accueil vont vers le backend du catalogue : faites-en la route par défaut, ou servez la page autrement et justifiez ce choix.

4. Pour que l’interface affiche le statut du cache comme en local, ajoutez au backend bucket l’en-tête de réponse personnalisé `X-Cache-Status: {cdn_cache_status}`. Sans lui, la page se rabat sur l’en-tête `Age`.

Ouvert directement par son URL `run.app`, le service affiche le catalogue mais pas les vidéos : c’est normal, elles ne passent pas par Cloud Run.

## Variables

| Variable | Rôle |
| --- | --- |
| `PORT` | Port d’écoute, fourni par Cloud Run (8080 par défaut). |
| `APP_VERSION` | Version affichée dans l’interface, pratique pour prouver quelle révision répond. |

## La carte du déploiement

En haut de l’interface, l’architecture cible est dessinée bloc par bloc. Chaque bloc s’allume selon ce que l’application constate elle-même, avec la preuve affichée dessous :

| Couleur | Sens |
| --- | --- |
| vert, « prouvé » | l’application l’a vérifié elle-même |
| orange, « à revoir » | ça fonctionne, mais c’est un anti-pattern connu |
| rouge, « en échec » | l’application a essayé et ça ne marche pas |
| pointillés, « pas encore détecté » | rien de visible pour l’instant |
| gris, « à prouver vous-même » | invisible depuis l’application : montrez-le dans la console |
| violet, « simulé en local » | l’équivalent local, en attendant le déploiement |

La carte constate, elle ne note pas : un bloc vert ne dit pas que votre choix est le bon, seulement qu’il est en place.

Pour StreamBox, le serveur vérifie Cloud Run et son identité ; le navigateur vérifie le passage par le Load Balancer, la route des médias, le cache et l’origine Cloud Storage. Aucun droit supplémentaire n’est nécessaire.

01 Cadrer

Comprendre la demande

Laissez Terraform de côté pour l’instant. Partez du message du responsable et traduisez-le en un parcours utilisateur et en critères de réussite que l’on peut observer.

À faire

  • Choisissez dans la liste ci-dessous les trois questions qui vous semblent prioritaires et posez-les au formateur. Les autres pourront venir ensuite.
  • Séparez ce qui est confirmé, ce que vous supposez pour l’instant et ce qui reste à décider.
  • Fixez un minimum démontrable, une limite de coût et ce que vous laissez de côté dans la première version.

Les questions à poser

  • Combien de vidéos, et de quelle taille en moyenne ?
  • Combien de spectateurs en même temps ?
  • Les contenus sont-ils publics ou réservés aux abonnés ?
  • Où se trouvent les utilisateurs ?
  • Quel niveau de disponibilité attend-on ?
  • Quel budget mensuel ?
Modèle de fiche de cadrage
Besoin ou questionRéponse ou hypothèsePreuve prévue
À compléterQui l’a confirmée ?Comment la vérifier ?
Avant de continuer

Montrez au formateur une fiche courte avec vos hypothèses et trois critères de réussite. Il valide le périmètre et le plafond de charge avant la suite.

02 Architecture

Comprendre l’architecture cible

Cette architecture est votre point de départ. Votre travail consiste à la déployer avec Terraform, à la sécuriser, à l’automatiser et à vérifier qu’elle se comporte comme prévu.

Il y a deux chemins bien séparés. Le catalogue passe par Cloud Run, tandis que les fichiers lourds sont servis par un backend bucket derrière le CDN. Documentez ce qui peut être mis en cache, avec quel TTL, et comment les contenus privés sont protégés. Le schéma ne fixe ni budget ni capacité.

flowchart TB
 U["Spectateur"] --> LB["Application Load Balancer externe
URL map"]
 LB -->|"/api/*"| NEG["Serverless NEG"]
 NEG --> RUN["Cloud Run
API catalogue"]
 LB -->|"/media/*"| CDN["Cloud CDN
backend bucket"]
 CDN -->|"cache miss"| GCS["Cloud Storage
objets vidéo"]
 SA["Identité de l’API
moindre privilège"] -.-> RUN
 LB -.-> OBS["Logging et Monitoring"]
 RUN -.-> OBS

Sur un petit écran, faites défiler le schéma horizontalement.

Voir et copier le code Mermaid
flowchart TB
 U["Spectateur"] --> LB["Application Load Balancer externe
URL map"]
 LB -->|"/api/*"| NEG["Serverless NEG"]
 NEG --> RUN["Cloud Run
API catalogue"]
 LB -->|"/media/*"| CDN["Cloud CDN
backend bucket"]
 CDN -->|"cache miss"| GCS["Cloud Storage
objets vidéo"]
 SA["Identité de l’API
moindre privilège"] -.-> RUN
 LB -.-> OBS["Logging et Monitoring"]
 RUN -.-> OBS

Comment ça circule

Le spectateur consulte le catalogue

Une requête destinée à l’API est routée vers Cloud Run, qui renvoie la liste des vidéos disponibles.

Le navigateur demande un fichier

Le chemin des médias mène au backend statique. Les fichiers sources restent dans Cloud Storage.

Le cache répond, ou pas

Si Cloud CDN a une réponse valide en cache, il la sert directement. Sinon, il va la chercher à l’origine et la garde si elle peut être mise en cache.

Vous observez le pic

Expliquez quelles requêtes atteignent encore l’origine, comment évolue la latence et quels volumes sortants sont facturés.

À retenir

Le CDN réduit les accès à l’origine, il ne rend pas les transferts gratuits. Distinguez le stockage, le remplissage du cache et la distribution vers les utilisateurs.

Approfondir dans la documentation Google Cloud

À faire à partir du schéma

  • Suivez une requête ou un événement de bout en bout et expliquez le rôle de chaque service GCP.
  • Listez les ressources Terraform nécessaires, leurs dépendances et ce que chaque module expose aux autres.
  • Repérez ce qui reste à décider : région et zones, exposition réseau, identités et permissions, dimensionnement, seuils et politique de reprise.
  • Annotez trois choix d’infrastructure avec leurs compromis. Gardez un schéma fidèle à ce que vous déployez réellement.
Avant de continuer

Présentez au formateur votre découpage Terraform, les flux autorisés et les paramètres retenus. On parle ici d’infrastructure : concevoir une application métier n’est pas l’objet du TP.

03 Construire

Construire le premier parcours

Avancez par petits pas : vous déployez, vous vérifiez, puis vous ajoutez la dépendance suivante. Les ressources finales sont décrites dans Terraform. La console reste utile pour observer et diagnostiquer.

À faire

  1. Créez un bucket avec votre objet de test et des accès conformes au périmètre retenu.
  2. Déployez l’API catalogue sur Cloud Run, avec une image versionnée, un compte de service dédié et une capacité plafonnée.
  3. Assemblez le point d’entrée, le routage entre API et médias et le backend de distribution. Vérifiez chaque chemin séparément.
  4. Activez le cache et ses logs. Expliquez quels accès directs restent possibles et ce que cela implique.

À montrer

Une requête au catalogue, la lecture du fichier par le point d’entrée prévu, et un extrait de logs qui distingue une lecture servie par l’origine d’une lecture servie par le cache.

À expliquer

Si l’API tombe, un fichier déjà en cache peut-il encore être servi ? Quelle partie de vos preuves permet de répondre ?

Besoin d’un indice ?

Indice 1, une piste

Commencez par un seul objet et une seule route d’API. Une réponse rapide ne prouve pas qu’elle vient du cache.

Indice 2, où chercher

Comportement du cache Cloud CDN

Les ressources du provider sont ensuite listées dans la rubrique Documentation Terraform.

Indice 3, un coup de pouce

Dans le provider, cherchez storage_bucket, compute_backend_bucket, compute_url_map et cloud_run_v2_service. Dessinez ensuite les ressources de liaison qui manquent, avant de les coder.

Organiser Terraform

Découpez vos modules par responsabilité. Écrivez d’abord leurs entrées, leurs sorties et leurs dépendances : le module racine se contente de les assembler. Chaque module a une courte documentation. Inutile en revanche de créer un module par ressource.

Un découpage à discuter, une fois votre propre proposition faite

Chaque module contient main.tf, variables.tf, outputs.tf et un court README. Le module racine relie les sorties des uns aux entrées des autres. Ce découpage est une proposition : à vous de le défendre ou de l’améliorer.

ModuleResponsabilitéEntrées principalesSorties utiles
mediaLe bucket, l’accès aux objets, le cycle de vie et la configuration du cache.project_id, location, labels, politique d’accèsbucket_name, backend_bucket_id
catalogueCloud Run, son compte de service dédié et ses limites de montée en charge.image_digest, region, max_instances, droits requisservice_name, service_uri, service_account_email (le NEG est créé par delivery)
deliveryLe Load Balancer, le routage entre médias et API, le CDN et l’exposition.backend_bucket_id, service_name, region, cache_policyip_address, url_map_id
observabilityLe dashboard, les alertes et les destinataires des notifications.identifiants du LB et de Cloud Run, seuils, canauxdashboard_id, alert_policy_ids

Une organisation de dépôt possible :

infra/
  bootstrap/          # backend GCS et accès CI, cycle séparé
  envs/
    lab/              # module racine déployé, backend et variables
    prod-design/      # variante documentée, sans déploiement imposé
  modules/
    media/
    catalogue/
    delivery/
    observability/
app/                  # le kit de démarrage, si vous l’utilisez
tests/
  smoke/              # vérification du chemin nominal
  load/               # scripts et jeux synthétiques
docs/
  architecture.mmd
  decisions/          # décisions et alternatives (ADR)
  runbooks/           # diagnostic et reprise
  evidence/           # résultats, sans secret
README.md

État, environnements et bootstrap

L’état Terraform vit dans un bucket GCS créé par un bootstrap séparé, lancé avant le laboratoire et qui n’en dépend pas. Activez le versioning de ce bucket et limitez qui peut y accéder. Le backend GCS gère le verrouillage, et un préfixe par environnement évite de mélanger les états.

Ne commitez ni l’état, ni les plans, ni les clés, ni les valeurs de secrets. Attention, sensitive = true masque une valeur à l’affichage mais ne la retire pas du state. Gardez plutôt un fichier d’exemple avec les variables non sensibles. Voir la documentation des modules Terraform.

Avant de continuer

Le chemin nominal fonctionne. terraform fmt -check et terraform validate passent, et un nouveau plan ne propose rien d’inattendu. Un autre membre du groupe sait expliquer les dépendances.

04 Automatiser

Rendre le déploiement reproductible

Un collègue doit pouvoir relire puis déployer un changement sans refaire vos manipulations dans la console.

À faire

  • À chaque changement, la CI vérifie le format, initialise sans backend et lance validate. Les versions sont figées et le fichier de verrouillage est commité.
  • La CI s’authentifie par fédération d’identité, limitée à votre dépôt et aux branches ou environnements autorisés. Aucune clé JSON durable dans Git.
  • Le plan est produit sur une branche de confiance, relu, puis appliqué tel quel après une approbation explicite. Un seul déploiement à la fois par environnement.
  • Un test du parcours nominal suit l’apply. Si quelque chose échoue, le pipeline s’arrête là.
  • La destruction est un job manuel et approuvé, suivi d’un inventaire des ressources restantes. Le bootstrap garde son propre cycle.

À montrer

Un petit changement suivi de son commit jusqu’au test final, et une erreur de validation volontaire arrêtée avant tout apply. Les plans sont des artefacts privés, conservés peu de temps.

Besoin d’un indice ?

Indice 1, une piste

Dessinez les jobs et demandez-vous quelle identité exécute chacun d’eux. Qu’est-ce qui prouve que le plan appliqué est bien celui qui a été relu ?

Indice 2, où chercher

La page du backend GCS et celle sur la fédération d’identité pour les pipelines.

Indice 3, un coup de pouce

Séparez quatre temps : une validation sans accès au cloud, un plan authentifié, une approbation, puis l’apply. Rattachez le plan au commit et à l’environnement. Si le code, les variables ou l’état changent, le plan doit être recalculé et relu à nouveau.

Avant de continuer

Montrez une exécution de la CI avec son test final. Une procédure manuelle documentée aide au diagnostic, mais elle ne remplace pas cette preuve d’automatisation.

05 Éprouver

Observer, tester, expliquer

Annoncez votre hypothèse avant chaque test. Un graphique doit répondre à une question précise : avoir un dashboard ne prouve pas, à lui seul, que le système est fiable.

Préparer les mesures

La latence et les erreurs du catalogue, le statut hit ou miss du cache, le trafic qui atteint l’origine et le volume distribué.

Déployez avec Terraform un dashboard et deux alertes utiles. Pour chacune, précisez la métrique, le filtre, la fenêtre, le seuil, le destinataire et la première action de diagnostic. Vérifiez que la notification arrive bien, puis qu’elle se referme quand tout revient à la normale.

Des signaux à adapter
SignalOù le trouverDécision ou exemple de seuil
Latence p95 et taux de 5xxLoad Balancer et Cloud RunExemple pour le labo : plus de 1 % de 5xx sur 5 minutes, avec au moins 100 requêtes. Regardez les logs avant d’agir.
Taux de cache et octets sortantsLogs du Load Balancer et du CDNComparez à la référence, à charge égale, et reliez toute dégradation aux accès à l’origine.
Instances et requêtes de l’APICloud RunRepérez une limite de capacité ou un plafond max_instances atteint.

L’essai de charge du laboratoire

Mesurez d’abord 1 utilisateur virtuel pendant 2 minutes, puis enchaînez 1, 5 et 10 utilisateurs, sur 5 minutes au total au maximum. Utilisez le petit fichier de test et séparez les résultats de l’API de ceux des médias.

Avant de lancer quoi que ce soit, fixez la cible autorisée, le plafond de ressources, la durée, le volume et la règle d’arrêt. Arrêtez si le coût dérape ou si la dégradation persiste. Un exemple de seuil à faire valider : plus de 5 % d’erreurs pendant 30 secondes.

Une expérience pour vous entraîner

Sur un seul objet de test, comparez deux politiques de cache. Revenez ensuite à la configuration de départ et vérifiez dans les logs que le comportement initial est bien retrouvé.

Écrivez la procédure de retour avant de commencer et ne changez qu’un paramètre à la fois. Si vous modifiez quelque chose à la main pour diagnostiquer, remettez ensuite Terraform en accord avec l’état voulu.

À montrer

Deux courbes, l’une pour l’API et l’autre pour les médias, la preuve du comportement du cache et un calcul du volume transféré. Gardez en tête qu’une faible charge ne prouve pas qu’un pic de production tiendrait.

Trame du compte rendu
  • L’hypothèse et le résultat attendu.
  • Le périmètre, la charge, l’heure de début et l’heure de fin.
  • Ce que vous avez observé avant, pendant et après, et l’impact sur le parcours utilisateur.
  • Les pistes de diagnostic, les vérifications faites et la cause retenue.
  • La correction, la preuve du retour au service et les limites de votre conclusion.
Une nouvelle contrainte

En cours de route, le formateur vous annoncera un événement supplémentaire. Vous devrez en expliquer l’impact et proposer une réponse. Selon le temps et le budget, cette réponse pourra mêler une expérience bornée et une évolution d’architecture argumentée.

Avant de continuer

Votre compte rendu sépare ce qui a été mesuré, ce qui reste une hypothèse et ce qui demanderait un test plus large. Chaque membre sait lire les courbes.

06 Présenter

Présenter ce que vous avez réalisé

Chaque groupe dispose de 20 minutes de présentation technique, démonstration comprise. Les trois membres prennent la parole. Montrez la solution telle qu’elle est, avec ses résultats et ses limites, et gardez des traces de secours au cas où la démonstration en direct échouerait.

SéquenceDuréeÀ montrer
Besoin et périmètre2 minLes hypothèses, les objectifs et le minimum réellement livré.
Architecture réalisée4 minLe schéma, les flux, la sécurité, vos choix et les alternatives écartées.
Terraform et pipeline4 minLes modules et leurs interfaces, l’état distant et la trace d’un déploiement par la CI.
Démonstration et résultats6 minLe chemin nominal, l’essai de charge, l’incident, le monitoring et la reprise. Prévoyez des captures au cas où la démonstration échouerait.
Coûts et limites3 minLes coûts estimés, les écarts avec la production, ce qui n’est pas fait et la suite.
Conclusion1 minLe bilan technique et ce que le groupe retient.

Ce que votre support doit référencer

  • Le dépôt, son README de déploiement et de destruction, le contrat de chaque module et une trace du pipeline.
  • Le schéma réellement déployé et trois décisions argumentées.
  • Les résultats de charge, le compte rendu d’incident, les alertes et le runbook.
  • Une estimation des principaux coûts, ce qui n’a pas été réalisé et l’écart avec une cible de production.

Après la présentation

À la date convenue avec le formateur, détruisez les ressources du laboratoire, vérifiez ce qui reste et signalez ce que vous gardez volontairement. Tenir le budget et nettoyer font partie du travail.

Avant la présentation

Répétez avec un chronomètre. Chaque membre doit pouvoir expliquer un flux, une permission, une panne et une limite sans se contenter de lire les diapositives.

Où en êtes-vous ?

Socle

Version complète

Ces cases sont enregistrées dans votre navigateur uniquement. Le formateur ne les voit pas.

Si vous êtes en avance

Choisissez une seule extension, une fois le parcours principal terminé et son coût validé. Ajouter des services ne remplace pas des preuves de qualité.

  • Concevoir puis tester un accès signé à un contenu privé.
  • Comparer deux politiques de cache avec le même protocole.
  • Décrire une variante de distribution géographique et son coût.

Documentation Terraform

Ouvrez ces aides quand vous en avez besoin. Le rôle de chaque service est indiqué, mais leur assemblage, leurs paramètres et leurs permissions restent à concevoir.

Ressources Terraform utiles

Cette liste est un point de départ et votre architecture demandera d’autres ressources. Chaque lien ouvre la page du provider Google, avec ses arguments et ses exemples.

RessourceRôleConseil
google_storage_bucketStocker les fichiers de démonstration.Commencez avec un petit fichier. Choisissez explicitement la région, les règles d’accès et de suppression.
google_compute_backend_bucketRelier le bucket au Load Balancer et activer le CDN.Vérifiez les en-têtes de cache avant de chercher à augmenter la charge.
google_compute_url_mapSéparer les chemins des médias et de l’API.Testez chaque chemin isolément. Le chemin reçu par le backend doit correspondre à celui du fichier ou de la route d’API.
google_compute_region_network_endpoint_groupRaccorder Cloud Run au Load Balancer par un serverless NEG.Indiquez la région et le nom du service Cloud Run. Ce backend ne se configure pas comme un groupe de VM.
google_cloud_run_v2_serviceDéployer la petite API de catalogue.Utilisez une image identifiée et un compte de service dédié. Ce backend ne transporte pas la vidéo.
google_compute_global_forwarding_ruleExposer le point d’entrée du Load Balancer.La chaîne comprend aussi une IP et un proxy HTTP ou HTTPS. Suivez l’exemple complet du provider.
Ressources communes et configuration du provider

google_project_service active les API nécessaires, et google_service_account crée une identité dédiée. Donnez à chaque identité les permissions dont elle a besoin, au bon niveau, plutôt qu’un rôle Owner ou Editor sur tout le projet.

Pour l’observabilité, il vous faudra un dashboard, une politique d’alerte et un canal de notification. Vérifiez que la notification arrive réellement.

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "8.6.0"
    }
  }
}

provider "google" {
  project = var.project_id
  region  = var.region
}

Cette version est un exemple, vérifié lors de la préparation du support. Contrôlez la dernière version publiée avant le TP. Déclarez vos variables et commitez .terraform.lock.hcl. Si votre projet utilise déjà une autre version, n’en changez pas sans relire le plan et les notes de migration. En local, utilisez ADC ; en CI, une identité fédérée. Jamais de clé JSON dans le code.

Documentation du provider Google

Critères d’évaluation

L’évaluation porte sur ce que le groupe a réalisé, sur ses résultats et sur la façon dont il les explique. Il n’y a pas de barème chiffré.

CritèreCe qui doit être observable
Cadrage et architectureDes hypothèses explicites, des flux lisibles, des alternatives et des compromis documentés.
Modules et reproductibilitéDes responsabilités cohérentes, des interfaces claires, un état distant, des versions figées et un redéploiement documenté.
Pipeline TerraformUne validation automatique, un plan relu puis appliqué tel quel, et des identités CI limitées.
Réseau, IAM et secretsDes expositions justifiées, le moindre privilège, aucun secret dans Git et un state protégé.
Charge et résilienceUn protocole reproductible, des mesures avant et après, un incident analysé et un retour au service démontré.
ObservabilitéUn dashboard utile, des seuils justifiés, une notification vérifiée et une procédure de diagnostic.
Coût et périmètreDes ordres de grandeur, les limites du laboratoire, la destruction et le contrôle des ressources restantes.
Présentation et défense collectiveLe groupe tient ses 20 minutes et montre ce qui fonctionne vraiment, avec ses limites. Chaque membre explique les choix, y compris le code proposé par un LLM.