Aller au contenu

Lab : Signalements en production sur Scaleway

200 Pratiquer ⏱ 5 h cloudscalewaypostgresql

Prérequis

Testé avec scaleway-cli 2.62.0 , vérifié le 5 octobre 2026

Ce lab rassemble le cours Scaleway en pratique. Vous partez de l'architecture du lab du cours précédent et vous la faites passer au niveau de production avec les services managés vus dans les leçons, puis un script interroge l'API pour vérifier les propriétés attendues. Il valide le niveau 200 des compétences « Fondamentaux du cloud », « Gestion des secrets », « Métriques et alerting » et « Sauvegarde et reprise d'activité ».

Comptez une journée, et un budget de quelques dizaines d'euros si tout tourne quelques heures : un réplica en lecture et un répartiteur de charge sont facturés à l'heure. Supprimez tout à la fin.

Note

Le script de vérification a été écrit à partir de l'aide de la CLI scw 2.62 et des structures de réponse du SDK Go de Scaleway. Il ne fait que des lectures (list, get).

Les exigences

ExigenceLeçon
Deux projets, signalements-preprod et signalements-prod ; la production vit dans le second1
La base sig-db de production a des sauvegardes automatiques actives conservées au moins 14 jours, au moins un réplica en lecture, le chiffrement au repos activé, et aucun point d'accès public3, 15
Les identifiants de la base sont dans Secret Manager : secret db sous le chemin /signalements/prod, de type database_credentials, protégé contre la suppression, chiffré avec une clé de Key Manager8
Un espace de noms de registre privé existe dans le projet de production7
La préproduction tourne sur Serverless Containers, avec un minimum de zéro instance5
Le répartiteur lb-signalements redirige HTTP vers HTTPS par une ACL12
Le domaine d'envoi des notifications est vérifié dans Transactional Email (statut checked)10
Le gestionnaire d'alertes de Cockpit et les alertes préconfigurées sont activés dans le projet de production14

Pistes

  • Créez les deux projets, puis déplacez ou recréez les ressources de production dans signalements-prod (leçon 1). Gardez les identifiants des deux projets dans des variables PREPROD et PROD.
  • Le chiffrement au repos de la base ne se désactive plus une fois activé, et copie les données dans un nouveau volume : activez-le sur une base vide ou en dehors des heures d'usage (leçon 3).
  • Le mot de passe de l'utilisateur applicatif ne doit apparaître ni dans l'historique du shell ni dans une sortie JSON passée à jq : relisez les encadrés des leçons 3 et 8.
  • Un domaine Transactional Email met un moment à passer en checked : les enregistrements SPF, DKIM et MX doivent être publiés et propagés (leçon 10).

Vérifier

Enregistrez le script sous verifier-lab.sh et lancez-le avec votre profil scw habituel.

#!/usr/bin/env bash
# Vérifie les propriétés attendues du lab « Signalements en production sur Scaleway ».
# Usage : ./verifier-lab.sh   (exige scw et jq)
# Chaque contrôle affiche OK ou ÉCHEC ; le code de sortie est le nombre d'échecs.
set -uo pipefail
echecs=0

controle() {   # controle "libellé" commande...
  local libelle=$1; shift
  if "$@" > /dev/null 2>&1; then
    echo "OK     $libelle"
  else
    echo "ÉCHEC  $libelle"
    echecs=$((echecs + 1))
  fi
}

projet() {   # projet nom : affiche l'identifiant du projet de ce nom exact
  scw account project list -o json | jq -r --arg n "$1" '.[] | select(.name == $n) | .id'
}

PREPROD=$(projet signalements-preprod)
PROD=$(projet signalements-prod)
controle "le projet signalements-preprod existe" test -n "$PREPROD"
controle "le projet signalements-prod existe" test -n "$PROD"

db=$(scw rdb instance list project-id="$PROD" region=fr-par -o json \
  | jq -c '[.[] | select(.name == "sig-db")][0] // empty')
controle "sig-db existe dans le projet de production" test -n "$db"
controle "sig-db : sauvegardes automatiques actives, conservées 14 jours ou plus" \
  bash -c 'jq -e ".backup_schedule.disabled == false and .backup_schedule.retention >= 14" <<< "$1"' _ "$db"
controle "sig-db : au moins un réplica en lecture" \
  bash -c 'jq -e "(.read_replicas // []) | length >= 1" <<< "$1"' _ "$db"
controle "sig-db : chiffrement au repos activé" \
  bash -c 'jq -e ".encryption.enabled == true" <<< "$1"' _ "$db"
controle "sig-db : aucun point d'accès public" \
  bash -c 'jq -e "[.endpoints[] | select(.load_balancer != null)] | length == 0" <<< "$1"' _ "$db"

secret=$(scw secret secret list project-id="$PROD" path=/signalements/prod name=db region=fr-par -o json \
  | jq -c '.[0] // empty')
controle "le secret /signalements/prod/db existe" test -n "$secret"
controle "le secret est de type database_credentials, protégé, avec au moins une version" \
  bash -c 'jq -e ".type == \"database_credentials\" and .protected == true and .version_count >= 1" <<< "$1"' _ "$secret"
controle "le secret est chiffré avec une clé de Key Manager" \
  bash -c 'jq -e ".key_id != null and .key_id != \"\"" <<< "$1"' _ "$secret"

controle "un espace de noms de registre privé existe en production" \
  bash -c 'scw registry namespace list project-id="$1" region=fr-par -o json | jq -e "length > 0 and all(.is_public == false)"' _ "$PROD"

controle "la préproduction a un conteneur serverless qui descend à zéro" \
  bash -c 'scw container container list project-id="$1" region=fr-par -o json | jq -e "any(.min_scale == 0)"' _ "$PREPROD"

lb=$(scw lb lb list project-id="$PROD" zone=fr-par-1 -o json \
  | jq -r '.[] | select(.name == "lb-signalements") | .id')
controle "lb-signalements existe en production" test -n "$lb"
controle "une ACL du répartiteur redirige vers HTTPS" \
  bash -c 'for fe in $(scw lb frontend list lb-id="$1" zone=fr-par-1 -o json | jq -r ".[].id"); do
             scw lb acl list frontend-id="$fe" zone=fr-par-1 -o json
           done | jq -s -e "add // [] | any(.action.type == \"redirect\")"' _ "$lb"

controle "un domaine Transactional Email est vérifié" \
  bash -c 'scw tem domain list project-id="$1" region=fr-par -o json | jq -e "any(.status == \"checked\")"' _ "$PROD"

controle "Cockpit : gestionnaire d'alertes et alertes préconfigurées activés" \
  bash -c 'scw cockpit alert-manager get project-id="$1" region=fr-par -o json | jq -e ".alert_manager_enabled == true and .managed_alerts_enabled == true"' _ "$PROD"

echo
echo "$echecs échec(s)"
exit "$echecs"

Quelques contrôles demandent une explication :

  • Les noms filtrés avec jq et non avec l'argument name= des commandes list : selon le produit, ce filtre cherche une sous-chaîne ou un nom exact, et le script ne veut pas dépendre de la différence.
  • Le chiffrement du secret se lit dans le champ key_id : vide, le secret est chiffré par une clé gérée par Scaleway ; renseigné, par votre clé de Key Manager.
  • Les ACL se lisent frontend par frontend, d'où la boucle ; jq -s rassemble les listes avant de chercher une action redirect.

Démonter

Supprimez dans l'ordre des dépendances (leçon 8 du cours précédent, et leçon 16 de celui-ci pour les nouveaux services) : conteneurs et espaces de noms serverless, répartiteur, groupe d'instances et instances, réplica puis base (ses sauvegardes survivent : supprimez-les), secrets (la protection doit être retirée avant), espace de noms du registre, domaine Transactional Email, et enfin les projets vides. Désactivez les alertes de Cockpit si le projet est conservé.

Plan du cours