{"id":770331,"date":"2025-11-07T08:17:49","date_gmt":"2025-11-07T07:17:49","guid":{"rendered":"https:\/\/www.devoteam.com\/?post_type=expert-view&#038;p=770331"},"modified":"2025-11-07T08:17:53","modified_gmt":"2025-11-07T07:17:53","slug":"migration-argo-cd","status":"publish","type":"expert-view","link":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/","title":{"rendered":"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS"},"content":{"rendered":"\n<h5 class=\"wp-block-heading\" id=\"h-pourquoi-migrer-nos-deploiements-vers-argo-cd\">Pourquoi migrer nos d\u00e9ploiements vers Argo CD ?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Contexte<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Au sein d\u2019une \u00e9quipe charg\u00e9e du d\u00e9ploiement et de la maintenance des <a href=\"https:\/\/devoteam.info\/expert-view\/eks-auto-mode-what-you-need-to-know-before-making-the-move\/\" target=\"_blank\" rel=\"noreferrer noopener\">clusters EKS,<\/a> nous travaillons quotidiennement au maintien \u00e0 jour et \u00e0 l\u2019am\u00e9lioration des services Kubernetes assurant les fonctions de scaling, de s\u00e9curit\u00e9 ou encore d\u2019observabilit\u00e9.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La mise \u00e0 jour de ces services est assur\u00e9e par un pipeline CI\/CD qui s&rsquo;appuie sur une stack Terragrunt. Cette stack compte une vingtaine de modules Terraform.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Constat<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bien que robuste et fiable, ce mode de gestion des clusters EKS pr\u00e9sente plusieurs difficult\u00e9s :&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Complexit\u00e9 de maintenance : Les d\u00e9pendances entre services rendent les mises \u00e0 jour fastidieuses et risqu\u00e9es.<\/li>\n\n\n\n<li>Difficult\u00e9s \u00e0 travailler en parall\u00e8le : Le pipeline centralis\u00e9 limite l\u2019agilit\u00e9 des \u00e9quipes, notamment pour le d\u00e9veloppement de nouvelles fonctionnalit\u00e9s.<\/li>\n\n\n\n<li>Manque de visibilit\u00e9 : L\u2019absence d\u2019une vue centralis\u00e9e et en temps r\u00e9el des d\u00e9ploiements complique le suivi et le debug.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>D\u00e9cision<\/strong> <strong>: Adoption du GitOps avec Argo CD<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour r\u00e9pondre \u00e0 ces enjeux, nous avons opt\u00e9 pour une migration vers une approche GitOps, en choisissant Argo CD comme solution cible. Ce choix s\u2019est accompagn\u00e9 des orientations suivantes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>D\u00e9ploiement distribu\u00e9 : Une instance d\u2019Argo CD par cluster pour une gestion plus granulaire et autonome.<\/li>\n\n\n\n<li>Conservation du pipeline CI\/CD existant : Celui-ci reste d\u00e9di\u00e9 au d\u00e9ploiement des briques d\u2019infrastructure (le cluster EKS lui-m\u00eame) et des services pr\u00e9requis pour Argo CD :\n<ul class=\"wp-block-list\">\n<li>Karpenter pour le provisionnement des n\u0153uds<\/li>\n\n\n\n<li>Cilium pour la CNI<\/li>\n\n\n\n<li>Nginx et AWS Load Balancer Controller pour l\u2019acc\u00e8s \u00e0 l\u2019interface graphique.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La suite de ce REX d\u00e9taillera les trois grandes phases de la mise en \u0153uvre de cette strat\u00e9gie GitOps :&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-yoast-seo-table-of-contents yoast-table-of-contents\"><ul><li><a href=\"#h-conception-d-une-architecture-modulaire-avec-argo-cd\" data-level=\"2\">Conception d\u2019une Architecture Modulaire avec Argo CD<\/a><ul><li><a href=\"#h-design-des-applications-argocd\" data-level=\"3\">Design des applications ArgoCD<\/a><\/li><li><a href=\"#h-organisation-des-services\" data-level=\"3\">Organisation des services<\/a><\/li><\/ul><\/li><li><a href=\"#h-refonte-des-services-kubernetes-de-terraform-a-helm\" data-level=\"2\">Refonte des Services Kubernetes : de Terraform \u00e0 Helm<\/a><ul><li><a href=\"#h-reecriture-des-templates-terraform-en-fichiers-de-configuration-yaml-helm\" data-level=\"3\">R\u00e9\u00e9criture des templates terraform en fichiers de configuration YAML\/Helm<\/a><\/li><li><a href=\"#h-gestion-des-ressources-aws-nbsp\" data-level=\"3\">Gestion des ressources AWS\u00a0<\/a><\/li><\/ul><\/li><li><a href=\"#h-industrialisation-du-deploiement-avec-argo-cd\" data-level=\"2\">Industrialisation du D\u00e9ploiement avec Argo CD<\/a><ul><li><a href=\"#h-prerequis-structurer-argo-cd-pour-le-deploiement\" data-level=\"3\">Pr\u00e9requis : Structurer Argo CD pour le d\u00e9ploiement<\/a><\/li><li><a href=\"#h-connexion-a-la-registry-privee\" data-level=\"3\">Connexion \u00e0 la registry priv\u00e9e<\/a><\/li><li><a href=\"#h-impacts-sur-la-strategie-de-branche-et-l-adaptation-du-gitflow\" data-level=\"3\">Impacts sur la strat\u00e9gie de branche et l\u2019adaptation du GitFlow<\/a><\/li><\/ul><\/li><li><a href=\"#h-bilan\" data-level=\"2\">Bilan<\/a><\/li><\/ul><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conception-d-une-architecture-modulaire-avec-argo-cd\">Conception d\u2019une Architecture Modulaire avec Argo CD<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La premi\u00e8re \u00e9tape de la migration a consist\u00e9 \u00e0 repenser l\u2019organisation des services pour les adapter \u00e0 une approche GitOps. L\u2019objectif \u00e9tait de passer d\u2019une gestion centralis\u00e9e via Terragrunt \u00e0 une architecture modulaire, d\u00e9cloisonn\u00e9e et auto-document\u00e9e, tout en pr\u00e9servant la coh\u00e9rence des d\u00e9ploiements.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-design-des-applications-argocd\">Design des applications ArgoCD<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Argo CD d\u00e9ploie des ressources Kubernetes \u00e0 travers des <a href=\"https:\/\/argo-cd.readthedocs.io\/en\/stable\/operator-manual\/declarative-setup\/#applications\" target=\"_blank\" rel=\"noreferrer noopener\"><em>applications<\/em><\/a>. Ces applications sont elles-m\u00eames des objets Kubernetes d\u00e9finis par une custom ressource (CRD) Argo.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une application r\u00e9f\u00e9rence une ou plusieurs sources pouvant \u00eatre des registres de chart helm ou d\u00e9p\u00f4ts git publics ou priv\u00e9s.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On distingue :&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Les applications \u201csimples\u201d<\/strong> [single chart applications] :&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Contenant une source unique, un chart Helm ou une configuration kustomize, qui d\u00e9ploient une seule application ou microservice.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Id\u00e9al pour les d\u00e9ploiements simples o\u00f9 chaque application est autonome, sans d\u00e9pendances complexes.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Les applications \u201ccomplexes\u201d<\/strong> [multi-charts applications] :&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Contenant plusieurs sources, multiples charts Helm ou multiples projets Git Kustomize, ayant des d\u00e9pendances entre eux.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Id\u00e9al pour les applications comportant plusieurs composants (front, back , database) devant \u00eatre d\u00e9ploy\u00e9s ensemble mais pas n\u00e9cessairement comme un unique gros monolithe.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utile lorsque chaque composant a sa propre helm chart.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Les App-of-Apps<\/strong> [Hierarchical Applications] :&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Une application parent contenant plusieurs applications enfants, pouvant \u00eatre simple ou complexe. Ces applications enfants ayant leur propre application Argo CD.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Permet de g\u00e9rer des <strong>services complexes et multi-chart<\/strong> ou de regrouper plusieurs applications au sein d\u2019une m\u00eame structure organisationnelle.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Id\u00e9al pour les environnements \u00e0 grande \u00e9chelle ou des <strong>configurations multi-clusters<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-organisation-des-services\">Organisation des services<\/h3>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-regroupement-par-fonctionnalite\">Regroupement par fonctionnalit\u00e9<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Pour structurer nos d\u00e9ploiements, nous avons opt\u00e9 pour une architecture hi\u00e9rarchique bas\u00e9e sur des App-of-Apps Argo CD. Chaque application parent regroupe des services par <strong>domaine fonctionnel<\/strong>, avec des applications enfants d\u00e9di\u00e9es \u00e0 des composants sp\u00e9cifiques. Voici les groupes identifi\u00e9s :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kube-core-infra :&nbsp; services infrastructure (ingress, storage, \u2026)<\/li>\n\n\n\n<li>kube-scaling : hpa, vpa, down-scaling<\/li>\n\n\n\n<li>kube-security: validation\/mutation webhook, backup, secrets<\/li>\n\n\n\n<li>kube-dynatrace : dynatrace&nbsp;<\/li>\n\n\n\n<li>kube-monitoring : metrics, logs managements<\/li>\n\n\n\n<li>kube-tools : on-demand service for testing or debugging purpose<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-gestion-des-services-multi-composants-l-exemple-de-kyverno\">Gestion des services multi-composants : l\u2019exemple de Kyverno<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Certains services, comme Kyverno, n\u00e9cessitent le d\u00e9ploiement de plusieurs charts Helm et de manifestes Kubernetes (ex : kyverno-operator, policy-reporter, et des politicies personnalis\u00e9es).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Initialement, un seul module Terraform g\u00e9rait l\u2019ensemble des composants, ce qui rendait les d\u00e9ploiements complexes, notamment la gestion des d\u00e9pendances entre CRD et objets Kubernetes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Regrouper tous ces \u00e9l\u00e9ments dans une seule application Argo CD aurait n\u00e9cessit\u00e9 de multiples sources et rendu la configuration difficile \u00e0 maintenir. Nous avons choisi de :&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>S\u00e9parer les composants en applications enfants distinctes (ex : une application pour kyverno-operator, une autre pour policy-reporter, et une troisi\u00e8me pour les policies).<\/li>\n\n\n\n<li>Regrouper ces applications enfants au sein d\u2019une m\u00eame App-of-Apps d\u00e9di\u00e9e \u00e0 la s\u00e9curit\u00e9.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cette approche s\u2019aligne sur les recommandations d\u2019Argo CD. La <a href=\"https:\/\/argo-cd.readthedocs.io\/en\/stable\/user-guide\/multiple_sources\/\" target=\"_blank\" rel=\"noreferrer noopener\">documentation<\/a> indique que m\u00eame s\u2019il n\u2019y a pas de limites techniques au nombre de sources que l\u2019on peut ajouter dans une application Argo CD, il est d\u00e9conseill\u00e9 d\u2019en abuser.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"837\" height=\"181\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-9.png\" alt=\"\" class=\"wp-image-771851\" style=\"width:600px\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-9.png 837w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-9-300x65.png 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-9-768x166.png 768w\" sizes=\"auto, (max-width: 837px) 100vw, 837px\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-standardisation-des-applications\">Standardisation des applications<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Pour garantir la coh\u00e9rence et la maintenabilit\u00e9, chaque application (parent ou enfant) suit un <strong>mod\u00e8le standardis\u00e9<\/strong> :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Charts Helm :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Source du chart : provenant d\u2019un registre priv\u00e9 (ECR) ou d\u2019un d\u00e9p\u00f4t Git.<\/li>\n\n\n\n<li>Fichiers <em>values <\/em>communs : stock\u00e9s dans un d\u00e9p\u00f4t Git partag\u00e9 entre tous les clusters.<\/li>\n\n\n\n<li>Fichiers <em>values <\/em>sp\u00e9cifiques : stock\u00e9s dans un d\u00e9p\u00f4t Git d\u00e9di\u00e9 au cluster cible.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Manifests Kubernetes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une seule source (d\u00e9p\u00f4t Git) contenant les fichiers YAML.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ce mod\u00e8le permet de d\u00e9coupler la configuration g\u00e9n\u00e9rique de celle sp\u00e9cifique \u00e0 un cluster, tout en conservant une structure pr\u00e9visible et reproductible.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"634\" height=\"562\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-1.png\" alt=\"\" class=\"wp-image-771873\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-1.png 634w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-1-300x266.png 300w\" sizes=\"auto, (max-width: 634px) 100vw, 634px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-refonte-des-services-kubernetes-de-terraform-a-helm\">Refonte des Services Kubernetes : de Terraform \u00e0 Helm<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-reecriture-des-templates-terraform-en-fichiers-de-configuration-yaml-helm\">R\u00e9\u00e9criture des templates terraform en fichiers de configuration YAML\/Helm<\/h3>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-un-defi-de-compatibilite-et-de-modularite\">Un d\u00e9fi de compatibilit\u00e9 et de modularit\u00e9<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">La migration vers Argo CD a n\u00e9cessit\u00e9 la transformation des templates Terraform \u2014 historiquement adapt\u00e9s pour assurer la compatibilit\u00e9 des services Kubernetes avec l\u2019ensemble des clusters \u2014 en manifestes Kubernetes ou en fichiers de configuration YAML\/Helm. L\u2019enjeu \u00e9tait double :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pr\u00e9server l\u2019<strong>historique <\/strong>des <strong>configurations<\/strong> existantes<\/li>\n\n\n\n<li><strong>Adapter <\/strong>les m\u00e9canismes de variabilisation pour qu\u2019ils soient <strong>compatibles <\/strong>avec une approche <strong>GitOps<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-gestion-des-values-helm-une-approche-hierarchisee\">Gestion des values Helm : Une approche hi\u00e9rarchis\u00e9e<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Contrairement \u00e0 Terraform, o\u00f9 les variables et templates permettent une variabilisation dynamique, Helm impose une structure plus rigide. Pour contourner cette limitation, nous avons mis en place une <strong>s\u00e9gr\u00e9gation <\/strong>des fichiers <em>values <\/em>selon leur <strong>port\u00e9e <\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Globale<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Configuration : commune \u00e0 tous les clusters (ex : versions par d\u00e9faut, param\u00e8tres g\u00e9n\u00e9riques).<\/li>\n\n\n\n<li>Localisation : projet Git d\u00e9di\u00e9 aux <em>App-of-Apps <\/em>&#8211; fichier values.yaml.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Environnement (Cloud Provider, r\u00e9gion)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Configuration : partag\u00e9e par tous les clusters de type EKS, GKE, au sein d\u2019une m\u00eame r\u00e9gion.<\/li>\n\n\n\n<li>Localisation : projet Git d\u00e9di\u00e9 aux <em>App-of-Apps <\/em>&#8211; fichier values-aws.yaml et values-gcp.yaml.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Cluster <\/strong>:\n<ul class=\"wp-block-list\">\n<li>Configuration : sp\u00e9cifique \u00e0 un cluster (ex : adresses IP, noms de domaines internes).<\/li>\n\n\n\n<li>Localisation : projet Git d\u00e9di\u00e9 au cluster cible.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-mecanisme-de-preseance\">M\u00e9canisme de pr\u00e9s\u00e9ance<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Les fichiers values sont appliqu\u00e9s dans un ordre pr\u00e9cis (du plus global au plus sp\u00e9cifique) via les sources de l\u2019application Argo CD. Chaque fichier surcharge les valeurs du pr\u00e9c\u00e9dent, garantissant ainsi une personnalisation progressive et contr\u00f4l\u00e9e.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-configuration-dynamique-des-services\">Configuration Dynamique des Services<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Les templates Terraform utilisaient des boucles, des conditions, et des fonctions avanc\u00e9es pour g\u00e9n\u00e9rer dynamiquement des configurations. Helm, bien que puissant, ne propose pas les m\u00eames m\u00e9canismes. Nous avons donc d\u00fb repenser les logiques de g\u00e9n\u00e9ration :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Remplacer les boucles Terraform par des boucles Helm (range) ou des listes statiques pr\u00e9-d\u00e9fini.<\/li>\n\n\n\n<li>Adapter les conditions (if) en utilisant des blocs {{- if }} ou des valeurs par d\u00e9faut dans les <em>values<\/em>.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"145\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-8.png\" alt=\"\" class=\"wp-image-771779\" style=\"width:600px\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-8.png 567w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-8-300x77.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"555\" height=\"195\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-5.png\" alt=\"\" class=\"wp-image-771828\" style=\"width:600px\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-5.png 555w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-5-300x105.png 300w\" sizes=\"auto, (max-width: 555px) 100vw, 555px\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-un-defi-majeur-preserver-la-securite-des-secrets\">Un d\u00e9fi majeur : Pr\u00e9server la s\u00e9curit\u00e9 des secrets<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019un des points critiques de la migration a \u00e9t\u00e9 la <a href=\"https:\/\/argo-cd.readthedocs.io\/en\/release-2.1\/operator-manual\/secret-management\/\" target=\"_blank\" rel=\"noreferrer noopener\">gestion des secrets<\/a>.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans l\u2019ancienne architecture Terraform, ceux-ci \u00e9taient :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stock\u00e9s dans <strong>AWS Secrets Manager<\/strong>.<\/li>\n\n\n\n<li>R\u00e9cup\u00e9r\u00e9s dynamiquement via des variables Terraform masqu\u00e9es.<\/li>\n\n\n\n<li>Inject\u00e9s dans les templates sans<strong> jamais appara\u00eetre en clair<\/strong> dans les fichiers de configuration.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Avec Argo CD, il \u00e9tait hors de question d\u2019exposer ces secrets en clair dans les fichiers values ou les d\u00e9p\u00f4ts Git.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une des solutions couramment utilis\u00e9e est Hashicorp <a href=\"https:\/\/developer.hashicorp.com\/vault\" target=\"_blank\" rel=\"noreferrer noopener\">Vault<\/a> et le plugin <a href=\"https:\/\/argocd-vault-plugin.readthedocs.io\/en\/stable\/howitworks\/\" target=\"_blank\" rel=\"noreferrer noopener\">argocd-vault-plugin<\/a>.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons opt\u00e9 pour une approche <strong>native AWS<\/strong> avec :&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/medium.com\/hostspaceng\/integrating-aws-secrets-manager-with-kubernetes-using-external-secrets-operator-9a909e32ccf8\" target=\"_blank\" rel=\"noreferrer noopener\">AWS Secret Manager<\/a>, d\u00e9j\u00e0 en place dans notre infrastructure<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/ContainerSolutions\/externalsecret-operator\" target=\"_blank\" rel=\"noreferrer noopener\">External Secret Operator<\/a> (ESO) pour synchroniser les secrets AWS et les secrets Kubernetes.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Avec cette solution les secrets <strong>ne transitent jamais<\/strong> dans les d\u00e9p\u00f4ts Git ou les fichiers <em>values<\/em>.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"783\" height=\"498\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-2.png\" alt=\"\" class=\"wp-image-771895\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-2.png 783w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-2-300x191.png 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-2-768x488.png 768w\" sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-gestion-des-ressources-aws-nbsp\">Gestion des ressources AWS&nbsp;<\/h3>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-contexte-des-dependances-aws-incontournables\">Contexte : Des d\u00e9pendances AWS incontournables<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">La plupart des services Kubernetes d\u00e9ploy\u00e9s sur Amazon EKS n\u00e9cessitent des ressources AWS externes pour fonctionner correctement :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>R\u00f4les et politiques IAM (pour les permissions des pods ou des contr\u00f4leurs).<\/li>\n\n\n\n<li>Buckets S3 (pour le stockage des logs, sauvegardes, etc.).<\/li>\n\n\n\n<li>Cl\u00e9s KMS (pour le chiffrement des donn\u00e9es sensibles).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dans l\u2019ancienne architecture, ces ressources \u00e9taient cr\u00e9\u00e9es et g\u00e9r\u00e9es par des modules Terraform, int\u00e9gr\u00e9s au pipeline CI\/CD Terragrunt.&nbsp;<\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-comment-concilier-une-approche-gitops-argo-cd-avec-la-gestion-de-ces-dependances-aws\">Comment concilier une approche GitOps (Argo CD) avec la gestion de ces d\u00e9pendances AWS ?<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Plusieurs outils permettent de g\u00e9rer des ressources AWS directement depuis Kubernetes, en s\u2019int\u00e9grant \u00e0 Argo CD :&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/kro.run\/docs\/overview\">KRO<\/a>\n<ul class=\"wp-block-list\">\n<li>Kubernetes Resource Operator (projet AWS Labs) pour g\u00e9rer des ressources AWS via des CRDs.<\/li>\n\n\n\n<li>Int\u00e9gration native avec AWS<\/li>\n\n\n\n<li>Limites :<strong> Non adapt\u00e9 \u00e0 la production<\/strong> (au moment de l\u2019\u00e9tude)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.crossplane.io\/v2.0\/whats-crossplane\/\">Crossplane&nbsp;<\/a>\n<ul class=\"wp-block-list\">\n<li>Plateforme open-source pour provisionner et g\u00e9rer des ressources cloud via des CRDs.<\/li>\n\n\n\n<li>Flexible, multi-cloud, communaut\u00e9 active<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/aws-controllers-k8s.github.io\/community\/docs\/community\/overview\/\">Controller ACK<\/a>\n<ul class=\"wp-block-list\">\n<li>AWS Controllers for Kubernetes : contr\u00f4leurs officiels AWS pour g\u00e9rer des ressources via CRDs (Controller utilis\u00e9 par Crossplane pour g\u00e9rer les ressources AWS).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-decision-strategique-conservation-des-modules-terraform\">D\u00e9cision strat\u00e9gique : Conservation des modules Terraform<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s une analyse comparative, <strong>Crossplane <\/strong>a \u00e9t\u00e9 identifi\u00e9 comme la solution la plus mature pour une int\u00e9gration GitOps.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"708\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-10.png\" alt=\"\" class=\"wp-image-771917\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-10.png 919w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-10-300x231.png 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-10-768x592.png 768w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cependant, une \u00e9valuation de la charge de travail a r\u00e9v\u00e9l\u00e9 que la migration de l\u2019ensemble des ressources AWS vers Crossplane aurait n\u00e9cessit\u00e9 un effort significatif, avec des risques de complexit\u00e9 accrue. De plus, la stabilit\u00e9 et la rapidit\u00e9 de rollback \u00e9taient des priorit\u00e9s pour la premi\u00e8re phase de migration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons donc d\u00e9cid\u00e9 de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Conserver <\/strong>les modules <strong>Terraform <\/strong>pour la gestion des ressources AWS, en parall\u00e8le d\u2019Argo CD.<\/li>\n\n\n\n<li>Utiliser une m\u00e9canique d<strong>&lsquo;activation \u00e0 la demande<\/strong> (feature flipping) du d\u00e9ploiement des ressources kubernetes dans ces modules<\/li>\n\n\n\n<li>D\u00e9coupler les responsabilit\u00e9s :\n<ul class=\"wp-block-list\">\n<li>Terraform\/Terragrunt : Gestion des ressources AWS (IAM, S3, KMS, etc.).<\/li>\n\n\n\n<li>Argo CD : D\u00e9ploiement des services Kubernetes, avec des r\u00e9f\u00e9rences aux ressources AWS existantes.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cette approche garantit :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La possibilit\u00e9 de rollback imm\u00e9diat vers Terragrunt en cas d\u2019incident.<\/li>\n\n\n\n<li>Une migration par \u00e9tapes, sans rupture brutale.<\/li>\n\n\n\n<li>Pas de r\u00e9\u00e9criture compl\u00e8te des modules AWS en manifests Kubernetes.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-perspectives-d-evolution\">Perspectives d\u2019\u00e9volution<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 moyen terme, une migration progressive vers Crossplane ou ACK pourrait \u00eatre envisag\u00e9e pour :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unifier la gestion des ressources AWS et Kubernetes sous GitOps.<\/li>\n\n\n\n<li>R\u00e9duire les d\u00e9pendances aux pipelines Terraform.<\/li>\n\n\n\n<li>B\u00e9n\u00e9ficier d\u2019une gestion d\u00e9clarative coh\u00e9rente pour l\u2019ensemble de l\u2019infrastructure.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-industrialisation-du-deploiement-avec-argo-cd\"><strong>Industrialisation du D\u00e9ploiement avec Argo CD<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-prerequis-structurer-argo-cd-pour-le-deploiement\">Pr\u00e9requis : Structurer Argo CD pour le d\u00e9ploiement<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Argo CD synchronise les ressources d\u2019un cluster Kubernetes avec une ou plusieurs sources de v\u00e9rit\u00e9 (d\u00e9p\u00f4ts Git, registres Helm, etc.). Cependant, avant d\u2019activer cette synchronisation, il est n\u00e9cessaire de configurer trois \u00e9l\u00e9ments cl\u00e9s dans Argo CD :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une application :\n<ul class=\"wp-block-list\">\n<li>D\u00e9finit les sources \u00e0 synchroniser (ex : d\u00e9p\u00f4t Git, chart Helm) et la cible (namespace, cluster).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Un <a href=\"https:\/\/argo-cd.readthedocs.io\/en\/stable\/user-guide\/projects\/\" target=\"_blank\" rel=\"noreferrer noopener\">projet<\/a> :\n<ul class=\"wp-block-list\">\n<li>Regroupement logique d\u2019applications avec des r\u00e8gles RBAC, des restrictions, \u2026<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Un repository :\n<ul class=\"wp-block-list\">\n<li>Connexion aux sources externes, (registres Helm, d\u00e9p\u00f4t Git, \u2026)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Plusieurs approches existent pour configurer ces \u00e9l\u00e9ments :&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GUI Argo CD :\n<ul class=\"wp-block-list\">\n<li>Cr\u00e9ation manuelle via l\u2019interface web<\/li>\n\n\n\n<li>Simple pour des tests ou des cas ponctuels<\/li>\n\n\n\n<li>Non reproductible, non versionn\u00e9e<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/argo-cd.readthedocs.io\/en\/stable\/cli_installation\/\" target=\"_blank\" rel=\"noreferrer noopener\">CLI Argo CD<\/a> :\n<ul class=\"wp-block-list\">\n<li>Utilisation de la ligne de commande (<em>argocd<\/em> CLI) ou int\u00e9gration dans un pipeline CI\/CD<\/li>\n\n\n\n<li>Automatisable, scriptable<\/li>\n\n\n\n<li>Gestion centralis\u00e9e complexe<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>API kubernetes :\n<ul class=\"wp-block-list\">\n<li>D\u00e9ploiement via<em> kubectl <\/em>(manifestes YAML) ou dans un pipeline CI\/CD<\/li>\n\n\n\n<li>Int\u00e9gration native avec Kubernetes<\/li>\n\n\n\n<li>Requiert une bonne ma\u00eetrise de l\u2019API<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Infrastructure as Code (IaC) :\n<ul class=\"wp-block-list\">\n<li>Utilisation de Terraform (providers kubernetes ou <a href=\"https:\/\/registry.terraform.io\/providers\/argoproj-labs\/argocd\/latest\/docs\" target=\"_blank\" rel=\"noreferrer noopener\">argocd<\/a>) pour une gestion d\u00e9clarative<\/li>\n\n\n\n<li>Reproductible, versionn\u00e9e, int\u00e9gr\u00e9e \u00e0 la stack existante<\/li>\n\n\n\n<li>Courbe d\u2019apprentissage pour le provider argocd<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-choix-technique-integration-via-terraform-et-le-provider-kubernetes\">Choix technique : Int\u00e9gration via Terraform et le provider Kubernetes<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Pour garantir reproductibilit\u00e9, tra\u00e7abilit\u00e9 et coh\u00e9rence avec notre stack existante, nous avons opt\u00e9 pour une approche Infrastructure as Code en \u00e9tendant notre stack Terragrunt avec :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un<strong> module Terraform <\/strong>d\u00e9di\u00e9 pour cr\u00e9er les projets, applications et repositories Argo CD.<\/li>\n\n\n\n<li>Des <strong>templates<\/strong> pour standardiser la d\u00e9finition des applications et projets.<\/li>\n\n\n\n<li>Le <strong>provider kubernetes <\/strong>(plut\u00f4t que le provider argocd) pour d\u00e9ployer les ressources, car :\n<ul class=\"wp-block-list\">\n<li>Il offre une stabilit\u00e9 \u00e9prouv\u00e9e (le(s) provider(s) argocd \u00e9tai(en)t encore en d\u00e9veloppement actif au moment de l\u2019\u00e9tude).<\/li>\n\n\n\n<li>Il permet une int\u00e9gration transparente avec nos modules Terraform existants.<\/li>\n\n\n\n<li>Les ressources sont d\u00e9finies dans un fichier de settings YAML, simplifiant la maintenance.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-connexion-a-la-registry-privee\">Connexion \u00e0 la registry priv\u00e9e<\/h3>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-enjeu-maintenir-un-acces-securise-et-continu-a-l-ecr\">Enjeu : Maintenir un acc\u00e8s s\u00e9curis\u00e9 et continu \u00e0 l\u2019ECR<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Dans une approche GitOps, ArgoCD s\u2019assure en continu que l\u2019infrastructure cible correspond \u00e0 l\u2019\u00e9tat souhait\u00e9 d\u00e9fini dans Git.&nbsp; En cas de divergence, les ressources kubernetes peuvent \u00eatre red\u00e9ploy\u00e9es. Ces m\u00e9canismes impliquent une connexion permanente de l\u2019instance Argo CD avec le registre ECR priv\u00e9 contenant les charts et images. Cependant, la dur\u00e9e de vie maximale d\u2019un <a href=\"https:\/\/docs.aws.amazon.com\/AmazonECR\/latest\/userguide\/Registries.html#registry_auth\" target=\"_blank\" rel=\"noreferrer noopener\">token ECR<\/a> est de 12h. Il faut donc mettre en place un m\u00e9canisme de renouvellement automatiquement des tokens, avec une fr\u00e9quence inf\u00e9rieure ou \u00e9gale \u00e0 12h.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons utilis\u00e9 <a href=\"https:\/\/medium.com\/@281332\/argocd-access-to-aws-ecr-for-helm-oci-external-secrets-operator-c850d3461f5f\" target=\"_blank\" rel=\"noreferrer noopener\">External Secrets Operator<\/a> (ESO) pour automatiser cette gestion, gr\u00e2ce \u00e0 sa fonctionnalit\u00e9 d\u00e9di\u00e9e aux tokens ECR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ESO surveille une ressource (CRD) de type <a href=\"https:\/\/external-secrets.io\/latest\/api\/generator\/ecr\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>ECRAuthorizationToken<\/em><\/a>, qui d\u00e9clenche automatiquement le renouvellement du token avant son expiration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avantages :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pas de rupture de service : le token est renouvel\u00e9 de mani\u00e8re transparente.<\/li>\n\n\n\n<li>S\u00e9curit\u00e9 : le token n\u2019est jamais stock\u00e9 en clair dans les d\u00e9p\u00f4ts Git ou les configurations Argo CD.<\/li>\n\n\n\n<li>Int\u00e9gration native : utilisation de l\u2019infrastructure AWS existante (IAM, ECR).<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"452\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-7-1024x452.png\" alt=\"\" class=\"wp-image-771939\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-7-1024x452.png 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-7-300x132.png 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-7-768x339.png 768w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-7.png 1149w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\" id=\"h-impacts-sur-la-strategie-de-branche-et-l-adaptation-du-gitflow\">Impacts sur la strat\u00e9gie de branche et l\u2019adaptation du GitFlow<\/h3>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-transition-du-modele-push-based-au-pull-based\">Transition du mod\u00e8le push-based au pull-based<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Avec Terragrunt, le d\u00e9ploiement suit un mod\u00e8le dit<strong> push-based <\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Les modifications d\u2019une branche feature sont pouss\u00e9es vers un environnement de test, puis vers la production, avant ou apr\u00e8s fusion sur la branche main (selon le GitFlow choisi).<\/li>\n\n\n\n<li>Ce mod\u00e8le est adapt\u00e9 au d\u00e9ploiement via un pipeline de CI\/CD<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1014\" height=\"713\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-4.png\" alt=\"\" class=\"wp-image-771961\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-4.png 1014w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-4-300x211.png 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-4-768x540.png 768w\" sizes=\"auto, (max-width: 1014px) 100vw, 1014px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Avec Argo CD, le d\u00e9ploiement devient <strong>pull-based<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le <strong>contr\u00f4leur <\/strong>tire le contenu d\u2019une branche Git fixe pour synchroniser le cluster.<\/li>\n\n\n\n<li>La <strong>branche cible ne change pas<\/strong> : les \u00e9volutions sont fusionn\u00e9es vers cette branche pour \u00eatre d\u00e9ploy\u00e9es automatiquement.<\/li>\n\n\n\n<li>Cons\u00e9quence : Le GitFlow classique (branches feature \u2192 main \u2192 d\u00e9ploiement) n\u2019est plus adapt\u00e9.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"996\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-3.png\" alt=\"\" class=\"wp-image-771983\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-3.png 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-3-300x292.png 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-3-768x747.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-strategie-de-branchement-adaptee-au-gitops\">Strat\u00e9gie de branchement adapt\u00e9e au GitOps<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">G\u00e9n\u00e9ralement, sur les projets GitOps, on va trouver :&nbsp;&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>une <strong>branche p\u00e9renne par environnement<\/strong>&nbsp;<\/li>\n\n\n\n<li>des branches feature\/Fix qui seront fusionn\u00e9es vers la branche de l\u2019environnement cible<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dans notre cas d\u2019usage, le d\u00e9coupage production\/non production n\u2019\u00e9tait pas le plus pertinent. A la place, nous avons align\u00e9 la strat\u00e9gie de branches sur notre <strong>plan de release trimestriel<\/strong>, bas\u00e9 sur les versions Kubernetes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Release courante : ex. 1.31<\/li>\n\n\n\n<li>Release \u00e0 venir ou en cours de d\u00e9ploiement: ex. 1.32<\/li>\n\n\n\n<li>Release en cours de pr\u00e9paration: ex: 1.33<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"h-workflow-de-deploiement\">Workflow de d\u00e9ploiement<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9veloppement :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Les branches feature ou fix sont fusionn\u00e9es vers la branche de la release en pr\u00e9paration (ex: 1.33).<\/li>\n\n\n\n<li>Les clusters de test synchronisent automatiquement cette branche pour validation.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Upgrade Kubernetes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une fois la release valid\u00e9e, les clusters de production sont bascul\u00e9s de la branche courante 1.31 vers la release suivante 1.32.<\/li>\n\n\n\n<li>La branche de d\u00e9veloppement 1.33 devient la nouvelle release \u00e0 venir, et une nouvelle branche de d\u00e9veloppement 1.34 est cr\u00e9\u00e9e pour la prochaine it\u00e9ration.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2025\/11\/Devoteam_Expert-view_Migration_Argo-CD-6.png\" alt=\"\" class=\"wp-image-772005\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Avantages :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alignement avec le cycle de release : chaque branche correspond \u00e0 une version Kubernetes et <strong>un \u00e9tat stable du code<\/strong>.<\/li>\n\n\n\n<li>Stabilit\u00e9 : les clusters de production restent synchronis\u00e9s sur une <strong>branche immuable pendant tout le trimestre<\/strong>.<\/li>\n\n\n\n<li>Flexibilit\u00e9 : les tests et validations sont isol\u00e9s sur la branche de pr\u00e9paration, sans impact sur la production.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-bilan\">Bilan<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La mise en \u0153uvre d\u2019une strat\u00e9gie <strong>GitOps<\/strong> pour le d\u00e9ploiement des services Kubernetes sur notre parc <strong>EKS<\/strong> a soulev\u00e9 de nombreux d\u00e9fis, chacun n\u00e9cessitant une solution adapt\u00e9e. <strong>Argo CD<\/strong>, en tant qu\u2019outil central de cette migration, b\u00e9n\u00e9ficie d\u2019un <strong>\u00e9cosyst\u00e8me riche<\/strong> (plugins, int\u00e9grations, bonnes pratiques) permettant d\u2019adresser chaque probl\u00e9matique de mani\u00e8re flexible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il n\u2019existe<strong> pas de solution universelle<\/strong> : les choix techniques d\u00e9pendent \u00e9troitement du <strong>contexte<\/strong>, des <strong>contraintes<\/strong> et des <strong>objectifs<\/strong> de chaque organisation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un crit\u00e8re d\u00e9cisif dans nos choix a \u00e9t\u00e9 <strong>la continuit\u00e9 op\u00e9rationnelle<\/strong> pour les \u00e9quipes en charge du <em>Run<\/em>. Pour minimiser les perturbations, nous avons privil\u00e9gi\u00e9 des solutions <strong>proches de l\u2019existant<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>R\u00e9utilisation des modules Terraform<\/strong> pour la gestion des ressources AWS.<\/li>\n\n\n\n<li><strong>Conservation de la stack Terragrunt<\/strong> pour le d\u00e9ploiement de l\u2019infrastructure.<\/li>\n\n\n\n<li><strong>Int\u00e9gration transparente<\/strong> avec le pipeline CI\/CD existant.<\/li>\n\n\n\n<li><strong>Migration progressive<\/strong> pour permettre un <em>rollback<\/em> simple en cas de besoin.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ces d\u00e9cisions ont permis de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>R\u00e9duire la courbe d\u2019apprentissage<\/strong> pour les \u00e9quipes.<\/li>\n\n\n\n<li><strong>Maintenir la stabilit\u00e9<\/strong> des environnements pendant la transition.<\/li>\n\n\n\n<li><strong>Capitaliser sur les outils ma\u00eetris\u00e9s<\/strong> (Terraform, AWS, etc.).<\/li>\n\n\n\n<li><strong>R\u00e9aliser un premier pas <\/strong>vers une cible full GitOps<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Les solutions pr\u00e9sent\u00e9es ici sont le fruit d\u2019un <strong>compromis<\/strong> entre innovation et pragmatisme. Elles ne seront pas n\u00e9cessairement optimales pour d\u2019autres contextes, o\u00f9 des contraintes diff\u00e9rentes (ex : multi-cloud, \u00e9quipes d\u00e9di\u00e9es DevOps, etc.) pourraient orienter vers d\u2019autres outils ou strat\u00e9gies.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pourquoi migrer nos d\u00e9ploiements vers Argo CD ? Contexte Au sein d\u2019une \u00e9quipe charg\u00e9e du d\u00e9ploiement et de la maintenance des clusters EKS, nous travaillons quotidiennement au maintien \u00e0 jour et \u00e0 l\u2019am\u00e9lioration des services Kubernetes assurant les fonctions de scaling, de s\u00e9curit\u00e9 ou encore d\u2019observabilit\u00e9.&nbsp; La mise \u00e0 jour de ces services est assur\u00e9e [&hellip;]<\/p>\n","protected":false},"featured_media":148098,"template":"","categories":[1361],"tags":[],"industry":[],"class_list":["post-770331","expert-view","type-expert-view","status-publish","has-post-thumbnail","hentry","category-architecture-cloud-native"],"acf":[],"cards":"\n\t<div class=\"single-post-card\">\n\n\t\t<figure class=\"wp-block-post-featured-image\"><a href=\"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/\" target=\"_self\" ><img width=\"1920\" height=\"1190\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg\" class=\"attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS\" style=\"aspect-ratio:4\/3;width:100%;object-fit:cover;\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg 1920w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-300x186.jpg 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-1024x635.jpg 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-768x476.jpg 768w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-1536x952.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/a><\/figure>\n\n\t\t\n\t\t<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-43282307 wp-block-group-is-layout-flex\">\n\t<p style=\"font-style:normal;font-weight:700\" class=\"has-link-color wp-elements-1 wp-block-lp-post-type has-text-color has-primary-color has-small-font-size\">Parole d'experts<\/p>\n\n\t\t\n\t\t<h3 style=\"font-style:normal;font-weight:400\" class=\"wp-block-post-title has-base-font-size\"><a href=\"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/\" target=\"_self\" >De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS<\/a><\/h3><\/div>\n\t\t\n\t<\/div>\n\n","yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS | Devoteam<\/title>\n<meta name=\"description\" content=\"Migration Terragrunt vers ArgoCD : REX sur notre strat\u00e9gie GitOps pour d\u00e9ployer des services Kubernetes sur EKS avec Argo CD et Helm.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS\" \/>\n<meta property=\"og:description\" content=\"Migration Terragrunt vers ArgoCD : REX sur notre strat\u00e9gie GitOps pour d\u00e9ployer des services Kubernetes sur EKS avec Argo CD et Helm.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/\" \/>\n<meta property=\"og:site_name\" content=\"Devoteam\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-07T07:17:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1190\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/\",\"url\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/\",\"name\":\"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS | Devoteam\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/GettyImages-886684958_edited.jpg\",\"datePublished\":\"2025-11-07T07:17:49+00:00\",\"dateModified\":\"2025-11-07T07:17:53+00:00\",\"description\":\"Migration Terragrunt vers ArgoCD : REX sur notre strat\u00e9gie GitOps pour d\u00e9ployer des services Kubernetes sur EKS avec Argo CD et Helm.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/\"]}],\"accessibilityFeature\":[\"tableOfContents\"]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/#primaryimage\",\"url\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/GettyImages-886684958_edited.jpg\",\"contentUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/GettyImages-886684958_edited.jpg\",\"width\":1920,\"height\":1190},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/migration-argo-cd\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Parole d'experts\",\"item\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/expert-view\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/\",\"name\":\"Devoteam\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/devoteam.info\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS | Devoteam","description":"Migration Terragrunt vers ArgoCD : REX sur notre strat\u00e9gie GitOps pour d\u00e9ployer des services Kubernetes sur EKS avec Argo CD et Helm.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/","og_locale":"fr_FR","og_type":"article","og_title":"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS","og_description":"Migration Terragrunt vers ArgoCD : REX sur notre strat\u00e9gie GitOps pour d\u00e9ployer des services Kubernetes sur EKS avec Argo CD et Helm.","og_url":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/","og_site_name":"Devoteam","article_modified_time":"2025-11-07T07:17:53+00:00","og_image":[{"width":1920,"height":1190,"url":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/","url":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/","name":"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS | Devoteam","isPartOf":{"@id":"https:\/\/devoteam.info\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/#primaryimage"},"image":{"@id":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/#primaryimage"},"thumbnailUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg","datePublished":"2025-11-07T07:17:49+00:00","dateModified":"2025-11-07T07:17:53+00:00","description":"Migration Terragrunt vers ArgoCD : REX sur notre strat\u00e9gie GitOps pour d\u00e9ployer des services Kubernetes sur EKS avec Argo CD et Helm.","breadcrumb":{"@id":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/"]}],"accessibilityFeature":["tableOfContents"]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/#primaryimage","url":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg","contentUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg","width":1920,"height":1190},{"@type":"BreadcrumbList","@id":"https:\/\/devoteam.info\/fr\/expert-view\/migration-argo-cd\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devoteam.info\/fr\/"},{"@type":"ListItem","position":2,"name":"Parole d'experts","item":"https:\/\/devoteam.info\/fr\/expert-view\/"},{"@type":"ListItem","position":3,"name":"De Terragrunt \u00e0 ArgoCD : impl\u00e9menter une strat\u00e9gie GitOps sur EKS"}]},{"@type":"WebSite","@id":"https:\/\/devoteam.info\/fr\/#website","url":"https:\/\/devoteam.info\/fr\/","name":"Devoteam","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devoteam.info\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"}]}},"uagb_featured_image_src":{"full":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg",1920,1190,false],"thumbnail":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-150x150.jpg",150,150,true],"medium":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-300x186.jpg",300,186,true],"medium_large":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-768x476.jpg",768,476,true],"large":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-1024x635.jpg",1024,635,true],"1536x1536":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited-1536x952.jpg",1536,952,true],"2048x2048":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/GettyImages-886684958_edited.jpg",1920,1190,false]},"uagb_author_info":{"display_name":"julien.lemarchal","author_link":"https:\/\/devoteam.info\/fr\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"Pourquoi migrer nos d\u00e9ploiements vers Argo CD ? Contexte Au sein d\u2019une \u00e9quipe charg\u00e9e du d\u00e9ploiement et de la maintenance des clusters EKS, nous travaillons quotidiennement au maintien \u00e0 jour et \u00e0 l\u2019am\u00e9lioration des services Kubernetes assurant les fonctions de scaling, de s\u00e9curit\u00e9 ou encore d\u2019observabilit\u00e9.&nbsp; La mise \u00e0 jour de ces services est assur\u00e9e\u2026","_links":{"self":[{"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/expert-view\/770331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/expert-view"}],"about":[{"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/types\/expert-view"}],"version-history":[{"count":0,"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/expert-view\/770331\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/media\/148098"}],"wp:attachment":[{"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/media?parent=770331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/categories?post=770331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/tags?post=770331"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/devoteam.info\/fr\/wp-json\/wp\/v2\/industry?post=770331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}