Dix-huit étapes, du git clone au make down. Au fil du défilement, le schéma se construit, et chaque commande dit ce qu'elle fait et montre ce qu'elle a affiché lors d'une vraie exécution.
Vue d'ensemble : la plateforme sur AWS, tous les contrôles réussisFaites défiler, la plateforme se construit
Préparer · Étape 01/18
Le dépôt
Tout est dans git : Terraform pour AWS, les manifestes qu'Argo CD applique, l'API de démo et son Dockerfile, et le Makefile qui enchaîne le tout. Rien n'est créé à la main, ni en local ni sur AWS.
1 dépôt là où tout commence
~/platform-eks-gitops
$ git clone https://github.com/Olivg92/platform-eks-gitops.gitCloning into 'platform-eks-gitops'...$ cd platform-eks-gitops
Préparer · Étape 02/18
Les outils
Une commande dit ce qui est installé, groupé par usage. Six outils suffisent pour la plateforme locale ; Terraform et le CLI AWS ne servent qu'à partir du chapitre 3, les linters seulement pour contribuer.
make local-up enchaîne cinq étapes, une ligne chacune. La première crée un cluster Kubernetes de deux nœuds dans Docker, à la même version de Kubernetes que sur EKS. Ses identifiants vont dans un fichier à lui, jamais dans le kubeconfig par défaut, qui peut viser d'autres clusters.
22 s pour créer le cluster
Cible appelée : make local-cluster
~/platform-eks-gitops
$ make local-up k3d cluster 22s ok
En local · Étape 04/18
L'image de l'API
L'image de l'API de démo est construite sur la machine, puis importée directement dans le cluster : pas de registre à faire tourner en local.
0 registre importée directement
Cible appelée : make demo-image
~/platform-eks-gitops
$ make local-up k3d cluster 22s ok Demo API image, built and imported 8s ok
En local · Étape 05/18
Argo CD
Helm installe Argo CD, le seul composant qu'Argo CD n'installe pas lui-même. Tout le reste viendra de git.
49 s pour Argo CD
Cible appelée : make local-argocd
~/platform-eks-gitops
$ make local-up k3d cluster 22s ok Demo API image, built and imported 8s ok Argo CD 49s ok
En local · Étape 06/18
L'application racine
Une seule Application, appliquée une fois, pointe Argo CD vers le dépôt : l'app-of-apps. À partir de là, Argo CD lit git et installe le reste tout seul.
1 racine l'app-of-apps
Cible appelée : make local-bootstrap
~/platform-eks-gitops
$ make local-up k3d cluster 22s ok Demo API image, built and imported 8s ok Argo CD 49s ok Root application 0s ok
En local · Étape 07/18
La plateforme, vague par vague
Argo CD installe par vagues : les opérateurs et leurs CRD d'abord, puis ce qui s'en sert, puis l'API de démo. La commande attend que chaque application soit synchronisée et saine, et liste pendant l'attente ce que chacune attend encore.
13 / 13 applications prêtes
Cible appelée : make local-wait
~/platform-eks-gitops
$ make local-up k3d cluster 22s ok Demo API image, built and imported 8s ok Argo CD 49s ok Root application 0s ok Platform, synced by Argo CD 3m37s ok 13/13 readyThe platform is up, in 4m56s. Log: logs/local-up-20261004-215503.log
En local · Étape 08/18
Vérifier
Neuf vérifications de bout en bout, chacune passe ou dit ce qui manque : les applications, la gateway en HTTP et en HTTPS, un secret venu de Vault, Grafana et l'API de démo derrière la gateway, les métriques, les règles de SLO et leur tableau de bord.
9 / 9 contrôles réussis
~/platform-eks-gitops
$ make local-verifychecking the local platform:ok Argo CD applications all applications healthyok gateway, HTTP listener listener answers (HTTP 404)ok gateway, HTTPS listener TLS terminated, issuer CN=platform-local-caok secret synced from Vault "stored in Vault, never in git"ok Grafana behind the gateway reachable over HTTPS (HTTP 200)ok demo API behind the gateway answers through the gatewayok demo API scraped by Prometheus ServiceMonitor in placeok SLO rules from Sloth 6 rule groups generated by Slothok SLO dashboard in Grafana dashboard shipped with the application
En local · Étape 09/18
Explorer
Chaque interface s'ouvre par un port-forward à elle, jusqu'à Ctrl+C, sans toucher à /etc/hosts : Argo CD, Grafana, Prometheus. Leurs mots de passe viennent de make argocd-password et make grafana-password.
3 ports 8081, 3000 et 9090
~/platform-eks-gitops
$ make argocd-uikubectl port-forward -n argocd svc/argocd-server 8081:80Forwarding from 127.0.0.1:8081 -> 8080$ make grafana-uikubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80Forwarding from 127.0.0.1:3000 -> 3000$ make prometheus-uikubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090Forwarding from 127.0.0.1:9090 -> 9090
En local · Étape 10/18
Casser exprès
L'API de démo sait échouer sur commande. Avec 30 % de requêtes en échec pour un SLO de 99,5 %, le budget d'erreur fond 60 fois trop vite : l'alerte de burn rate générée par Sloth se déclenche, avec le lien vers son runbook. make demo-fix remet tout en ordre.
74 / 245 requêtes en échec
~/platform-eks-gitops
$ make demo-breaksetting error_rate=0.3 latency_ms=0 on every pod demo-api-6bbd6667c-8wf8j: {"error_rate":0.3,"latency_ms":0} demo-api-6bbd6667c-knkhd: {"error_rate":0.3,"latency_ms":0}$ make demo-loadsending ~5 req/s to https://demo.platform.local:8443/ (127.0.0.1) for 60ssent 245 requests, 74 of them failed$ make demo-fixsetting error_rate=0 latency_ms=0 on every pod demo-api-6bbd6667c-8wf8j: {"error_rate":0.0,"latency_ms":0} demo-api-6bbd6667c-knkhd: {"error_rate":0.0,"latency_ms":0}
En local · Étape 11/18
Tout supprimer
Une commande supprime le cluster et son kubeconfig, rien d'autre : le dépôt reste tel quel, prêt pour le prochain make local-up.
0 cluster après make local-down
~/platform-eks-gitops
$ make local-downdeleted the k3d cluster platform-local
Sur AWS · Étape 12/18
Préparer le compte
La première fois sur AWS tient en une commande, ici dans un clone neuf. Elle garde le profil dans local.mk, vérifie la session, trouve la région (ici, celle où le bucket d'état existe déjà) et deux zones qu'EKS accepte, puis écrit terraform.tfvars et backend.hcl. Sans bucket d'état, elle en créerait un, après en avoir montré le plan.
1 commande pour débuter sur AWS
~/platform-eks-gitops
$ make aws-setupAWS setup of the demo environment:Which AWS CLI profile should this project use? It is kept in local.mk, which is not committed.Profiles on this machine: default perso my-profileProfile (a new name is created at the login): perso profile perso (now in local.mk) session opened 0h00 ago, about 11h59 left account <account id> region eu-north-1, where the state bucket is (now in local.mk) terraform.tfvars written, zones eu-north-1a eu-north-1b backend.hcl written, bucket platform-eks-gitops-tfstate-og92Ready. Next: make plan to see what would be created, or make up to create it.
Sur AWS · Étape 13/18
Voir le plan
Avant que rien n'existe, Terraform dit ce qu'il créerait : le VPC et ses sous-réseaux publics, le cluster EKS et deux nœuds Spot, les rôles IAM et les secrets. Pas de NAT gateway : les nœuds sont dans des sous-réseaux publics, derrière des groupes de sécurité stricts.
28 ressources à créer
~/platform-eks-gitops
$ make plan# the detail of each of the 28 resources, then:Plan: 28 to add, 0 to change, 0 to destroy.
Sur AWS · Étape 14/18
Créer l'infrastructure
make up montre le plan en quelques lignes et ce qu'il coûte, puis attend un oui. Terraform applique exactement ce plan : le réseau, le cluster, ses nœuds.
0,18 $ par heure de démo
~/platform-eks-gitops
$ make upAWS session opened 0h01 ago, about 11h58 left Terraform init 2s ok Terraform plan 6s okTerraform plan: to create: 28 1 aws_default_security_group, 4 aws_eks_addon, 1 aws_eks_cluster, 1 aws_eks_node_group, 1 aws_eks_pod_identity_association, 3 aws_iam_role, 1 aws_iam_role_policy, 4 aws_iam_role_policy_attachment, 1 aws_internet_gateway, 1 aws_launch_template, 1 aws_route_table, 2 aws_route_table_association, 2 aws_secretsmanager_secret, 2 aws_secretsmanager_secret_version, 2 aws_subnet, 1 aws_vpcThe Kubernetes API will answer to <your IP>/32 only.This costs about $0.18 an hour, until `make down`.Apply it? Only 'yes' will be accepted: yes Terraform apply 11m17s ok 28 of 28 resources
Sur AWS · Étape 15/18
Installer la plateforme
La même commande écrit les identifiants du nouveau cluster dans un fichier à part, installe Argo CD, puis l'application racine, comme en local. Argo CD installe la version AWS : les secrets depuis Secrets Manager par Pod Identity, la gateway derrière un load balancer.
12 / 12 applications prêtes
Cible appelée : make aws-argocd, make aws-bootstrap, make aws-wait
~/platform-eks-gitops
$ make upAWS session opened 0h01 ago, about 11h58 left Terraform init 2s ok Terraform plan 6s okTerraform plan: to create: 28 1 aws_default_security_group, 4 aws_eks_addon, 1 aws_eks_cluster, 1 aws_eks_node_group, 1 aws_eks_pod_identity_association, 3 aws_iam_role, 1 aws_iam_role_policy, 4 aws_iam_role_policy_attachment, 1 aws_internet_gateway, 1 aws_launch_template, 1 aws_route_table, 2 aws_route_table_association, 2 aws_secretsmanager_secret, 2 aws_secretsmanager_secret_version, 2 aws_subnet, 1 aws_vpcThe Kubernetes API will answer to <your IP>/32 only.This costs about $0.18 an hour, until `make down`.Apply it? Only 'yes' will be accepted: yes Terraform apply 11m17s ok 28 of 28 resources Credentials for the new cluster 3s ok Argo CD 49s ok Root application 3s ok Platform, synced by Argo CD 5m45s ok 12/12 readyThe platform is up, in 18m09s. Log: logs/up-20261005-092741.log
Sur AWS · Étape 16/18
Vérifier sur EKS
Dix vérifications pour la version AWS : les nœuds tournent bien en Spot, le magasin de secrets atteint Secrets Manager par Pod Identity, l'API de démo répond par le load balancer, avec l'image publiée par la CI. Ensuite, les mêmes interfaces qu'en local, avec ENV=aws.
10 / 10 contrôles sur EKS
~/platform-eks-gitops
$ make aws-verifychecking the platform on EKS:ok Argo CD applications all applications healthyok nodes running on spot capacity 2 of 2 nodes on spot capacityok secret store (Pod Identity) Secrets Manager reachable with Pod Identityok secret from Secrets Manager credentials materialised for "admin"ok gateway load balancer a07fe9cf596134f19a0589778c38f0ef-a5a171c81b806794.elb.eu-north-1.amazonaws.comok Grafana behind the gateway reachable over HTTPS (HTTP 200)ok demo API behind the gateway answers through the load balancerok demo API image published by CI, sha-339a41ab09ceok demo API scraped by Prometheus ServiceMonitor in placeok SLO rules from Sloth 6 rule groups generated by Sloth
Sur AWS · Étape 17/18
Tout détruire
make down arrête Argo CD pour qu'il ne recrée pas ce qu'on supprime, retire le load balancer créé par Kubernetes, détruit le reste avec Terraform, puis demande à l'API d'AWS s'il reste quelque chose qui facture.
1 bucket seul à rester
~/platform-eks-gitops
$ make downAWS session opened 0h20 ago, about 11h39 left Terraform init 3s ok Terraform plan of the destroy 9s okTerraform plan: to destroy: 28 1 aws_default_security_group, 4 aws_eks_addon, 1 aws_eks_cluster, 1 aws_eks_node_group, 1 aws_eks_pod_identity_association, 3 aws_iam_role, 1 aws_iam_role_policy, 4 aws_iam_role_policy_attachment, 1 aws_internet_gateway, 1 aws_launch_template, 1 aws_route_table, 2 aws_route_table_association, 2 aws_secretsmanager_secret, 2 aws_secretsmanager_secret_version, 2 aws_subnet, 1 aws_vpcDestroy it? Only 'yes' will be accepted: yes Stopping Argo CD, so it stops recreating 5s ok Removing the load balancer Kubernetes made 5s ok Terraform destroy 6m49s ok 28 of 28 resourceschecking nothing is left behind:ok load balancers noneok classic load balancers noneok elastic IPs noneok EBS volumes noneok EKS clusters noneok NAT gateways noneEverything is gone, in 7m23s. The state bucket is the only resource left, and it costs cents.
En continu · Étape 18/18
La CI
Les mêmes vérifications tournent en local et à chaque pull request, depuis le même fichier : lint de Terraform et de Kubernetes, détection de secrets. Quand l'API de démo change, GitHub Actions construit aussi son image, la teste et la scanne avec Trivy, puis la publie sur GHCR depuis main ; chaque semaine, un workflow vérifie l'âge des images de base et scanne à nouveau l'image publiée.
14 contrôles par PR
~/platform-eks-gitops
$ make lintpre-commit run -atrim trailing whitespace.................................................Passedfix end of files.........................................................Passedcheck for merge conflicts................................................Passedcheck for added large files..............................................Passeddetect private key.......................................................Passedcheck yaml...............................................................PassedDetect hardcoded secrets.................................................Passedyamllint.................................................................PassedTerraform fmt............................................................PassedTerraform validate.......................................................PassedTerraform validate with tflint...........................................PassedCheckov..................................................................PassedLint GitHub Actions workflow files.......................................Passedkubeconform..............................................................Passed