Modules OpenTofu réutilisables pour l'infrastructure Scaleway, extraits de la
duplication constatée entre les repos sweeek (walibuy) et opentofu-ffspt
(ffsportpourtous). L'objectif : mutualiser le code d'infrastructure Scaleway
générique, sans jamais porter la gestion des objets Kubernetes applicatifs
(namespaces, RBAC, ingress, Helm releases...), qui reste volontairement
propre à chaque repo consommateur.
| Module | Rôle |
|---|---|
vpc |
VPC, private networks, public gateways (IPAM), réservation d'IPs de load-balancer |
kubernetes-cluster |
Cluster Kapsule + pools de nodes, autoscaler, auto-upgrade, OIDC |
rdb-postgresql |
Instance RDB PostgreSQL managée + bases + utilisateurs dédiés |
rdb-mysql |
Instance RDB MySQL managée + bases + utilisateurs dédiés |
iam-app-identity |
Identité applicative IAM (application + clé API + policy + secret optionnel) |
object-bucket |
Bucket Object Storage + policy (accès SRE + accès applicatif scopé) |
container-registry |
Namespace Container Registry |
bastion |
Instance bastion SSH/DBA sur private network |
flux |
Bootstrap FluxCD (namespace, deploy key, sealed-secrets, GitRepository/Kustomization) — exception au périmètre ci-dessous |
Chaque module a son propre README.md avec un exemple d'utilisation et les
particularités à connaître.
- Pas de bloc
providerdans les modules : chaque module hérite des providers configurés par le repo consommateur (bonne pratique pour un module destiné à être réutilisé dans des contextes différents — projets Scaleway, régions, credentials distincts). - Contrainte de version du provider Scaleway harmonisée à
>= 2.79.0, < 3.0.0sur tous les modules (les repos d'origine avaient des contraintes divergentes selon les couches :~>2.57.0,~>2.74.0,~>2.79.0...). lifecycle.prevent_destroy = trueest figé en dur sur les ressources critiques (cluster Kubernetes, instances RDB, IP publique du bastion) : la valeur delifecycledoit être une constante littérale en Terraform/OpenTofu (elle ne peut pas dépendre d'une variable), et une ressource de production ne doit pas pouvoir être détruite par untofu apply/destroyaccidentel.- Aucune ressource Kubernetes (namespace, RBAC, ingress, Helm release, manifest...) dans ces
modules : c'est une exigence explicite du périmètre, ces objets restent gérés directement dans
chaque repo consommateur. Exception assumée : le module
flux, dont le bootstrap est indissociable de ressources Kubernetes (namespace, secrets, CRDGitRepository/Kustomization) — un module flux qui les exclurait n'aurait aucune substance. Voir son README pour le détail de cette exception et de ses limites.
Chaque module se référence via une source git versionnée par tag, par exemple :
module "vpc" {
source = "git::https://<url-de-ce-repo>//modules/vpc?ref=vpc-v1.0.0"
# ...
}L'intégration dans les repos sweeek et opentofu-ffspt (remplacement du code dupliqué par des
appels à ces modules, choix des tags de version) est gérée séparément, hors périmètre de ce repo.
Les tags et les releases GitHub sont générés automatiquement par
release-please, à partir des messages de commit
conventionnels déjà utilisés dans ce repo (feat(module): ..., fix(module): ..., chore: ...).
- Versioning indépendant par module : chaque module du tableau ci-dessus a son propre numéro
de version et son propre tag, au format
<module>-vX.Y.Z(ex:vpc-v1.2.0,bastion-v1.0.1). release-please détermine, pour chaque module, quels commits ont modifié des fichiers sousmodules/<module>/depuis son dernier tag, et en déduit le bump (fix→ patch,feat→ minor,!/BREAKING CHANGE→ major). - Chaque push sur
mainmet à jour (ou crée) une pull request "release" par module impacté, proposant le prochain numéro de version et leCHANGELOG.mddu module correspondant (modules/<module>/CHANGELOG.md). - Merger une de ces pull requests crée le tag Git et la release GitHub associée, immédiatement
utilisable via
ref=<module>-vX.Y.Zdans les repos consommateurs (cf section ci-dessus). Rien à taguer à la main. - Un commit qui touche plusieurs modules à la fois (à éviter autant que possible) déclenche une pull request de release pour chacun d'entre eux.
Chaque module a été vérifié avec tofu init -backend=false && tofu validate et formaté avec
tofu fmt -recursive.