<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de Cellenza</title>
	<atom:link href="https://blog.cellenza.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.cellenza.com/</link>
	<description></description>
	<lastBuildDate>Wed, 14 Jan 2026 14:57:11 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.cellenza.com/wp-content/uploads/2022/04/favicon-96x96-1.png</url>
	<title>Le blog de Cellenza</title>
	<link>https://blog.cellenza.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">203374432</site>	<item>
		<title>Comment RAJA Group a construit une plateforme data unifiée avec Microsoft Fabric</title>
		<link>https://blog.cellenza.com/data/comment-raja-a-construit-une-plateforme-data-unifiee-avec-microsoft-fabric/</link>
					<comments>https://blog.cellenza.com/data/comment-raja-a-construit-une-plateforme-data-unifiee-avec-microsoft-fabric/#respond</comments>
		
		<dc:creator><![CDATA[jeanpierreriehl]]></dc:creator>
		<pubDate>Wed, 14 Jan 2026 16:00:00 +0000</pubDate>
				<category><![CDATA[Data]]></category>
		<category><![CDATA[Microsoft Fabric]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154761</guid>

					<description><![CDATA[<p>Comment RAJA Group a construit une plateforme data unifiée avec Microsoft Fabric – et comment Cellenza a contribué à écrire cette trajectoire Lorsque RAJA Group nous sollicite en 2024, la question n’est pas : « Quelle technologie choisir ? ». La vraie question est bien plus stratégique : Quelle trajectoire data devons-nous construire pour le [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/data/comment-raja-a-construit-une-plateforme-data-unifiee-avec-microsoft-fabric/">Comment RAJA Group a construit une plateforme data unifiée avec Microsoft Fabric</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1><strong>Comment RAJA Group a construit une plateforme data unifiée avec Microsoft Fabric – et comment Cellenza a contribué à écrire cette trajectoire</strong></h1>
<p>Lorsque RAJA Group nous sollicite en 2024, la question n’est pas : « Quelle technologie choisir ? ». La vraie question est bien plus stratégique :</p>
<p>Quelle trajectoire data devons-nous construire pour le groupe, et Microsoft Fabric est-il le bon socle pour l&rsquo;incarner ?</p>
<p>Avec ses 26 filiales européennes, son historique IT riche, des usages data variés et une organisation fortement distribuée, RAJA Group ne cherche pas une technologie. <strong>RAJA Group cherche un<em>e plateforme unique et un </em>modèle opérationnel pérenne</strong>, capable d’accompagner son ambition data.</p>
<p>C’est sur cette base que commence notre collaboration.</p>
<h3><strong>Le cadrage : comprendre RAJA Group pour savoir si Fabric « fit » réellement (et inversement)</strong></h3>
<p>Notre mission initiale n’était pas d’analyser des volumes ou d’inventorier des sources. Il s’agissait d’abord de comprendre :</p>
<ul>
<li>la stratégie data du groupe ;</li>
<li>les ambitions de transformation pour les années à venir ;</li>
<li>la culture de développement et les pratiques existantes ;</li>
<li>la maturité data et les contraintes opérationnelles ;</li>
<li>le modèle organisationnel et sa capacité à s’approprier Fabric.</li>
</ul>
<p>Chez Cellenza, nous sommes convaincus que :</p>
<p>une technologie se choisit parce qu’elle s&rsquo;aligne avec la gouvernance, les usages et la culture de l’entreprise.</p>
<p>Nous avons donc construit avec RAJA Group une <strong>trajectoire data</strong> claire, durable, alignée sur les ambitions du groupe, basée sur une architecture de la plateforme et accompagnée d’un premier <strong>backlog</strong> pour structurer l’évolution. Ce travail a permis de valider que <strong>Fabric correspondait à la manière dont RAJA Group travaille</strong>, collabore et souhaite faire évoluer la donnée.</p>
<h3><strong>Co‑construire plutôt que livrer : la signature Cellenza</strong></h3>
<p>Dès le démarrage de la mise en œuvre, un principe s’impose :</p>
<p>Cellenza ne vient pas livrer une plateforme, mais aider RAJA Group à la construire et à se l’approprier.</p>
<p>Nous intégrons leurs équipes et travaillons main dans la main, en suivant les principes du <strong>Platform Engineering</strong>, qui constituent notre marque de fabrique :</p>
<ul>
<li>privilégier les outils plutôt que les solutions ponctuelles ;</li>
<li>standardiser pour accélérer et fiabiliser ;</li>
<li>industrialiser pour réduire les coûts de possession ;</li>
<li>rendre les équipes clientes autonomes, pas dépendantes ;</li>
<li>avancer de façon pragmatique, itérative et collaborative.</li>
</ul>
<p>Ce mode de travail crée une dynamique d’apprentissage rapide et un engagement fort autour de la plateforme.</p>
<h3><strong>26 ERP intégrés en trois mois : quand l’industrialisation rencontre la capacité d’apprentissage</strong></h3>
<p>Le chiffre surprend souvent : <strong>26 ERP intégrés en trois mois</strong>.</p>
<p>Pourtant, cette performance s’explique par deux facteurs clés :</p>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f527.png" alt="🔧" class="wp-smiley" style="height: 1em; max-height: 1em;" /> L’industrialisation via un moteur d’intégration</strong></p>
<p>Nous avons conçu avec RAJA Group un <strong>engine d’intégration</strong> permettant :</p>
<ul>
<li>de standardiser les patterns d’ingestion ;</li>
<li>d’automatiser la répétition sur les 26 systèmes ;</li>
<li>de sécuriser les flux sans reconstruire chaque pipeline ;</li>
<li>d’offrir une base solide pour les évolutions futures.</li>
</ul>
<p>Cet outil – aujourd’hui en version 2 – est au cœur de l’efficacité de la plateforme.</p>
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Une courbe d’apprentissage exceptionnelle</strong></p>
<p>L’autre clé du succès : <strong>la montée en compétence des équipes RAJA Group</strong>.</p>
<p>Issues d’un univers SQL traditionnel, elles ont adopté Fabric en un temps record :</p>
<ul>
<li>pipelines et Lakehouses,</li>
<li>notebooks et Spark,</li>
<li>logique d’industrialisation,</li>
<li>bonnes pratiques de gouvernance.</li>
</ul>
<p>C’est l’une des révélations du projet :</p>
<p>bien accompagné et bien outillé, Fabric offre une courbe d’apprentissage sans équivalent.</p>
<h3><strong>Composer avec les limites de Fabric… et sa roadmap</strong></h3>
<p>En 2024, Fabric est encore en pleine évolution. Certaines fonctionnalités manquent encore ; d’autres arrivent trop tard pour les besoins immédiats.</p>
<p>Nous devons alors arbitrer entre :</p>
<ul>
<li>attendre une future fonctionnalité prévue dans la roadmap ;</li>
<li>ou développer un outil interne pour répondre immédiatement au besoin.</li>
</ul>
<p>Nous avons notamment construit du <strong>monitoring avancé</strong> et divers outils d’observabilité pour compléter les limites de l’époque.</p>
<p>Notre relation étroite avec Microsoft et la présence de <strong>MVP Fabric</strong> dans nos équipes ont été déterminantes pour faire les bons choix, anticiper les évolutions et garantir un socle stable malgré la jeunesse du produit.</p>
<h3><strong>2025 : quand la plateforme devient un écosystème</strong></h3>
<p>L’année 2025 marque une étape clé : la plateforme n’est plus un simple socle technique, mais un <strong>écosystème en croissance permanente</strong>, façonné à la fois par les besoins métiers et par l’expertise continue apportée par Cellenza.</p>
<p>Dès le début, nous avons structuré l’accompagnement autour d’un principe simple : <strong>faire évoluer la plateforme au même rythme que l’organisation</strong>, sans jamais perdre de vue les objectifs de long terme. Cette approche a permis d’inscrire Fabric dans une logique vivante, adaptable et durable.</p>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f501.png" alt="🔁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Une amélioration continue structurée et portée par les usages</strong></h4>
<p>Chaque nouveau cas d’usage ouvre une opportunité d’améliorer la plateforme : optimiser un pattern d’ingestion, renforcer une couche de gouvernance, enrichir un modèle, ajuster l’architecture. Ces évolutions ne sont pas anecdotiques : elles permettent au socle Fabric de gagner en maturité, en robustesse et en cohérence.</p>
<p>Cellenza accompagne RAJA Group dans cette dynamique en apportant une <strong>vision experte</strong> sur ce qu’il faut améliorer, quand le faire et comment le faire. Ce rôle de « gardien du cadre » garantit que la plateforme continue d’évoluer de manière maîtrisée.</p>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Une expertise Cellenza qui éclaire les choix technologiques</strong></h4>
<p>Tout au long de 2025, nous assurons :</p>
<ul>
<li>des revues régulières des développements ;</li>
<li>des arbitrages technologiques pour orienter les évolutions ;</li>
<li>une veille continue sur l’évolution de Fabric pour anticiper les impacts ;</li>
<li>des recommandations d’architecture pour maintenir une cohérence globale.</li>
</ul>
<p>Cette présence experte permet à RAJA Group de rester à jour tout en consolidant un socle stable et aligné avec sa stratégie data.</p>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4b8.png" alt="💸" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Une gestion maîtrisée des coûts et des capacités</strong></h4>
<p>La montée en charge implique un suivi attentif des consommations. Ensemble, nous mettons en place :</p>
<ul>
<li>une <strong>optimisation ciblée au bon moment</strong> (notebooks, Spark, stockage, organisation du Lakehouse) ;</li>
<li>un <strong>capacity planning</strong> pour anticiper les besoins futurs ;</li>
<li>des pratiques garantissant un équilibre sain entre performance, coûts et simplicité.</li>
</ul>
<p>L’objectif : <strong>protéger les coûts tout en accompagnant la croissance</strong> de la plateforme.</p>
<p>RAJA Group ne « consomme » plus Fabric : <strong>RAJA Group le maîtrise, l’enrichit et l’utilise pour accélérer sa transformation</strong>. La plateforme est devenue un espace où les usages évoluent en continu, guidés par l’innovation et soutenus par l’expertise Cellenza.</p>
<h3><strong>L’IA et les Data Agents : une nouvelle ère d’innovation pour RAJA Group</strong></h3>
<p>Avec une plateforme désormais solide et pleinement maîtrisée, RAJA Group aborde en 2025 un territoire résolument tourné vers l’avenir : celui de l’IA intégrée à Fabric, et en particulier des <strong>Data Agents</strong>. Et l’enthousiasme est à la hauteur du potentiel.</p>
<p>Les Data Agents représentent une avancée majeure : des agents intelligents, directement connectés aux données, capables de comprendre une question métier, d’aller chercher les données pertinentes, de déclencher des traitements automatisés et de restituer une réponse contextualisée. Une rupture dans la manière d’interagir avec la donnée.</p>
<p>RAJA Group a choisi non seulement d’expérimenter cette fonctionnalité, mais de l’explorer <strong>en profondeur</strong> — à la fois sous l’angle technique (<em>est-ce que ça fonctionne réellement dans notre contexte ? quelles limites ? quelles optimisations ?</em>) et sous l’angle opérationnel (<em>pour qui ? pour quels usages ? comment assurer une adoption simple mais sécurisée ?</em>).</p>
<p>Cette démarche est emblématique de l’ambition du groupe : <strong>ne pas consommer la technologie, mais la comprendre pour en tirer une vraie valeur métier</strong>. Et c’est exactement dans ce cadre que Cellenza intervient.</p>
<p>Nous réalisons un travail d’ingénierie et de conseil :</p>
<ul>
<li>décortiquer les Data Agents pour en comprendre les ressorts internes ;</li>
<li>tester leurs capacités avec les jeux de données du groupe ;</li>
<li>définir les premiers scénarios concrets : analyse de performance commerciale, support aux équipes opérationnelles, automatisation de tâches analytiques récurrentes… ;</li>
<li>identifier les prérequis d’adoption à l’échelle du groupe ;</li>
<li>proposer une trajectoire réaliste d’industrialisation.</li>
</ul>
<p>Ce travail ouvre des perspectives enthousiasmantes : une donnée plus accessible, des analyses plus rapides, une démocratisation accrue de la BI, et une capacité nouvelle à créer de la valeur <strong>immédiate</strong>.</p>
<p>Les Data Agents ne sont pas seulement une fonctionnalité supplémentaire : ils représentent un nouveau mode d’interaction entre les équipes RAJA Group et leur patrimoine data.</p>
<p>C’est une évolution profonde, structurante, et que RAJA Group aborde avec lucidité, ambition et enthousiasme — toujours avec le soutien de Cellenza pour assurer des choix éclairés, responsables et alignés sur leur trajectoire data.</p>
<h2><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3a5.png" alt="🎥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Pour aller plus loin — la vidéo du projet</strong></h2>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong><a href="https://www.youtube.com/watch?v=J90Lkrmda18&amp;t=71s"><em>https://www.youtube.com/watch?v=J90Lkrmda18&amp;t=71s</em></a></strong></p>
<h3><strong>En bref — ce qu’il faut retenir</strong></h3>
<ul>
<li>Une <strong>trajectoire data</strong> construite sur mesure pour RAJA Group.</li>
<li>Une évaluation réaliste démontrant que <strong>Fabric correspondait parfaitement</strong> à l’organisation du groupe.</li>
<li>Un moteur d’intégration permettant d’ingérer <strong>26 ERP en trois mois</strong>.</li>
<li>Une <strong>courbe d’apprentissage remarquable</strong> des équipes RAJA Group.</li>
<li>Le <strong>Platform Engineering comme ADN Cellenza</strong>.</li>
<li>Des arbitrages maîtrisés malgré un produit en pleine évolution.</li>
<li>Une plateforme désormais orientée <strong>IA, Data Agents et transformation des usages</strong>.</li>
</ul>
<p>L’article <a href="https://blog.cellenza.com/data/comment-raja-a-construit-une-plateforme-data-unifiee-avec-microsoft-fabric/">Comment RAJA Group a construit une plateforme data unifiée avec Microsoft Fabric</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/data/comment-raja-a-construit-une-plateforme-data-unifiee-avec-microsoft-fabric/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154761</post-id>	</item>
		<item>
		<title>Considérations pour une Gateway partagée</title>
		<link>https://blog.cellenza.com/cloud-2/considerations-pour-une-gateway-partagee/</link>
					<comments>https://blog.cellenza.com/cloud-2/considerations-pour-une-gateway-partagee/#respond</comments>
		
		<dc:creator><![CDATA[David Frappart]]></dc:creator>
		<pubDate>Thu, 04 Dec 2025 07:30:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Cloud]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154583</guid>

					<description><![CDATA[<p>Dans la continuité des articles précédents sur la Kubernetes Gateway API, nous explorons aujourd’hui un aspect plus opérationnel de ce produit, en considérant nos options pour une vision partagée de la fonctionnalité. En effet, jusqu’ici, nous avons créé des Gateways selon nos besoins, et nous avons pu voir qu’il était facile d’ajouter des instances de [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/considerations-pour-une-gateway-partagee/">Considérations pour une Gateway partagée</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Dans la continuité des articles précédents sur la Kubernetes Gateway API, nous explorons aujourd’hui un aspect plus opérationnel de ce produit, en considérant nos options pour une vision partagée de la fonctionnalité.</p>



<p class="wp-block-paragraph">En effet, jusqu’ici, nous avons créé des <strong>Gateways </strong>selon nos besoins, et nous avons pu voir qu’il était facile d’ajouter des instances de celles-ci.</p>



<p class="wp-block-paragraph">Toutefois, comme pour tout objet facile à déployer, il peut être souhaitable d’en limiter le nombre.</p>



<p class="wp-block-paragraph">C’est à ceci que nous allons réfléchir dans cet article.</p>



<p class="wp-block-paragraph">L’agenda&nbsp;:</p>



<ul class="wp-block-list">
<li>Scénario pour une <strong>Gateway </strong>partagée</li>



<li>Configurer des <strong>HTTPRoutes </strong>et des <strong>Gateways </strong>pour plusieurs <strong>namespaces</strong></li>



<li>Configurer l’usage de <strong>Secrets </strong>pour les <strong>Gateways </strong>sur plusieurs <strong>namespaces</strong></li>



<li>Conclusion</li>
</ul>



<p class="wp-block-paragraph">&nbsp;</p>



<h2 class="wp-block-heading">1. Scénario pour une Gateway partagée</h2>



<h3 class="wp-block-heading">1.1. Réflexion sur le besoin d’une Gateway partagée</h3>



<p class="wp-block-paragraph">Jusqu’ici, comme nous l’avons évoqué en introduction, nous avons eu une approche distribuée dans l’usage de la Gateway API. C’est-à-dire que pour chaque périmètre, comme par exemple une application, nous avions une instance de <strong>Gateway </strong>dédiée, à laquelle étaient associées des <strong>HTTPRoutes</strong>, selon le besoin d’exposition de l’application.</p>



<p class="wp-block-paragraph">Bien que cela fonctionne sans problème, cette approche distribuée ne capitalise pas sur le modèle Role-Based de la Gateway API, et donne probablement trop de responsabilités à une équipe qui gèrerait uniquement son application.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="833" height="729" src="https://blog.cellenza.com/wp-content/uploads/2025/11/image.png" alt="" class="wp-image-154598" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/image.png 833w, https://blog.cellenza.com/wp-content/uploads/2025/11/image-600x525.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/image-768x672.png 768w" sizes="(max-width: 833px) 100vw, 833px" /></figure>



<p class="wp-block-paragraph">Si l’on part du postulat que le <strong>namespace </strong>représente une frontière de sécurité une fois les configurations RBAC souhaitées appliquées, déployer aussi bien la <strong>Gateway </strong>que la <strong>HTTPRoute </strong>n’est probablement pas souhaitable d’un point de vue sécurité. Après tout, la possibilité de créer une <strong>Gateway </strong>dans un Cloud-managed Kubernetes est équivalente à pouvoir créer un service exposé sur Internet.</p>



<p class="wp-block-paragraph">Du point de vue de la <strong>GatewayClass</strong>, par sa nature, la ségrégation par <strong>namespace </strong>n’aura pas d’impact sur la capacité d’une équipe à utiliser une classe plutôt qu’une autre.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="171" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-28-165639-1-1024x171.png" alt="Codes" class="wp-image-154603" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-28-165639-1-1024x171.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-28-165639-1-600x100.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-28-165639-1-768x128.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-28-165639-1.png 1285w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">En revanche, la <strong>Gateway </strong>est une ressource dite <em>namespaced</em>, et dans une approche <em>segragation of duties</em>, il fait sens de déployer celle-ci dans un <strong>namespace </strong>distinct de l’application, dont le management serait confié à une équipe différente, typiquement une équipe d’opérateurs de cluster, vs des équipes responsables d’applications, comme indiqué sur le schéma.</p>



<p class="wp-block-paragraph">On peut imaginer une organisation des ressources de la Gateway API comme ci-dessous&nbsp;:</p>



<ul class="wp-block-list">
<li>Un <strong>namespace</strong>, géré par des opérateurs de cluster, contenant la <strong>Gateway </strong>partagée, exposée sur le réseau externe.</li>
</ul>



<ul class="wp-block-list">
<li>Des namespaces gérés par des responsables d’applications, contenant les ressources associées à l’application, et notamment la <strong>HTTPRoute </strong>requise pour l’exposition.</li>
</ul>



<p class="wp-block-paragraph">Rappelons que nous pouvons ajouter des <strong>annotations </strong>applicables sur le <strong>Service </strong>sous-jacent à la <strong>Gateway </strong>pour faire de celle-ci une Internal <strong>Gateway</strong>.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="189" src="https://blog.cellenza.com/wp-content/uploads/2025/11/1-1024x189.png" alt="codage" class="wp-image-154605" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/1-1024x189.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-600x111.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-768x142.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/1.png 1202w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">En prenant ce point en compte, on pourrait envisager la mise en place d’admission controller qui contrôleraient ou forceraient l’application de la section <strong>spec</strong>.<strong>infrastructure</strong>.<strong>annotations </strong>sur une instance de <strong>Gateway</strong>. Mais nous garderons ce sujet pour un autre article.</p>



<p class="wp-block-paragraph">Enfin, à propos de l’usage de TLS, ce qui est absolument un prérequis pour le monde réel, nous pouvons voir que le certificat est référencé au niveau de la Gateway.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1036" height="488" src="https://blog.cellenza.com/wp-content/uploads/2025/11/2-1024x482.png" alt="codes" class="wp-image-154606" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/2-1024x482.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-600x283.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-768x362.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/2.png 1036w" sizes="auto, (max-width: 1036px) 100vw, 1036px" /></figure>



<p class="wp-block-paragraph">On remarque au passage l’existence d’un paramètre <strong>namespace </strong>dans la section <strong>certificateRegs</strong>, ce qui nous permet également d’envisager l’usage d’un <strong>namespace </strong>dédié pour les Secrets associés aux certificats permettant la configuration TLS. Auquel cas, il s’agirait encore d’un <strong>namespace </strong>géré par une équipe d’opérateurs de cluster, voire d’une équipe SecOps en charge de la gestion des certificats.</p>



<h3 class="wp-block-heading">1.2. Un mot sur l’environnement de lab</h3>



<p class="wp-block-paragraph">Avant de nous plonger dans le cœur de notre sujet, un mot sur l’environnement de lab utilisé dans cet article.</p>



<p class="wp-block-paragraph">En lieu et place d’un cluste AKS, nous utiliserons un kubernetes single node de type kubeadm, créé à l’aide de Vagrant.</p>



<p class="wp-block-paragraph">Le VagrantFile est défini comme ci-dessous.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="812" src="https://blog.cellenza.com/wp-content/uploads/2025/11/33-1024x812.png" alt="GatewayClass " class="wp-image-154610" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/33-1024x812.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/33-600x476.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/33-768x609.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/33.png 1284w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Un <a href="https://github.com/dfrappart/k8slocal"><strong>repo Github</strong></a> est disponible pour les «&nbsp;jusqu’auboutistes&nbsp;» qui voudraient manipuler eux-mêmes.</p>



<p class="wp-block-paragraph">La <strong>GatewayClass </strong>dédiée suivante est créée.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="427" src="https://blog.cellenza.com/wp-content/uploads/2025/11/44-1024x427.png" alt="GatewayClass" class="wp-image-154609" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/44-1024x427.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/44-600x250.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/44-768x320.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/44.png 1074w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Avec la CRD Cilium associée pour permettre l’usage d’un service <strong>NodePort</strong>, en l’absence d’un LoadBalancer disponible dans notre environnement local.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="860" height="322" src="https://blog.cellenza.com/wp-content/uploads/2025/11/555.png" alt="Gateway" class="wp-image-154614" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/555.png 860w, https://blog.cellenza.com/wp-content/uploads/2025/11/555-600x225.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/555-768x288.png 768w" sizes="auto, (max-width: 860px) 100vw, 860px" /></figure>



<p class="wp-block-paragraph">Pour simuler une application, nous utilisons un <strong>Deployment </strong>basé sur nginx, customisé avec une <strong>Configmap </strong>dans la configuration du <strong>Pod</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="870" height="1024" src="https://blog.cellenza.com/wp-content/uploads/2025/11/7-870x1024.png" alt="" class="wp-image-154616" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/7-870x1024.png 870w, https://blog.cellenza.com/wp-content/uploads/2025/11/7-510x600.png 510w, https://blog.cellenza.com/wp-content/uploads/2025/11/7-768x904.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/7-1200x1412.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/11/7.png 1280w" sizes="auto, (max-width: 870px) 100vw, 870px" /></figure>



<p class="wp-block-paragraph">Exposer cette application, avec une approche distribuée nécessiterait la création d’une <strong>Gateway</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="938" height="438" src="https://blog.cellenza.com/wp-content/uploads/2025/11/8.png" alt="" class="wp-image-154617" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/8.png 938w, https://blog.cellenza.com/wp-content/uploads/2025/11/8-600x280.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/8-768x359.png 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></figure>



<p class="wp-block-paragraph">et d’une <strong>HTTPRoute</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="940" height="900" src="https://blog.cellenza.com/wp-content/uploads/2025/11/9.png" alt="" class="wp-image-154618" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/9.png 940w, https://blog.cellenza.com/wp-content/uploads/2025/11/9-600x574.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/9-768x735.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>



<p class="wp-block-paragraph">Puisque nous sommes sur un cluster single-node, nous nous appuyons sur la gateway-class-config pour faire de notre <strong>Service </strong>sous-jacent à la <strong>Gateway </strong>un <strong>NodePort</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="199" src="https://blog.cellenza.com/wp-content/uploads/2025/11/10-1024x199.png" alt="" class="wp-image-154621" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/10-1024x199.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/10-600x117.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/10-768x149.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/10.png 1152w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Si la <strong>Gateway </strong>est bien configurée pour un accès externe, nous obtenons un résultat similaire avec la commande <strong>curl</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="583" src="https://blog.cellenza.com/wp-content/uploads/2025/11/11-1024x583.png" alt="" class="wp-image-154622" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/11-1024x583.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/11-600x341.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/11-768x437.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/11-1200x683.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/11/11.png 1290w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Cependant, nous ne sommes pas à ce stade dans une approche partagée.</p>



<p class="wp-block-paragraph">&nbsp;</p>



<h2 class="wp-block-heading">2. Configurer des HTTPRoutes et des Gateways sur plusieurs namespaces</h2>



<h3 class="wp-block-heading">2.1. Observation des propriétés de la Gateway</h3>



<p class="wp-block-paragraph">Pour commencer, étudions un peu les spécifications de la Gateway API.</p>



<p class="wp-block-paragraph">L’on peut trouver dans la description de <a href="https://gateway-api.sigs.k8s.io/reference/spec/#listener">spec.listeners</a> un paramètre appelé <strong>allowedRoutes</strong>, qui contient un champ <strong>namespaces</strong>. Sa valeur par défaut, comme affiché dans le tableau ci-après est <strong>Same</strong>, ce qui signifie donc que les <strong>HTTPRoutes </strong>acceptées par une <strong>Gateway </strong>par défaut sont celles dans le même <strong>namespace</strong>.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Field</td><td>Description</td><td>Default</td></tr><tr><td><strong>namespaces</strong></td><td>Namespaces indicates namespaces from which Routes may be attached to this Listener. This is restricted to the namespace of this Gateway by default.</td><td>{ from:Same }</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">En suivant les liens de la documentation, on trouve ensuite les valeurs acceptées pour ce champ <strong>namespaces</strong>.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Field</td><td>Description</td></tr><tr><td><strong>All</strong></td><td>Routes/ListenerSets in all namespaces may be attached to this Gateway.</td></tr><tr><td><strong>Selector</strong></td><td>Only Routes/ListenerSets in namespaces selected by the selector may be attached to this Gateway.</td></tr><tr><td><strong>Same</strong></td><td>Only Routes/ListenerSets in the same namespace as the Gateway may be attached to this Gateway.</td></tr><tr><td><strong>None</strong></td><td>No Routes/ListenerSets may be attached to this Gateway.</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Ceci étant vu, créons à présent une nouvelle <strong>Gateway</strong>, dans son propre <strong>namespace</strong>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="887" height="444" src="https://blog.cellenza.com/wp-content/uploads/2025/11/12-1.png" alt="" class="wp-image-154628" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/12-1.png 887w, https://blog.cellenza.com/wp-content/uploads/2025/11/12-1-600x300.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/12-1-768x384.png 768w" sizes="auto, (max-width: 887px) 100vw, 887px" /></figure>



<p class="wp-block-paragraph">On obtient les objets suivants après création.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="247" src="https://blog.cellenza.com/wp-content/uploads/2025/11/13-1024x247.png" alt="" class="wp-image-154626" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/13-1024x247.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/13-600x145.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/13-768x185.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/13-1200x290.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/11/13.png 1202w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">En mettant à jour notre HTTPRoute créée précédemment, de la manière suivante&nbsp;:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="892" height="188" src="https://blog.cellenza.com/wp-content/uploads/2025/11/1-1.png" alt="" class="wp-image-154634" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/1-1.png 892w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-1-600x126.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-1-768x162.png 768w" sizes="auto, (max-width: 892px) 100vw, 892px" /></figure>



<p class="wp-block-paragraph">On obtient le statut suivant.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="729" src="https://blog.cellenza.com/wp-content/uploads/2025/11/2-1-1024x729.png" alt="" class="wp-image-154635" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/2-1-1024x729.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-1-600x427.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-1-768x547.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-1-1200x854.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-1.png 1290w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Ce qui est prévisible, puisqu’à ce stade, nous n’avons pas modifié la valeur par défaut du paramètre <strong>allowedRoutes</strong>. Modifions notre <strong>Gateway </strong>pour qu’elle accepte les <strong>HTTPRoutes </strong>depuis tous les <strong>namespaces</strong>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="794" height="152" src="https://blog.cellenza.com/wp-content/uploads/2025/11/3.png" alt="" class="wp-image-154637" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/3.png 794w, https://blog.cellenza.com/wp-content/uploads/2025/11/3-600x115.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/3-768x147.png 768w" sizes="auto, (max-width: 794px) 100vw, 794px" /></figure>



<p class="wp-block-paragraph">Une fois la modification faite, le statut de notre <strong>HTTPRoute </strong>passe à <strong>Accepted</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="765" src="https://blog.cellenza.com/wp-content/uploads/2025/11/4-1024x765.png" alt="" class="wp-image-154638" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/4-1024x765.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/4-600x448.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/4-768x574.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/4-400x300.png?crop=1 400w, https://blog.cellenza.com/wp-content/uploads/2025/11/4-200x150.png?crop=1 200w, https://blog.cellenza.com/wp-content/uploads/2025/11/4.png 1164w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Et une commande <strong>curl </strong>nous permet d’accéder à notre <strong>Service </strong>derrière la <strong>Gateway</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="286" src="https://blog.cellenza.com/wp-content/uploads/2025/11/55-1024x286.png" alt="" class="wp-image-154640" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/55-1024x286.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/55-600x168.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/55-768x215.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/55-1200x335.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/11/55.png 1288w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Toutefois, autoriser tous les <strong>namespaces </strong>est peut-être un peu trop. Voyons comment utiliser le paramètre <strong>Selector </strong>afin d’être plus sélectif sur les <strong>namespaces </strong>cibles.</p>



<p class="wp-block-paragraph">Le <strong>namespace gundam</strong> contient les labels ci-après.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="156" src="https://blog.cellenza.com/wp-content/uploads/2025/11/66-1024x156.png" alt="" class="wp-image-154642" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/66-1024x156.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/66-600x92.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/66-768x117.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/66.png 1100w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Nous pouvons donc modifier notre <strong>Gateway </strong>comme ci-après pour cibler uniquement ce <strong>namespace</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="311" src="https://blog.cellenza.com/wp-content/uploads/2025/11/77-1024x311.png" alt="" class="wp-image-154643" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/77-1024x311.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/77-600x182.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/77-768x233.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/77.png 1060w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Le statut de notre <strong>HTTProute </strong>ne change pas, puisqu’elle remplit toujours les conditions requises par la <strong>Gateway</strong>.</p>



<p class="wp-block-paragraph">Ajoutons une nouvelle application, dans un autre <strong>namespace </strong>appelé <strong>demoapp</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="464" src="https://blog.cellenza.com/wp-content/uploads/2025/11/1-2-1024x464.png" alt="" class="wp-image-154645" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/1-2-1024x464.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-2-600x272.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-2-768x348.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-2-1200x544.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/11/1-2.png 1266w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Ainsi que sa <strong>HTTPRoute </strong>associée.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1012" height="774" src="https://blog.cellenza.com/wp-content/uploads/2025/11/2-2.png" alt="" class="wp-image-154647" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/2-2.png 1012w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-2-600x459.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/2-2-768x587.png 768w" sizes="auto, (max-width: 1012px) 100vw, 1012px" /></figure>



<p class="wp-block-paragraph">Le statut nous indique ce que l‘on attend, à savoir que la <strong>HTTPRoute </strong>n’est pas acceptée en l’état par la <strong>Gateway</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="116" src="https://blog.cellenza.com/wp-content/uploads/2025/12/3-1-1024x116.png" alt="" class="wp-image-154651" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/3-1-1024x116.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-1-600x68.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-1-768x87.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-1-1200x136.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-1.png 1292w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Pour configurer la <strong>Gateway </strong>pour accepter une liste de <strong>namespaces</strong>, on doit comprendre que par défaut, le champ <strong>matchLabels </strong>utilisé agit comme un <strong>AND</strong>. Ce qui signifie qu’ajouter d’autres <strong>namespaces </strong>comme ci-après indique à la <strong>Gateway </strong>de n’accepter que les <strong>HTTPRoutes </strong>dont les <strong>namespaces </strong>ont tous les labels spécifiés. Ce qui n’est pas possible dans notre cas, où nous utilisons un label reprenant le nom de chaque <strong>namespace</strong>.</p>



<p class="wp-block-paragraph">Pour utiliser l’équivalent du <strong>OR</strong> dans un yaml kubernetes, nous utilisons la syntaxe suivante.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="235" src="https://blog.cellenza.com/wp-content/uploads/2025/12/4-1024x235.png" alt="" class="wp-image-154654" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/4-1024x235.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/12/4-600x138.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/4-768x176.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/4-1200x275.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/12/4.png 1282w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">De cette manière, nous pouvons sélectionner plusieurs <strong>namespaces </strong>en nous appuyant sur le label <strong>kubernetes.io/metadata.name</strong> et en spécifiant une liste de valeurs acceptées.</p>



<p class="wp-block-paragraph">Nous savons à présent comment gérer une Gateway partagée. Passons maintenant à la gestion du TLS.</p>



<h2 class="wp-block-heading">3. Configurer l’usage de Secrets pour les Gateways sur plusieurs namespaces</h2>



<p class="wp-block-paragraph">Dans le cadre de la Gateway API, le certificat est géré au niveau de la <strong>Gateway</strong>. Le champ <strong>listerneters[].protocol</strong> doit être configuré avec la valeur <strong>HTTPS </strong>et le <strong>listeners[].port avec 443</strong>.</p>



<p class="wp-block-paragraph">De plus, la section tls contient les informations relatives au certificat.</p>



<p class="wp-block-paragraph">Une Gateway configurée avec un listener utilisant tls avec un <strong>Secret </strong>ressemble à ceci.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="976" src="https://blog.cellenza.com/wp-content/uploads/2025/12/55-1024x976.png" alt="" class="wp-image-154659" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/55-1024x976.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/12/55-600x572.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/55-768x732.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/55-1200x1144.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/12/55.png 1282w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Référencer le <strong>Secret </strong>de cette manière implique que celui-ci est dans le même <strong>namespace </strong>que la <strong>Gateway</strong>, comme indiqué dans l’extrait de la documentation ci-après.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Field</td><td>Description</td><td>Default</td></tr><tr><td><strong>group</strong></td><td>Group is the group of the referent. For example, « gateway.networking.k8s.io ». When unspecified or empty string, core API group is inferred.</td><td>&nbsp;</td></tr><tr><td><strong>kind</strong></td><td>Kind is kind of the referent. For example « Secret ».</td><td><strong>Secret</strong></td></tr><tr><td><strong>name</strong></td><td>Name is the name of the referent.</td><td>&nbsp;</td></tr><tr><td><strong>namespace</strong></td><td>Namespace is the namespace of the referenced object. When unspecified, the local namespace is inferred. Note that when a namespace different than the local namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace&rsquo;s owner to accept the reference. See the `<strong>ReferenceGrant</strong>` documentation for details.</td><td>&nbsp;</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Pour réaliser nos tests, nous allons créer un <strong>namespace </strong>supplémentaire, et recréer le <strong>Secret </strong>associé à notre certificat dans ce même <strong>namespace</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="548" src="https://blog.cellenza.com/wp-content/uploads/2025/12/1-1024x548.png" alt="" class="wp-image-154662" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/1-1024x548.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/12/1-600x321.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/1-768x411.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/1.png 1196w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Puis nous ajoutons le champ <strong>namespace </strong>dans le listener de la <strong>Gateway</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="267" src="https://blog.cellenza.com/wp-content/uploads/2025/12/2-1024x267.png" alt="" class="wp-image-154664" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/2-1024x267.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/12/2-600x156.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/2-768x200.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/2.png 1074w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">En regardant le statut de notre <strong>HTTPRoute</strong>, nous voyons que la référence à notre certificat n’est pas autorisée.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="929" height="1024" src="https://blog.cellenza.com/wp-content/uploads/2025/12/3-3-929x1024.png" alt="" class="wp-image-154666" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/3-3-929x1024.png 929w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-3-544x600.png 544w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-3-768x847.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-3-1200x1323.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/12/3-3.png 1268w" sizes="auto, (max-width: 929px) 100vw, 929px" /></figure>



<p class="wp-block-paragraph">Ce à quoi nous nous attendions. Il nous faut utiliser un autre objet de la Gateway API : le <strong>ReferenceGrant</strong>.</p>



<p class="wp-block-paragraph">Cet objet permet de spécifier quels objets peuvent faire références à quels autres objets. Concrètement, quels Secrets une Gateway peut utiliser.</p>



<p class="wp-block-paragraph">Dans notre cas, on ajoute donc un <strong>ReferenceGrant </strong>dans le <strong>namespace </strong>de notre Secret, et indiquons que celui-ci peut être référencé par la <strong>Gateway</strong> dans le <strong>namespace ciliumgateway</strong>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1004" height="552" src="https://blog.cellenza.com/wp-content/uploads/2025/12/44.png" alt="" class="wp-image-154669" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/44.png 1004w, https://blog.cellenza.com/wp-content/uploads/2025/12/44-600x330.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/44-768x422.png 768w" sizes="auto, (max-width: 1004px) 100vw, 1004px" /></figure>



<p class="wp-block-paragraph">Une commande <strong>curl </strong>nous permettra à présent d’atteindre avec succès nos applications exposées derrière notre nouvelle <strong>Gateway </strong>partagée, avec un certificat référencé dans un <strong>Secret</strong>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="930" src="https://blog.cellenza.com/wp-content/uploads/2025/12/55-1-1024x930.png" alt="" class="wp-image-154671" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/55-1-1024x930.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/12/55-1-600x545.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/55-1-768x698.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/55-1-1200x1090.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/12/55-1.png 1290w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="706" src="https://blog.cellenza.com/wp-content/uploads/2025/12/66-1024x706.png" alt="" class="wp-image-154672" srcset="https://blog.cellenza.com/wp-content/uploads/2025/12/66-1024x706.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/12/66-600x414.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/12/66-768x530.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/12/66-1200x827.png 1200w, https://blog.cellenza.com/wp-content/uploads/2025/12/66.png 1282w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Il est à présent temps de conclure.</p>



<h1 class="wp-block-heading">Conclusion</h1>



<p class="wp-block-paragraph">Toujours dans l’usage de la Gateway API, nous avons cette fois ci exploré la mise en œuvre et l’usage d’une <strong>Gateway </strong>partagée.</p>



<p class="wp-block-paragraph">Il ressort que l’on peut sans trop de difficultés définir quels <strong>namespaces </strong>peuvent être autorisés à utiliser une <strong>Gateway</strong>.</p>



<p class="wp-block-paragraph">Il est également possible de séparer la gestion des Secrets utilisés pour les certificats et le trafic TLS en s’appuyant sur un <strong>ReferenceGrant</strong>.</p>



<p class="wp-block-paragraph">L’ensemble de ces fonctionnalités étant en GA dans la Gateway API, il reste à présent à sélectionner un provider de Gateway API pour pouvoir mettre en œuvre tout ceci et sortir de l’Ingress Controller.</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/considerations-pour-une-gateway-partagee/">Considérations pour une Gateway partagée</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/cloud-2/considerations-pour-une-gateway-partagee/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154583</post-id>	</item>
		<item>
		<title>Toujours à propos de la Kubernetes Gateway API</title>
		<link>https://blog.cellenza.com/cloud-2/toujours-a-propos-de-la-kubernetes-gateway-api/</link>
					<comments>https://blog.cellenza.com/cloud-2/toujours-a-propos-de-la-kubernetes-gateway-api/#respond</comments>
		
		<dc:creator><![CDATA[David Frappart]]></dc:creator>
		<pubDate>Thu, 20 Nov 2025 07:30:35 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154488</guid>

					<description><![CDATA[<p>Bonjour   !   Dans un article précédent, l’attention était porté sur la GatewayClass, et la Gateway, deux objets de l’API de la… Gateway API. L’analyse s’est arrêtée avant de réellement répondre à la question de l’exposition d’application.  Ce nouvel article, poursuit l’exploration des objets relatifs à la Gateway API et nous attaquons plus précisément comment exposer les applications, avec la HTTPRoute.  L’agenda :   Introduction à la  HTTPRoute  Ajouter la prise en [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/toujours-a-propos-de-la-kubernetes-gateway-api/">Toujours à propos de la Kubernetes Gateway API</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span data-contrast="auto">Bonjour   ! </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Dans un article précédent, l’attention était porté sur la </span><span data-contrast="none">GatewayClass</span><span data-contrast="auto">, et la </span><span data-contrast="none">Gateway</span><span data-contrast="auto">, deux objets de l’API de la… Gateway API. L’analyse s’est arrêtée avant de réellement répondre à la question de l’exposition d’application.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Ce nouvel article, poursuit l’exploration des objets relatifs à la Gateway API et nous attaquons plus précisément comment exposer les applications, avec la </span><span data-contrast="none">HTTPRoute</span><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">L’agenda : </span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Introduction à la  </span><span data-contrast="none">HTTPRoute</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Ajouter la prise en charge de TLS</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Conclusion</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Pour rappel,  une </span><span data-contrast="none">GatewayClass</span><span data-contrast="auto">, et quelques </span><span data-contrast="none">Gateways ont été crées</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Ce qui a ppermisd’identifier la possibilité de passer des annotations au </span><span data-contrast="none">Service</span><span data-contrast="auto"> kubernetes créé avec la Gateway, à travers la propriété </span><span data-contrast="none">spec.infrastructure.annotations</span><span data-contrast="auto">. Bien qu’il soit possible, dans le cas de la Gateway API Cilium, d’utiliser la crd spécifique pour customiser la </span><span data-contrast="none">GatewayClass</span><span data-contrast="auto">, nous avons finalement utilisé la propriété au niveau de la </span><span data-contrast="none">Gateway</span><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">A ce stade, le manifest yaml de la</span><span data-contrast="none">Gateway</span><span data-contrast="auto">  prends la forme suivante</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154490 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135112-600x282.png" alt="" width="600" height="282" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135112-600x282.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135112-768x361.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135112.png 974w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Et nous utilisons les capacités d’Azure pour avoir un load balancer de type internal avec un manifest comme ci-dessous :</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154491 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135436-600x339.png" alt="" width="600" height="339" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135436-600x339.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135436-768x434.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135436.png 979w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>A présent, regardons comment effectivement gérer l’exposition de nos applications.</p>
<h1>1. Introduction à la HTTPRoute</h1>
<h4>1.1. Les bases</h4>
<p>L’exposition d’application dans Kubernetes est donc réalisée avec un objet appelé HTTPRoute.</p>
<p>Considérons une application basée sur un simple Deployment, ainsi qu’un Service :</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154493 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135634-600x335.png" alt="" width="600" height="335" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135634-600x335.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135634-768x428.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135634.png 977w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154494 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135835-600x428.png" alt="" width="600" height="428" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135835-600x428.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135835-768x548.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-135835.png 972w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154497 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140207-600x498.png" alt="" width="600" height="498" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140207-600x498.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140207-768x638.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140207.png 813w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Avec un Service de type ClusterIP, l’application n’est accessible que depuis l’intérieur du cluster.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154499 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140354-600x298.png" alt="" width="600" height="298" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140354-600x298.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140354-768x382.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140354.png 974w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Ajoutons une HTTPRoute.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154500 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140512-600x298.png" alt="" width="600" height="298" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140512-600x298.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140512-768x382.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140512.png 978w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Dans la section hostnames,un nom d’hôte doit être spécifié et résolvable d’un point de vue DNS. Dans le cas présent, un enregistrement est utilisé sur une Azure DNS zone. Cette étape n’est pas détaillée, puisque c’est un peu hors sujet.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154502 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140628-600x224.png" alt="" width="600" height="224" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140628-600x224.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140628-768x287.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140628.png 964w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Depuis un navigateur, le résultat est le suivant.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154503 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Image20-595x600.png" alt="" width="595" height="600" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Image20-595x600.png 595w, https://blog.cellenza.com/wp-content/uploads/2025/11/Image20-150x150.png?crop=1 150w, https://blog.cellenza.com/wp-content/uploads/2025/11/Image20.png 643w" sizes="auto, (max-width: 595px) 100vw, 595px" /></p>
<p>Ajoutons à présent quelques services à notre application, et voyons comment nous pouvons gérer cela.</p>
<h4>1.2. Gestion de path avec la HTTPRoute</h4>
<p>Avant de d’aborder dans ce sujet, prenons un peu de recul.</p>
<p>Avec un Nginx Ingress Controller,pour exposer, disons, 3 services,</p>
<p>un Ingress est défini de la manière suivante :</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154505 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140954-600x429.png" alt="" width="600" height="429" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140954-600x429.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140954-768x549.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-140954.png 984w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154508 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141319-600x250.png" alt="" width="600" height="250" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141319-600x250.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141319-768x320.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141319.png 980w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Sous réserve que les services existent, (et les deployments associés), lacommande curl devrait produire le résultat suivant</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154510 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141551-600x442.png" alt="" width="600" height="442" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141551-600x442.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141551-768x566.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141551.png 879w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154511 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141736-600x407.png" alt="" width="600" height="407" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141736-600x407.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141736-768x521.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-141736.png 890w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154512 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142010-600x494.png" alt="" width="600" height="494" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142010-600x494.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142010-768x632.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142010.png 802w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Mais la partie la plus intéressante ici est l’annotation ‘nginx.ingress.kubernetes.io/rewrite-target: /’ qui, comme on peut le supposer, ré-écrit les path depuis l’ingress vers le path ‘/’.</p>
<p>Tentons d’obtenir un résultat similaire avec une HTTPRoute.</p>
<p>Quelques deployments et services supplémentaires ont été crées.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154514 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142238-600x390.png" alt="" width="600" height="390" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142238-600x390.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142238-768x499.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142238.png 927w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>L’objectif est d’exposer l’application barbatos via une HTTPRoute. une règle supplémentaire est ajoutée dans la section spec.rules.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154515 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142349-600x180.png" alt="" width="600" height="180" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142349-600x180.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142349-768x231.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142349.png 922w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Est-ce que cela fonctionne ?</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154516 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142456-600x177.png" alt="" width="600" height="177" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142456-600x177.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142456-768x227.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142456.png 931w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Une réponse Not Found est obtenue d’un pod nginx constituant l’application. Ce qui est au demeurant logique, puisque qu’aucune ré-écriture du path n’a été spécifié. Le trafic est donc dirigé vers les pods de l’application sur le path /barbatos, alors que les pods en question ne servent que le path ‘/’.</p>
<p>Il est possible de confirmer cette affirmation en regardant les logs du pod correspondant.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154519 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142755-600x428.png" alt="" width="600" height="428" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142755-600x428.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142755-768x548.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-142755.png 920w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154520 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143106-600x142.png" alt="" width="600" height="142" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143106-600x142.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143106-768x182.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143106.png 925w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>La documentation de l’API de la HTTPRoute est consultée afin de trouver une solution.</p>
<p>Dans la section spec.rules, nous avons déjà ajouté une section matches, qui contient notre path cible.</p>
<p>La documentation de la HTTPRoute, mentionne l’existence d’une section filters qui peut être ajouter. Plus spécifiquement, le type URLRewrite présente un intérêt particulier.</p>
<table>
<tbody>
<tr>
<td width="160">Field</td>
<td width="160">Description</td>
<td width="160">Default</td>
<td width="160">Validation</td>
</tr>
<tr>
<td width="160">type</td>
<td width="160">Type defines the type of path modifier.</td>
<td width="160">Enum: [ReplaceFullPath ReplacePrefixMatch]</td>
<td width="160">&nbsp;</td>
</tr>
<tr>
<td width="160">replaceFullPath</td>
<td width="160">Specifies the value with which to replace the full path of a request during a rewrite or redirect.</td>
<td width="160">&nbsp;</td>
<td width="160">MaxLength: 1024</td>
</tr>
<tr>
<td width="160">replacePrefixMatch</td>
<td width="160">Specifies the value with which to replace the prefix match of a request during a rewrite or redirect.</td>
<td width="160">&nbsp;</td>
<td width="160">MaxLength: 1024</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Dans notre cas, nous allons donc utiliser ces propriétés pour modifier notre path avec :</p>
<ul>
<li>Un type avec la valeur ReplacePrefixMatch</li>
<li>La propriété ReplacePrefixMatch configurée avec la valeur ‘/’ pour remplacer le path de la HTTPRoute vers le path ‘/’ sur le container.</li>
</ul>
<p>Ce qui nous donne le résultat ci-après.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154522 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143243-600x139.png" alt="" width="600" height="139" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143243-600x139.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143243-768x178.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143243.png 934w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Et une HTTPRoute fonctionnelle sur l’url <a href="http://gundam.app.teknews.cloud/barbatos">http://gundam.app.teknews.cloud/barbatos</a>.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154523 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Image21-534x600.png" alt="" width="534" height="600" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Image21-534x600.png 534w, https://blog.cellenza.com/wp-content/uploads/2025/11/Image21.png 643w" sizes="auto, (max-width: 534px) 100vw, 534px" /></p>
<p>Le lecteur attentif (ou l’utilisateur d’Ingress expérimenté) aura remarqué que la configuration pour la ré-écriture du path est ici gérée pour chaque backend. Ce n’était pas forcément le cas avec un Ingress Controller, qui s’appuyait sur des annotations au niveau de l’Ingress, comme pour Nginx avec ‘nginx.ingress.kubernetes.io/rewrite-target: /’ que nous avons utilisé plus haut.</p>
<p>On peut donc noter que si la configuration de rewrite est peut etre un peu plus complexe, elle permet d’être également plus granulaire que dans le cas d’un Ingress.</p>
<p>Avant de passer à la gestion du TLS, observons la notion de gestion du poids.</p>
<h4>1.3. Gérer le poids avec une HTTPRoute</h4>
<p>Cette fonctionnalité a été abordé dans un article précédemment : la HTTPRoute peut nativement gérer le poids entres différents backend.</p>
<p>En recherchant dans la documentation, nous pouvons trouver la propriété spec.rules.backendRefs.weigh.</p>
<table>
<tbody>
<tr>
<td width="94">Field</td>
<td width="255">Description</td>
<td width="132">Default</td>
<td width="160">Validation</td>
</tr>
<tr>
<td width="94">weight</td>
<td width="255">Weight specifies the proportion of requests forwarded to the referenced backend. This is computed as weight/(sum of all weights in this BackendRefs list).</td>
<td width="132">1</td>
<td width="160">Max 1e+06</p>
<p>Min 0</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>En transposant cette propriété dans une HTTPRoute, nous obtenons une configuration comme ci-après.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154527 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143550-600x386.png" alt="" width="600" height="386" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143550-600x386.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143550-768x494.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-143550.png 932w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>L’équilibrage se vérifie à l’aide d’une simple commande bash.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154528 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144111-600x195.png" alt="" width="600" height="195" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144111-600x195.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144111-768x249.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144111.png 924w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Ici,  la répartition de poids est d’environ 50/50.</p>
<p>En modifiant la configuration comme ceci :</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154529 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144215-600x211.png" alt="" width="600" height="211" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144215-600x211.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144215-768x271.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144215.png 931w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>La répartition devient beaucoup plus déséquilibrée comme attendu par les poids des backends respectifs.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154532 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144400-600x163.png" alt="" width="600" height="163" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144400-600x163.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144400-768x208.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144400.png 925w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Le sujet est à présent terminé. Passons à la gestion de TLS</p>
<h1>2. Ajouter la prise en charge de TLS</h1>
<h4>2.1. Considérations pour l’usage de TLS avec la Gateway API</h4>
<p>Comme pour les parties précédentes,  la documentation de la <a href="https://gateway-api.sigs.k8s.io/guides/tls/">Gateway Api</a> sert de référence</p>
<p>Depuis le point de vue de la Gateway, :</p>
<ul>
<li>La connexion downstream, qui a lieu entre le client et la Gateway</li>
<li>La connexion upstream, qui a lieu entre la Gateway et le Service en backend.</li>
</ul>
<p><img loading="lazy" decoding="async" class=" wp-image-154534 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Image22-600x231.png" alt="" width="600" height="231" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Image22-600x231.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Image22-1024x394.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/Image22-768x296.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Image22.png 1472w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>De ce point de vue, la gestion de la connectivité avec TLS, plus exactement avec HTTPS, est limitée, dans le cas de la HTTPRoute, a une terminaison TLS au niveau de la Gateway.</p>
<p>On notera que ce n’est pas l’unique scenario, comme le résume le tableau ci-après.</p>
<p>Dans cette section, nous nous limiterons toutefois à l’usage de la HTTPRoute et donc au scénario de terminaison TLS sur la Gateway.</p>
<p>&nbsp;</p>
<p><strong>Note</strong><em> : On utilisera ici TLS ou HTTPS de manière interchangeable, bien que les deux ne soient pas tout à fait équivalent. Ici, TLS avec </em>HTTPRoute<em> est forcément avec HTTPS.</em></p>
<p>&nbsp;</p>
<table>
<tbody>
<tr>
<td width="214">Listener Protocol</td>
<td width="214">TLS Mode</td>
<td width="214">Route Type supported</td>
</tr>
<tr>
<td width="214">TLS</td>
<td width="214">Passthrough</td>
<td width="214">TLSRoute</td>
</tr>
<tr>
<td width="214">TLS</td>
<td width="214">Terminate</td>
<td width="214">TCPRoute</td>
</tr>
<tr>
<td width="214">HTTPS</td>
<td width="214">Terminate</td>
<td width="214">HTTPRoute</td>
</tr>
<tr>
<td width="214">gRPC</td>
<td width="214">Terminate</td>
<td width="214">GRPCRoute</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Regardons à présent comment effectivement configurer HTTPS sur notre HTTPRoute.</p>
<p>&nbsp;</p>
<h2>2.2 Configuration de HTTPS</h2>
<p>&nbsp;</p>
<p>La configuration TLS est réalisée en premier lieu au niveau de la Gateway.</p>
<p>&nbsp;</p>
<p>La documentation de la Gateway foiurnit des informations sur le paramètre spec.listeners.tls.</p>
<p>&nbsp;</p>
<table width="642">
<tbody>
<tr>
<td width="141">Field</td>
<td width="258">Description</td>
<td width="92">Default</td>
<td width="151">Validation</td>
</tr>
<tr>
<td width="141">mode</td>
<td width="258">Mode defines the TLS behavior for the TLS session initiated by the client. There are two possible modes:</p>
<p>&#8211; Terminate: The TLS session between the downstream client and the Gateway is terminated at the Gateway. This mode requires certificates to be specified in some way, such as populating the certificateRefs field.</p>
<p>&#8211; Passthrough: The TLS session is NOT terminated by the Gateway. This implies that the Gateway can&rsquo;t decipher the TLS stream except for the ClientHello message of the TLS protocol. The certificateRefs field is ignored in this mode.</td>
<td width="92">Terminate</td>
<td width="151">Enum: [Terminate Passthrough]</td>
</tr>
<tr>
<td width="141">certificateRefs</td>
<td width="258">CertificateRefs contains a series of references to Kubernetes objects that contains TLS certificates and private keys.</p>
<p>These certificates are used to establish a TLS handshake for requests that match the hostname of the associated listener.</p>
<p>A single CertificateRef to a Kubernetes Secret has « Core » support.</p>
<p>Implementations MAY choose to support attaching multiple certificates to a Listener, but this behavior is implementation-specific.</p>
<p>References to a resource in different namespace are invalid UNLESS there is a ReferenceGrant in the target namespace that allows the certificate to be attached.</p>
<p>If a ReferenceGrant does not allow this reference, the « ResolvedRefs » condition MUST be set to False for this listener with the « RefNotPermitted » reason.</p>
<p>This field is required to have at least one element when the mode is set to « Terminate » (default) and is optional otherwise.</p>
<p>CertificateRefs can reference to standard Kubernetes resources, i.e. Secret, or implementation-specific custom resources.</td>
<td width="92">&nbsp;</td>
<td width="151">MaxItems: 64</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Puis sur l’objet enfant spec.listenrers.tls.certificateRefs.</p>
<p>&nbsp;</p>
<table width="642">
<tbody>
<tr>
<td width="100">Field</td>
<td width="278">Description</td>
<td width="103">Default</td>
<td width="161">Validation</td>
</tr>
<tr>
<td width="100">group</td>
<td width="278">Group is the group of the referent. For example, « gateway.networking.k8s.io ». When unspecified or empty string, core API group is inferred.</td>
<td width="103">&nbsp;</td>
<td width="161">MaxLength: 253</p>
<p>&nbsp;</td>
</tr>
<tr>
<td width="100">kind</td>
<td width="278">Kind is kind of the referent. For example « Secret ».</td>
<td width="103">Secret</td>
<td width="161">MaxLength: 63</p>
<p>MinLength: 1</td>
</tr>
<tr>
<td width="100">name</td>
<td width="278">Name is the name of the referent.</td>
<td width="103">&nbsp;</td>
<td width="161">&nbsp;</td>
</tr>
<tr>
<td width="100">namespace</td>
<td width="278">Namespace is the namespace of the referenced object. When unspecified, the localnamespace is inferred.</p>
<p>Note that when a namespace different than the local namespace is specified, a ReferenceGrant object is required in the referent namespace to allow that namespace&rsquo;s owner to accept the reference.</td>
<td width="103">&nbsp;</td>
<td width="161">MaxLength: 63</p>
<p>MinLength: 1</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Ce qui permet de définir une configuration comme ci-dessous :</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154536 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144658-600x443.png" alt="" width="600" height="443" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144658-600x443.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144658-768x567.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144658.png 922w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154537 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144804-600x140.png" alt="" width="600" height="140" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144804-600x140.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144804-768x179.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144804.png 923w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Dans le cas présent, le secret a été créer à l’aide de kubectl :</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154539 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144945-600x36.png" alt="" width="600" height="36" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144945-600x36.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144945-768x45.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-144945.png 929w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Une fois les objets kubernetes créés, une Gateway et une HTTPRoute sont disponibles.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154542 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145130-2-600x210.png" alt="" width="600" height="210" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145130-2-600x210.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145130-2-768x268.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145130-2.png 924w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>A l’aide de curl, on peut vérifier la connectivité.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154543 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145332-600x446.png" alt="" width="600" height="446" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145332-600x446.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145332-768x571.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145332.png 923w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154544 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145435-600x198.png" alt="" width="600" height="198" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145435-600x198.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145435-768x254.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145435.png 925w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154545 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145602-600x449.png" alt="" width="600" height="449" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145602-600x449.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145602-768x575.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145602.png 921w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154546 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145724-600x454.png" alt="" width="600" height="454" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145724-600x454.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145724-768x581.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-145724.png 833w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154548 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150004-600x533.png" alt="" width="600" height="533" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150004-600x533.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150004-768x683.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150004.png 791w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154549 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150127-600x367.png" alt="" width="600" height="367" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150127-600x367.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150127-768x470.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150127.png 904w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154550 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150245-600x161.png" alt="" width="600" height="161" srcset="https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150245-600x161.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150245-1024x276.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150245-768x207.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/11/Capture-decran-2025-11-07-150245.png 1033w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Voilà qui finalise notre exploration de la HTTPRoute.</p>
<p>Passons à la conclusion.</p>
<h1>Conclusion</h1>
<p>Cette fois-ci, l’accent a été mis sur comment effectivement exposer une application à travers l’usage d’une Gateway et d’un HTTPRoute.</p>
<p>La gestion de certificat est définie au niveau de la Gateway, à travers un objet référent qui est jusqu’ici un kubernetes Secret.</p>
<p>Apparaît  également la mention de namespace dans les différents objets utilisés, ce qui laisse sous-entendre une prise en charge cross-namespace pour par exemple, des scenarios de Gateway et de certificat mutualisé.</p>
<p>Mais ce sera un sujet pour un autre article.</p>
<p>&nbsp;</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/toujours-a-propos-de-la-kubernetes-gateway-api/">Toujours à propos de la Kubernetes Gateway API</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/cloud-2/toujours-a-propos-de-la-kubernetes-gateway-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154488</post-id>	</item>
		<item>
		<title>Microsoft 365 Copilot : Au-delà du buzz, quelles valeurs concrètes ?</title>
		<link>https://blog.cellenza.com/cloud-2/microsoft-365-copilot-adoption-entreprise/</link>
					<comments>https://blog.cellenza.com/cloud-2/microsoft-365-copilot-adoption-entreprise/#respond</comments>
		
		<dc:creator><![CDATA[thierrybarthel]]></dc:creator>
		<pubDate>Thu, 06 Nov 2025 08:00:35 +0000</pubDate>
				<category><![CDATA[Cloud]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154388</guid>

					<description><![CDATA[<p>Introduction : Le moment de vérité  Depuis son lancement, Microsoft 365 Copilot divise. D&#8217;un côté, des promesses d&#8217;une révolution de la productivité. De l&#8217;autre, une certaine sinistrose : coûts élevés, résultats parfois décevants, ROI difficile à justifier. Chez Cellenza, nous accompagnons quotidiennement des organisations dans leur transformation digitale, et nous constatons un fossé entre le [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/microsoft-365-copilot-adoption-entreprise/">Microsoft 365 Copilot : Au-delà du buzz, quelles valeurs concrètes ?</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3><span class="TextRun SCXW9396577 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW9396577 BCX8" data-ccp-parastyle="heading 1">Introduction : Le moment de vérité</span></span><span class="EOP SCXW9396577 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:360,&quot;335559739&quot;:80,&quot;335559740&quot;:276}"> </span></h3>
<p><span class="TextRun SCXW246782134 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW246782134 BCX8">Depuis son lancement, Microsoft 365 Copilot divise. D&rsquo;un côté, des promesses d&rsquo;une révolution de la productivité. De l&rsquo;autre, une certaine sinistrose : coûts élevés, résultats parfois décevants, ROI difficile à justifier. Chez Cellenza, nous accompagnons quotidiennement des organisations dans leur transformation digitale, et nous constatons un fossé entre le potentiel de Copilot et la perception qu&rsquo;en ont les utilisateurs.</span></span><span class="EOP SCXW246782134 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span class="TextRun SCXW134981303 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW134981303 BCX8">Ce fossé provient souvent d&rsquo;une méconnaissance des capacités réelles de l&rsquo;outil. Trop d&rsquo;entreprises déploient Copilot sans stratégie d&rsquo;adoption, espérant une magie instantanée. La réalité ? Copilot est un outil puissant, mais qui nécessite de comprendre </span></span><strong><span class="TextRun SCXW134981303 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW134981303 BCX8">où</span></span></strong><span class="TextRun SCXW134981303 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW134981303 BCX8"> et </span></span><strong><span class="TextRun SCXW134981303 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW134981303 BCX8">comment</span></span></strong><span class="TextRun SCXW134981303 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW134981303 BCX8"> l&rsquo;utiliser efficacement.</span></span><span class="EOP SCXW134981303 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span class="TextRun SCXW231192856 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW231192856 BCX8">Cet article propose un tour d&rsquo;horizon pragmatique des fonctionnalités de Copilot application par application, avec des cas d&rsquo;usage concrets. L&rsquo;objectif : vous aider à identifier les gains rapides et à construire une stratégie d&rsquo;adoption qui génère une vraie valeur.</span></span><span class="EOP SCXW231192856 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h3><span class="TextRun SCXW49024110 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW49024110 BCX8">Sécurité d&rsquo;abord : L&rsquo;Enterprise Data Protection</span></span><span class="EOP SCXW49024110 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></h3>
<p><span data-contrast="auto">Avant même de parler de fonctionnalités, abordons l&rsquo;éléphant dans la pièce : </span><b><span data-contrast="auto">la sécurité et la confidentialité des données</span></b><span data-contrast="auto">. C&rsquo;est souvent la première objection (légitime) des DSI et RSSI.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">Microsoft a mis en place ce qu&rsquo;on appelle l&rsquo;</span><b><span data-contrast="auto">Enterprise Data Protection</span></b><span data-contrast="auto"> pour garantir que l&rsquo;utilisation de Copilot ne compromet jamais vos données sensibles :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><strong><span class="TextRun SCXW59240802 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW59240802 BCX8">Les garanties fondamentales :</span></span></strong><span class="EOP SCXW59240802 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><strong><span class="TextRun SCXW75846378 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW75846378 BCX8">Vos données restent VÔTRES</span></span><span class="EOP SCXW75846378 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></strong></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Aucune donnée d&rsquo;entreprise n&rsquo;est utilisée pour entraîner les modèles d&rsquo;IA de Microsoft</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Les prompts et réponses ne sont pas stockés ni utilisés pour améliorer les modèles</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Zero data leakage : l&rsquo;IA ne peut pas « fuiter » des informations d&rsquo;un tenant à un autre</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><strong><span class="NormalTextRun SCXW19877703 BCX8">Respect des permissions </span><span class="NormalTextRun SpellingErrorV2Themed SCXW19877703 BCX8">existantes</span></strong></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Copilot ne contourne JAMAIS vos contrôles d&rsquo;accès</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Un utilisateur ne verra via Copilot que ce à quoi il a déjà accès</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Les politiques de partage et DLP (Data Loss Prevention) restent actives</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><strong><span class="TextRun SCXW208191778 BCX8" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SpellingErrorV2Themed SCXW208191778 BCX8">Gouvernance</span><span class="NormalTextRun SCXW208191778 BCX8"> et </span><span class="NormalTextRun SpellingErrorV2Themed SCXW208191778 BCX8">conformité</span></span><span class="EOP SCXW208191778 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></strong></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Intégration native avec </span><b><span data-contrast="auto">Microsoft Purview</span></b><span data-contrast="auto"> pour auditer toutes les interactions</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Logs complets des requêtes et réponses pour investigations si nécessaire</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Conformité RGPD, ISO 27001, SOC 2 maintenue</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Possibilité de définir des policies pour bloquer certains types de contenus</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><strong><span class="TextRun SCXW125859908 BCX8" lang="EN-GB" xml:lang="EN-GB" data-contrast="auto"><span class="NormalTextRun SpellingErrorV2Themed SCXW125859908 BCX8">Souveraineté</span><span class="NormalTextRun SCXW125859908 BCX8"> des données</span></span><span class="EOP SCXW125859908 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></strong></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Les données restent dans votre région géographique</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Pour l&rsquo;Europe, le traitement se fait dans des datacenters européens</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Pas de transfert vers des juridictions non conformes</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154397 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-095508-600x357.png" alt="" width="600" height="357" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-095508-600x357.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-095508-768x457.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-095508.png 1017w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW1194507 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW1194507 BCX8">Cette protection s&rsquo;applique </span></span><strong><span class="TextRun SCXW1194507 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW1194507 BCX8">à toutes les interactions avec </span><span class="NormalTextRun SpellingErrorV2Themed SCXW1194507 BCX8">Copilot</span></span></strong><span class="TextRun SCXW1194507 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW1194507 BCX8">, que vous utilisiez la version gratuite de </span><span class="NormalTextRun SpellingErrorV2Themed SCXW1194507 BCX8">Copilot</span><span class="NormalTextRun SCXW1194507 BCX8"> Chat ou la version payante avec accès aux données Microsoft 365.</span></span><span class="EOP SCXW1194507 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h3><span class="TextRun SCXW153986921 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW153986921 BCX8">L&rsquo;écosystème </span><span class="NormalTextRun SpellingErrorV2Themed SCXW153986921 BCX8">Copilot</span><span class="NormalTextRun SCXW153986921 BCX8"> : Gratuit vs Payant, que choisir ?</span></span></h3>
<p><span class="TextRun SCXW237677443 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW237677443 BCX8">Microsoft propose deux niveaux d&rsquo;accès à </span><span class="NormalTextRun SpellingErrorV2Themed SCXW237677443 BCX8">Copilot</span><span class="NormalTextRun SCXW237677443 BCX8">, et c&rsquo;est important de comprendre la différence pour construire votre stratégie d&rsquo;adoption.</span></span><span class="EOP SCXW237677443 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-154400 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-095756.png" alt="" width="569" height="578" /></p>
<p><b><span data-contrast="auto">Copilot Chat inclus dans les licences : Déjà puissant pour démarrer</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Bonne nouvelle :</span></b><span data-contrast="auto"> Tous vos collaborateurs avec une licence Microsoft 365 commerciale ont déjà accès à Copilot Chat gratuitement, avec l&rsquo;Enterprise Protection activée. C&rsquo;est une excellente porte d&rsquo;entrée pour découvrir l&rsquo;IA au travail sans investissement supplémentaire.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que permet Copilot Chat gratuit :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol>
<li><b><span data-contrast="auto"> Synthèse et extraction d&rsquo;informations</span></b><span data-contrast="auto"> Collez un email long, des notes de réunion ou un article, et demandez un résumé ou les points d&rsquo;action. Idéal pour traiter rapidement l&rsquo;information.</span></li>
</ol>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> Un manager colle le compte-rendu d&rsquo;une réunion de 5 pages et demande : « Extrais les décisions prises et les actions assignées avec leurs deadlines »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="2">
<li><b><span data-contrast="auto"> Traduction et reformulation</span></b><span data-contrast="auto"> Besoin de traduire un document ? De réécrire un texte dans un ton différent ? Copilot Chat le fait instantanément.</span></li>
</ol>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> « Traduis ce paragraphe en néerlandais avec un ton formel pour une communication corporate »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="3">
<li><b><span data-contrast="auto"> Brainstorming et rédaction créative</span></b><span data-contrast="auto"> Génération d&rsquo;idées, de noms de projets, de slogans, premiers drafts de contenus&#8230; Un partenaire créatif accessible à tous.</span></li>
</ol>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> « Propose 10 noms accrocheurs pour notre nouveau service de conseil en cybersécurité, avec pour chacun une tagline »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="4">
<li><b><span data-contrast="auto"> Recherche et questions générales</span></b><span data-contrast="auto"> Copilot Chat accède au web en temps réel et peut répondre à des questions factuelles avec sources citées. C&rsquo;est un moteur de recherche augmenté.</span></li>
</ol>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> « Quelles sont les tendances actuelles en matière de Change Management digital dans le secteur bancaire ? »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="5">
<li><b><span data-contrast="auto"> Analyse de fichiers individuels et multi-fichiers</span></b><span data-contrast="auto"> Uploadez jusqu&rsquo;à 3 fichiers (512MB chacun) et posez des questions dessus. Copilot peut analyser ces fichiers ensemble pour en extraire des insights. Limitation : 3 fichiers par période de 24h dans la version gratuite.</span></li>
</ol>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> Upload de 3 documents (budget, planning, compte-rendu) : « Compare ces trois documents et identifie les incohérences entre le budget prévu et les dépenses réelles mentionnées dans le compte-rendu »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="6">
<li><b><span data-contrast="auto"> Assistance technique (formules, code, scripts)</span></b><span data-contrast="auto"> Besoin d&rsquo;aide pour une formule Excel complexe ou un script PowerShell ? Copilot Chat peut générer des exemples ou débugger.</span></li>
</ol>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> « Écris une formule Excel pour calculer la moyenne pondérée en excluant les valeurs nulles »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="7">
<li><b><span data-contrast="auto"> Productivité personnelle</span></b><span data-contrast="auto"> Création d&rsquo;agendas, to-do lists, plans de projet structurés&#8230; Copilot devient votre assistant d&rsquo;organisation.</span></li>
</ol>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> « Crée un plan de projet sur 3 mois pour déployer Microsoft 365 Copilot dans une entreprise de 200 personnes »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Nouveauté 2024-2025 :</span></b><span data-contrast="auto"> Copilot Chat est désormais accessible directement dans Word, Excel, PowerPoint et les autres apps Office via un panneau latéral, même sans licence payante. L&rsquo;assistant IA est toujours à portée de clic dans votre flux de travail.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Avec une licence Microsoft 365 Copilot : L&rsquo;IA connectée à vos données</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">La licence payante débloque la vraie puissance : </span><b><span data-contrast="auto">Copilot accède à vos données Microsoft 365</span></b><span data-contrast="auto">.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Les capacités exclusives :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></b><b><span data-contrast="auto"> Accès au Microsoft Graph</span></b><span data-contrast="auto"> Copilot peut interroger vos emails, documents, réunions, chats Teams, etc. C&rsquo;est la différence fondamentale.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><i><span data-contrast="auto">Exemple concret :</span></i><span data-contrast="auto"> « Résume tous les échanges avec le client Acme Corp des 2 dernières semaines et identifie les points bloquants mentionnés »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">Sans licence payante, vous devriez manuellement copier-coller ces informations. Avec la licence, Copilot les trouve et les synthétise automatiquement.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c1.png" alt="📁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></b><b><span data-contrast="auto"> Analyse multi-fichiers et cross-référencement</span></b><span data-contrast="auto"> La version gratuite analyse jusqu&rsquo;à 3 fichiers ensemble. La version payante peut travailler sur plusieurs documents simultanément sans limite quotidienne et faire des corrélations avancées.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><i><span data-contrast="auto">Exemple :</span></i><span data-contrast="auto"> « Compare les budgets mentionnés dans ces 4 propositions commerciales et crée un tableau comparatif »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Agents déclaratifs inclus</span></b><span data-contrast="auto"> Avec la licence payante, vous pouvez créer et utiliser des agents personnalisés grounded sur vos données d&rsquo;entreprise, sans coût supplémentaire. Dans la version gratuite, seuls les agents basés sur le web sont disponibles.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Intégration profonde dans les apps</span></b><span data-contrast="auto"> Au-delà du simple chat intégré, la licence payante active des fonctionnalités avancées dans chaque application:</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Teams</span></b><span data-contrast="auto"> : Récap de meetings avec références aux passages spécifiques, résumés de canaux entiers</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Outlook</span></b><span data-contrast="auto"> : Coaching email basé sur votre historique, priorisation intelligente contextuelle</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Word</span></b><span data-contrast="auto"> : Génération de contenu à partir de vos fichiers SharePoint ou OneDrive</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Excel</span></b><span data-contrast="auto"> : Analyse de données et aide à la création de formules, graphiques et mise en forme conditionnelle </span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><b><span data-contrast="auto">PowerPoint</span></b><span data-contrast="auto"> : Création de présentations à partir de vos documents Word ou données Excel</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="6" data-aria-level="1"><b><span data-contrast="auto">OneDrive/SharePoint</span></b><span data-contrast="auto"> : Recherche sémantique dans toute votre bibliothèque documentaire</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Reporting, formation et adoption: </span></b><span data-contrast="auto">Accès au Copilot Dashboard dans Viva Insights pour mesurer adoption et impact. Accès à la Copilot Academy dans Viva Learning et assistance à la création d’une communautée d’adoption de Copilot dans Viva Engage.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h3><span class="TextRun SCXW141935591 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW141935591 BCX8">L&rsquo;écosystème </span><span class="NormalTextRun SpellingErrorV2Themed SCXW141935591 BCX8">Copilot</span><span class="NormalTextRun SCXW141935591 BCX8"> : Une approche unifiée</span></span><span class="EOP SCXW141935591 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></h3>
<p><span data-contrast="auto">Que vous utilisiez la version gratuite ou payante, voici les composantes de l&rsquo;écosystème :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot Chat</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">Un assistant conversationnel sécurisé qui combine la connaissance du web et l&rsquo;accès à vos données professionnelles. Accessible dans Teams, Outlook, Edge et l&rsquo;application principale, il devient votre interface naturelle avec l&rsquo;intelligence artificielle au quotidien.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot Search</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">Une recherche en langage naturel qui interroge simultanément vos emails, chats, documents et données à travers Microsoft 365 et les services connectés. Fini les recherches par mots-clés approximatives : posez simplement votre question.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot Notebooks</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">Un espace de travail dédié à la réflexion approfondie et à la résolution de problèmes structurés. Idéal pour les scénarios complexes comme la planification trimestrielle, le traitement de tickets de support ou la rédaction de documents stratégiques. Les notebooks conservent un historique des interactions pour assurer continuité et réutilisation.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot (Loop) Pages</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">Des canevas interactifs qui transforment les réponses de Copilot en pages éditables et partageables. Un outil puissant pour le brainstorming collaboratif, la création de documentation ou de contenus en temps réel avec vos équipes.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h2><span class="TextRun SCXW194581281 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SpellingErrorV2Themed SCXW194581281 BCX8">Copilot</span><span class="NormalTextRun SCXW194581281 BCX8"> par application : Le guide pratique</span></span><span class="EOP SCXW194581281 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;469777462&quot;:[6803],&quot;469777927&quot;:[0],&quot;469777928&quot;:[1]}"> </span></h2>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154406 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100451-600x352.png" alt="" width="600" height="352" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100451-600x352.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100451-768x451.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100451.png 891w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><b><span data-contrast="auto">Note importante :</span></b><span data-contrast="auto"> Les fonctionnalités avancées décrites ci-dessous nécessitent une licence Microsoft 365 Copilot payante. Pour les utilisateurs avec uniquement Copilot Chat gratuit, le panneau Copilot dans les apps Office permet d&rsquo;accéder aux fonctionnalités de chat (brainstorming, rédaction, analyse de fichiers individuels) mais sans connexion aux données Microsoft 365.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot dans Teams : Conseiller en temps réel et récapitulatifs intelligents</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Le défi :</span></b><span data-contrast="auto"> Réunions manquées, manque d&rsquo;impact durant les meetings, fil de discussions interminables.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que Copilot apporte :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Conseiller durant le meeting</span></b><span data-contrast="auto"> : Copilot peut résumer les points clés en temps réel, identifier où les participants sont alignés ou en désaccord, suggérer des actions de suivi, et même tester la solidité des arguments présentés</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Agent Facilitator</span></b><span data-contrast="auto"> : Prend des notes collaboratives en temps réel pour tout le groupe, gère le temps de parole, suit les objectifs du meeting, et capture automatiquement les décisions et points clés</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Intelligent Recap</span></b><span data-contrast="auto"> : Fonctionnalité incluse dans Teams Premium et dans la licence Microsoft 365 Copilot, qui génère des résumés détaillés des réunions avec chapitres, actions, et références temporelles</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Rattrapage instantané</span></b><span data-contrast="auto"> : Si vous rejoignez 5+ minutes en retard, Copilot vous propose de vous mettre à jour automatiquement</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Gain concret :</span></b><span data-contrast="auto"> 4-5h/semaine pour un chef de projet multi-projets qui génère automatiquement ses comptes-rendus et reste concentré sur le contenu plutôt que la prise de notes.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Prompt exemple durant la réunion :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">« Identifie les faiblesses dans l&rsquo;argument qui vient d&rsquo;être présenté sur notre stratégie de pricing et propose des contre-arguments basés sur les données du marché »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot dans Outlook : Inbox intelligente</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Le défi :</span></b><span data-contrast="auto"> 80+ emails/jour, priorités noyées, réponses chronophages.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que Copilot apporte :</span></b><br />
<span data-contrast="auto"> Identifie les 5 emails critiques avec explication du « pourquoi », génère des brouillons de réponse contextualisés, et transforme un email en invitation de réunion en un clic.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain concret :</span></b><span data-contrast="auto"> 1h30/jour économisées sur la gestion email pour les profils commerciaux.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Prompt exemple :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">« Rédige une réponse professionnelle mais chaleureuse pour décliner poliment cette demande et proposer une alternative »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto"> Copilot dans Word : De l&rsquo;idée au document</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Le défi :</span></b><span data-contrast="auto"> Partir de zéro sur des documents structurés.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que Copilot apporte :</span></b><br />
<span data-contrast="auto"> Génère un premier draft complet à partir de notes brutes, de plusieurs documents sources, ou d&rsquo;un simple brief. Transforme du texte en tableaux, résume des documents longs, répond à des questions sur le contenu.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain concret :</span></b><span data-contrast="auto"> De 3h à 30 min pour une note de cadrage client complète.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Prompt exemple :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">« À partir de ces notes de réunion, crée une proposition commerciale structurée avec contexte, objectifs, approche méthodologique et livrables. </span><span data-contrast="auto">Ton professionnel et concis. »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><b><span data-contrast="auto">Copilot dans Excel : Analyse en langage naturel</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Le défi :</span></b><span data-contrast="auto"> Formules complexes inaccessibles, analyses qui prennent des jours.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que Copilot apporte :</span></b><br />
<span data-contrast="auto"> « Identifie les 3 produits avec la plus forte croissance et les 3 en déclin, analyse les facteurs saisonniers, et génère un dashboard visuel » &#8211; et c&rsquo;est fait. Génère formules, détecte tendances, crée visualisations.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain concret :</span></b><span data-contrast="auto"> De 2 jours à 30 minutes pour une analyse trimestrielle complète.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Prompt exemple :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">« Analyse ce tableau de ventes. Identifie les produits les plus performants, calcule le taux de croissance mensuel, et crée un graphique comparatif »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot dans PowerPoint : Présentations en minutes</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Le défi :</span></b><span data-contrast="auto"> Créer des slides professionnelles prend des heures.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que Copilot apporte :</span></b><br />
<span data-contrast="auto"> Génère une présentation complète (structure, contenu, visuels, notes) à partir de vos documents Excel/Word existants. Ajuste design et ton automatiquement. Tout en utilisant les modèles officiels de votre société.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain concret :</span></b><span data-contrast="auto"> Présentation COMEX de 15 slides créée en 20 minutes au lieu de 3 heures.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Prompt exemple :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">« Crée une présentation de 10 slides présentant notre nouvelle stratégie produit à partir de ce document Word. Style visuel moderne, ton inspirant. »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot dans OneDrive : Comparaisons multi-documents</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Le défi :</span></b><span data-contrast="auto"> Comparer manuellement plusieurs documents longs.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que Copilot apporte :</span></b><br />
<span data-contrast="auto"> Compare jusqu&rsquo;à 5 fichiers simultanément : « Compare ces 4 propositions sur prix, délais, garanties et expérience. » Résultat structuré en 2 minutes.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain concret :</span></b><span data-contrast="auto"> Journée d&rsquo;analyse comparative réduite à 15 minutes.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Prompt exemple :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">« Compare ces trois documents de spécifications et identifie les exigences communes et les différences majeures »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot dans SharePoint : Sites auto-générés</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Le défi :</span></b><span data-contrast="auto"> Créer un site complet prend 2 jours.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce que Copilot apporte :</span></b><br />
<span data-contrast="auto"> Génère un site branded complet (structure, navigation, contenu) à partir de vos documents existants. Site d&rsquo;onboarding RH créé en 2 heures au lieu de 2 jours.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h3><span class="TextRun SCXW86973748 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW86973748 BCX8">Les agents déclaratifs : Personnaliser Copilot pour votre métier</span></span><span class="EOP SCXW86973748 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></h3>
<p><span data-contrast="auto">Au-delà des fonctionnalités natives, Microsoft 365 Copilot permet de créer des </span><b><span data-contrast="auto">agents déclaratifs</span></b><span data-contrast="auto"> &#8211; des versions personnalisées de Copilot adaptées à vos besoins spécifiques.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Qu&rsquo;est-ce qu&rsquo;un agent déclaratif ?</span></b><span data-contrast="auto"> C&rsquo;est un Copilot configuré avec :</span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Instructions spécifiques</span></b><span data-contrast="auto"> : « Tu es un expert en réglementation RGPD »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Actions personnalisées</span></b><span data-contrast="auto"> : Connexions à vos systèmes métier</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Connaissances dédiées</span></b><span data-contrast="auto"> : Accès à des documents, sites, ou bases de données spécifiques</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">SharePoint Agents :</span></b><span data-contrast="auto"> Chaque site SharePoint peut devenir un agent spécialisé. </span><span data-contrast="auto">Par exemple :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Un agent « Juridique » qui connaît tous les contrats types</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Un agent « Produit X » qui maîtrise toute la documentation technique</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Un agent « Projet Y » qui centralise toute l&rsquo;information projet</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><span data-contrast="auto">Ces agents peuvent être partagés dans Teams pour que toute l&rsquo;équipe bénéficie de cette expertise contextualisée.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Copilot Connectors :</span></b><span data-contrast="auto"> Intégrez vos sources de données externes (CRM, ERP, bases de données métier) pour que Copilot raisonne sur l&rsquo;ensemble de vos informations, pas seulement celles dans Microsoft 365. Chaque organisation reçoit 50 millions d&rsquo;items de quota d&rsquo;indexation sans coût supplémentaire.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h3><span class="TextRun SCXW151623546 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW151623546 BCX8">Mon Retour d&rsquo;expérience terrain : 5 agents qui transforment mon quotidien</span></span><span class="EOP SCXW151623546 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></h3>
<p><span class="TextRun SCXW78553433 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW78553433 BCX8">Chez </span><span class="NormalTextRun SpellingErrorV2Themed SCXW78553433 BCX8">Cellenza</span><span class="NormalTextRun SCXW78553433 BCX8">, nous ne nous contentons pas de conseiller nos clients sur </span><span class="NormalTextRun SpellingErrorV2Themed SCXW78553433 BCX8">Copilot</span><span class="NormalTextRun SCXW78553433 BCX8"> &#8211; nous l&rsquo;utilisons intensivement en interne. En tant que Head of Change Management, j&rsquo;ai créé plusieurs agents déclaratifs qui sont devenus indispensables à mon travail quotidien. Voici un aperçu concret de ce que les agents peuvent apporter.</span></span><span class="EOP SCXW78553433 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154410 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100913-600x351.png" alt="" width="600" height="351" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100913-600x351.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100913-768x449.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-100913.png 948w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<ol>
<li><b><span data-contrast="auto">Adoption Strategist</span></b></li>
</ol>
<p><b><span data-contrast="auto">Sa mission :</span></b><span data-contrast="auto"> Piloter la stratégie d&rsquo;adoption de solutions Microsoft 365</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce qu&rsquo;il fait :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Construit des feuilles de route d&rsquo;adoption (phases, acteurs, indicateurs) basées sur des modèles éprouvés (ADKAR, M365 Adoption Maturity Model)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Identifie et structure des KPIs d&rsquo;adoption pertinents</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Traduit les données d&rsquo;usage en insights stratégiques pour les sponsors et la direction</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">S&rsquo;adapte à la culture client (banque, industrie, secteur public)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Ce qu&rsquo;il m&rsquo;apporte :</span></b><span data-contrast="auto"> Au lieu de 4-5h pour créer un plan d&rsquo;adoption de zéro, j&rsquo;obtiens une base solide en 10 minutes que je personnalise en 1h.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain estimé :</span></b><span data-contrast="auto"> 3-4h par projet × 12-15 projets/an = </span><b><span data-contrast="auto">45-60h annuelles</span></b></p>
<ol start="2">
<li><b><span data-contrast="auto">Communication Architect</span></b></li>
</ol>
<p><b><span data-contrast="auto">Sa mission :</span></b><span data-contrast="auto"> Concevoir des communications claires et engageantes pour différentes audiences</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce qu&rsquo;il fait :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Rédige des contenus de communication à fort impact (news Teams, posts Viva Engage, e-mails, slides sponsor)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Élabore des plans de communication complets (cibles, canaux, calendrier)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Crée des storytelling utilisateurs pour ancrer le message (« Avant/Après » la transformation)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Génère des briefs visuels et des templates de communication</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Adapte le ton selon le canal et la culture organisationnelle</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Ce qu&rsquo;il m&rsquo;apporte :</span></b><span data-contrast="auto"> Pour chaque projet, je génère rapidement 15-20 communications de qualité plutôt que de partir de zéro à chaque fois. Réduction de 70% du temps de création.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain estimé :</span></b><span data-contrast="auto"> 2h par communication × 20/projet × 12 projets = </span><b><span data-contrast="auto">480h annuelles</span></b><span data-contrast="auto"> </span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="3">
<li><b><span data-contrast="auto">Learning Experience Designer</span></b></li>
</ol>
<p><b><span data-contrast="auto">Sa mission :</span></b><span data-contrast="auto"> Concevoir des formations efficaces et engageantes sur Microsoft 365 et Copilot</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce qu&rsquo;il fait :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Crée des parcours de formation et supports formateurs complets</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Produit des fiches pratiques, quiz, scripts de formation, capsules vidéos</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Conçoit des modules pédagogiques adaptés selon les personas</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Prépare des Q&amp;A Live et anticipe les questions utilisateurs</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Propose des méthodes de mesure d&rsquo;efficacité (NPS, taux de complétion)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Ce qu&rsquo;il m&rsquo;apporte :</span></b><span data-contrast="auto"> Un module e-learning complet généré en 1h au lieu d&rsquo;une journée. Je passe ensuite 2h à personnaliser.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain estimé :</span></b><span data-contrast="auto"> 5h par module × 8 modules/projet × 12 projets = </span><b><span data-contrast="auto">480h annuelles</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="4">
<li><b><span data-contrast="auto">Change Network Coach</span></b></li>
</ol>
<p><b><span data-contrast="auto">Sa mission :</span></b><span data-contrast="auto"> Mobiliser et accompagner les relais du changement dans l&rsquo;organisation</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce qu&rsquo;il fait :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Identifie les champions naturels et définit leur rôle</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Conçoit des kits de communication et formation pour les relais</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Propose des animations communautaires (Café AI, challenges, feedback loops)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Crée des systèmes de reconnaissance et valorisation</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Suit la participation et l&rsquo;impact du réseau de champions</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Ce qu&rsquo;il m&rsquo;apporte :</span></b><span data-contrast="auto"> Génération rapide d&rsquo;idées et de contenu pour animer le réseau de champions : challenges, fiches de rôles, reconnaissances.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain estimé :</span></b><span data-contrast="auto"> 3h/mois × 12 mois = </span><b><span data-contrast="auto">36h annuelles</span></b><span data-contrast="auto"> </span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ol start="5">
<li><b><span data-contrast="auto">Use Case &amp; Persona Builder</span></b></li>
</ol>
<p><b><span data-contrast="auto">Sa mission :</span></b><span data-contrast="auto"> Identifier et structurer les cas d&rsquo;usage métiers et créer des personas d&rsquo;utilisateurs</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Ce qu&rsquo;il fait :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Construit des matrices de cas d&rsquo;usage structurées</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Rédige des fiches personas détaillées avec besoins et comportements</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Évalue la valeur métier et la fréquence d&rsquo;usage de chaque cas</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Propose des prompts Copilot métiers adaptés aux rôles</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Priorise les quick wins selon un framework « Pain → Usage → Gain → KPI »</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Ce qu&rsquo;il m&rsquo;apporte :</span></b><span data-contrast="auto"> Préparation d&rsquo;ateliers cas d&rsquo;usage accélérée. Je pars d&rsquo;une base concrète plutôt que d&rsquo;une page blanche, rendant les sessions beaucoup plus productives.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Gain estimé :</span></b><span data-contrast="auto"> 2h par atelier × 4 ateliers/projet × 12 projets = </span><b><span data-contrast="auto">96h annuelles</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h4><strong><span class="TextRun SCXW146659800 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW146659800 BCX8">Bilan de mes 5 agents</span></span><span class="EOP SCXW146659800 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></strong></h4>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154414 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101234-600x310.png" alt="" width="600" height="310" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101234-600x310.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101234-1024x529.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101234-768x397.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101234.png 1085w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><b><span data-contrast="auto">Temps total économisé annuellement :</span></b> <b><span data-contrast="auto">1 137 heures</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><b><span data-contrast="auto">Temps d&rsquo;investissement pour créer ces 5 agents :</span></b> <b><span data-contrast="auto">≈ 2 heures</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><b><span data-contrast="auto">ROI de ma démarche agents :</span></b><span data-contrast="auto"> Plus de </span><b><span data-contrast="auto">5 000% la première année</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="auto">Au-delà des chiffres, ces agents ont transformé ma façon de travailler :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Plus de créativité, moins de temps sur l&rsquo;exécution</span></b><span data-contrast="auto"> : Je me concentre sur la stratégie et la personnalisation</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Qualité constante</span></b><span data-contrast="auto"> : Les livrables respectent toujours les meilleures pratiques</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Scalabilité</span></b><span data-contrast="auto"> : Je peux gérer plus de projets simultanément sans surcharge</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Capitalisation</span></b><span data-contrast="auto"> : Toute mon expertise est codifiée et réutilisable</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">A retenir :</span></b><span data-contrast="auto"> Les agents déclaratifs ne sont pas un gadget. Bien conçus, ils deviennent de véritables collègues virtuels qui démultiplient votre impact. Et le plus beau ? Leur création ne nécessite aucune compétence en développement, juste une bonne compréhension de votre métier et de vos processus.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h3><span class="TextRun SCXW9592996 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW9592996 BCX8">Stratégie d&rsquo;adoption recommandée : De la découverte gratuite au déploiement payant</span></span><span class="EOP SCXW9592996 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></h3>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154416 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101415-600x337.png" alt="" width="600" height="337" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101415-600x337.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101415-768x432.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-20-101415.png 971w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><b><span data-contrast="auto">Phase 1 &#8211; Découverte gratuite (Mois 1-2) : « Goûter à l&rsquo;IA »</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Objectif :</span></b><span data-contrast="auto"> Créer une culture IA et identifier les champions</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Action :</span></b><span data-contrast="auto"> Déploiement de Copilot Chat gratuit pour tous</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Formation :</span></b><span data-contrast="auto"> Ateliers découverte de 1h par département</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Mesure :</span></b><span data-contrast="auto"> Usage volontaire, feedback qualitatif, identification des power users</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Bénéfices attendus :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="16" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Démystification de l&rsquo;IA (plus de peur de l&rsquo;inconnu)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="16" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Identification des besoins réels par département</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="16" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Constitution d&rsquo;une communauté d&rsquo;early adopters</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="16" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Validation de l&rsquo;appétit pour l&rsquo;IA sans investissement majeur</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Phase 2 &#8211; Pilote payant (Mois 3-5) : « Prouver la valeur »</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Objectif :</span></b><span data-contrast="auto"> ROI démontré sur cas d&rsquo;usage ciblés</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Action :</span></b><span data-contrast="auto"> 20-50 licences payantes pour les champions identifiés</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Formation :</span></b><span data-contrast="auto"> Formation approfondie + accompagnement individuel</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Mesure :</span></b><span data-contrast="auto"> Temps économisé, qualité des livrables, satisfaction</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Cas d&rsquo;usage pilotes recommandés :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="18" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Commerciaux</span></b><span data-contrast="auto"> : Récap meetings + propositions (gain : 5h/semaine)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="18" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Managers</span></b><span data-contrast="auto"> : Synthèse multi-sources + reporting (gain : 4h/semaine)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="18" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Support</span></b><span data-contrast="auto"> : Analyse tickets + documentation (gain : 6h/semaine)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="18" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">RH</span></b><span data-contrast="auto"> : Rédaction annonces + onboarding (gain : 3h/semaine)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Phase 3 &#8211; Déploiement optimisé (Mois 6+) : « Industrialiser »</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Objectif :</span></b><span data-contrast="auto"> Maximiser le ROI avec allocation optimale des licences</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Action :</span></b><span data-contrast="auto"> Extension aux départements/rôles à fort ROI prouvé</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Formation :</span></b><span data-contrast="auto"> Programme continu + communauté de pratique</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Mesure :</span></b><span data-contrast="auto"> Dashboard Copilot, KPIs métier, optimisation continue</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Règle d&rsquo;or :</span></b><span data-contrast="auto"> Gardez certains utilisateurs sur la version gratuite si elle suffit à leurs besoins. Pas besoin d&rsquo;une licence payante pour quelqu&rsquo;un qui utilise principalement Copilot pour du brainstorming ou de la traduction !</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<h3><span class="TextRun SCXW198804632 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW198804632 BCX8">ROI : Parlons chiffres</span></span><span class="EOP SCXW198804632 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></h3>
<p><b><span data-contrast="auto">Gains de temps documentés :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Réunions</span></b><span data-contrast="auto"> : 30 min économisées par réunion</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Emails</span></b><span data-contrast="auto"> : 45 min/jour pour les profils à forte charge</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Création de contenu</span></b><span data-contrast="auto"> : 60-70% de temps en moins sur premiers drafts</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Analyse de données</span></b><span data-contrast="auto"> : Réduction de 50% du temps d&rsquo;analyse Excel</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Pour un collaborateur à 70k€/an qui économise 5h/semaine</span></b><span data-contrast="auto">, le ROI est positif dès 6 mois.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">Au-delà des chiffres</span></b><span data-contrast="auto"> :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="21" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Réduction de la charge cognitive et du stress</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="21" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Plus de temps pour les tâches à valeur ajoutée</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="21" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Amélioration de la qualité des livrables</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="21" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Meilleure collaboration d&rsquo;équipe</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<h3><span class="TextRun SCXW174404258 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW174404258 BCX8">Conclusion : De la technologie à la transformation</span></span><span class="EOP SCXW174404258 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></h3>
<p><span data-contrast="auto">Microsoft 365 Copilot n&rsquo;est ni une baguette magique, ni un gadget marketé. C&rsquo;est un outil puissant qui, utilisé intelligemment et accompagné d&rsquo;une vraie stratégie de Change Management, peut transformer significativement la productivité et l&rsquo;expérience de travail.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">La clé du succès ?</span></b><span data-contrast="auto"> Ne pas voir Copilot comme un projet IT, mais comme une transformation organisationnelle nécessitant vision claire, accompagnement humain, itération continue et culture d&rsquo;apprentissage.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><span data-contrast="auto">Chez Cellenza, nous accompagnons nos clients dans cette transformation, de la définition de la stratégie d&rsquo;adoption à la mise en place des programmes de Change Management, en passant par la création d&rsquo;agents personnalisés et l&rsquo;optimisation des processus métier.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><b><span data-contrast="auto">L&rsquo;ère de l&rsquo;IA au travail est là. La question n&rsquo;est plus « faut-il adopter Copilot ? » mais « comment en tirer le maximum de valeur pour mon organisation ? »</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p><i><span data-contrast="auto">Vous souhaitez échanger sur votre stratégie d&rsquo;adoption Microsoft 365 Copilot ? Contactez-nous pour un atelier de cadrage personnalisé.</span></i><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:160}"> </span></p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/microsoft-365-copilot-adoption-entreprise/">Microsoft 365 Copilot : Au-delà du buzz, quelles valeurs concrètes ?</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/cloud-2/microsoft-365-copilot-adoption-entreprise/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154388</post-id>	</item>
		<item>
		<title>A propos de la Kubernetes Gateway API</title>
		<link>https://blog.cellenza.com/cloud-2/kubernetes-gateway-api-gatewayclass-gateway/</link>
					<comments>https://blog.cellenza.com/cloud-2/kubernetes-gateway-api-gatewayclass-gateway/#respond</comments>
		
		<dc:creator><![CDATA[David Frappart]]></dc:creator>
		<pubDate>Thu, 23 Oct 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154213</guid>

					<description><![CDATA[<p>Bonjour à tous,  Faisant suite à notre dernier post à propos de l’exposition des applications sur Kubernetes,  ce nouvel article propose de creuser davantage ce sujet que nous avons effleuré : la Kubernetes Gateway API.   Nous commencerons par un aperçu des options disponibles pour implémenter cette Gateway API, puis nous nous concentrerons sur 2 objets de [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/kubernetes-gateway-api-gatewayclass-gateway/">A propos de la Kubernetes Gateway API</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span data-contrast="auto">Bonjour à tous,</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Faisant suite à notre dernier post à propos de l’exposition des applications sur Kubernetes,  ce nouvel article propose de creuser davantage ce sujet que nous avons effleuré : la Kubernetes Gateway API.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">Nous commencerons par un aperçu des options disponibles pour implémenter cette Gateway API, puis nous nous concentrerons sur 2 objets de l’API : la </span><b><span data-contrast="auto">Gateway Class</span></b><span data-contrast="auto">, et la </span><b><span data-contrast="auto">Gateway</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">L’agenda : </span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Quelques Gateway API providers</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">A propos de la Gateway Class</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">A propos de la Gateway</span><span data-ccp-props="{}"> </span></li>
</ul>
<p>&nbsp;</p>
<h2><span class="TextRun SCXW158704940 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW158704940 BCX8" data-ccp-parastyle="heading 1">1. </span><span class="NormalTextRun SCXW158704940 BCX8" data-ccp-parastyle="heading 1">Quelques Gateway API providers</span></span><span class="EOP SCXW158704940 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;335559738&quot;:240,&quot;335559739&quot;:120}"> </span></h2>
<p><span data-contrast="auto">Les discussions autour de la Gateway API ont débuté dans un article dont le but était de discuter des moyens disponibles pour l’exposition d’application.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Comme mentionné dans la </span><a href="https://kubernetes.io/docs/concepts/services-networking/ingress/"><span data-contrast="none">documentation Kubernetes</span></a><span data-contrast="auto">, l’API Ingress est à présent gelée, et la Gateway API en est son successeur officiel.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Toujours dans la </span><a href="https://gateway-api.sigs.k8s.io/implementations/"><span data-contrast="none">documentation</span></a><span data-contrast="auto">, une liste des implémentations de cette Gateway est disponible parmis lesquelles , et de manière non exhaustive : </span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Nginx Gateway Fabric</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Traefik Proxy</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Istio</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Application Gateway for Containers</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Cilium</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">A l’exception Cillium qui est encore en beta, tous les autres providers de cette liste sont en GA.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Il est également possible de mentionner Hashicorp Consul qui pourrait être une alternative intéressante.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Pour utiliser une implémentation de la Gateway API, il est nécessaire de disposer de quelques CRDs à priori. Ces CRDs sont : </span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">La Gateway Class</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">La Gateway</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">La Http Route</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Il convient également de mentionner les objets suivants : </span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">La gRPC Route</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">La TLS Route</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Le Referent Grant</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Il convient de noter, point important, que toutes ces CRDs ne sont pas nécessairement au même état dans leur cycle de vie (GA vs Beta…)</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Les informations détaillées sur ces CRDs sont disponibles sur le </span><a href="https://github.com/kubernetes-sigs/gateway-api/tree/main/config/crd/standard"><span data-contrast="none">github</span></a><span data-contrast="auto"> repository dédié.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154218 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110402-600x181.png" alt="" width="600" height="181" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110402-600x181.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110402-1024x310.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110402-768x232.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110402-1536x464.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110402.png 1594w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">A noter que la version stable actuelle est 1.3.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La présence des CRDs sur un cluster, peut être vérifié à l’aide d’une commande </span><span data-contrast="none">kubectl</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154220 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110629-600x168.png" alt="" width="600" height="168" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110629-600x168.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110629-1024x286.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110629-768x215.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110629.png 1402w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Une fois ce point validé, il est temps d’installer un Gateway provider.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Dans le cadre de cet article, malgré le statut Beta de sa Gateway API, nous utilisons un cluster avec Cilium comme CNI et procédons à l’activation de la feature avec un argument <span class="NormalTextRun SCXW48062008 BCX8" data-ccp-charstyle="Source Text">additionnel</span><span class="NormalTextRun SCXW48062008 BCX8" data-ccp-charstyle="Source Text">.</span></span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154222 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110855-600x109.png" alt="" width="600" height="109" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110855-600x109.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110855-1024x186.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110855-768x140.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-110855.png 1419w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW229243802 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">Si l’installatio</span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">n est complète, après </span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">le </span><span class="NormalTextRun SpellingErrorV2Themed SCXW229243802 BCX8" data-ccp-charstyle="Source Text">redé</span><span class="NormalTextRun SpellingErrorV2Themed SCXW229243802 BCX8" data-ccp-charstyle="Source Text">marrer</span><span class="NormalTextRun SpellingErrorV2Themed SCXW229243802 BCX8" data-ccp-charstyle="Source Text">age</span> <span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">d</span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">es </span><span class="NormalTextRun SpellingErrorV2Themed SCXW229243802 BCX8" data-ccp-charstyle="Source Text">pods</span> <span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">Cilium</span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">,</span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text"> une Gateway Class </span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">devrait</span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text"> être </span><span class="NormalTextRun SCXW229243802 BCX8" data-ccp-charstyle="Source Text">disponible.</span></span><span class="EOP SCXW229243802 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154224 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-112409-600x496.png" alt="" width="600" height="496" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-112409-600x496.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-112409.png 742w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Pour l’installation d’un provider, malgré toute la qualité de la documentation Kubernetes, il est préférable de consulter la documentation dédiée du provider choisi afin, entre autres, de valider la version des CRDs suppportée par le provider.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">Par exemple, à la date d’écriture de cet article, la documentation pour la Gateway API de </span><a href="https://doc.traefik.io/traefik/v3.2/routing/providers/kubernetes-gateway/"><span data-contrast="none">Traefik</span></a><span data-contrast="auto"> mentionne un support des CRDs en version 1.2.1.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> <img loading="lazy" decoding="async" class="size-medium wp-image-154226 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-112729-600x405.png" alt="" width="600" height="405" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-112729-600x405.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-112729-768x518.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-112729.png 818w" sizes="auto, (max-width: 600px) 100vw, 600px" /></span></p>
<p><span data-contrast="auto">Dans le cas de Cilium,  la version stable actuelle supporte la version 1.2.0.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Le remier point d’attention consiste donc, à valider la version des CRDs supportée par le Gateway API provider.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">De fait, il faudra donc être particulièrement prudent si l’on souhaite faire co-exister 2 providers de Gateway AP.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Ces premiers points vus, passons à présent à la Gateway Class.</span><span data-ccp-props="{}"> </span></p>
<h2><span class="TextRun SCXW167873549 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW167873549 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">2. </span><span class="NormalTextRun SCXW167873549 BCX8" data-ccp-charstyle="Source Text">A propos de la Gateway Class</span></span><span class="EOP SCXW167873549 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;335559738&quot;:240,&quot;335559739&quot;:120}"> </span></h2>
<h5><span data-ccp-props="{}"> <span class="TextRun SCXW191206488 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW191206488 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">2.1</span><span class="NormalTextRun SCXW191206488 BCX8" data-ccp-charstyle="Source Text">. Quelques concepts</span></span><span class="EOP SCXW191206488 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:40}"> </span></span></h5>
<p><span class="TextRun SCXW89283283 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">L’installation </span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">d’</span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">un provider de Gateway API </span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">fournit </span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">une </span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">première</span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text"> Gateway Class. Avec un cluster AKS et </span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">Cilium</span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text"> en BYO </span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">CNI, </span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">la</span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text"> classe suivante</span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text"> est disponible</span><span class="NormalTextRun SCXW89283283 BCX8" data-ccp-charstyle="Source Text">.</span></span><span class="EOP SCXW89283283 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154229 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113711-600x378.png" alt="" width="600" height="378" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113711-600x378.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113711-768x484.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113711.png 894w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154230 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113850-600x357.png" alt="" width="600" height="357" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113850-600x357.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113850-768x457.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-113850.png 888w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154231 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114019-600x180.png" alt="" width="600" height="180" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114019-600x180.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114019-768x230.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114019.png 883w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154232 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114120-600x127.png" alt="" width="600" height="127" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114120-600x127.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114120-1024x217.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114120-768x162.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114120.png 1385w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">L’affichage en yaml  fournit des informations importantes sur le statut de la Gateway Class.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La section </span><span data-contrast="none">conditions</span><span data-contrast="auto"> doit afficher </span><span data-contrast="none">type</span><span data-contrast="none">: </span><span data-contrast="none">Accepted</span><span data-contrast="auto"> et </span><span data-contrast="none">status</span><span data-contrast="none">: </span><span data-contrast="none">« True »</span><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La section </span><span data-contrast="none">spec</span><span data-contrast="auto"> contient le  </span><span data-contrast="none">controllerName</span><span data-contrast="auto"> qui spécifie le provider utilisé. Ici, nous notons la valeur </span><span data-contrast="none">io.cilium/gateway-controller</span><span data-contrast="auto">. </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">En se référant au schéma de l’organisation rôle-centrique de la gateway API, on note que la Gateway Class est gérée côté Infrastructure Provider</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154234 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114307-600x299.png" alt="" width="600" height="299" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114307-600x299.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114307-768x382.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114307.png 972w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW198136416 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW198136416 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">Ainsi, </span><span class="NormalTextRun SCXW198136416 BCX8" data-ccp-charstyle="Source Text">un</span><span class="NormalTextRun SCXW198136416 BCX8" data-ccp-charstyle="Source Text"> Infrastructure Provider</span><span class="NormalTextRun SCXW198136416 BCX8" data-ccp-charstyle="Source Text"> est en théorie</span> <span class="NormalTextRun SCXW198136416 BCX8" data-ccp-charstyle="Source Text">est capable de définir</span><span class="NormalTextRun SCXW198136416 BCX8" data-ccp-charstyle="Source Text"> une classe pour le trafic public et une autre pour le trafic privé.</span></span><span class="EOP SCXW198136416 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154236 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114428-600x162.png" alt="" width="600" height="162" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114428-600x162.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114428-1024x276.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114428-768x207.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-114428.png 1216w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW28739758 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW28739758 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">Regardons à présent </span></span><a class="Hyperlink SCXW28739758 BCX8" href="https://gateway-api.sigs.k8s.io/reference/spec/#gatewayclass" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW28739758 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW28739758 BCX8" data-ccp-charstyle="Hyperlink">l’objet API dans la documentation</span></span></a><span class="TextRun SCXW28739758 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW28739758 BCX8" data-ccp-charstyle="Source Text">, afin de déterminer quelles sont nos options pour configurer davantage une Gateway </span><span class="NormalTextRun SpellingErrorV2Themed SCXW28739758 BCX8" data-ccp-charstyle="Source Text">Class. </span><span class="NormalTextRun SpellingErrorV2Themed SCXW28739758 BCX8" data-ccp-charstyle="Source Text">Le</span> <span class="NormalTextRun SCXW28739758 BCX8" data-ccp-charstyle="Source Text">premier niveau de paramètres</span><span class="NormalTextRun SCXW28739758 BCX8" data-ccp-charstyle="Source Text"> contient</span><span class="NormalTextRun SCXW28739758 BCX8" data-ccp-charstyle="Source Text"> les éléments suivants : </span></span><span class="EOP SCXW28739758 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154238 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115025-600x242.png" alt="" width="600" height="242" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115025-600x242.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115025-1024x413.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115025-768x310.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115025.png 1320w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154240 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115812-600x212.png" alt="" width="600" height="212" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115812-600x212.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115812-1024x362.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115812-768x271.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-115812.png 1282w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">La section </span><span data-contrast="none">parametersRef</span><span data-contrast="auto"> est utilisée pour des configurations spécifiques au provider, et peut renvoyer vers une CRD ou une configmap.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Dans le cas de Cilium, il y a effectivement une CRD appelé </span><span data-contrast="none">CiliumGatewayClassConfig</span><span data-contrast="auto"> qui peut être utilisé pour donner des paramètres supplémentaires, spécifique à Cilium.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">Examinons comment utiliser ces différents paramètres.</span><span data-ccp-props="{}"> </span></p>
<h5><span class="TextRun SCXW42396817 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW42396817 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">2.2. </span><span class="NormalTextRun SCXW42396817 BCX8" data-ccp-charstyle="Source Text">Expérimentation</span><span class="NormalTextRun SCXW42396817 BCX8" data-ccp-charstyle="Source Text">s</span><span class="NormalTextRun SCXW42396817 BCX8" data-ccp-charstyle="Source Text"> avec la </span><span class="NormalTextRun SCXW42396817 BCX8" data-ccp-charstyle="Source Text">GatewayClass</span></span><span class="EOP SCXW42396817 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Une commande kubectl nous a permis précédemment d’identifier la GatewayClass Cilium par défaut.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Pour créer davantage de GatewayClass, par exemple pour du trafic interne et externe les définitions ci-dessous peuvent être utilisées : </span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> <img loading="lazy" decoding="async" class="size-medium wp-image-154243 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141634-600x270.png" alt="" width="600" height="270" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141634-600x270.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141634-1024x461.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141634-768x346.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141634.png 1172w" sizes="auto, (max-width: 600px) 100vw, 600px" /></span></p>
<p><span class="TextRun SCXW229882257 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW229882257 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">Après application du fichier, nous obtenons 2 nouvelles </span><span class="NormalTextRun SCXW229882257 BCX8" data-ccp-charstyle="Source Text">GatewayClass</span><span class="NormalTextRun SCXW229882257 BCX8" data-ccp-charstyle="Source Text">.</span></span><span class="EOP SCXW229882257 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154245 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141825-600x113.png" alt="" width="600" height="113" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141825-600x113.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141825-1024x192.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141825-768x144.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-141825.png 1374w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">A ce stade cependant, rien ne permet de spécifier dans les futures Gateway si celles-ci devraient être privées ou publiques.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Dans le cadre de Cilium, il est possible d’utiliser la CRD </span><span data-contrast="none">CiliumGatewayClassConfig</span><span data-contrast="auto"> mentionnée précédemment.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La section </span><span data-contrast="none">spec</span><span data-contrast="auto"> de cette CRD, visible sur la </span><a href="https://docs.cilium.io/en/latest/network/servicemesh/gateway-api/parameterized-gatewayclass/"><span data-contrast="none">documentation</span></a><span data-contrast="auto"> Cilium est comme suit : </span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154247 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-142418-600x319.png" alt="" width="600" height="319" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-142418-600x319.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-142418-1024x544.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-142418-768x408.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-142418-500x266.png?crop=1 500w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-142418.png 1090w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154248 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145023-600x411.png" alt="" width="600" height="411" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145023-600x411.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145023-768x526.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145023.png 795w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154250 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145336-600x397.png" alt="" width="600" height="397" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145336-600x397.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145336-768x508.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145336.png 831w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW179948245 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW179948245 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">Il convient de noter</span> <span class="NormalTextRun SCXW179948245 BCX8" data-ccp-charstyle="Source Text">que la ressource est </span><span class="NormalTextRun SpellingErrorV2Themed SCXW179948245 BCX8" data-ccp-charstyle="Source Text">namespaced</span><span class="NormalTextRun SCXW179948245 BCX8" data-ccp-charstyle="Source Text">, et que son nom court est </span></span><span class="TextRun SCXW179948245 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SpellingErrorV2Themed SCXW179948245 BCX8">cgccc</span><span class="NormalTextRun SCXW179948245 BCX8">.</span></span><span class="EOP SCXW179948245 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154252 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145640-600x61.png" alt="" width="600" height="61" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145640-600x61.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145640-1024x105.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145640-768x79.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145640.png 1288w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154255 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145729-1-600x71.png" alt="" width="600" height="71" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145729-1-600x71.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145729-1-1024x121.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145729-1-768x91.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145729-1-1536x182.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145729-1.png 1665w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW238527468 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW238527468 BCX8" data-ccp-charstyle="Source Text" data-ccp-charstyle-defn="{&quot;ObjectId&quot;:&quot;0624522b-701c-5ece-bc63-916c49f999b3|1&quot;,&quot;ClassId&quot;:1073872969,&quot;Properties&quot;:[469775450,&quot;Source Text&quot;,201340122,&quot;1&quot;,134234082,&quot;true&quot;,134233614,&quot;true&quot;,469778129,&quot;SourceText&quot;,335572020,&quot;1&quot;,469777841,&quot;Liberation Mono&quot;,469777842,&quot;Liberation Mono&quot;,469777843,&quot;Noto Sans Mono CJK SC&quot;,469777844,&quot;Liberation Mono&quot;,469769226,&quot;Liberation Mono,Noto Sans Mono CJK SC&quot;,268442635,&quot;24&quot;]}">Cette CRD </span><span class="NormalTextRun SCXW238527468 BCX8" data-ccp-charstyle="Source Text">permet de manipuler le type de service. </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW238527468 BCX8" data-ccp-charstyle="Source Text">il</span><span class="NormalTextRun SCXW238527468 BCX8" data-ccp-charstyle="Source Text"> e</span><span class="NormalTextRun SCXW238527468 BCX8" data-ccp-charstyle="Source Text">st possible </span><span class="NormalTextRun SCXW238527468 BCX8" data-ccp-charstyle="Source Text">d’</span><span class="NormalTextRun SCXW238527468 BCX8" data-ccp-charstyle="Source Text">écrire la définition suivante pour changer le type de service des Gateway d’une classe donnée.</span></span><span class="EOP SCXW238527468 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154257 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145924-600x198.png" alt="" width="600" height="198" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145924-600x198.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145924-1024x338.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145924-768x253.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-145924.png 1115w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Au passage, la documentation Cilium réfère des exemples avec un service de type </span><span data-contrast="none">NodePort</span><span data-contrast="auto">, utile pour des sandbox local sans Cloud Controller Manager, mais pas avec du </span><span data-contrast="none">ClusterIP</span><span data-contrast="auto"> comme dans notre exemple. </span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">D’autre part, pour faire un peu de lien avec notre plateforme Cloud (ici Azure), il n’y a pas au niveau de la GatewayClass de moyen de passer des annotations comme </span><span data-contrast="none">service.beta.kubernetes.io/azure-load-balancer-internal: « true » </span><span data-contrast="auto">pour forcer des Gateway avec des services de type </span><span data-contrast="none">LoadBalancer</span><span data-contrast="auto"> mais utilisant un service Azure LoadBalancer Internal. </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La GatewayClass est un équivalent à l’IngressClass des ingress controllers, et on verra que les annotations sont plutôt gérées au niveau de la Gateway. </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">A présent, l’étape suivante concerne Gateway. </span><span data-ccp-props="{}"> </span></p>
<h2><span class="TextRun SCXW60625400 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW60625400 BCX8" data-ccp-parastyle="heading 1">3. </span><span class="NormalTextRun SCXW60625400 BCX8" data-ccp-parastyle="heading 1">A propos de la Gateway</span></span><span class="EOP SCXW60625400 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;335559738&quot;:240,&quot;335559739&quot;:120}"> </span></h2>
<h5><span class="TextRun SCXW104479532 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW104479532 BCX8" data-ccp-parastyle="heading 2">3.1. Concepts de base de la Gateway</span></span><span class="EOP SCXW104479532 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:40}"> </span></h5>
<p><span class="TextRun SCXW83506856 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW83506856 BCX8">Comme le schéma ci-dessous le représente, la Gateway est le premier élément auquel accède un client qui veut atteindre une application exposée dans un environnement </span><span class="NormalTextRun SCXW83506856 BCX8">Kubernetes</span><span class="NormalTextRun SCXW83506856 BCX8">.</span></span><span class="EOP SCXW83506856 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154260 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150130-600x238.png" alt="" width="600" height="238" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150130-600x238.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150130-1024x406.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150130-768x305.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150130.png 1232w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Tenant compte de cette représentation, ainsi que de l’organisation Role-Based de la Gateway API,les divergences avec le modèle Ingress deviennent plus claires.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">En effet, avec un Ingress Controller, un unique point d’accès a été défini (sous la forme d’un service Kubernetes finalement, toute la partie L7 étant prise en charge par le dit controller), alors chaque Gateway est un point d’accès, obtenu d’une ou plusieurs GatewayClass.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">Ci-dessous une définition de Gateway, avec la GatewayClass Cilium par défaut.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154262 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150307-600x234.png" alt="" width="600" height="234" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150307-600x234.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150307-1024x400.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150307-768x300.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150307.png 1122w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-ccp-props="{}"> <span class="TextRun SCXW67003739 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW67003739 BCX8">La création de cette Gateway entrainera la création d’un service correspondant, préfixé avec </span></span><span class="TextRun SCXW67003739 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SpellingErrorV2Themed SCXW67003739 BCX8">cilium</span></span><span class="TextRun SCXW67003739 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SpellingErrorV2Themed SCXW67003739 BCX8">&#8211;</span></span><span class="TextRun SCXW67003739 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SpellingErrorV2Themed SCXW67003739 BCX8">gateway</span></span><span class="TextRun SCXW67003739 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW67003739 BCX8">-.</span></span><span class="EOP SCXW67003739 BCX8" data-ccp-props="{}"> </span></span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154264 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150422-600x160.png" alt="" width="600" height="160" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150422-600x160.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150422-1024x274.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150422-768x205.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150422.png 1144w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW241003467 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW241003467 BCX8">À noter</span><span class="NormalTextRun SCXW241003467 BCX8"> par ailleurs que l’on a bien un service de type </span></span><span class="TextRun SCXW241003467 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW241003467 BCX8">LoadBalancer</span></span><span class="TextRun SCXW241003467 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW241003467 BCX8">.</span></span><span class="EOP SCXW241003467 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154266 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150817-600x446.png" alt="" width="600" height="446" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150817-600x446.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-150817.png 727w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Également, on remarque le paramètre </span><span data-contrast="none">metadata.ownerReferences</span><span data-contrast="auto"> qui indique la dépendance à une Gateway.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154269 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151050-1-600x198.png" alt="" width="600" height="198" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151050-1-600x198.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151050-1-768x254.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151050-1.png 1024w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW203256347 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW203256347 BCX8">Essayons à présent de </span><span class="NormalTextRun AdvancedProofingIssueV2Themed SCXW203256347 BCX8">customiser</span><span class="NormalTextRun SCXW203256347 BCX8"> un peu notre Gateway.</span></span><span class="EOP SCXW203256347 BCX8" data-ccp-props="{}"> </span></p>
<h5><span class="TextRun SCXW244862798 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW244862798 BCX8" data-ccp-parastyle="heading 2">3.2. Utilisation d’une </span><span class="NormalTextRun SCXW244862798 BCX8" data-ccp-parastyle="heading 2">GatewayClass</span><span class="NormalTextRun SCXW244862798 BCX8" data-ccp-parastyle="heading 2"> avec une configuration Custom</span></span><span class="EOP SCXW244862798 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Dans cette section, la CRD </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="none">CiliumGatewayClassConfig</span><span data-contrast="auto"> présenté précédemment est réexaminée </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Une GatewayClass custom est disponible utilisant une CRD pour changer le type de service.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154272 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151347-600x498.png" alt="" width="600" height="498" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151347-600x498.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151347.png 625w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154273 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151458-600x356.png" alt="" width="600" height="356" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151458-600x356.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151458-768x456.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151458.png 904w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW188559509 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW188559509 BCX8">Et la définition de Gateway associée.</span></span><span class="EOP SCXW188559509 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154275 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151604-600x232.png" alt="" width="600" height="232" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151604-600x232.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151604-1024x396.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151604-768x297.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151604.png 1164w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW85374021 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW85374021 BCX8">L</span><span class="NormalTextRun SCXW85374021 BCX8">a</span><span class="NormalTextRun SCXW85374021 BCX8"> Gateway </span><span class="NormalTextRun SCXW85374021 BCX8">attendue </span><span class="NormalTextRun SCXW85374021 BCX8">d</span><span class="NormalTextRun SCXW85374021 BCX8">evrait</span><span class="NormalTextRun SCXW85374021 BCX8"> avoir un</span><span class="NormalTextRun SCXW85374021 BCX8"> service sous-jacent de type </span></span><span class="TextRun SCXW85374021 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW85374021 BCX8">ClusterIP</span></span><span class="TextRun SCXW85374021 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW85374021 BCX8">, sans valeur </span><span class="NormalTextRun SCXW85374021 BCX8">attribuée</span><span class="NormalTextRun SCXW85374021 BCX8"> pour l’adresse externe. Toutefois, on se rend compte que ce n’est pas le cas.</span></span><span class="EOP SCXW85374021 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154277 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151724-600x249.png" alt="" width="600" height="249" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151724-600x249.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151724-1024x425.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151724-768x319.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151724.png 1126w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Dans ce cas spécifique, la CRD </span><span data-contrast="none">CiliumGatewayClassConfig</span><span data-contrast="auto">  n’a pas donné le résultat escompté.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Est-il tout de même possible d’obtenir une Gateway s’appuyant sur un Azure Internal Load Balancer ?</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Essayons d’éditer le service associé d’une Gateway, en ajoutant l’annotation appropriée, </span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154279 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151842-600x253.png" alt="" width="600" height="253" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151842-600x253.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151842-1024x432.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151842-768x324.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151842.png 1119w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154280 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151936-600x141.png" alt="" width="600" height="141" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151936-600x141.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151936-1024x241.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151936-768x181.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-151936.png 1304w" sizes="auto, (max-width: 600px) 100vw, 600px" /><img loading="lazy" decoding="async" class="size-medium wp-image-154281 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152202-600x411.png" alt="" width="600" height="411" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152202-600x411.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152202-768x525.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152202.png 893w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154282 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152249-600x248.png" alt="" width="600" height="248" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152249-600x248.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152249-1024x423.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152249-768x317.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152249.png 1130w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">Après un peu d’attente, le service est mis à jour et s’appuie sur un Internal LoadBalancer.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154285 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152356-1-600x93.png" alt="" width="600" height="93" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152356-1-600x93.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152356-1-1024x158.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152356-1-768x118.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152356-1.png 1400w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Nous avons donc obtenu le résultat attendu, mais cela n’est pas très satisfaisant. Observons nos options en analysant un peu plus l’API correspondant à la Gateway.</span><span data-ccp-props="{}"> </span></p>
<h5><span data-ccp-props="{}"> </span><span class="TextRun SCXW72821543 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW72821543 BCX8" data-ccp-parastyle="heading 2">3.3. Analyse de l’objet Gateway</span></span><span class="EOP SCXW72821543 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Comme pour la GatewayClass, la </span><a href="https://gateway-api.sigs.k8s.io/reference/spec/#gateway"><span data-contrast="none">documentation</span></a><span data-contrast="auto"> de la Gateway API donne les détails de l’objet Gateway.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Dans la section </span><span data-contrast="none">spec</span><span data-contrast="auto">, la sous-section </span><span data-contrast="none">infrastructure</span><span data-contrast="auto">, contient les paramètres </span><span data-contrast="none">AnnotationKey</span><span data-contrast="auto"> et </span><span data-contrast="none">AnnotationValue</span><span data-contrast="auto">. </span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154288 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152705-600x328.png" alt="" width="600" height="328" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152705-600x328.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152705-1024x560.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152705-768x420.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152705.png 1055w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">Une nouvelle Gateway peut être créer avec cette section </span><span data-contrast="none">infrastructure</span><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154289 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152811-600x308.png" alt="" width="600" height="308" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152811-600x308.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152811-1024x526.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152811-768x394.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152811.png 1139w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Une Gateway est obtenue avec une adresse privée, et son service associé qui hérite de l’annotation passée.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154291 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152925-600x166.png" alt="" width="600" height="166" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152925-600x166.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152925-1024x283.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152925-768x212.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152925-1536x425.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-02-152925.png 1555w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">La Gateway créée est finalement de type interne, mais sa nature n’a pas été hérité de la GatewayClass.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Faisons un petit résumé.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:0,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:259}"> </span></p>
<h2><span class="TextRun SCXW143139504 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW143139504 BCX8" data-ccp-parastyle="heading 1">Conclusion</span></span><span class="EOP SCXW143139504 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;335559738&quot;:240,&quot;335559739&quot;:120}"> </span></h2>
<p><span data-contrast="auto">Nous avons vu un peu plus en profondeur les 2 objets de la Gateway API suivant : </span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;335559738&quot;:0}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">La GatewayClass</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">La Gateway</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-ccp-props="{}"> </span><span data-contrast="auto">La GatewayClass, comme pour l’IngressClass, est utilisé pour définir des propriétés qui seront héritées par les Gateway enfants.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La Gateway n’a pas d’équivalent dans l’architecture Ingress Controller. Elle constitue le point d’entrée pour les applications qui sont exposées. Il est possible de partager des Gateway sur différents namespaces, mais ce sera un sujet pour une autre fois.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">De la même manière, les détails pour l’exposition d’une application, et notamment l’usage de la http Route, seront vu prochainement.</span><span data-ccp-props="{}"> </span></p>
<p><span data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/kubernetes-gateway-api-gatewayclass-gateway/">A propos de la Kubernetes Gateway API</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/cloud-2/kubernetes-gateway-api-gatewayclass-gateway/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154213</post-id>	</item>
		<item>
		<title>Construire un pipeline CI/CD sécurisée et optimisée pour déployer de l’IaC sur Azure</title>
		<link>https://blog.cellenza.com/cloud-2/pipeline-ci-cd-terraform-azure/</link>
					<comments>https://blog.cellenza.com/cloud-2/pipeline-ci-cd-terraform-azure/#respond</comments>
		
		<dc:creator><![CDATA[Claude Mahoukou]]></dc:creator>
		<pubDate>Thu, 16 Oct 2025 08:33:47 +0000</pubDate>
				<category><![CDATA[Cloud]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154294</guid>

					<description><![CDATA[<p>Introduction L’importance croissante de l’automatisation et de la sécurité dans le déploiement de l’infrastructure  Les pratiques DevOps ont profondément transformé la manière dont les équipes IT conçoivent, déploient et maintiennent leurs infrastructures. Dans un contexte où les environnements cloud sont de plus en plus complexes, dynamiques et interconnectés, l’Infrastructure as Code (IaC) s’impose comme un [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/pipeline-ci-cd-terraform-azure/">Construire un pipeline CI/CD sécurisée et optimisée pour déployer de l’IaC sur Azure</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Introduction</h3>
<h5><span class="TextRun SCXW226853143 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW226853143 BCX8">L’importance croissante de l’automatisation et de la sécurité dans le déploiement de l’infrastructure</span></span><span class="EOP SCXW226853143 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></h5>
<p><span class="TextRun SCXW180223269 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180223269 BCX8">Les pratiques DevOps ont profondément transformé la manière dont les équipes IT conçoivent, déploient et maintiennent leurs infrastructures. Dans un contexte où les environnements cloud sont de plus en plus complexes, dynamiques et interconnectés, <strong>l’</strong></span></span><strong><span class="TextRun SCXW180223269 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180223269 BCX8">Infrastructure as Code (</span><span class="NormalTextRun SpellingErrorV2Themed SCXW180223269 BCX8">IaC</span><span class="NormalTextRun SCXW180223269 BCX8">)</span></span></strong><span class="TextRun SCXW180223269 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180223269 BCX8"> s’impose comme un levier clé pour répondre aux enjeux de </span></span><strong><span class="TextRun SCXW180223269 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180223269 BCX8">scalabilité, de fiabilité et de rapidité d’exécution</span></span><span class="TextRun SCXW180223269 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180223269 BCX8">.</span></span><span class="EOP SCXW180223269 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></strong></p>
<p><span class="TextRun SCXW31027734 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW31027734 BCX8">Mais automatiser ne suffit pas. </span></span><strong><span class="TextRun SCXW31027734 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW31027734 BCX8">Une pipeline</span><span class="NormalTextRun SCXW31027734 BCX8"> CI/CD mal conçue peut introduire de nouveaux risques</span></span></strong><span class="TextRun SCXW31027734 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW31027734 BCX8"><strong> :</strong> erreurs de configuration, expositions de secrets, ou encore dérives entre l’état souhaité et l’état réel de l’infrastructure. C’est pourquoi<strong> la </strong></span></span><strong><span class="TextRun SCXW31027734 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW31027734 BCX8">sécurisation, la traçabilité et la standardisation des chaînes CI/CD</span></span></strong><span class="TextRun SCXW31027734 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><strong><span class="NormalTextRun SCXW31027734 BCX8"> dédiées à l’</span><span class="NormalTextRun SpellingErrorV2Themed SCXW31027734 BCX8">IaC</span></strong><span class="NormalTextRun SCXW31027734 BCX8"> sont aujourd’hui incontournables pour garantir un déploiement maîtrisé et conforme aux bonnes pratiques de gouvernance cloud.</span></span><span class="EOP SCXW31027734 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Face à ces défis, de nombreuses organisations – y compris les plus avancées – adoptent des </span><b><span data-contrast="auto">architectures CI/CD modulaires, sécurisées et évolutives</span></b><span data-contrast="auto">, s’appuyant sur :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="24" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Terraform</span></b><span data-contrast="auto"> pour la gestion déclarative de l’infrastructure,</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="24" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Azure DevOps</span></b><span data-contrast="auto"> pour l’orchestration des workflows,</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="24" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Et </span><b><span data-contrast="auto">Microsoft Azure</span></b><span data-contrast="auto"> comme environnement cible de déploiement.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><strong><span class="TextRun SCXW65437610 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW65437610 BCX8">Objectif de l’article</span></span><span class="EOP SCXW65437610 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></strong></p>
<p><span class="TextRun SCXW132038499 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW132038499 BCX8">Cet article propose une </span></span><strong><span class="TextRun SCXW132038499 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW132038499 BCX8">démarche concrète et structurée</span></span></strong><span class="TextRun SCXW132038499 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW132038499 BCX8"> pour concevoir et mettre en œuvre </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW132038499 BCX8">une pipeline</span><span class="NormalTextRun SCXW132038499 BCX8"> CI/CD dédiée au déploiement d’</span><span class="NormalTextRun SpellingErrorV2Themed SCXW132038499 BCX8">IaC</span><span class="NormalTextRun SCXW132038499 BCX8"> avec </span></span><strong><span class="TextRun SCXW132038499 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SpellingErrorV2Themed SCXW132038499 BCX8">Terraform</span><span class="NormalTextRun SCXW132038499 BCX8"> sur Azure</span></span></strong><span class="TextRun SCXW132038499 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW132038499 BCX8">, orchestrée via </span></span><strong><span class="TextRun SCXW132038499 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW132038499 BCX8">Azure DevOps</span></span></strong><span class="TextRun SCXW132038499 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW132038499 BCX8">.</span></span><span class="EOP SCXW132038499 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Vous découvrirez comment :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Comprendre les enjeux spécifiques d’une pipeline IaC</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Identifier les erreurs fréquentes et les risques d’une automatisation mal maîtrisée</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Définir une architecture robuste intégrant la sécurité, l’organisation des environnements et le contrôle qualité</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Construire pas à pas une pipeline CI/CD modulaire, réutilisable et bien documentée</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Adopter les bonnes pratiques de versioning, de gestion des secrets et de tests automatisés</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="6" data-aria-level="1"><span data-contrast="auto">Évaluer les choix techniques autour d’Azure DevOps : agents d’exécution, Service Connections, templates YAML, etc</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<h3><strong>I- <span class="TextRun SCXW207067191 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW207067191 BCX8" data-ccp-parastyle="heading 1">Comprendre les enjeux du CI/CD pour l’</span><span class="NormalTextRun SpellingErrorV2Themed SCXW207067191 BCX8" data-ccp-parastyle="heading 1">IaC</span></span><span class="EOP SCXW207067191 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></strong></h3>
<p><strong>​</strong><b><span data-contrast="auto">Problèmes fréquents : erreurs humaines, manque de validation, mauvaise organisation.</span></b></p>
<p><span data-contrast="auto">Déployer de l’IaC sans pipeline CI/CD revient à exécuter manuellement des scripts Terraform dans un terminal, souvent depuis des postes locaux. Cette pratique expose les projets à de nombreuses </span><span data-contrast="auto">erreurs : oublis de paramètres, mauvaises configurations, fuites de secrets ou dérives entre l’infrastructure réelle et celle définie dans le code.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Une pipeline CI/CD bien conçue permet d’automatiser les étapes critiques du cycle de vie IaC (init, validate, plan, apply), tout en renforçant la sécurité et la traçabilité. Elle réduit les erreurs humaines, standardise les déploiements et permet d’appliquer systématiquement des contrôles qualité via des tests, des validations et des revues de code.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">En parallèle, l’usage rigoureux d’un système de versioning comme Git est indispensable. Il permet de tracer chaque modification, de collaborer efficacement et d’assurer un alignement constant entre le code source et l’état des environnements. Sans cette rigueur, les projets s’exposent à des dérives : états désynchronisés, scripts modifiés localement sans historique clair, ou déploiements non audités.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">C’est la </span><b><span data-contrast="auto">combinaison d’un repository Git structuré et d’une pipeline CI/CD robuste</span></b><span data-contrast="auto"> qui constitue le socle d’une approche IaC maîtrisée et alignée avec les exigences de gouvernance cloud.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<h3>II-<span class="TextRun SCXW221397629 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW221397629 BCX8" data-ccp-parastyle="heading 1">Préparer le projet </span><span class="NormalTextRun SpellingErrorV2Themed SCXW221397629 BCX8" data-ccp-parastyle="heading 1">IaC</span><span class="NormalTextRun SCXW221397629 BCX8" data-ccp-parastyle="heading 1"> </span></span><span class="EOP SCXW221397629 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:720,&quot;335559738&quot;:360,&quot;335559739&quot;:80,&quot;335559991&quot;:360,&quot;469777462&quot;:[720],&quot;469777927&quot;:[0],&quot;469777928&quot;:[8]}"> </span></h3>
<p><span data-contrast="auto">La qualité d&rsquo;une pipeline CI/CD repose d&rsquo;abord sur une base solide : la structuration du projet Terraform. Trop souvent négligée, cette étape conditionne pourtant la maintenabilité, la sécurité et la collaboration à long terme.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Avant même d’écrire une ligne de YAML, il est essentiel de poser des fondations solides : organiser clairement le dépôt Git, anticiper la gestion multi-environnements, définir une stratégie de versioning, et centraliser les variables sensibles. Une organisation rigoureuse permet d’éviter bon nombre de pièges techniques ou organisationnels par la suite.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<h3>II.I- <span class="TextRun SCXW160987356 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW160987356 BCX8" data-ccp-parastyle="heading 2">Organisation du dépôt Git : structure par environnement et modules</span></span><span class="EOP SCXW160987356 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:720,&quot;335559738&quot;:160,&quot;335559739&quot;:80,&quot;469777462&quot;:[720],&quot;469777927&quot;:[0],&quot;469777928&quot;:[8]}"> </span></h3>
<p><span data-contrast="auto">Dans une logique d’industrialisation, notamment sur Azure avec Terraform, une </span><b><span data-contrast="auto">architecture modulaire et scalable</span></b><span data-contrast="auto"> s’impose.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Les bonnes pratiques consistent à :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="26" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Séparer les modules Terraform</span></b><span data-contrast="auto"> dans un dépôt dédié, versionné, réutilisable sur plusieurs projets.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="26" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Créer un dépôt par projet ou par environnement</span></b><span data-contrast="auto">, dit « consommateur », qui appelle dynamiquement les modules via des tags (ref=vX.Y.Z).</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Cette séparation permet de centraliser la maintenance des briques d’infrastructure (réseaux, bases de données, comptes de stockage, etc.), tout en laissant aux projets la liberté d’orchestrer leurs environnements selon leurs besoins spécifiques.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">Structure globale du dépôt IaC consommateur</span></b><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Voici la structure à adopter dans votre dépôt principal :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:720,&quot;335559740&quot;:240}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154309 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-112904-600x372.png" alt="" width="600" height="372" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-112904-600x372.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-112904-768x476.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-112904.png 907w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><b><span data-contrast="auto">Fichier d’entrée : azure-pipelines.yml et templating YAML</span></b><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Le fichier azure-pipelines.yml, situé à la racine du dépôt, constitue le point d’entrée de la pipeline CI/CD. Il référence un ou plusieurs templates YAML centralisés, généralement placés dans .azure/pipelines/, tels que stage.yml, où sont définis les jobs standards : init, validate, plan, apply.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Cette approche modulaire facilite la mutualisation des pipelines entre projets et permet de centraliser les mises à jour, tout en garantissant la cohérence des bonnes pratiques sur l’ensemble des environnements.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">backend/ : gestion du backend Terraform</span></b><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Le dossier backend/ contient les fichiers de configuration .conf propres à chaque environnement. Ces fichiers définissent l’emplacement et les paramètres du backend distant Azure utilisé pour stocker le terraform.tfstate.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Exemple de paramètres définis :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">resource_group_name : groupe de ressources Azure contenant le storage account</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">storage_account_name : compte de stockage dédié au backend</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">container_name : conteneur Blob où sera stocké l’état</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">key : nom unique du fichier .tfstate par environnement</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Cette organisation permet :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Un verrouillage d’état fiable (state locking) évitant les conflits d’écriture</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Une isolation stricte des environnements</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Un suivi centralisé et sécurisé de l’état de l’infrastructure</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><b><span data-contrast="auto">vars/ : centralisation des variables d’environnement</span></b><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Le dossier vars/ regroupe les fichiers .tfvars propres à chaque environnement (ex. dev.tfvars, prod.tfvars). Ces fichiers permettent d’injecter des valeurs spécifiques (noms, tailles, tags, etc.) tout en réutilisant une même base de modules.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Avantages :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Reproductibilité</span></b><span data-contrast="auto"> des déploiements</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Clarté</span></b><span data-contrast="auto"> dans la gestion des paramètres</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Versioning centralisé</span></b><span data-contrast="auto"> des configurations</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Fichiers racine : exécution Terraform</span></b><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">À la racine du dépôt, on retrouve les fichiers standards suivants :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">main.tf : appelle les modules distants</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">variables.tf : déclare les variables attendues</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">providers.tf : configure le provider Azure</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">locals.tf : centralise les valeurs intermédiaires (tags, formats, concaténations, etc.)</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><span data-contrast="auto">Exemple d’appel d’un module distant dans main.tf :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154311 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113122-600x100.png" alt="" width="600" height="100" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113122-600x100.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113122-1024x170.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113122-768x127.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113122-1536x255.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113122.png 1783w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">L’utilisation de </span><b><span data-contrast="auto">tags (ref=vX.Y.Z)</span></b><span data-contrast="auto"> permet de figer une version stable d’un module, garantissant traçabilité et compatibilité dans le temps.Cette architecture modulaire et templatisée offre plusieurs avantages :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><b><span data-contrast="auto">Architecture modulaire : un modèle éprouvé</span></b><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Cette organisation modulaire repose sur une séparation claire des responsabilités :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="31" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Le dépôt template contient uniquement les modules Terraform génériques.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="31" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Le dépôt projet orchestre les déploiements selon les environnements cibles.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><span data-contrast="auto">Avantages :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Industrialisation : mise à jour centralisée des modules</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Traçabilité : chaque version de module est identifiable</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Sécurité : séparation des responsabilités</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Scalabilité : ajout d’environnements ou de modules simplifié</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<h3>II.II- <span class="TextRun SCXW36226559 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW36226559 BCX8" data-ccp-parastyle="heading 2">Sécurisation des branches : stratégie Git, gestion des PR, approbation</span></span><span class="EOP SCXW36226559 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Dans un projet IaC, une erreur peut avoir des conséquences critiques : ressources supprimées, configurations erronées ou fuites d’informations. La mise en place de </span><b><span data-contrast="auto">branch policies</span></b><span data-contrast="auto"> strictes est donc incontournable.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">Stratégie de branches recommandée</span></b><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Une stratégie Git claire permet d’aligner sécurité, collaboration et contrôle qualité. Voici une structure éprouvée :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="33" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">main</span></b><span data-contrast="auto"> : branche protégée, contenant le code validé. Représente la source de vérité. Tout changement doit passer par une Pull Request (PR).</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="33" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">develop</span></b><span data-contrast="auto"> : branche intermédiaire servant à valider les workflows sur l’environnement de qualification.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="33" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Branches feature/</span></b><span data-contrast="auto"> : utilisées pour introduire des modifications spécifiques, issues de develop.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">La branche main doit être </span><b><span data-contrast="auto">protégée</span></b><span data-contrast="auto"> par une policy interdisant tout push direct.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">Politiques de validation</span></b><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Les </span><b><span data-contrast="auto">branch policies</span></b><span data-contrast="auto"> dans Azure DevOps permettent de :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="34" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Lancer automatiquement la pipeline à l’ouverture de chaque PR</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="34" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Imposer une revue par un ou plusieurs membres de l’équipe</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="34" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Bloquer la fusion si la pipeline échoue ou si des critères qualité ne sont pas remplis</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="34" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Exiger un lien avec une </span><b><span data-contrast="auto">User Story ou un ticket</span></b><span data-contrast="auto"> pour chaque PR</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Cette démarche garantit la qualité du code, la traçabilité des décisions, et une gouvernance claire des modifications.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559740&quot;:240}"> </span></p>
<h3>II.III- <span class="TextRun SCXW238478792 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW238478792 BCX8" data-ccp-parastyle="heading 2">Organisation des groupes de variables</span></span><span class="EOP SCXW238478792 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Plus l’infrastructure grandit, plus la gestion des variables devient critique. Pour garantir lisibilité, maintenabilité et cohérence, chaque environnement dispose de son propre fichier .tfvars,</span> <span data-contrast="auto">regroupé dans un dossier</span> <span data-contrast="auto">vars/.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Ce découpage permet de :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="35" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Centraliser les paramètres spécifiques (noms, tailles, régions, tags, etc.)</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="35" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Réutiliser les mêmes modules avec des valeurs différentes</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="35" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Faciliter les relectures et les validations</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Un simple appel avec le bon fichier .tfvars suffit à cibler un environnement spécifique sans modifier le code source.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><b><span data-contrast="auto">Validation conditionnelle des variables</span></b><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Pour fiabiliser les déploiements, il est essentiel d’intégrer des </span><b><span data-contrast="auto">règles de validation dans les fichiers .tf</span></b><span data-contrast="auto">. Cela permet de détecter rapidement les erreurs de saisie ou les valeurs non conformes dès le terraform plan.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Exemple :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154314 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113410-600x121.png" alt="" width="600" height="121" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113410-600x121.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113410-1024x207.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113410-768x155.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113410-1536x311.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113410.png 1630w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="none">​</span></p>
<p><span data-contrast="auto">Ce mécanisme évite des déploiements incorrects et renforce les standards internes, notamment dans les projets à grande échelle.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Variable Groups dans Azure DevOps : une approche complémentaire</span></b><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">En parallèle des fichiers .tfvars, </span><b><span data-contrast="auto">les Variable Groups</span></b><span data-contrast="auto"> d’Azure DevOps permettent de gérer les paramètres et secrets </span><b><span data-contrast="auto">directement depuis l’interface DevOps</span></b><span data-contrast="auto">, sans modifier le code Git.</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><span data-contrast="auto">Avantages :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="36" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Centralisation des variables utilisées dans plusieurs pipelines</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="36" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Séparation du code et de la configuration</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="36" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Intégration directe avec </span><b><span data-contrast="auto">Azure Key Vault</span></b><span data-contrast="auto"> pour sécuriser les secrets</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="36" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Modification facile sans ouverture de PR</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Exemple d’inclusion dans la pipeline YAML :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-154316 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-113958.png" alt="" width="510" height="244" /></p>
<p><span data-contrast="none">​</span><span data-contrast="auto">En une seule ligne, on charge toutes les variables nécessaires à un environnement donné.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Utilisation dans le code Terraform :</span></b><br />
<span data-contrast="auto">Une fois injectées dans la pipeline, ces variables peuvent être passées à Terraform en tant que -var lors du plan ou apply : terraform plan -var « vm_size=$(VM_SIZE) » -var « region=$(REGION) ». Dans le code Terraform, il suffit alors de déclarer : variable « vm_size » {} et variable « region » {}</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Pourquoi combiner .tfvars + Variable Groups ?</span></b><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Cette double approche permet de tirer le meilleur parti des deux mondes :</span></p>
<p><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> <img loading="lazy" decoding="async" class=" wp-image-154318 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-114613-600x86.png" alt="" width="705" height="101" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-114613-600x86.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-114613-1024x148.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-114613-768x111.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-114613-1536x221.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-114613.png 1658w" sizes="auto, (max-width: 705px) 100vw, 705px" /></span></p>
<p><span class="TextRun SCXW156488676 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW156488676 BCX8">Cette organisation prépare également l’infrastructure à </span></span><strong><span class="TextRun SCXW156488676 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW156488676 BCX8">évoluer facilement</span></span></strong><span class="TextRun SCXW156488676 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW156488676 BCX8"> : duplication vers d’autres environnements, équipes ou clients sans refactorisation.</span></span><span class="EOP SCXW156488676 BCX8" data-ccp-props="{}"> </span></p>
<h3>III-<span class="TextRun SCXW151891722 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW151891722 BCX8" data-ccp-parastyle="heading 1">Mettre en place les fondations </span><span class="NormalTextRun SpellingErrorV2Themed SCXW151891722 BCX8" data-ccp-parastyle="heading 1">Terraform</span></span><span class="EOP SCXW151891722 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Une fois le dépôt structuré et les variables bien gérées, il est temps de poser les bases techniques du projet : </span><b><span data-contrast="auto">backend distant, provider, verrouillage d’état</span></b><span data-contrast="auto">.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Backend distant sécurisé</span></b><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Le fichier terraform.tfstate est le </span><b><span data-contrast="auto">cœur</span></b><span data-contrast="auto"> du projet Terraform : il contient l’état réel de l’infrastructure. Le stocker en local expose à des risques majeurs (corruption, suppression, perte de synchronisation).</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">La bonne pratique : configurer un </span><b><span data-contrast="auto">backend distant dans Azure</span></b><span data-contrast="auto">, basé sur un Storage Account.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Avantages clés :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="37" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Collaboration fluide</span></b><span data-contrast="auto"> : état partagé entre tous les membres du projet</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="37" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Sécurité renforcée</span></b><span data-contrast="auto"> : contrôle d’accès via RBAC, endpoints privés, règles NSG</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="37" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Verrouillage automatique</span></b><span data-contrast="auto"> : évite les conflits lors d’exécutions concurrentes</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="37" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Versioning</span></b><span data-contrast="auto"> natif : possibilité de rollback en cas d’erreur</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="37" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><b><span data-contrast="auto">Intégration CI/CD</span></b><span data-contrast="auto"> : état toujours synchronisé, que ce soit en local ou via pipeline</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<h3>IV-<span class="TextRun SCXW175653130 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW175653130 BCX8" data-ccp-parastyle="heading 1">Construction </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW175653130 BCX8" data-ccp-parastyle="heading 1">de la pipeline</span></span><span class="EOP SCXW175653130 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h3>
<h4><span class="TextRun SCXW201381390 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW201381390 BCX8" data-ccp-parastyle="heading 2">IV.I-Définition </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW201381390 BCX8" data-ccp-parastyle="heading 2">d’une pipeline</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW201381390 BCX8" data-ccp-parastyle="heading 2">IaC</span><span class="NormalTextRun SCXW201381390 BCX8" data-ccp-parastyle="heading 2"> efficace</span></span><span class="EOP SCXW201381390 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">Une pipeline </span><b><span data-contrast="auto">Infrastructure as Code (IaC)</span></b><span data-contrast="auto"> efficace doit répondre à plusieurs impératifs :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Automatiser les étapes clés</span></b><span data-contrast="auto"> du cycle Terraform : init, validate, plan, apply</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Renforcer la sécurité</span></b><span data-contrast="auto"> via l’authentification OIDC, la gestion centralisée des secrets et le contrôle des accès</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Gérer plusieurs environnements</span></b><span data-contrast="auto"> (développement, production, etc.) de manière isolée et cohérente</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Intégrer des validations manuelles</span></b><span data-contrast="auto"> pour sécuriser les déploiements sensibles</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="19" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><b><span data-contrast="auto">Rester modulaire, lisible et facilement maintenable</span></b><span data-contrast="auto"> dans le temps</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<p><span data-contrast="auto">Dans notre approche, la pipeline s’articule autour des éléments suivants :</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Un </span><b><span data-contrast="auto">fichier azure-pipelines.yml</span></b><span data-contrast="auto">, agissant comme point d’entrée</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Un </span><b><span data-contrast="auto">template stages.yml</span></b><span data-contrast="auto"> réutilisable pour chaque environnement</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Des </span><b><span data-contrast="auto">groupes de variables</span></b><span data-contrast="auto"> partagés, facilitant la gestion des configurations</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="20" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Un </span><b><span data-contrast="auto">Storage Account Azure</span></b><span data-contrast="auto"> utilisé comme backend distant pour stocker et verrouiller l’état (tfstate) de manière centralisée</span><span data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></li>
</ul>
<h4>IV.II- <span class="TextRun SCXW252345988 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW252345988 BCX8" data-ccp-parastyle="heading 2">Étapes essentielles : init, </span><span class="NormalTextRun SpellingErrorV2Themed SCXW252345988 BCX8" data-ccp-parastyle="heading 2">validate</span><span class="NormalTextRun SCXW252345988 BCX8" data-ccp-parastyle="heading 2">, plan, </span><span class="NormalTextRun SpellingErrorV2Themed SCXW252345988 BCX8" data-ccp-parastyle="heading 2">apply</span></span><span class="EOP SCXW252345988 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="none">​</span></p>
<p><span data-contrast="auto">Nous décomposons chaque étape de Terraform dans notre pipeline. La première étape de notre pipeline sera l’initialisation :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">init</span></b><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Initialise le projet et configure le backend distant :</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154324 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131401-600x236.png" alt="" width="600" height="236" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131401-600x236.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131401-1024x403.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131401-768x302.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131401.png 1043w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">validate</span></b><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Permet de détecter les erreurs de syntaxe Terraform avant de générer un plan :</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154326 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131807-600x104.png" alt="" width="600" height="104" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131807-600x104.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131807-1024x177.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131807-768x133.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-131807.png 1527w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">plan</span></b><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Génère le plan Terraform (stocké en .tfplan) :</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="none">​</span><span data-ccp-props="{&quot;335559685&quot;:240,&quot;335559739&quot;:100,&quot;469777462&quot;:[960,9062],&quot;469777927&quot;:[0,1],&quot;469777928&quot;:[1,4]}"> <img loading="lazy" decoding="async" class="size-medium wp-image-154328 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-132103-600x93.png" alt="" width="600" height="93" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-132103-600x93.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-132103-1024x158.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-132103-768x119.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-132103.png 1222w" sizes="auto, (max-width: 600px) 100vw, 600px" /></span></p>
<p><span data-contrast="none">​</span><b><span data-contrast="auto">apply</span></b><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Exécute le plan si validé :</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154329 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133132-600x116.png" alt="" width="600" height="116" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133132-600x116.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133132-1024x198.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133132-768x148.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133132.png 1413w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3>IV.III- <span class="TextRun SCXW211957549 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW211957549 BCX8" data-ccp-parastyle="heading 2">Séparer les jobs / stages (validation, plan, </span><span class="NormalTextRun SpellingErrorV2Themed SCXW211957549 BCX8" data-ccp-parastyle="heading 2">apply</span><span class="NormalTextRun SCXW211957549 BCX8" data-ccp-parastyle="heading 2">…)</span></span><span class="EOP SCXW211957549 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Dans le fichier stage.yml, chaque étape clé du processus comme le plan ou l’apply est définie comme un stage distinct. Cette approche permet d’appliquer des politiques spécifiques à chaque étape (comme des approbations ou des délais d’attente), de mieux isoler et traiter les erreurs, et d’obtenir une pipeline plus modulaire, lisible et maintenable. </span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Extrait de stage.yml :</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154332 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133937-600x200.png" alt="" width="600" height="200" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133937-600x200.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133937-768x256.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-133937.png 1008w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW195315983 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW195315983 BCX8">Et dans azure-</span><span class="NormalTextRun SpellingErrorV2Themed SCXW195315983 BCX8">pipelines.yml</span><span class="NormalTextRun SCXW195315983 BCX8"> :</span></span><span class="EOP SCXW195315983 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-154334 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-134144.png" alt="" width="421" height="550" /></p>
<p><span data-contrast="auto">Ce fichier YAML déclenche automatiquement la pipeline lorsqu’un changement est détecté sur les branches main ou dev. Il s’appuie sur le template stages.yml pour structurer les étapes, et injecte dynamiquement la valeur de l’environnement (dev ou prd). Cela permet de charger les bons fichiers .tfvars et les fichiers de configuration du backend, assurant ainsi un déploiement cohérent selon le contexte.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Le fichier Yaml ressembleras à ça : </span><a href="https://github.com/ClaudeEmmanuel242/Cellenza_Article_Construire-un-pipeline-CI-CD-s-curis-e-"><span data-contrast="none">Lien GitHub</span></a><span data-contrast="auto"> </span><span data-ccp-props="{}"> </span></p>
<h4>IV.IV- <span class="TextRun SCXW203627572 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW203627572 BCX8" data-ccp-parastyle="heading 2">Gestion des validations manuelles (approbations)</span></span><span class="EOP SCXW203627572 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span class="TextRun SCXW191667858 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW191667858 BCX8">Avant d’exécuter un </span><span class="NormalTextRun SpellingErrorV2Themed SCXW191667858 BCX8">apply</span><span class="NormalTextRun SCXW191667858 BCX8"> sur un environnement critique comme la production, il est essentiel d’ajouter une étape de validation manuelle. Cela peut être réalisé en configurant un environnement avec approbation dans Azure DevOps ou en ajoutant une tâche conditionnelle dédiée au sein de </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW191667858 BCX8">la pipeline</span><span class="NormalTextRun SCXW191667858 BCX8">. Cette précaution permet de garder un contrôle humain avant tout changement impactant.</span> <span class="NormalTextRun SCXW191667858 BCX8">Voici comment l’on peut configurer cette étape</span><span class="NormalTextRun SCXW191667858 BCX8"> :</span></span><span class="EOP SCXW191667858 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154336 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-134358-600x147.png" alt="" width="600" height="147" srcset="https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-134358-600x147.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-134358-1024x250.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-134358-768x188.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/10/Capture-decran-2025-10-03-134358.png 1059w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">​<span class="TextRun SCXW264952412 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW264952412 BCX8">Dans Azure DevOps, il suffit de configurer une </span></span><span class="TextRun SCXW264952412 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW264952412 BCX8">approbation manuelle</span></span><span class="TextRun SCXW264952412 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW264952412 BCX8"> sur l’environnement </span><span class="NormalTextRun SpellingErrorV2Themed SCXW264952412 BCX8">GouvCloud</span><span class="NormalTextRun SCXW264952412 BCX8">-prod</span><span class="NormalTextRun SCXW264952412 BCX8"> et le tour est jouer.</span></span><span class="EOP SCXW264952412 BCX8" data-ccp-props="{}"> </span></span></p>
<h3>V- <span class="TextRun SCXW171228875 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW171228875 BCX8" data-ccp-parastyle="heading 1">Sécurisation </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed GrammarErrorHighlight SCXW171228875 BCX8" data-ccp-parastyle="heading 1">de la pipeline</span></span><span class="EOP SCXW171228875 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h3>
<p><span class="TextRun SCXW108575939 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW108575939 BCX8">Dans un contexte professionnel, sécuriser sa pipeline CI/CD est indispensable. Une mauvaise configuration peut exposer des identifiants, ouvrir des failles dans les infrastructures déployées, ou encore permettre des déploiements non autorisés.</span> <span class="NormalTextRun SCXW108575939 BCX8">Cette section détaille les éléments clés pour sécuriser efficacement </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW108575939 BCX8">une pipeline</span><span class="NormalTextRun SCXW108575939 BCX8"> Azure DevOps utilisée pour le déploiement </span><span class="NormalTextRun SpellingErrorV2Themed SCXW108575939 BCX8">Terraform</span><span class="NormalTextRun SCXW108575939 BCX8"> sur Azure.</span></span><span class="EOP SCXW108575939 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h4>V.I- <span class="TextRun SCXW18351024 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW18351024 BCX8" data-ccp-parastyle="heading 2">Méthodes d’authentification via les Service Connections Azure DevOps</span></span><span class="EOP SCXW18351024 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:1068,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">Azure DevOps permet d’utiliser différentes méthodes d’authentification pour interagir avec Azure. Voici les trois principales :</span><span data-ccp-props="{}"> </span></p>
<ol>
<li><b><span data-contrast="auto"> Service Principal classique (mot de passe / secret)</span></b></li>
</ol>
<p><span data-contrast="auto">Cette méthode historique basée sur un </span><b><span data-contrast="auto">ID d’application (clientId)</span></b><span data-contrast="auto"> et un </span><b><span data-contrast="auto">secret (clientSecret)</span></b><span data-contrast="auto"> consiste à tout simplement créer un secret sur le Service et utilisé sa valeur afin d’avoir accès à des ressources. Son avantage c’est sa simplicité à mettre en place mais peu sécurisé. Et les inconvénients sont multiples : </span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Les secrets expirent (par défaut après 1 an).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Les secrets sont sensibles et doivent être stockés dans des variables sécurisées.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Impossible à utiliser avec OIDC.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ol start="2">
<li><b><span data-contrast="auto"> Service Principal avec certificat</span></b></li>
</ol>
<p><span data-contrast="auto">Ce service utilise un certificat plutôt qu’un secret. L’avantage c’est tout simplement une meilleure sécurité que les secrets (certificats stockés dans Azure Key Vault) tandis que l’Inconvénient est de taille car elle rajoute de la complexité en terme de gestion.</span><span data-ccp-props="{}"> </span></p>
<ol start="3">
<li><b><span data-contrast="auto"> Service Principal fédéré (OIDC)</span></b></li>
</ol>
<p><span data-contrast="auto">Azure DevOps utilise un </span><b><span data-contrast="auto">jeton OIDC émis dynamiquement</span></b><span data-contrast="auto"> pour s’authentifier auprès d’Azure. Pas besoin de stocker un secret ou un certificat. Le </span><b><span data-contrast="auto">jeton est court-lived</span></b><span data-contrast="auto">, ce qui limite les risques de compromission.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Avantages</span></b><span data-contrast="auto"> :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="2"><span data-contrast="auto">Sécurité renforcée : aucun secret à stocker dans la pipeline.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="2"><span data-contrast="auto">Gestion centralisée via Entra ID (anciennement Azure AD).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="2"><span data-contrast="auto">Compatible avec les bonnes pratiques DevSecOps.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Cette approche est recommandée dans tous les contextes d’entreprise.</span><span data-ccp-props="{}"> </span></p>
<h3>V.II- <span class="TextRun SCXW226353532 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW226353532 BCX8" data-ccp-parastyle="heading 2">Permissions, scopes et accès restreints</span></span><span class="EOP SCXW226353532 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:1068,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Pour réduire les risques, il est essentiel de respecter le </span><b><span data-contrast="auto">principe du moindre privilège (PoLP)</span></b><span data-contrast="auto"> lors de la configuration des permissions des Service Principals.</span><span data-ccp-props="{}"> </span></p>
<p><b><span data-contrast="auto">Bonnes pratiques :</span></b><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="38" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Créer un Service Principal </span><b><span data-contrast="auto">par environnement</span></b><span data-contrast="auto"> (dev, preprod, prod).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="38" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Limiter les rôles au strict nécessaire (Contributor, Reader, etc.).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="38" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Éviter</span></b><span data-contrast="auto"> les rôles globaux tels que Owner.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="38" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Restreindre les </span><b><span data-contrast="auto">scopes d’accès</span></b><span data-contrast="auto"> au niveau du </span><b><span data-contrast="auto">resource group</span></b><span data-contrast="auto"> plutôt qu’au niveau de l’abonnement.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="38" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Documenter et auditer régulièrement les attributions de rôles (RBAC).</span><span data-ccp-props="{}"> </span></li>
</ul>
<h4>V.III- <span class="TextRun SCXW138511258 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW138511258 BCX8" data-ccp-parastyle="heading 2">Sécurité des agents d’exécution</span></span><span class="EOP SCXW138511258 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:1068,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">Dans une pipeline Azure DevOps, chaque job s&rsquo;exécute sur un </span><b><span data-contrast="auto">agent</span></b><span data-contrast="auto">, une machine (virtuelle ou physique) chargée d&rsquo;interpréter les étapes définies dans le YAML. On distingue deux types d’agents :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="21" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Microsoft-hosted</span></b><span data-contrast="auto"> : machines éphémères provisionnées automatiquement par Azure.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="21" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Self-hosted</span></b><span data-contrast="auto"> : agents que vous gérez vous-même, déployés sur votre propre infrastructure.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><b><span data-contrast="auto">Pourquoi opter pour un agent self-hosted ?</span></b><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Dans un cadre professionnel, notamment pour des environnements </span><b><span data-contrast="auto">privés</span></b><span data-contrast="auto"> ou des ressources sensibles, les agents Microsoft-hosted atteignent vite leurs limites :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="22" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Pas d’accès aux ressources internes (VNet, Key Vault privé, etc.).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="22" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Pas de personnalisation possible (versions d’outils, configuration réseau).</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="22" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Temps d’attente variable (agents partagés entre plusieurs organisations).</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Les agents self-hosted offrent une meilleure maîtrise de l’environnement d’exécution. Ils permettent de choisir librement les outils, les versions, et d’assurer une configuration adaptée, tout en garantissant un haut niveau de sécurité grâce à un contrôle total du réseau, des NSG et des accès. Ils permettent également une connectivité directe aux ressources internes sur Azure.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Pour les héberger efficacement, la meilleure pratique consiste à utiliser une VM Scale Set (VMSS), qui regroupe des machines virtuelles identiques capables de s’adapter automatiquement à la charge. Cette solution assure une scalabilité dynamique, un réseau privé sécurisé, un environnement standardisé via image ou script personnalisé (Terraform, Azure CLI, etc.), et une cohérence d’exécution entre les agents, limitant ainsi les erreurs.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h3><span class="TextRun SCXW69748189 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW69748189 BCX8" data-ccp-parastyle="heading 1">Conclusion</span><span class="NormalTextRun SCXW69748189 BCX8" data-ccp-parastyle="heading 1"> </span></span><span class="EOP SCXW69748189 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:360,&quot;335559739&quot;:80}"> </span></h3>
<p><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">Construire </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">une pipeline</span><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)"> CI/CD dédiée à l’Infrastructure as Code avec </span><span class="NormalTextRun SpellingErrorV2Themed SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">Terraform</span><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)"> n’est pas une simple formalité. C’est un </span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-charstyle="Strong">engagement pour la qualité</span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">, la </span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-charstyle="Strong">sécurité</span></span> <span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">et la </span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-charstyle="Strong">pérennité</span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)"> d</span><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">’un </span><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">environnements cloud.</span> <span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">Tout au long de cet article, nous avons posé les fondations d’un projet </span><span class="NormalTextRun SpellingErrorV2Themed SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">IaC</span><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)"> bien structuré</span><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">. </span><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">Le but n’est pas de complexifier, mais d’</span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-charstyle="Strong">industrialiser intelligemment</span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">, afin de rendre les déploiements </span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-charstyle="Strong">répétables</span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">, </span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-charstyle="Strong">auditables</span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)"> et </span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-charstyle="Strong">maîtrisés</span></span><span class="TextRun SCXW235452603 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW235452603 BCX8" data-ccp-parastyle="Normal (Web)">.</span></span><span class="EOP SCXW235452603 BCX8" data-ccp-props="{&quot;134233117&quot;:true,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559740&quot;:240}"> </span></p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/pipeline-ci-cd-terraform-azure/">Construire un pipeline CI/CD sécurisée et optimisée pour déployer de l’IaC sur Azure</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/cloud-2/pipeline-ci-cd-terraform-azure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154294</post-id>	</item>
		<item>
		<title>Héberger un GitHub Action Runner sur Azure Container Apps</title>
		<link>https://blog.cellenza.com/cloud-2/heberger-un-github-action-runner-sur-azure-container-apps/</link>
					<comments>https://blog.cellenza.com/cloud-2/heberger-un-github-action-runner-sur-azure-container-apps/#respond</comments>
		
		<dc:creator><![CDATA[Benoît Sautière]]></dc:creator>
		<pubDate>Thu, 09 Oct 2025 06:30:00 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154113</guid>

					<description><![CDATA[<p>Introduction  Après avoir abordé le sujet Azure Function sur Azure Container Apps, l’article se penche sur un autre scénario visant à héberger un GitHub Action Runner sur un conteneur. L’objectif de cet article est de documenter les étapes de la mise en œuvre, mais aussi de fournir un exemple d’implémentation fonctionnel.  Utiliser Azure Container Apps [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/heberger-un-github-action-runner-sur-azure-container-apps/">Héberger un GitHub Action Runner sur Azure Container Apps</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h4><span class="TextRun SCXW74163016 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW74163016 BCX8" data-ccp-parastyle="heading 2">Introduction</span></span><span class="EOP SCXW74163016 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">Après avoir abordé le sujet </span><a href="https://blog.cellenza.com/cloud-2/azure/hebergement-dazure-functions-dans-azure-apps/"><span data-contrast="none">Azure Function sur Azure Container Apps</span></a><span data-contrast="auto">, l’article se penche sur un autre scénario visant à héberger un GitHub Action Runner sur un conteneur. L’objectif de cet article est de documenter les étapes de la mise en œuvre, mais aussi de fournir un exemple d’implémentation fonctionnel.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Utiliser Azure Container Apps pour héberger un GitHub Action Runner éphémère est une approche très intéressante à plusieurs titres : </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Pas de machine virtuelle à maintenir, car nous utilisons une infrastructure managée par Microsoft</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Limiter la maintenance au seul conteneur que nous allons construire de manière totalement industrielle</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Conteneur instancié uniquement quand on en a besoin, donc une facturation limitée à la durée de vie du conteneur qui va exécuter notre GitHub Action workflow</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">L’infrastructure utilisée est directement connectée à notre Virtual Network, donc prête pour des déploiements en environnement privatisé</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><span data-contrast="auto">Ce sujet est déjà documenté chez Microsoft : </span><a href="https://learn.microsoft.com/en-us/azure/container-apps/github-actions"><span data-contrast="none">Deploy to Azure Container Apps with GitHub Actions</span></a><span data-contrast="auto">. Cela fonctionne très bien, mais pour partir en production, on a besoin de travailler quelques sujets comme :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">La construction de l’image de notre GitHub Action Runner</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">L’utilisation de l’authentification GitHub Apps en lieu et place d’un Personal Access Token (PAT)</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Comment industrialiser ce processus </span><span data-ccp-props="{}"> </span></li>
</ul>
<h4><span class="TextRun SCXW32438812 BCX8" lang="EN-US" xml:lang="EN-US" data-contrast="none"><span class="NormalTextRun SCXW32438812 BCX8" data-ccp-parastyle="heading 2">La big</span><span class="NormalTextRun SCXW32438812 BCX8" data-ccp-parastyle="heading 2"> picture</span></span><span class="EOP SCXW32438812 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span class="TextRun SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW138161742 BCX8">Commençons p</span><span class="NormalTextRun SCXW138161742 BCX8">ar poser une vu</span><span class="NormalTextRun SCXW138161742 BCX8">e d’</span><span class="NormalTextRun SCXW138161742 BCX8">ensemble</span><span class="NormalTextRun SCXW138161742 BCX8">.</span> <span class="NormalTextRun SCXW138161742 BCX8">L’environnement</span><span class="NormalTextRun SCXW138161742 BCX8"> Az</span><span class="NormalTextRun SCXW138161742 BCX8">ure </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW138161742 BCX8">repo</span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW138161742 BCX8">se </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW138161742 BCX8"> </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW138161742 BCX8">sur</span><span class="NormalTextRun SCXW138161742 BCX8"> Azure </span></span><a class="Hyperlink SCXW138161742 BCX8" href="https://learn.microsoft.com/en-us/azure/container-apps/environment" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW138161742 BCX8" data-ccp-charstyle="Hyperlink">Container Apps</span><span class="NormalTextRun SCXW138161742 BCX8" data-ccp-charstyle="Hyperlink"> Environment</span></span></a><span class="TextRun SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW138161742 BCX8">. Celui-ci disposera d’une User-</span><span class="NormalTextRun SpellingErrorV2Themed SCXW138161742 BCX8">Assigned</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW138161742 BCX8">Managed</span> <span class="NormalTextRun SCXW138161742 BCX8">I</span><span class="NormalTextRun SCXW138161742 BCX8">dentity lui permettant d’extraire un secret du Key Vault et </span><span class="NormalTextRun SCXW138161742 BCX8">d’instancier une image </span><span class="NormalTextRun SCXW138161742 BCX8">préalablement construite avec </span><span class="NormalTextRun SCXW138161742 BCX8">Azure Container </span><span class="NormalTextRun SpellingErrorV2Themed SCXW138161742 BCX8">Registry</span><span class="NormalTextRun SCXW138161742 BCX8"> (ACR)</span><span class="NormalTextRun SCXW138161742 BCX8">. </span><span class="NormalTextRun SCXW138161742 BCX8">L’</span></span><a class="Hyperlink SCXW138161742 BCX8" href="https://learn.microsoft.com/en-us/azure/container-apps/jobs?tabs=azure-cli" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW138161742 BCX8" data-ccp-charstyle="Hyperlink">Azure</span><span class="NormalTextRun SCXW138161742 BCX8" data-ccp-charstyle="Hyperlink"> Container Apps Job</span></span></a><span class="TextRun SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW138161742 BCX8"> instancié </span><span class="NormalTextRun SCXW138161742 BCX8">sera configuré pour exploit</span><span class="NormalTextRun SCXW138161742 BCX8">er</span><span class="NormalTextRun SCXW138161742 BCX8"> le</span> </span><a class="Hyperlink SCXW138161742 BCX8" href="https://keda.sh/docs/2.17/scalers/github-runner/" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW138161742 BCX8" data-ccp-charstyle="Hyperlink">Scaler GitHub</span></span></a><span class="TextRun SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW138161742 BCX8"> de </span><span class="NormalTextRun SCXW138161742 BCX8"> </span></span><a class="Hyperlink SCXW138161742 BCX8" href="https://keda.sh/" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW138161742 BCX8" data-ccp-charstyle="Hyperlink">Keda</span></span></a><span class="TextRun SCXW138161742 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"> <span class="NormalTextRun SCXW138161742 BCX8">(</span><span class="NormalTextRun SpellingErrorV2Themed SCXW138161742 BCX8">Kubernetes</span><span class="NormalTextRun SCXW138161742 BCX8"> Event</span><span class="NormalTextRun SCXW138161742 BCX8">&#8211;</span><span class="NormalTextRun SpellingErrorV2Themed SCXW138161742 BCX8">driven</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW138161742 BCX8">Autoscaling</span><span class="NormalTextRun SCXW138161742 BCX8">)</span><span class="NormalTextRun SCXW138161742 BCX8">. L’objectif </span><span class="NormalTextRun SCXW138161742 BCX8">est</span><span class="NormalTextRun SCXW138161742 BCX8"> de pouvoir détecter qu</span><span class="NormalTextRun SCXW138161742 BCX8">’un </span><span class="NormalTextRun SCXW138161742 BCX8">G</span><span class="NormalTextRun SCXW138161742 BCX8">itHub</span><span class="NormalTextRun SCXW138161742 BCX8"> Action Workflow est dans l’attente d’un </span><span class="NormalTextRun SCXW138161742 BCX8">GitHub</span><span class="NormalTextRun SCXW138161742 BCX8"> Action </span><span class="NormalTextRun SCXW138161742 BCX8">Runner</span> <span class="NormalTextRun SCXW138161742 BCX8">éphémère.</span><span class="NormalTextRun SCXW138161742 BCX8"> C’est ce qui déclenchera l’instanciation du Azure Container Apps Jobs.</span></span><span class="EOP SCXW138161742 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154116" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-100744-600x402.png" alt="" width="600" height="402" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-100744-600x402.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-100744-768x515.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-100744.png 892w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW233424687 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW233424687 BCX8">Voila pour les grandes lignes. Maintenant rentrons dans le détail avec la mise en œuvre de l’infrastructure</span><span class="NormalTextRun SCXW233424687 BCX8">.</span> <span class="NormalTextRun SCXW233424687 BCX8">Pour simplifier la mise en œuvre, tout est disponible sur </span><span class="NormalTextRun SCXW233424687 BCX8">ce repo Git</span><span class="NormalTextRun SCXW233424687 BCX8">H</span><span class="NormalTextRun SCXW233424687 BCX8">ub</span><span class="NormalTextRun SCXW233424687 BCX8"> : </span></span><a class="Hyperlink SCXW233424687 BCX8" href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW233424687 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW233424687 BCX8" data-ccp-charstyle="Hyperlink">ContainerAppsJobGithubRunner</span></span></a><span class="EOP SCXW233424687 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h4><span class="TextRun SCXW60487467 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW60487467 BCX8" data-ccp-parastyle="heading 2">Etape n°1 : </span><span class="NormalTextRun SCXW60487467 BCX8" data-ccp-parastyle="heading 2">Mise en œuvre de l’infrastructure</span></span><span class="EOP SCXW60487467 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">L’infrastructure mise en œuvre est relativement simple. Elle se compose :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">D’un Virtual Network dans lequel nous allons dédier un sous-réseau pour notre futur Azure Container Apps Environment</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">D’une User-Assigned identity qui sera utilisée par notre futur Azure Container Apps Environment pour « puller » l’image de notre GitHub Action Runner éphémère</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">D’une instance Azure Container Registry pour stocker l’image de notre conteneur</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Une instance Azure Log Analytics Workspace pour collecter la télémétrie de notre Container Apps Environment</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">Une instance Azure Container Apps Environment qui va porter notre futur job</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="6" data-aria-level="1"><span data-contrast="auto">Une instance de Key Vault pour stocker les secrets que nous allons manipuler</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="27" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="7" data-aria-level="1"><span data-contrast="auto">Quelques rôles assignments afin que notre Azure Container Apps Environment puisse déployer notre job mais aussi lui mettre à disposition un secret issus de notre instance de Key Vault</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Pour simplifier la mise en œuvre, l’intégralité de ce déploiement est mise à disposition sous la forme d’un déploiement Bicep </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/IaC/solution.bicep"><span data-contrast="none">solution.bicep</span></a><span data-contrast="auto"> avec son fichier de réponse </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/IaC/solution.json"><span data-contrast="none">solution.json</span></a><span data-contrast="auto">. Ne reste qu’à le déployer à l’aide de la commande </span><a href="https://learn.microsoft.com/en-us/powershell/module/az.resources/new-azresourcegroupdeployment?view=azps-14.3.0"><span data-contrast="none">New-AzSubscriptionDeployment</span></a><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><i><span data-contrast="auto">New-AzSubscriptionDeployment -TemplateFile solution.bicep -TemplateParameterFile solution.json -location WestEurope</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154119" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101013-600x312.png" alt="" width="600" height="312" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101013-600x312.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101013-1024x532.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101013-768x399.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101013.png 1104w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW24622722 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW24622722 BCX8">Au </span><span class="NormalTextRun SCXW24622722 BCX8">terme de cette étape, tous les composants sont en place côté Azure, à l’exception de </span><span class="NormalTextRun SCXW24622722 BCX8">l’</span><span class="NormalTextRun SCXW24622722 BCX8">Azure Container Apps Jobs. </span><span class="NormalTextRun SCXW24622722 BCX8">Prochaine étape : </span><span class="NormalTextRun SCXW24622722 BCX8">la mise en place de l’authentification avec une </span></span><a class="Hyperlink SCXW24622722 BCX8" href="https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/about-authentication-with-a-github-app" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW24622722 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW24622722 BCX8" data-ccp-charstyle="Hyperlink">GitHub App</span></span></a><span class="TextRun SCXW24622722 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW24622722 BCX8">.</span></span><span class="EOP SCXW24622722 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h4><span class="TextRun SCXW89820750 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW89820750 BCX8" data-ccp-parastyle="heading 2">Etape n°2 : </span><span class="NormalTextRun SCXW89820750 BCX8" data-ccp-parastyle="heading 2">Mise en place de l’authentification Git</span><span class="NormalTextRun SCXW89820750 BCX8" data-ccp-parastyle="heading 2">Hub App</span></span><span class="EOP SCXW89820750 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">À </span><span data-contrast="auto">la première lecture de la documentation GitHub sur </span><a href="https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/about-authentication-with-a-github-app"><span data-contrast="none">l’authentification GitHub App</span></a><span data-contrast="auto">, on peut trouver le sujet un peu cryptique.Il s’agit d’une application que à déclarer, puis à installer au sein de notre repository GitHub. Dans le contexte de cet article, nous allons déclarer notre application GitHub App et l’installer dans notre Repository. La démarche est identique lorsqu’on voudra mettre en place au sein d’une organisation GitHub. Pour commencer, créer cette GitHub App :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Connectez-vous à GitHub et allez dans votre profil pour sélectionner « Settings »</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Dans « Développer Settings », sélectionnez « GitHub Apps » </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Cliquer sur le bouton « New GitHub Apps »</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Choisissez un nom expressif pour votre GitHub Apps : « NPRD-ACARunner »</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Associez une description qui explique clairement à quoi va service cette GitHub App</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Vous pouvez fournir une URL fictive pour l’URL demandée dans notre contexte</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Assurez-vous que la case d’option « Expire user authorization tokens » est bien cochée</span></li>
</ol>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154128" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-1-600x197.png" alt="" width="600" height="197" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-1-600x197.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-1-1024x337.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-1-768x252.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-1.png 1281w" sizes="auto, (max-width: 600px) 100vw, 600px" /> <img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154129" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-2-600x197.png" alt="" width="600" height="197" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-2-600x197.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-2-1024x337.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-2-768x252.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101902-2.png 1281w" sizes="auto, (max-width: 600px) 100vw, 600px" /> <img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154130" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101737-1-600x248.png" alt="" width="600" height="248" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101737-1-600x248.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101737-1-1024x423.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101737-1-768x317.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101737-1.png 1237w" sizes="auto, (max-width: 600px) 100vw, 600px" /> <img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154131" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101454-2-600x164.png" alt="" width="600" height="164" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101454-2-600x164.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101454-2-1024x280.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101454-2-768x210.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-101454-2.png 1508w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>8. Désactivez la prise en charge de la fonctionnalité « Callback URL »<span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">      9.Dans la section « Repository Permissions » configurez les options suivantes : </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1080,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Action: Read Only</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1080,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Administration: Read Only</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1080,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">MetaData : Read Only</span></li>
</ul>
<p>&nbsp;</p>
<p><span data-contrast="auto">     10.Dans la section “Organization permissions, configurez les options suivantes</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1080,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Actions &#8211; Read-only</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1080,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Metadata &#8211; Read-only</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1080,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Self-hosted Runners &#8211; Read &amp; Write</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><span class="TextRun SCXW138166332 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW138166332 BCX8">Selon que </span><span class="NormalTextRun SCXW138166332 BCX8">le déploiement se fasse</span><span class="NormalTextRun SCXW138166332 BCX8"> dans le contexte d’une </span><span class="NormalTextRun SCXW138166332 BCX8">organisation</span> <span class="NormalTextRun SCXW138166332 BCX8">GitHub</span><span class="NormalTextRun SCXW138166332 BCX8"> ou d’un simple repository </span><span class="NormalTextRun SCXW138166332 BCX8">GitHub</span><span class="NormalTextRun SCXW138166332 BCX8"> personnel, les permissions ne sont pas les mêmes, tout comme les URL</span> <span class="NormalTextRun SCXW138166332 BCX8">sollicit</span><span class="NormalTextRun SCXW138166332 BCX8">ées</span><span class="NormalTextRun SCXW138166332 BCX8"> pendant l’initialisation de notre GitHub Action Runner éphémère</span><span class="NormalTextRun SCXW138166332 BCX8">. Une</span><span class="NormalTextRun SCXW138166332 BCX8"> fois l’application créée, </span><span class="NormalTextRun SCXW138166332 BCX8">assurez-vous</span><span class="NormalTextRun SCXW138166332 BCX8"> de bien conserver </span><span class="NormalTextRun SCXW138166332 BCX8">l’App ID </span><span class="NormalTextRun SCXW138166332 BCX8">puis</span><span class="NormalTextRun SCXW138166332 BCX8"> générer une clé privée</span> <span class="NormalTextRun SCXW138166332 BCX8">pouvant être</span><span class="NormalTextRun SCXW138166332 BCX8"> utilisée </span><span class="NormalTextRun SCXW138166332 BCX8">que nous pourrons utiliser comme méthode d’authentification</span><span class="NormalTextRun SCXW138166332 BCX8">.</span></span><span class="EOP SCXW138166332 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154134" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103107-600x248.png" alt="" width="600" height="248" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103107-600x248.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103107-1024x423.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103107-768x318.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103107.png 1289w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154136" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103401-600x210.png" alt="" width="600" height="210" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103401-600x210.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103401-1024x359.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103401-768x269.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103401.png 1247w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154138" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103634-600x219.png" alt="" width="600" height="219" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103634-600x219.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103634-1024x375.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103634-768x281.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103634.png 1129w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW135215713 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW135215713 BCX8">L’</span><span class="NormalTextRun SCXW135215713 BCX8">application GitHub App est maintenant déclarée, il faut procéder </span><span class="NormalTextRun SCXW135215713 BCX8">à </span><span class="NormalTextRun SCXW135215713 BCX8">son installation. </span><span class="NormalTextRun SCXW135215713 BCX8">Elle peut être rend</span><span class="NormalTextRun SCXW135215713 BCX8">ue</span><span class="NormalTextRun SCXW135215713 BCX8"> disponible </span><span class="NormalTextRun SCXW135215713 BCX8">à </span><span class="NormalTextRun SCXW135215713 BCX8">grande </span><span class="NormalTextRun SCXW135215713 BCX8">échelle </span><span class="NormalTextRun SCXW135215713 BCX8">au niveau d’une organisation</span> <span class="NormalTextRun SCXW135215713 BCX8">mais j’ai volontairement retenu de ne l’installer que dans mon projet GitHub.</span></span><span class="EOP SCXW135215713 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-154140 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103839.png" alt="" width="383" height="565" /></p>
<p><span class="TextRun SCXW18615254 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW18615254 BCX8">Lors de l’installation de </span><span class="NormalTextRun SCXW18615254 BCX8">l’</span><span class="NormalTextRun SCXW18615254 BCX8">application, </span><span class="NormalTextRun SCXW18615254 BCX8">un « Installation ID » sera généré, celui-ci est visible dans l’URL </span><span class="NormalTextRun SCXW18615254 BCX8">dans</span><span class="NormalTextRun SCXW18615254 BCX8"> votre navigateur.</span><span class="NormalTextRun SCXW18615254 BCX8"> Nous avons besoin de le conserver.</span></span><span class="EOP SCXW18615254 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154142" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103950-600x84.png" alt="" width="600" height="84" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103950-600x84.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103950-1024x143.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103950-768x107.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-103950.png 1073w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h4><span class="TextRun SCXW146112330 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW146112330 BCX8" data-ccp-parastyle="heading 2">Etape n°3 : </span><span class="NormalTextRun SCXW146112330 BCX8" data-ccp-parastyle="heading 2">Mise en place des secrets</span></span><span class="EOP SCXW146112330 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">Lors de la mise en œuvre de GitHub App, nous avons récupéré des identifiants (GitHub AppID &amp; GitHub Installation ID) ainsi qu’une clé privée. Pour les identifiants, j’ai choisi de les consommer directement dans Azure Container Apps comme variables d’environnements de notre futur conteneur. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Cependant, pour la clé privée, une attention particulière est nécessaire. L’infrastructure déployée inclut une instance de Key Vault. Elle permettra d’y stocker notre clé privée. Seul Azure Container Apps y aura accès, il passera cette référence à notre futur conteneur. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Il ne reste plus qu’à uploader le contenu du fichier contenant la clé privée comme secret : </span><i><span data-contrast="auto">az keyvault secret set &#8211;vault-name &lt;Key Vault Name&gt; &#8211;name GitHubPEM &#8211;file &lt;pem file&gt; –output none</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154144" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104118-600x66.png" alt="" width="600" height="66" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104118-600x66.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104118-1024x113.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104118-768x85.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104118.png 1499w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h4><span class="TextRun SCXW16080529 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW16080529 BCX8" data-ccp-parastyle="heading 2">Etape n°4 : </span><span class="NormalTextRun SCXW16080529 BCX8" data-ccp-parastyle="heading 2">Construction </span><span class="NormalTextRun SCXW16080529 BCX8" data-ccp-parastyle="heading 2">de notre </span><span class="NormalTextRun SCXW16080529 BCX8" data-ccp-parastyle="heading 2">GitHub Runner</span></span><span class="EOP SCXW16080529 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">C’est en fait le sujet le plus compliqué. Pour construire cette image, j’avais trois possibilités : </span><span data-ccp-props="{}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Utiliser les images mises à disposition par GitHub. Cela fonctionne mais c’est un peu vide </span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Utiliser l’excellent travail d’autres : </span><a href="https://github.com/myoung34/docker-github-actions-runner"><span data-contrast="none">https://github.com/myoung34/docker-github-actions-runner</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Construire son image soi même</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">C’est cette dernière option que j’ai retenue car je voulais personnaliser les composants mis à disposition dans le GitHub Action Runner, jusqu’à personnaliser la version de chaque composant. En plus, il est essentiel de d’intégrer la prise en charge de l’authentification GitHub App. C’est ce point qui a nécessité le plus de travail.  </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Etant donné que la construction de l’image est relativement chronophage (presque douze minutes), tout ce qui est nécessaire est présent dans le repository dans le répertoire </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/IaC/solution.json"><span data-contrast="none">Docker</span></a><span data-contrast="auto">   du Repository Git mis à disposition avec cet article. Les commandes ci-dessous vont nous permettre d’identifier l’instance du service Azure Container Registry (ACR) mis à disposition, s’y connecter et de déclencher la construction de notre conteneur.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><i><span data-contrast="auto">az acr list &#8211;query [].name &#8211;output tsv</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><i><span data-contrast="auto">az acr login &#8211;name &lt;Nom de l’instance ACR précédemment identifiée&gt;</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><i><span data-contrast="auto">az acr build &#8211;registry &lt;Nom de l’instance ACR précédemment identifiée&gt; &#8211;image &lt;Nom de l’instance ACR précédemment identifiée&gt;.azurecr.io/runner_base: 2.325.0 . &#8211;build-arg &lsquo;RUNNER_VERSION=2.325.0&rsquo; &#8211;build-arg &lsquo;DOTNET_VERSION=9.0&rsquo; &#8211;build-arg &lsquo;PS_VERSION=7.4.5&rsquo; &#8211;build-arg &lsquo;AZACCOUNTS_VERSION=3.0.4&rsquo; &#8211;build-arg &lsquo;AZKEYVAULT_VERSION=6.2.0&rsquo; &#8211;build-arg</span></i><i><span data-contrast="auto"> &lsquo;AZSTORAGE_VERSION=7.4.0&rsquo; &#8211;build-arg &lsquo;AZAPPINSIGHT_VERSION=2.2.5&rsquo; &#8211;build-arg &lsquo;AZNETWORK_VERSION=7.10.0&rsquo; &#8211;build-arg &lsquo;AZRESOURCES_VERSION=7.5.0&rsquo; &#8211;build-arg &lsquo;AZ_TABLE_VERSION=2.1.0&rsquo; &#8211;build-arg &lsquo;MS_GRAPH_VERSION=2.24.0&rsquo; &#8211;build-arg &lsquo;MS_ENTRA_VERSION=1.0.1&rsquo; &#8211;build-arg &lsquo;TERRAFORM_VERSION=1.10.0&rsquo; &#8211;build-arg &lsquo;TERRAGRUNT_VERSION=0.72.2&rsquo; &#8211;build-arg &lsquo;AZURECLI_VERSION=2.74.0&rsquo; &#8211;build-arg  &lsquo;UBUNTU_LTS_VERSION=jammy&rsquo;</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ol>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154147 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104451-600x234.png" alt="" width="600" height="234" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104451-600x234.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104451-1024x399.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104451-768x300.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104451.png 1282w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Douze minutes plus tard, nous avons une image pour notre futur Runner GitHub Action. Le </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/Docker/Dockerfile"><span data-contrast="none">DockerFile</span></a><span data-contrast="auto"> mis à disposition inclus un grand nombre de variables pour personnaliser les versions des composants. Au moment de l’écriture de cet article, c’est la version 2.325.0 de l’image du GitHub Runner qui est disponible. Pensez à aller regarder quelle est la version la plus récente de disponible ici : </span><a href="https://github.com/actions/runner-images/releases"><span data-contrast="none">https://github.com/actions/runner-images/releases</span></a><span data-contrast="auto">.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Une fois l’opération terminée,  la présence d’une nouvelle image dans Azure Container Registry peut être vérifié avec la commande suivante : </span><i><span data-contrast="auto">az acr repository show &#8211;name &lt;Nom de l’instance ACR précédemment identifiée&gt;  &#8211;repository runner_base</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154150 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104606-600x188.png" alt="" width="600" height="188" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104606-600x188.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104606-1024x321.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104606-768x241.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104606.png 1230w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Maintenant, reste à expliquer comment va fonctionner l’authentification. Le fichier </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/Docker/Dockerfile"><span data-contrast="none">Dockerfile</span></a><span data-contrast="auto">, mentionne la copie et du script </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/Docker/github-actions-runner/entrypoint.sh"><span data-contrast="none">entrypoint.sh</span></a><span data-contrast="auto">. Il sera exécuté à chaque instanciation du conteneur. Pour écrire ce script, je suis parti de la documentation GitHub sur le sujet : </span><a href="https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app"><span data-contrast="none">Generating a JSON Web Token (JWT) for a GitHub App</span></a><span data-contrast="auto">. Le script exploite la clé privée pour négocier un « Access Token » qui sera ensuite soumise à l’API de GitHub Runner registration, obtenant ainsi un « Registration Token » qui sera lui-même utilisé pour enregistrer le GitHub Runner éphémère. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Selon qu&rsquo;il s’agisse d’une organisation GitHub ou d’un simple GitHub Account, les URL ne sont pas les mêmes. Dans le contexte de cet article, je travaille sur mon repository personnel. Le tableau ci-dessous référence les URL qui seront nécessaires et comment les construire selon les scénarios :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154152 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104806-600x203.png" alt="" width="600" height="203" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104806-600x203.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104806-1024x346.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104806-768x259.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104806.png 1277w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Note : Dans le contexte de cet article (et ne disposant pas d’une </span><a href="https://docs.github.com/en/organizations/collaborating-with-groups-in-organizations/about-organizations"><span data-contrast="none">organization GitHub</span></a><span data-contrast="auto"> personnelle), ce sont donc les URL de mon Repo personnel GitHub qui sont utilisées. Pour un déploiement dans le contexte d’une organisation, il faudra adapter les variables dans le fichier </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/IaC/acajob.bicep"><span data-contrast="none">acajob.bicep</span></a><span data-contrast="auto">.  </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span><span data-contrast="auto">Le conteneur va exploiter les informations suivantes en tant que variables d’environnement :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">APP_ID</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">PEM (référencé entant que secret Key Vault)</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">ACCESS_TOKEN_URL</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">REGISTRATION_TOKEN_API_URL</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">RUNNER-REGISTRATION_URL</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<h4><span class="TextRun SCXW176433628 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW176433628 BCX8" data-ccp-parastyle="heading 2">Etape n°5 : </span><span class="NormalTextRun SCXW176433628 BCX8" data-ccp-parastyle="heading 2">Déploiement de notre GitHub</span><span class="NormalTextRun SCXW176433628 BCX8" data-ccp-parastyle="heading 2"> Runner</span></span><span class="EOP SCXW176433628 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">Le déploiement est assuré par un déploiement Bicep </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/IaC/acajob.bicep"><span data-contrast="none">acajob.bicep</span></a><span data-contrast="auto"> et son fichier de paramètres associés </span><a href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/IaC/acajob.json"><span data-contrast="none">acajob.json</span></a><span data-contrast="auto">. Pensez bien à actualiser ce dernier. La configuration du Azure Container Apps job comprend : </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">L’image à utiliser ainsi que la User-Assigned Identity qu’Azure Container Apps devra utiliser pour « Puller » l’image pour notre conteneur.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">L’identifiant unique de notre GitHub Application ID</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">La référence du secret Key Vault contenant la clé privée obtenus lors de la création de notre GitHub Application</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">Les trois URL de GitHub (Registration Token API URL, Runner Registration Token API URL, Access Token API URL)</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="25" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">La configuration de Keda pour le Scaler GitHub</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Le déploiement est réalisé avec la commande ci-dessous : </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><i><span data-contrast="auto">New-AzResourceGroupDeployment -ResourceGroupName RG-nprd-acarunner-1.0    -TemplateFile acajob.bicep -TemplateParameterFile acajob.json</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154154 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104947-600x357.png" alt="" width="600" height="357" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104947-600x357.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104947-768x458.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-104947.png 851w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW27468941 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW27468941 BCX8">La seule subtilité de configuration concerne le stockage de la clé privée obtenue avec notre GitHub </span><span class="NormalTextRun SCXW27468941 BCX8">App</span><span class="NormalTextRun SCXW27468941 BCX8">. Celle-ci a été volontairement stock</span><span class="NormalTextRun SCXW27468941 BCX8">ée</span><span class="NormalTextRun SCXW27468941 BCX8"> dans un Azure Key Vault </span><span class="NormalTextRun SCXW27468941 BCX8">pour qu’elle ne soit pas directement visible dans la configuration du conteneur comme illustré ci-dessous.</span><span class="NormalTextRun SCXW27468941 BCX8"> </span><span class="NormalTextRun SCXW27468941 BCX8"> </span></span><span class="EOP SCXW27468941 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154156 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105114-600x445.png" alt="" width="600" height="445" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105114-600x445.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105114.png 769w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW57154890 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW57154890 BCX8">Pour que </span><span class="NormalTextRun SCXW57154890 BCX8">le </span><span class="NormalTextRun SCXW57154890 BCX8">conteneur puisse être instancié </span><span class="NormalTextRun SCXW57154890 BCX8">à </span><span class="NormalTextRun SCXW57154890 BCX8">la demande, reste encore </span><span class="NormalTextRun SCXW57154890 BCX8">à </span><span class="NormalTextRun SCXW57154890 BCX8">configurer </span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">Keda</span><span class="NormalTextRun SCXW57154890 BCX8"> e</span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">t pl</span><span class="NormalTextRun SCXW57154890 BCX8">us particulièrement le </span></span><a class="Hyperlink SCXW57154890 BCX8" href="https://keda.sh/docs/2.17/scalers/github-runner/" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW57154890 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW57154890 BCX8" data-ccp-charstyle="Hyperlink">scaler</span><span class="NormalTextRun SCXW57154890 BCX8" data-ccp-charstyle="Hyperlink"> GitHub Runner</span></span></a><span class="TextRun SCXW57154890 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW57154890 BCX8">.</span> <span class="NormalTextRun SCXW57154890 BCX8">Le </span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">scaler</span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8"> a bes</span><span class="NormalTextRun SCXW57154890 BCX8">oin d’un certain nombre de paramètres</span><span class="NormalTextRun SCXW57154890 BCX8">. Le point d’attention sera de ne pas être trop agressif au niveau des API de Git</span><span class="NormalTextRun SCXW57154890 BCX8">Hu</span><span class="NormalTextRun SCXW57154890 BCX8">b sous</span><span class="NormalTextRun SCXW57154890 BCX8"> peine de rate </span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">limiti</span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">ng</span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">. C’es</span><span class="NormalTextRun SCXW57154890 BCX8">t pour cette raison que </span><span class="NormalTextRun SCXW57154890 BCX8">j’ai retenu de dédier mon GitHub Action </span><span class="NormalTextRun SCXW57154890 BCX8">R</span><span class="NormalTextRun SCXW57154890 BCX8">unner </span><span class="NormalTextRun SCXW57154890 BCX8">à </span><span class="NormalTextRun SCXW57154890 BCX8">un seul et unique GitHub repo.</span> <span class="NormalTextRun SCXW57154890 BCX8">Ici encore, c’est la référence du secret Key </span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">Vault</span><span class="NormalTextRun SpellingErrorV2Themed SCXW57154890 BCX8">utilisé</span> <span class="NormalTextRun SCXW57154890 BCX8"> </span><span class="NormalTextRun SCXW57154890 BCX8">pour passer la clé privée de </span><span class="NormalTextRun SCXW57154890 BCX8">GitHub App.</span> </span><span class="EOP SCXW57154890 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-154157 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105219.png" alt="" width="283" height="535" /></p>
<h4><span class="TextRun SCXW27805819 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW27805819 BCX8" data-ccp-parastyle="heading 2">Tester notre </span><span class="NormalTextRun SpellingErrorV2Themed SCXW27805819 BCX8" data-ccp-parastyle="heading 2">Github</span><span class="NormalTextRun SCXW27805819 BCX8" data-ccp-parastyle="heading 2"> Runner éphémère</span></span><span class="EOP SCXW27805819 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span class="TextRun SCXW13450585 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW13450585 BCX8">Pour tester </span><span class="NormalTextRun SCXW13450585 BCX8">Git</span><span class="NormalTextRun SCXW13450585 BCX8">H</span><span class="NormalTextRun SCXW13450585 BCX8">ub Action </span><span class="NormalTextRun SCXW13450585 BCX8">Runner</span><span class="NormalTextRun SCXW13450585 BCX8">, nous avons besoin d’un Workflow. Pour l’exemple en </span><span class="NormalTextRun SCXW13450585 BCX8">voilà</span><span class="NormalTextRun SCXW13450585 BCX8"> un</span><span class="NormalTextRun SCXW13450585 BCX8"> : </span></span><a class="Hyperlink SCXW13450585 BCX8" href="https://github.com/benoitsautierecellenza/ContainerAppsJobGithubRunner/blob/main/.github/workflows/demoRunner.yml" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW13450585 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW13450585 BCX8" data-ccp-charstyle="Hyperlink">demoRunner.yml</span></span></a><span class="TextRun SCXW13450585 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW13450585 BCX8">. Comme on peut le voir ci-dessous, il est minimaliste, composé d’un seul job</span><span class="NormalTextRun SCXW13450585 BCX8"> contenant quelques commandes pour mettre en évidence quelques </span><span class="NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW13450585 BCX8">composants intégré</span><span class="NormalTextRun SCXW13450585 BCX8"> à notre conteneur. Sa seule particularité, c’est de demander son exécution sur un </span><span class="NormalTextRun SCXW13450585 BCX8">Runner</span><span class="NormalTextRun SCXW13450585 BCX8"> de type « Self-</span><span class="NormalTextRun SpellingErrorV2Themed SCXW13450585 BCX8">Hosted</span><span class="NormalTextRun SCXW13450585 BCX8"> »</span><span class="NormalTextRun SCXW13450585 BCX8">. C’est just</span><span class="NormalTextRun SCXW13450585 BCX8">ement </span><span class="NormalTextRun SCXW13450585 BCX8">un des tags de notre </span><span class="NormalTextRun SCXW13450585 BCX8">GitHub</span><span class="NormalTextRun SCXW13450585 BCX8"> Action Runner éphémère.</span></span><span class="EOP SCXW13450585 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-154160 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105410.png" alt="" width="402" height="528" /></p>
<p><span data-contrast="auto">Une fois ce GitHub Workflow déclenché, au niveau Keda, on peut suivre le bon déroulement des opérations avec une simple requête KQL : </span><span data-ccp-props="{}"> </span></p>
<p><i><span data-contrast="auto">ContainerAppSystemLogs</span></i><span data-ccp-props="{}"> </span></p>
<p><i><span data-contrast="auto">| where EventSource == &lsquo;KEDA&rsquo;</span></i><span data-ccp-props="{}"> </span></p>
<p><i><span data-contrast="auto">| where JobName == « githubactionrunner »</span></i><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154162 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105519-600x245.png" alt="" width="600" height="245" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105519-600x245.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105519-1024x419.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105519-768x314.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105519.png 1260w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Le Keda initialise correctement le Scaler et  est  mesure de détecter la présence de GitHub Action workflow en attente d’exécution pour déclencher l’instanciation du GitHub Runner. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Au niveau de notre Container Apps Jobs,l’initialisation s’effectue correctement et les logs restent consultables. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154164 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105614-600x237.png" alt="" width="600" height="237" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105614-600x237.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105614-1024x405.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105614-768x304.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105614.png 1280w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW98023860 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW98023860 BCX8">Au niveau GitHub, on peut constater que le GitHub Workflow s’est bien déclenché et a été exécuté depuis notre GitHub Action Runner éphémère.</span></span><span class="EOP SCXW98023860 BCX8" data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154169 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105720-1-600x276.png" alt="" width="600" height="276" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105720-1-600x276.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105720-1-1024x471.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105720-1-768x354.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105720-1.png 1125w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154171 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105805-2-600x278.png" alt="" width="600" height="278" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105805-2-600x278.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105805-2-1024x474.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105805-2-768x355.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-105805-2.png 1124w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154172 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110001-600x247.png" alt="" width="600" height="247" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110001-600x247.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110001-1024x421.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110001-768x316.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110001.png 1146w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">En agissant rapidement, il est possible deconstater la présence duGitHub Action éphémère.</span><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154173 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110052-600x241.png" alt="" width="600" height="241" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110052-600x241.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110052-1024x412.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110052-768x309.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110052.png 1146w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="auto">Pour finir, une fois le GitHub Workflow terminé, il sera posszible  de constater le bon fonctionnement de celui-ci avec une simple requête KQL comme illustré ci-dessous : </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><i><span data-contrast="auto">ContainerAppConsoleLogs_CL</span></i><span data-ccp-props="{}"> </span></p>
<p><i><span data-contrast="auto">| where Log_s contains « √ »</span></i><span data-ccp-props="{}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-154175 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110154-600x154.png" alt="" width="600" height="154" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110154-600x154.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110154-1024x263.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110154-768x198.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-24-110154.png 1380w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h4><span class="TextRun SCXW239774571 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW239774571 BCX8" data-ccp-parastyle="heading 2">Conclusion</span></span><span class="EOP SCXW239774571 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span class="TextRun SCXW56226743 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW56226743 BCX8">La mise en œuvre est un peu plus compliquée qu’avec un </span><span class="NormalTextRun SpellingErrorV2Themed SCXW56226743 BCX8">Personal</span><span class="NormalTextRun SCXW56226743 BCX8"> Access </span><span class="NormalTextRun SpellingErrorV2Themed SCXW56226743 BCX8">Token</span><span class="NormalTextRun SCXW56226743 BCX8"> (PAT)</span><span class="NormalTextRun SCXW56226743 BCX8"> mais une fois </span><span class="NormalTextRun SCXW56226743 BCX8">l’</span><span class="NormalTextRun SCXW56226743 BCX8">intégr</span><span class="NormalTextRun SCXW56226743 BCX8">ation</span> <span class="NormalTextRun SCXW56226743 BCX8">de </span><span class="NormalTextRun SCXW56226743 BCX8">l’authentification avec GitHub Apps, </span><span class="NormalTextRun SCXW56226743 BCX8">nous </span><span class="NormalTextRun SCXW56226743 BCX8">dispos</span><span class="NormalTextRun SCXW56226743 BCX8">ons</span><span class="NormalTextRun SCXW56226743 BCX8"> d’un GitHub Runner </span><span class="NormalTextRun SpellingErrorV2Themed SCXW56226743 BCX8">éphémère</span><span class="NormalTextRun SpellingErrorV2Themed SCXW56226743 BCX8">facturé</span><span class="NormalTextRun SCXW56226743 BCX8"> uniquement en fonction de la puissance CPU &amp; consommation mémoire</span><span class="NormalTextRun SCXW56226743 BCX8"> utilisées lors de l’exécution de vos GitHub Action Workflows. Avec quelques modifications au niveau du </span><span class="NormalTextRun SpellingErrorV2Themed SCXW56226743 BCX8">DockerFile</span><span class="NormalTextRun SCXW56226743 BCX8">, vous serez en mesur</span><span class="NormalTextRun SpellingErrorV2Themed SCXW56226743 BCX8">e de rapid</span><span class="NormalTextRun SCXW56226743 BCX8">ement </span><span class="NormalTextRun SCXW56226743 BCX8">développer un GitHub Action Runner répondant </span><span class="NormalTextRun SCXW56226743 BCX8">à </span><span class="NormalTextRun SCXW56226743 BCX8">vos besoins.</span></span><span class="EOP SCXW56226743 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h4><span class="TextRun SCXW109887464 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW109887464 BCX8" data-ccp-parastyle="heading 2">Quelques lectures additionnelles</span></span><span class="EOP SCXW109887464 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h4>
<p><span data-contrast="auto">Entre ma première lecture de l’article </span><a href="https://learn.microsoft.com/en-us/azure/container-apps/github-actions"><span data-contrast="none">Deploy to Azure Container Apps with GitHub Actions</span></a><span data-contrast="auto"> et celui-ci, plusieurs itérations ont été nécessaires pour bien comprendre l’assemblage de tous les composants et les implications de l’utilisation de GitHub Apps comme méthode d’authentification. Je vous recommande les lectures suivantes : </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Les runners GitHub : </span><a href="https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners"><span data-contrast="none">https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Base image for GitHub self-hosted Runners : </span><a href="https://github.com/actions/runner"><span data-contrast="none">https://github.com/actions/runner</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">Une excellente base de travail pour des runners GitHub : </span><a href="https://github.com/myoung34/docker-github-actions-runner"><span data-contrast="none">https://github.com/myoung34/docker-github-actions-runner</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><span data-contrast="auto">L’implémentation avec Azure Verified Modules : </span><a href="https://github.com/ethorneloe/azure-apps-jobs-github-runners"><span data-contrast="none">https://github.com/ethorneloe/azure-apps-jobs-github-runners</span></a><span data-contrast="auto">, </span><a href="https://github.com/Azure/terraform-azurerm-avm-ptn-cicd-agents-and-runners"><span data-contrast="none">https://github.com/Azure/terraform-azurerm-avm-ptn-cicd-agents-and-runners</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><span data-contrast="auto">La documentation officielle de Keda sur la configuration des scalers : <a href="https://keda.sh/docs/2.17/scalers/github-runner/" rel="nofollow">https://keda.sh/docs/2.17/scalers/github-runner/</a></span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="6" data-aria-level="1"><span data-contrast="auto">Comment la version 2.17 de Keda va résoudre certains problèmes rencontrés : </span><a href="https://github.com/microsoft/azure-container-apps/issues/1525"><span data-contrast="none">https://github.com/microsoft/azure-container-apps/issues/1525</span></a><span data-ccp-props="{}"> </span></li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/heberger-un-github-action-runner-sur-azure-container-apps/">Héberger un GitHub Action Runner sur Azure Container Apps</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/cloud-2/heberger-un-github-action-runner-sur-azure-container-apps/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154113</post-id>	</item>
		<item>
		<title>Optimiser vos analyses de sécurité GitHub avec des requêtes CodeQL custom</title>
		<link>https://blog.cellenza.com/securite-2/optimiser-analyses-github-codeql-custom-cpp/</link>
					<comments>https://blog.cellenza.com/securite-2/optimiser-analyses-github-codeql-custom-cpp/#respond</comments>
		
		<dc:creator><![CDATA[Wafaa TOUNZI]]></dc:creator>
		<pubDate>Thu, 02 Oct 2025 06:30:33 +0000</pubDate>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Sécurité]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=154086</guid>

					<description><![CDATA[<p>L’objectif de cet article est de présenter un POC autour de la personnalisation du CodeQL pour analyser un projet C++.  L’idée est de démontrer, étape par étape, comment configurer un workflow d’analyse pour écrire des requêtes QL personnalisées et interpréter les résultats afin d’adapter la détection de vulnérabilités au contexte du projet.  Cette personnalisation permet [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/securite-2/optimiser-analyses-github-codeql-custom-cpp/">Optimiser vos analyses de sécurité GitHub avec des requêtes CodeQL custom</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span class="TextRun SCXW180477824 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180477824 BCX8">L’objectif de cet article est de présenter un POC autour de la personnalisation du </span><span class="NormalTextRun SpellingErrorV2Themed SCXW180477824 BCX8">CodeQL</span><span class="NormalTextRun SCXW180477824 BCX8"> pour analyser un projet C++.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW180477824 BCX8"><span class="SCXW180477824 BCX8"> </span><br class="SCXW180477824 BCX8" /></span><span class="TextRun SCXW180477824 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180477824 BCX8"> L’idée est de démontrer, étape par étape, comment configurer un workflow d’analyse pour écrire des requêtes QL personnalisées et interpréter les résultats afin d’adapter la détection de vulnérabilités au contexte du projet.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW180477824 BCX8"><span class="SCXW180477824 BCX8"> </span><br class="SCXW180477824 BCX8" /></span><span class="TextRun SCXW180477824 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW180477824 BCX8"> Cette personnalisation permet aussi d’optimiser l’exécution de </span><span class="NormalTextRun SpellingErrorV2Themed SCXW180477824 BCX8">CodeQL</span><span class="NormalTextRun SCXW180477824 BCX8">, en réduisant le bruit et parfois le temps d’analyse grâce à un ciblage plus précis des règles et des chemins. Nous allons suivre les étapes suivantes :</span></span><span class="EOP SCXW180477824 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="Arial" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><strong>Créer un workflow codeql.yml </strong><br />
<span data-contrast="auto"> pour analyser le code automatiquement via GitHub Actions et exporter les résultats au format SARIF.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="Arial" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><strong>Configurer un fichier codeql-config.yml </strong><br />
<span data-contrast="auto">  afin de définir les chemins à inclure ou ignorer, sélectionner les packs de règles, et ajouter des queries personnalisées.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="Arial" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><strong>Écrire des custom queries .ql avec métadonnées </strong><br />
<span data-contrast="auto">  en utilisant les propriétés telles que @problem.severity, @precision, @tags et @security-severity pour ajuster la sévérité et la pertinence des résultats.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="Arial" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><strong>Utiliser les query-filters </strong><br />
<span data-contrast="auto">  pour réduire le bruit, exclure certaines règles peu précises ou recommandations, et concentrer l’analyse sur les résultats critiques.</span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="Arial" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><strong>Tester et interpréter les résultats</strong><br />
<span data-contrast="auto">  en visualisant les alertes dans GitHub Security ainsi que dans les fichiers SARIF exportés, afin de valider que la configuration et les requêtes répondent bien aux besoins du projet</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ol>
<h3></h3>
<h3>I-<span class="TextRun SCXW137133871 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW137133871 BCX8">Créer le workflow </span><span class="NormalTextRun SpellingErrorV2Themed SpellingErrorHighlight SCXW137133871 BCX8">codeql.yml</span></span></h3>
<p><span class="TextRun SCXW80624975 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW80624975 BCX8">Créer un fichier .</span><span class="NormalTextRun SpellingErrorV2Themed SCXW80624975 BCX8">github</span><span class="NormalTextRun SCXW80624975 BCX8">/workflows/</span><span class="NormalTextRun SpellingErrorV2Themed SCXW80624975 BCX8">codeql.yml</span><span class="NormalTextRun SCXW80624975 BCX8">.</span></span><span class="LineBreakBlob BlobObject DragDrop SCXW80624975 BCX8"><span class="SCXW80624975 BCX8"> </span><br class="SCXW80624975 BCX8" /></span><span class="TextRun SCXW80624975 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW80624975 BCX8"> Ce fichier décrit les étapes du workflow GitHub Actions qui exécute </span><span class="NormalTextRun SpellingErrorV2Themed SCXW80624975 BCX8">CodeQL</span><span class="NormalTextRun SCXW80624975 BCX8">. Voici un </span><span class="NormalTextRun SpellingErrorV2Themed SCXW80624975 BCX8">example</span><span class="NormalTextRun SCXW80624975 BCX8"> pour un projet C++ :</span></span><span class="EOP SCXW80624975 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:360,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154090 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142459-600x566.png" alt="" width="600" height="566" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142459-600x566.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142459-768x724.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142459.png 801w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154091 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142623-600x503.png" alt="" width="600" height="503" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142623-600x503.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142623-768x643.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142623.png 783w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154092 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142730-600x385.png" alt="" width="600" height="385" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142730-600x385.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-142730.png 640w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><b><span data-contrast="auto">Explication du fichier :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:360,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">uses: github/codeql-action/init@v3:</span> <span data-contrast="auto">cette étape installe et configure CodeQL en précisant le langage à analyser. Elle charge le fichier codeql-config.yml pour savoir quels dossiers à inclure/exclure et quelles règles (queries) à exécuter.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:360,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">uses: github/codeql-action/autobuild@v3:</span> <span data-contrast="auto">GitHub essaie de compiler automatiquement le projet. Pour les langages compilés (C#, Java, C++), CodeQL a besoin d’une compilation (build) obligatoire pour comprendre la structure de le code.</span> <span data-contrast="auto">Si l’autobuild échoue, on peut remplacer avec un </span><b><span data-contrast="auto">build manuel</span></b><span data-contrast="auto"> (make, cmake, mvn, dotnet build, yarn build, etc.)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:360,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">uses : github/codeql-action/analyze@v3: </span><span data-contrast="auto">cette action exécute l’analyse CodeQL avec les règles choisies. Les résultats sont exportés après, dans un fichier </span><b><span data-contrast="auto">SARIF</span></b><span data-contrast="auto"> (ce fichier contient les vulnérabilités, leur sévérité et leur précision.)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:360,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">uses: actions/upload-artifact@v4: </span><span data-contrast="auto">sauvegarde le fichier SARIF comme artefact téléchargeable du workflow. On peut aussi l’ouvrir dans GitHub Security ou bien l’importer dans un </span><b><span data-contrast="auto">outil tiers</span></b><span data-contrast="auto"> (SonarQube…etc)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559731&quot;:360,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154094 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143003-600x468.png" alt="" width="600" height="468" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143003-600x468.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143003-768x599.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143003.png 1018w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><span class="TextRun SCXW114783043 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW114783043 BCX8">II- Fichier de configuration </span><span class="NormalTextRun SpellingErrorV2Themed SCXW114783043 BCX8">codeql-config.yml</span></span><span class="EOP SCXW114783043 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:1080,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:720}"> </span></h3>
<p><span class="TextRun SCXW196301114 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW196301114 BCX8">Ce fichier permet de personnaliser ce qui est scanné et quelles règles sont utilisées :</span></span><span class="EOP SCXW196301114 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154096 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143204-600x321.png" alt="" width="600" height="321" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143204-600x321.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143204-1024x547.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143204-768x411.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143204.png 1186w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154097 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143517-600x251.png" alt="" width="600" height="251" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143517-600x251.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143517-1024x428.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143517-768x321.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-143517.png 1266w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><b><span data-contrast="auto">Explication du fichier</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">On indique quelles queries CodeQL doit on exécuter pour notre projet :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">security-extended</span><span data-contrast="auto"> : pack officiel GitHub avec plus de règles de sécurité (recommandé).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">security-and-quality</span> <span data-contrast="auto">: ajoute en plus des règles de bonnes pratiques et de qualité de code.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">./github/codeql/queries/test-query.ql</span><span data-contrast="auto"> : la query custom, qui détecte par exemple l’usage dangereux de la fonction classique </span><b><span data-contrast="auto">strcpy</span></b><span data-contrast="auto">()</span><span data-contrast="auto"> dans du C/C++</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<p><span data-contrast="auto"> </span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:720,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<ol>
<li aria-setsize="-1" data-leveltext="1-" data-font="Arial" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;1-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Filtrer les résultats avec query-filters</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:720,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:360}"> </span></li>
</ol>
<p><span data-contrast="auto">Les query-filters permettent de contrôler finement les résultats de CodeQL sans modifier les requêtes elles-mêmes. Concrètement, ils servent à </span><b><span data-contrast="auto">exclure ou inclure</span></b><span data-contrast="auto"> certains résultats en fonction de critères comme :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:360,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><i><span data-contrast="auto">problem.severity</span></i><span data-contrast="auto"> : exclure par exemple les </span><i><span data-contrast="auto">warnings</span></i><span data-contrast="auto"> pour ne garder que les </span><i><span data-contrast="auto">errors</span></i><span data-contrast="auto">.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><i><span data-contrast="auto">Precision</span></i><i><span data-contrast="auto"> :</span></i><span data-contrast="auto"> ignorer les règles de faible précision (low) pour réduire les faux positifs.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><i><span data-contrast="auto">Tags</span></i><i><span data-contrast="auto"> :</span></i><span data-contrast="auto"> cibler uniquement certaines catégories (ex. security, correctness, etc.).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<p><i><span data-contrast="auto">Le fichier SARIF résultant, ne contient plus les severités filtrées (low, warning)</span></i><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:2,&quot;335551620&quot;:2,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154100 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-144356-600x387.png" alt="" width="600" height="387" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-144356-600x387.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-144356-768x495.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-144356.png 1003w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><b><span data-contrast="auto">III- Comprendre un fichier de requête CodeQL (.ql)</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:1080,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:720}"> </span></h3>
<p><span data-contrast="auto">Un fichier .ql est une requête qui décrit un pattern à détecter dans le code. Il est une sorte de langage déclaratif inspiré de SQL et de la logique, qui manipule les bases de données CodeQL générées à partir du code source (</span><a href="https://codeql.github.com/docs/writing-codeql-queries/about-codeql-queries/"><span data-contrast="none">About CodeQL queries — CodeQL</span></a><span data-contrast="auto">).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">On peut s’inspirer ou utiliser directement ces build-in queries via </span><a href="https://github.com/github/codeql/blob/main/cpp/ql/src/Likely%20Bugs/Likely%20Typos/UsingStrcpyAsBoolean.ql"><span data-contrast="none">codeql/cpp/ql/src/Likely Bugs/Likely Typos/UsingStrcpyAsBoolean.ql at main · github/codeql</span></a><span data-contrast="auto">) </span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">Exemple de requête pour détecter strcpy() :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154101" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-144456-600x375.png" alt="" width="600" height="375" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-144456-600x375.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-144456.png 753w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><b><span data-contrast="auto">Explication du fichier :</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">La première partie est la description du fichier .ql :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">@name :</span></b><span data-contrast="auto"> le nom affiché dans GitHub Security.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">@description</span></b><span data-contrast="auto"> : explication du problème.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">@</span><b><span data-contrast="auto">kind :</span></b><span data-contrast="auto"> type de résultat (problem, path-problem, etc.).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">@precision</span></b><span data-contrast="auto">: niveau de confiance (low, medium, high, very-high).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="5" data-aria-level="1"><b><span data-contrast="auto">@problem.severity</span></b><span data-contrast="auto">: sévérité (error, warning, recommendation).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="6" data-aria-level="1"><b><span data-contrast="auto">@tags</span></b><span data-contrast="auto"> : classification pour filtrer ou relier à CWE, bonnes pratiques, etc.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="7" data-aria-level="1"><b><span data-contrast="auto">@security-severity</span></b><span data-contrast="auto"> : score de 0.0 à 10.0 → traduit en </span><i><span data-contrast="auto">Critical / High / Medium / Low</span></i><span data-contrast="auto"> dans GitHub</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<p style="text-align: center;"><span data-contrast="auto"> </span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:720,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> <img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154103" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-145443-600x393.png" alt="" width="600" height="393" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-145443-600x393.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-145443.png 641w" sizes="auto, (max-width: 600px) 100vw, 600px" /></span></p>
<ol>
<li aria-setsize="-1" data-leveltext="1-" data-font="Arial" data-listid="4" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;1-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Ensuite pour le reste du fichier :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span>
<ul>
<li aria-setsize="-1" data-leveltext="·" data-font="Symbol" data-listid="8" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;·&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">On importe la librairie CodeQL pour le langage C++ (</span><a href="https://codeql.github.com/docs/codeql-language-guides/codeql-library-for-cpp/#codeql-library-for-cpp"><span data-contrast="none">CodeQL library for C and C++ — CodeQL</span></a><span data-contrast="auto">)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:720,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:360}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">from FunctionCall call</span><br />
<span data-contrast="auto"> → on définit une variable call qui représente chaque appel de fonction trouvé dans le code C++.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">where call.getTarget().getName() = « strcpy »</span><br />
<span data-contrast="auto"> → on filtre uniquement les appels à la fonction strcpy.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">select call, « Avoid using strcpy&#8230; »</span><br />
<span data-contrast="auto">→ on retourne chaque appel détecté avec un message d’alerte.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257}"> </span></li>
</ul>
</li>
</ol>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154105 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-145900-600x354.png" alt="" width="600" height="354" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-145900-600x354.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-145900-768x453.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-145900.png 836w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><b><span data-contrast="auto">IV- Les Bonnes Pratiques au niveau Pull Requests</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:1080,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:720}"> </span></h3>
<p><span data-contrast="auto">Au-delà de la création des custom queries et de la configuration des workflows, il est essentiel de mettre en place des règles de protection sur les branches pour garantir que le code vulnérable ne soit jamais fusionné vers la branche principale, par erreur ou par un Bypass/Force merge de PR.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span data-contrast="auto">RuleSets à activer dans GitHub :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="Ø" data-font="Wingdings" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[9675],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;Ø&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="2"><b><span data-contrast="auto">Require status checks to</span></b> <b><span data-contrast="auto">pass</span></b><span data-contrast="auto"> : obliger le workflow CodeQL à réussir avant de permettre un merge. Il devient en mode « </span><i><span data-contrast="auto">Required</span></i><span data-contrast="auto"> ».</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:786,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:360}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="Ø" data-font="Wingdings" data-listid="11" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[9675],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;Ø&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="2"><b><span data-contrast="auto">Require branches to be up to date before merging</span></b><span data-contrast="auto"> → la PR doit être mise à jour avec la dernière version de la branche cible pour éviter d’intégrer du code non-scanné</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:786,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:360}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="Ø" data-font="Wingdings" data-listid="12" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;Ø&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Require code scanning results </span></b><span data-contrast="auto">: forcer la présence des résultats CodeQL avec un :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:360,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:360}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="ü" data-font="Wingdings" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;ü&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Seuil de Security alerts: High or higher</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:1211,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:360}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="ü" data-font="Wingdings" data-listid="13" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;ü&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Type d’alertes bloquantes : Errors ou bien All</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559685&quot;:1211,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:257,&quot;335559991&quot;:360}"> </span></li>
</ul>
<p><span data-contrast="auto">Cela signifie que si une alerte de sévérité High ou Critical est détectée, le merge sera bloqué jusqu’à correction.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><span class="TextRun SCXW123770075 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW123770075 BCX8">Avec ce </span><span class="NormalTextRun SpellingErrorV2Themed SCXW123770075 BCX8">ruleset</span><span class="NormalTextRun SCXW123770075 BCX8">, une PR ne peut pas être fusionnée tant que le workflow </span><span class="NormalTextRun SpellingErrorV2Themed SCXW123770075 BCX8">CodeQL</span><span class="NormalTextRun SCXW123770075 BCX8"> n’a pas tourné et les alertes de sécurité de type High ou plus graves n’ont pas été résolues.</span></span><span class="EOP SCXW123770075 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154109 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-150306-600x318.png" alt="" width="600" height="318" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-150306-600x318.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-150306-1024x543.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-150306-768x408.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-150306-500x266.png?crop=1 500w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-23-150306.png 1236w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><b><span data-contrast="auto">Conclusion</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></h3>
<p><span data-contrast="auto">En résumé, les queries CodeQL personnalisées offrent une grande flexibilité : elles permettent d’aller au-delà des règles standard de GHAS, de répondre à des besoins métier spécifiques et de renforcer la détection de vulnérabilités selon le contexte du projet.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:257}"> </span></p>
<p>L’article <a href="https://blog.cellenza.com/securite-2/optimiser-analyses-github-codeql-custom-cpp/">Optimiser vos analyses de sécurité GitHub avec des requêtes CodeQL custom</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/securite-2/optimiser-analyses-github-codeql-custom-cpp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">154086</post-id>	</item>
		<item>
		<title>Spark supporte désormais les CTEs recursives</title>
		<link>https://blog.cellenza.com/data/spark-cte-recursives-data-lineage-databricks/</link>
					<comments>https://blog.cellenza.com/data/spark-cte-recursives-data-lineage-databricks/#respond</comments>
		
		<dc:creator><![CDATA[Arthur Guerin]]></dc:creator>
		<pubDate>Thu, 11 Sep 2025 06:30:42 +0000</pubDate>
				<category><![CDATA[Data]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=153998</guid>

					<description><![CDATA[<p>Cas d&#8217;usage &#8211; extraction du data lineage  Prérequis : Databricks runtime 17.0 (June 2025 &#8211; Link), Databricks Unity catalog, accès aux tables system access.  Introduction  L&#8217;arrivée de Spark 4.0 marque un jalon important dans l&#8217;évolution du moteur Spark et amène son lot de nouveautés, parmi lesquelles la possibilité de faire des requêtes SQL récursives.  Celles-ci [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/data/spark-cte-recursives-data-lineage-databricks/">Spark supporte désormais les CTEs recursives</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3><span class="TextRun SCXW140903295 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW140903295 BCX8" data-ccp-parastyle="heading 1">Cas d&rsquo;usage &#8211; extraction du data </span><span class="NormalTextRun SpellingErrorV2Themed SCXW140903295 BCX8" data-ccp-parastyle="heading 1">lineage</span></span><span class="EOP SCXW140903295 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h3>
<p><span class="TextRun SCXW218689905 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW218689905 BCX8">Prérequis : </span><span class="NormalTextRun SpellingErrorV2Themed SCXW218689905 BCX8">Databricks</span><span class="NormalTextRun SCXW218689905 BCX8"> runtime 17.0 (June 2025 &#8211; </span></span><a class="Hyperlink SCXW218689905 BCX8" href="https://learn.microsoft.com/fr-fr/azure/databricks/release-notes/runtime/17.0" target="_blank" rel="noreferrer noopener"><span class="TextRun Underlined SCXW218689905 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW218689905 BCX8" data-ccp-charstyle="Hyperlink">Link</span></span></a><span class="TextRun SCXW218689905 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW218689905 BCX8">), </span><span class="NormalTextRun SpellingErrorV2Themed SCXW218689905 BCX8">Databricks</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW218689905 BCX8">Unity</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW218689905 BCX8">catalog</span><span class="NormalTextRun SCXW218689905 BCX8">, accès aux tables system </span><span class="NormalTextRun SpellingErrorV2Themed SCXW218689905 BCX8">access</span><span class="NormalTextRun SCXW218689905 BCX8">.</span></span><span class="EOP SCXW218689905 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h4><span class="TextRun SCXW149360411 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW149360411 BCX8" data-ccp-parastyle="heading 1">Introduction</span></span><span class="EOP SCXW149360411 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h4>
<p><span data-contrast="none">L&rsquo;arrivée de Spark 4.0 marque un jalon important dans l&rsquo;évolution du moteur Spark et amène son lot de nouveautés, parmi </span><span data-contrast="auto">lesquelles </span><span data-contrast="none">la possibilité de faire des requêtes SQL récursives.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Celles-ci ont plusieurs avantages : elles permettent de rendre vos scripts SQL plus lisibles, efficients, et sont un atout considérable pour vos projets analytics. Afin d&rsquo;illustrer cette fonctionnalité et les éléments à prendre en compte au moment de son implémentation, nous allons partir d&rsquo;un cas d&rsquo;usage concret : l&rsquo;extraction complète (c&rsquo;est à dire avec les colonnes) du data lineage pour une table spécifique, à l&rsquo;aide de la table système</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><i><span data-contrast="none">system.access.column_lineage</span></i><span data-contrast="none">, accessible depuis Unity Catalog (pour les workspaces où celui-ci est activé).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h4><span class="TextRun SCXW220279558 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW220279558 BCX8" data-ccp-parastyle="heading 2">Pourquoi un tel cas d’usage ?</span></span><span class="EOP SCXW220279558 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:1,&quot;335559739&quot;:0,&quot;335559991&quot;:199}"> </span></h4>
<p><span class="TextRun SCXW53224552 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW53224552 BCX8">Simplement parce que les fonctionnalités de data </span><span class="NormalTextRun SpellingErrorV2Themed SCXW53224552 BCX8">lineage</span><span class="NormalTextRun SCXW53224552 BCX8"> proposées par </span><span class="NormalTextRun SpellingErrorV2Themed SCXW53224552 BCX8">Databricks</span><span class="NormalTextRun SCXW53224552 BCX8"> rencontrent aujourd’hui certaines limites. Pour bien comprendre, rappelons brièvement que le data </span><span class="NormalTextRun SpellingErrorV2Themed SCXW53224552 BCX8">lineage</span><span class="NormalTextRun SCXW53224552 BCX8"> est une fonctionnalité </span></span><span class="TextRun SCXW53224552 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW53224552 BCX8">d’</span></span><span class="TextRun SCXW53224552 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SpellingErrorV2Themed SCXW53224552 BCX8">Unity</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW53224552 BCX8">Catalog</span><span class="NormalTextRun SCXW53224552 BCX8"> qui permet notamment de suivre le cycle de vie des données en traçant leurs origines, les transformations appliquées et leurs utilisations &#8211; bien sûr, tout cela de manière automatisée.</span></span><span class="EOP SCXW53224552 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h6><span class="TextRun SCXW147779271 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW147779271 BCX8" data-ccp-parastyle="heading 3">Plusieurs outils sont ainsi proposés par </span><span class="NormalTextRun SpellingErrorV2Themed SCXW147779271 BCX8" data-ccp-parastyle="heading 3">Databricks</span><span class="NormalTextRun SCXW147779271 BCX8" data-ccp-parastyle="heading 3"> pour exploiter le </span><span class="NormalTextRun SpellingErrorV2Themed SCXW147779271 BCX8" data-ccp-parastyle="heading 3">lineage</span></span><span class="EOP SCXW147779271 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h6>
<p><span data-contrast="none">Deux tables système :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">system.access.column_lineage (</span><a href="https://docs.databricks.com/aws/en/admin/system-tables/lineage#column-lineage-schema"><span data-contrast="none">Lien</span></a><span data-contrast="none">) : permet de tracer les lectures/écritures au niveau des colonnes.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">  </span><span data-contrast="none">system.access.table_lineage (</span><a href="https://docs.databricks.com/aws/en/admin/system-tables/lineage#table-lineage-schema"><span data-contrast="none">Lien</span></a><span data-contrast="none">): permet de tracer les lectures/écritures au niveau des tables.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154003" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-144210-1-600x445.png" alt="" width="600" height="445" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-144210-1-600x445.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-144210-1-768x569.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-144210-1.png 861w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="none">Le « Catalog explorer » &#8211; Interface utilisateur</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Un onglet »Lineage » est accessible lors de la sélection d&rsquo;une table depuis le Unity Catalog</span><span data-contrast="none">.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154006" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145053-600x244.png" alt="" width="600" height="244" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145053-600x244.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145053-1024x416.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145053-768x312.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145053.png 1485w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW174238228 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW174238228 BCX8">Une vue graphe du data</span></span> <span class="TextRun SCXW174238228 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SpellingErrorV2Themed SCXW174238228 BCX8">lineage</span><span class="NormalTextRun SCXW174238228 BCX8"> en sélectionnant une table. </span></span><span class="TextRun SCXW174238228 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW174238228 BCX8">Une API </span> <span class="NormalTextRun SCXW174238228 BCX8">REST</span><span class="NormalTextRun SCXW174238228 BCX8">.</span></span><span class="EOP SCXW174238228 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h6><span class="TextRun SCXW28699946 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW28699946 BCX8" data-ccp-parastyle="heading 3">À </span><span class="NormalTextRun SCXW28699946 BCX8" data-ccp-parastyle="heading 3">ce jo</span></span><span class="TextRun SCXW28699946 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW28699946 BCX8" data-ccp-parastyle="heading 3">ur</span><span class="NormalTextRun SCXW28699946 BCX8" data-ccp-parastyle="heading 3">, les limitations identifiées sont les suivantes</span></span><span class="EOP SCXW28699946 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h6>
<p><span data-contrast="none">Les tables système ne fournissent que les dépendances en amont et en aval dites directes (c’est-à-dire sous la forme source → target). Pour obtenir l&rsquo;intégralité des dépendances, il est nécessaire d&rsquo;exécuter plusieurs requêtes récursives.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Les filtres et colonnes utilisés dans les jointures ne sont pas capturés si les colonnes sont absentes de la table finale. Cela est dû à l&rsquo;absence de lien direct entre une colonne source et une colonne cible, ce qui peut entraîner une perte de visibilité sur la logique de transformation.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">La périodicité retenue pour la conservation des données de lineage est limitée à un an.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Il n’y a pas de traçage des opérations de DELETE et UPDATE. Si un champ est renommé ou supprimé, il devient difficile à identifier dans les tables système sans une requête avancée.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Ainsi, il peut être intéressant, dans certains cas, de disposer d’un outil permettant d’extraire le data lineage sur l’ensemble des dépendances d’une table spécifique. Le support des CTEs récursives (Common Table Expressions) va justement nous y aider.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h6><span class="TextRun SCXW15454818 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW15454818 BCX8" data-ccp-parastyle="heading 2">&#8211; Rappel rapide sur les CTE</span></span><span class="EOP SCXW15454818 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:1,&quot;335559739&quot;:0,&quot;335559991&quot;:199}"> </span></h6>
<p><span data-contrast="none">L’objectif de cet article n’est pas de faire une présentation exhaustive des CTEs récursives, mais voici les principales utilisations à garder en tête pour la suite :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">L’exploration des relations hiérarchiques.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">La construction d’arbres de dépendance, notamment de type parent-enfant (ex. : catégories).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">L’itération et la génération de suites numériques ou de séquences (par exemple, pour extraire chaque lettre d’un mot, etc.).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h6><span class="TextRun SCXW198698752 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW198698752 BCX8" data-ccp-parastyle="heading 3">Structure d’une CTE récursive</span></span><span class="EOP SCXW198698752 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h6>
<p><span data-contrast="none">Les CTEs récursives sont structurées en deux parties :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Une partie d’initialisation, également appelée ancre (anchor) : C’est la requête initiale, définie à l’aide du mot-clé RECURSIVE et de la CTE.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Une partie récursive : C’est la requête itérative qui réutilise la CTE et s’appuie sur un UNION ALL pour concaténer les résultats.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154013" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145841-600x260.png" alt="" width="600" height="260" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145841-600x260.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145841-1024x443.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145841-768x332.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-145841.png 1412w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h5><span class="TextRun SCXW126676859 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW126676859 BCX8" data-ccp-parastyle="heading 2">&#8211; Cas d’usage : Extraction du data </span><span class="NormalTextRun SpellingErrorV2Themed SCXW126676859 BCX8" data-ccp-parastyle="heading 2">lineage</span></span><span class="EOP SCXW126676859 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:1,&quot;335559739&quot;:0,&quot;335559991&quot;:199}"> </span></h5>
<p><span data-contrast="none">L’objectif attendu est d’obtenir une table contenant l’ensemble du data lineage d’une table choisie, avec en ligne toutes les dépendances entre colonnes sources et colonnes cibles intervenant dans sa construction.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Pour visualiser la profondeur de la dépendance, une colonne </span><b><span data-contrast="none">level </span></b><span data-contrast="none">est ajoutée, contenant des valeurs numériques :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Une valeur de 1 indique qu’il faut remonter une table en amont de la table finale. </span><span data-contrast="none">Une valeur de 2 signifie qu’il faut remonter deux niveaux, et ainsi de suite.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Essayons maintenant d&rsquo;extraire l&rsquo;ensemble des dernières dépendances pour une table donnée, et ce pour tous ses champs à l&rsquo;aide des CTEs récursives.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154016" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-102834-600x125.png" alt="" width="600" height="125" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-102834-600x125.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-102834-1024x213.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-102834-768x160.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-102834-1536x320.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-102834.png 1713w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW214958653 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW214958653 BCX8">Une fois ces étapes réalisées, il s’agit maintenant de construire l’ancre (</span><span class="NormalTextRun SpellingErrorV2Themed SCXW214958653 BCX8">anchor</span><span class="NormalTextRun SCXW214958653 BCX8">) de la CTE récursive.</span></span><span class="EOP SCXW214958653 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h6><span class="TextRun SCXW100437827 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW100437827 BCX8" data-ccp-parastyle="heading 3">Construction de l&rsquo;ancre</span></span><span class="EOP SCXW100437827 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h6>
<p><span data-contrast="none">Rien de particulièrement complexe ici, si ce n’est l’application de </span><b><span data-contrast="none">trois filtres essentiels </span></b><span data-contrast="none">: </span><span data-contrast="none">Sur la table choisie (cible de l’analyse).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Sur la dernière version de la table (grâce au timestamp le plus récent du lineage).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Sur la liste des colonnes (utilisée ensuite dans la phase récursive pour effectuer la jointure).</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h6><span class="TextRun SCXW220190837 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW220190837 BCX8">Et l&rsquo;</span></span><span class="TextRun SCXW220190837 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW220190837 BCX8">initialisation de la colonne </span><span class="NormalTextRun SpellingErrorV2Themed SCXW220190837 BCX8">level</span></span><span class="TextRun SCXW220190837 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW220190837 BCX8">.</span></span><span class="EOP SCXW220190837 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h6>
<h6><span class="TextRun SCXW219469838 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW219469838 BCX8">Construction de la partie récursive</span></span><span class="EOP SCXW219469838 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></h6>
<p><span data-contrast="none">Pour construire la partie récursive de la CTE, deux jointures internes (INNER JOIN) sont nécessaires :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Sur lineage_cte : pour relier chaque colonne cible à sa colonne source précédente, et ainsi reconstruire la chaîne de transformation des données.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Sur recent : pour filtrer les relations et ne conserver que les plus récentes par colonne et table cible, assurant ainsi un lineage à jour.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">À chaque itération, la valeur du champ level est incrémentée pour refléter la profondeur de la dépendance.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">La requête dans sa version finale :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154020" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103132-600x225.png" alt="" width="600" height="225" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103132-600x225.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103132-1024x383.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103132-768x288.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103132.png 1405w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154022" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103713-600x446.png" alt="" width="600" height="446" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103713-600x446.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103713-768x571.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103713.png 922w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154023" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103806-600x101.png" alt="" width="600" height="101" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103806-600x101.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103806-768x129.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103806.png 918w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-154025" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103909-600x41.png" alt="" width="600" height="41" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103909-600x41.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103909-1024x70.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103909-768x52.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103909-1536x104.png 1536w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-09-01-103909.png 1721w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span data-contrast="none">Deux paramètres sont proposés :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">MAX RECURSION LEVEL : Ce paramètre par défaut à 100, limite la profondeur de récursion générant une erreur « RECURSION_LEVEL_LIMIT_EXCEEDED » si celui-ci est dépassé : </span><a href="https://learn.microsoft.com/en-us/azure/databricks/error-messages/error-classes#recursion_level_limit_exceeded"><span data-contrast="none">Lien</span></a><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">WITH RECURSIVE recursive_cte(n) MAX RECURSION LEVEL 200 AS ( &#8230;)</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">La taille du jeu de données retourné en résultat ne peut excéder la limite par défaut de 1 million de lignes, si celle-ci est dépassée, l&rsquo;erreur suivante est levée RECURSION_ROW_LIMIT_EXCEEDED : </span><a href="https://learn.microsoft.com/en-us/azure/databricks/error-messages/error-classes#recursion_row_limit_exceeded"><span data-contrast="none">Lien</span></a><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<h3><span class="TextRun SCXW32829763 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW32829763 BCX8" data-ccp-parastyle="heading 2">Conclusion</span></span><span class="EOP SCXW32829763 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559685&quot;:9,&quot;335559737&quot;:0,&quot;335559738&quot;:1,&quot;335559739&quot;:0,&quot;335559991&quot;:199}"> </span></h3>
<p><span data-contrast="none">Arrivés à l’issue de cet article, nous espérons avoir démontré l’utilité des CTEs récursives à travers un cas concret : l’extraction du data lineage d’une table.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Au-delà de la mise à disposition d’un outil technique, notre objectif était également de souligner l’importance du data lineage dans Unity Catalog, et de vous permettre d’explorer les différentes fonctionnalités nativement intégrées.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p><span data-contrast="none">Par ailleurs, l’arrivée de Spark 4.0 et des nouvelles fonctionnalités SQL qu’il supporte marque une avancée significative vers la création d’une data platform unifiée. Nous vous encourageons vivement à découvrir les autres nouveautés, qui pourraient s’avérer précieuses dans vos projets data.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></p>
<p>L’article <a href="https://blog.cellenza.com/data/spark-cte-recursives-data-lineage-databricks/">Spark supporte désormais les CTEs recursives</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/data/spark-cte-recursives-data-lineage-databricks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">153998</post-id>	</item>
		<item>
		<title>Implémentation de la communication basée sur les messages dans l&#8217;écosystème Azure : mon retour d&#8217;expérience AZ-204</title>
		<link>https://blog.cellenza.com/cloud-2/implementation-services-messagerie-azure-retour-experience-az204/</link>
					<comments>https://blog.cellenza.com/cloud-2/implementation-services-messagerie-azure-retour-experience-az204/#respond</comments>
		
		<dc:creator><![CDATA[Mohammed Boujaaboud]]></dc:creator>
		<pubDate>Thu, 04 Sep 2025 06:30:16 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=153880</guid>

					<description><![CDATA[<p>Lors de ma préparation à la certification AZ-204, j&#8217;ai découvert l&#8217;écosystème riche et parfois déroutant des services de messagerie Azure. Entre Service Bus, Event Hubs, Event Grid et Storage Queues, difficile de s&#8217;y retrouver ! Mais une fois plongé dans les Cloud Design Patterns comme l&#8217;Event Sourcing ou la Choreography, tout prend sens. Voici mon [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/implementation-services-messagerie-azure-retour-experience-az204/">Implémentation de la communication basée sur les messages dans l&rsquo;écosystème Azure : mon retour d&rsquo;expérience AZ-204</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span data-contrast="none">Lors de ma préparation à la certification </span><b><span data-contrast="none">AZ-204</span></b><span data-contrast="none">, j&rsquo;ai découvert l&rsquo;écosystème riche et parfois déroutant des services de messagerie Azure. Entre </span><b><span data-contrast="none">Service Bus</span></b><span data-contrast="none">, </span><b><span data-contrast="none">Event Hubs</span></b><span data-contrast="none">, </span><b><span data-contrast="none">Event Grid</span></b><span data-contrast="none"> et </span><b><span data-contrast="none">Storage Queues</span></b><span data-contrast="none">, difficile de s&rsquo;y retrouver ! Mais une fois plongé dans les </span><b><span data-contrast="none">Cloud Design Patterns</span></b><span data-contrast="none"> comme l&rsquo;Event Sourcing ou la Choreography, tout prend sens. Voici mon analyse comparative, nourrie par l&rsquo;expérience et les meilleures pratiques du Well-Architected Framework.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16777215,&quot;335559738&quot;:250,&quot;335559739&quot;:450}"> </span></p>
<p><span data-contrast="none">Dans Azure, les services de messagerie sont conçus pour répondre à des besoins variés, allant de la gestion de flux de données massifs à la coordination de workflows complexes. Un message peut être une commande (ordre d&rsquo;agir) ou un événement (notification). Microsoft Azure propose plusieurs services de messagerie adaptés à différents scénarios d&rsquo;architecture moderne.</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h3><span class="TextRun SCXW65899259 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW65899259 BCX8" data-ccp-parastyle="heading 2">Quel service choisir ? Matrice de décision pratique</span></span><span class="EOP SCXW65899259 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h3>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153882" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143315-376x600.png" alt="" width="376" height="600" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143315-376x600.png 376w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143315.png 402w" sizes="auto, (max-width: 376px) 100vw, 376px" /></p>
<h4><span class="TextRun SCXW91937367 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW91937367 BCX8" data-ccp-parastyle="heading 2">1. Azure Service Bus : l&rsquo;épine dorsale de vos architectures CQRS</span></span><span class="EOP SCXW91937367 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h4>
<p><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8">Azure Service Bus est un service de messagerie d&rsquo;entreprise entièrement géré, parfait pour implémenter des patterns comme </span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8">CQRS</span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8"> ou </span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8">Saga</span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8">. Lors de mes </span><span class="NormalTextRun SpellingErrorV2Themed SCXW190867513 BCX8">labs</span><span class="NormalTextRun SCXW190867513 BCX8"> AZ-204, j&rsquo;ai réalisé à quel point sa fiabilité était cruciale pour les commandes critiques. Il prend en charge les protocoles AMQP 1.0 et HTTP/REST, et propose deux principaux modèles de communication : les </span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8">files d&rsquo;attente</span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8"> (point-à-point) et les </span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8">rubriques/abonnements</span></span><span class="TextRun SCXW190867513 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW190867513 BCX8"> (publication/abonnement).</span></span><span class="EOP SCXW190867513 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16777215,&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h5><span class="TextRun SCXW40269627 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW40269627 BCX8" data-ccp-parastyle="heading 3">Exemple de code &#8211; Pattern CQRS avec Service Bus</span></span><span class="EOP SCXW40269627 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:450,&quot;335559739&quot;:225}"> </span></h5>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153884" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143706-600x488.png" alt="" width="600" height="488" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143706-600x488.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143706.png 762w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153885" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143820-600x440.png" alt="" width="600" height="440" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143820-600x440.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-143820.png 768w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153888" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144039-1-600x525.png" alt="" width="600" height="525" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144039-1-600x525.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144039-1.png 769w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153890" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144322-600x129.png" alt="" width="600" height="129" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144322-600x129.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144322-1024x220.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144322-768x165.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144322.png 1275w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h4><span class="TextRun SCXW39345096 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW39345096 BCX8" data-ccp-parastyle="heading 2">2. Azure Event Hubs : la fondation de l&rsquo;Event </span><span class="NormalTextRun SpellingErrorV2Themed SpellingErrorHighlight SCXW39345096 BCX8" data-ccp-parastyle="heading 2">Sourcing</span></span><span class="EOP SCXW39345096 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h4>
<p><span class="TextRun SCXW139791071 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW139791071 BCX8">En découvrant Event Hubs durant ma préparation, j&rsquo;ai compris pourquoi il est la référence pour l&rsquo;</span></span><span class="TextRun SCXW139791071 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW139791071 BCX8">Event </span><span class="NormalTextRun SpellingErrorV2Themed SCXW139791071 BCX8">Sourcing</span></span><span class="TextRun SCXW139791071 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW139791071 BCX8">. Compatible avec Apache Kafka, il excelle pour persister des millions d&rsquo;événements par seconde en temps réel, créant un store d&rsquo;événements </span><span class="NormalTextRun SCXW139791071 BCX8">immuable.</span></span><span class="EOP SCXW139791071 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16777215,&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h5><span class="TextRun SCXW72439072 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW72439072 BCX8" data-ccp-parastyle="heading 3">Exemple de code &#8211; Event </span><span class="NormalTextRun SpellingErrorV2Themed SCXW72439072 BCX8" data-ccp-parastyle="heading 3">Sourcing</span><span class="NormalTextRun SCXW72439072 BCX8" data-ccp-parastyle="heading 3"> avec Event Hubs</span></span><span class="EOP SCXW72439072 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:450,&quot;335559739&quot;:225}"> </span></h5>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153893" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144633-600x396.png" alt="" width="600" height="396" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144633-600x396.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144633-768x507.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144633.png 825w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153894" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144749-600x488.png" alt="" width="600" height="488" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144749-600x488.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144749-768x625.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144749.png 827w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153896" src="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144858-1-600x416.png" alt="" width="600" height="416" srcset="https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144858-1-600x416.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144858-1-768x532.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/07/Capture-decran-2025-07-30-144858-1.png 828w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153899" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-145106-600x154.png" alt="" width="600" height="154" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-145106-600x154.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-145106-768x197.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-145106.png 954w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h4><span class="TextRun SCXW69191130 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW69191130 BCX8" data-ccp-parastyle="heading 2">3. Azure Event </span><span class="NormalTextRun SpellingErrorV2Themed SCXW69191130 BCX8" data-ccp-parastyle="heading 2">Grid</span><span class="NormalTextRun SCXW69191130 BCX8" data-ccp-parastyle="heading 2"> :</span></span><span class="TextRun SCXW69191130 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW69191130 BCX8" data-ccp-parastyle="heading 2"> l&rsquo;orchestrateur de la </span><span class="NormalTextRun SpellingErrorV2Themed SCXW69191130 BCX8" data-ccp-parastyle="heading 2">Choreography</span></span><span class="EOP SCXW69191130 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h4>
<p><span class="TextRun SCXW20471986 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW20471986 BCX8">Event </span><span class="NormalTextRun SpellingErrorV2Themed SCXW20471986 BCX8">Grid</span><span class="NormalTextRun SCXW20471986 BCX8"> m&rsquo;a fasciné par sa capacité à implémenter élégamment le pattern </span></span><span class="TextRun SCXW20471986 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SpellingErrorV2Themed SCXW20471986 BCX8">Choreography</span></span><span class="TextRun SCXW20471986 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW20471986 BCX8">. Contrairement à l&rsquo;orchestration centralisée, chaque service réagit de manière autonome aux événements, créant une architecture résiliente et découplée.</span></span><span class="EOP SCXW20471986 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16777215,&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h5><span class="TextRun SCXW18005721 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW18005721 BCX8" data-ccp-parastyle="heading 3">Exemple de code &#8211; Pattern </span><span class="NormalTextRun SpellingErrorV2Themed SCXW18005721 BCX8" data-ccp-parastyle="heading 3">Choreography</span><span class="NormalTextRun SCXW18005721 BCX8" data-ccp-parastyle="heading 3"> avec Event </span><span class="NormalTextRun SpellingErrorV2Themed SCXW18005721 BCX8" data-ccp-parastyle="heading 3">Grid</span></span><span class="EOP SCXW18005721 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:450,&quot;335559739&quot;:225}"> </span></h5>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153902" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163223-600x398.png" alt="" width="600" height="398" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163223-600x398.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163223-768x509.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163223.png 944w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153903" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163313-600x401.png" alt="" width="600" height="401" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163313-600x401.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163313-768x514.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163313.png 945w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153904" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163407-600x398.png" alt="" width="600" height="398" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163407-600x398.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163407-768x509.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163407.png 946w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153905" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163456-600x405.png" alt="" width="600" height="405" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163456-600x405.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163456-768x518.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163456.png 951w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153908" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163637-600x228.png" alt="" width="600" height="228" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163637-600x228.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163637-768x292.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163637.png 961w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h4><span class="TextRun SCXW243029410 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW243029410 BCX8" data-ccp-parastyle="heading 2">4. Azure Storage Queues : le champion du Queue-</span><span class="NormalTextRun SpellingErrorV2Themed SCXW243029410 BCX8" data-ccp-parastyle="heading 2">Based</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW243029410 BCX8" data-ccp-parastyle="heading 2">Load</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW243029410 BCX8" data-ccp-parastyle="heading 2">Leveling</span></span><span class="EOP SCXW243029410 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h4>
<p><span class="TextRun SCXW5949676 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW5949676 BCX8">Storage Queues pourrait sembler basique, mais il brille dans l&rsquo;implémentation du pattern </span></span><span class="TextRun SCXW5949676 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW5949676 BCX8">Queue-</span><span class="NormalTextRun SpellingErrorV2Themed SCXW5949676 BCX8">Based</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW5949676 BCX8">Load</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW5949676 BCX8">Leveling</span></span><span class="TextRun SCXW5949676 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW5949676 BCX8">. Lors de mes exercices pratiques, j&rsquo;ai découvert sa puissance pour lisser les pics de charge à coût minimal.</span></span><span class="EOP SCXW5949676 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16777215,&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h5><span class="TextRun SCXW99389721 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW99389721 BCX8" data-ccp-parastyle="heading 3">Exemple de code &#8211; </span><span class="NormalTextRun SpellingErrorV2Themed SCXW99389721 BCX8" data-ccp-parastyle="heading 3">Load</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW99389721 BCX8" data-ccp-parastyle="heading 3">Leveling</span><span class="NormalTextRun SCXW99389721 BCX8" data-ccp-parastyle="heading 3"> avec Storage Queues</span></span><span class="EOP SCXW99389721 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:450,&quot;335559739&quot;:225}"> </span></h5>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153910" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163754-600x362.png" alt="" width="600" height="362" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163754-600x362.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163754-768x463.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163754.png 943w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153911" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163845-600x383.png" alt="" width="600" height="383" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163845-600x383.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163845-768x490.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163845.png 952w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153913" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163938-600x383.png" alt="" width="600" height="383" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163938-600x383.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163938-768x490.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-163938.png 949w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153914" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164041-600x265.png" alt="" width="600" height="265" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164041-600x265.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164041-768x339.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164041.png 948w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><span class="TextRun SCXW255083743 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW255083743 BCX8" data-ccp-parastyle="heading 2">Architecture hybride : la synergie des patterns</span></span><span class="EOP SCXW255083743 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h3>
<p><span class="TextRun SCXW210610413 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW210610413 BCX8">Dans la réalité des projets </span><span class="NormalTextRun SCXW210610413 BCX8">d’</span><span class="NormalTextRun SCXW210610413 BCX8">entreprises</span><span class="NormalTextRun SCXW210610413 BCX8">, ces services fonctionnent ensemble. Voici l&rsquo;architecture que j&rsquo;ai implémentée lors d&rsquo;un projet post-certification, combinant plusieurs patterns :</span></span><span class="EOP SCXW210610413 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16777215,&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153916" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164142-600x416.png" alt="" width="600" height="416" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164142-600x416.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164142-768x532.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164142.png 954w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153917" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164234-600x391.png" alt="" width="600" height="391" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164234-600x391.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164234-768x501.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164234.png 968w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153919" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164314-600x399.png" alt="" width="600" height="399" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164314-600x399.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164314-768x511.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164314.png 956w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153920" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164351-600x239.png" alt="" width="600" height="239" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164351-600x239.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164351-768x306.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164351.png 944w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><span class="TextRun SCXW242389840 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW242389840 BCX8" data-ccp-parastyle="heading 2">Pièges courants et solutions apprises sur le terrain</span></span><span class="EOP SCXW242389840 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h3>
<h4><span class="TextRun SCXW79941614 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW79941614 BCX8" data-ccp-parastyle="heading 3">Service Bus : Gestion proactive des Dead </span><span class="NormalTextRun SpellingErrorV2Themed SCXW79941614 BCX8" data-ccp-parastyle="heading 3">Letters</span></span><span class="EOP SCXW79941614 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:450,&quot;335559739&quot;:225}"> </span></h4>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153922" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164457-600x370.png" alt="" width="600" height="370" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164457-600x370.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164457-768x474.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164457.png 968w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153923" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164544-600x365.png" alt="" width="600" height="365" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164544-600x365.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164544-768x468.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164544.png 951w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153925" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164615-600x238.png" alt="" width="600" height="238" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164615-600x238.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164615-768x304.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164615.png 952w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><span class="TextRun SCXW11760158 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW11760158 BCX8" data-ccp-parastyle="heading 3">Event Hubs : Checkpoint économiquement optimisé</span></span><span class="EOP SCXW11760158 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16777215,&quot;335559738&quot;:450,&quot;335559739&quot;:225}"> </span></h3>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153926" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164712-600x354.png" alt="" width="600" height="354" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164712-600x354.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164712-768x453.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164712.png 973w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-153928" src="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164759-600x250.png" alt="" width="600" height="250" srcset="https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164759-600x250.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164759-768x320.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/09/Capture-decran-2025-07-30-164759.png 998w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h3><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16447992,&quot;335559738&quot;:0,&quot;335559739&quot;:240}"> </span><b><span data-contrast="none">Conclusion : architecture messaging moderne</span></b><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:600,&quot;335559739&quot;:300}"> </span></h3>
<p><span data-contrast="none">Ma découverte de ces services lors de la préparation AZ-204 m&rsquo;a révélé qu&rsquo;Azure offre bien plus qu&rsquo;une simple palette d&rsquo;outils. C&rsquo;est un écosystème cohérent pour implémenter les patterns architecturaux modernes :</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16775664,&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="none">Service Bus</span></b><span data-contrast="none"> : Excellence pour CQRS et les transactions critiques</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="none">Event Hubs</span></b><span data-contrast="none"> : Fondation robuste pour l&rsquo;Event Sourcing et l&rsquo;analytics</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="none">Event Grid</span></b><span data-contrast="none"> : Simplicité serverless pour la Choreography</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="none">Storage Queues</span></b><span data-contrast="none"> : Efficacité économique pour le Load Leveling</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<h4><span class="TextRun SCXW12525284 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW12525284 BCX8" data-ccp-parastyle="heading 3">Points clés de mon retour d&rsquo;expérience</span></span><span class="EOP SCXW12525284 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:450,&quot;335559739&quot;:225}"> </span></h4>
<ol>
<li aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="none">Commencez par le pattern</span></b><span data-contrast="none">, puis choisissez le service</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="none">Combinez intelligemment</span></b><span data-contrast="none"> : une approche hybride peut réduire les coûts de 85%</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="none">Appliquez le Well-Architected Framework</span></b><span data-contrast="none"> dès le début</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
<li aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="none">Anticipez les patterns d&rsquo;échec</span></b><span data-contrast="none"> : dead letters, checkpoints et poison messages</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16775664,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ol>
<p>&nbsp;</p>
<h4><span class="TextRun SCXW191692289 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW191692289 BCX8">Ressources pour approfondir</span></span><span class="EOP SCXW191692289 BCX8" data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335557856&quot;:16447992,&quot;335559738&quot;:0,&quot;335559739&quot;:225}"> </span></h4>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="1" data-aria-level="1"><a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/event-sourcing"><span data-contrast="none">Event Sourcing Pattern</span></a><span data-contrast="none"> : Maîtrisez l&rsquo;append-only store</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16447992,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="2" data-aria-level="1"><a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/choreography"><span data-contrast="none">Choreography Pattern</span></a><span data-contrast="none"> : Découplage intelligent des microservices</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16447992,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="3" data-aria-level="1"><a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/queue-based-load-leveling"><span data-contrast="none">Queue-Based Load Leveling</span></a><span data-contrast="none"> : Lissage de charge maîtrisé</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16447992,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<ul>
<li aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="3" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}" data-aria-posinset="4" data-aria-level="1"><a href="https://learn.microsoft.com/en-us/azure/well-architected/service-guides/service-bus/operational-excellence"><span data-contrast="none">Service Bus Best Practices</span></a><span data-contrast="none"> : Excellence opérationnelle garantie</span><span data-ccp-props="{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335557856&quot;:16447992,&quot;335559738&quot;:0,&quot;335559739&quot;:0}"> </span></li>
</ul>
<p>L’article <a href="https://blog.cellenza.com/cloud-2/implementation-services-messagerie-azure-retour-experience-az204/">Implémentation de la communication basée sur les messages dans l&rsquo;écosystème Azure : mon retour d&rsquo;expérience AZ-204</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/cloud-2/implementation-services-messagerie-azure-retour-experience-az204/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">153880</post-id>	</item>
		<item>
		<title>BizTalk : comment migrer efficacement vers Azure Integration Services ?</title>
		<link>https://blog.cellenza.com/developpement-specifique/integration/migration-biztalk-azure-cloud-integration/</link>
					<comments>https://blog.cellenza.com/developpement-specifique/integration/migration-biztalk-azure-cloud-integration/#respond</comments>
		
		<dc:creator><![CDATA[Guillaume David]]></dc:creator>
		<pubDate>Wed, 09 Jul 2025 06:30:52 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Architecture applicative]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Integration]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=153780</guid>

					<description><![CDATA[<p>Avec l&#8217;évolution rapide des technologies cloud, de nombreuses entreprises cherchent à moderniser leurs plateformes d’intégration. Microsoft BizTalk Server montre aujourd’hui ses limites face aux exigences actuelles de flexibilité, de scalabilité et d’agilité. Cette réflexion devient d’autant plus urgente que la fin du support étendu de BizTalk Server est officiellement annoncée pour 2030, poussant les organisations [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/developpement-specifique/integration/migration-biztalk-azure-cloud-integration/">BizTalk : comment migrer efficacement vers Azure Integration Services ?</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span data-contrast="auto">Avec l&rsquo;évolution rapide des technologies cloud, de nombreuses entreprises cherchent à moderniser leurs plateformes d’intégration. </span><b><span data-contrast="auto">Microsoft BizTalk Server</span></b><span data-contrast="auto"> montre aujourd’hui ses limites face aux exigences actuelles de </span><b><span data-contrast="auto">flexibilité, de scalabilité et d’agilité</span></b><span data-contrast="auto">. Cette réflexion devient d’autant plus urgente que la </span><b><span data-contrast="auto">fin du support étendu de BizTalk Server est officiellement annoncée pour 2030</span></b><span data-contrast="auto">, poussant les organisations à anticiper leur transition vers une solution d’intégration plus moderne, capable de répondre aux nouveaux besoins tels que le </span><b><span data-contrast="auto">streaming ou l’event-driven architecture</span></b><span data-contrast="auto">.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">C’est dans ce contexte que </span><b><span data-contrast="auto">Azure Integration Services (AIS)</span></b><span data-contrast="auto"> s’impose comme une alternative moderne, </span><b><span data-contrast="auto">cloud-native</span></b><span data-contrast="auto">. Mais migrer de BizTalk vers AIS ne se résume pas à un simple </span><i><span data-contrast="auto">lift-and-shift</span></i><span data-contrast="auto">. Il s’agit d’un véritable </span><b><span data-contrast="auto">changement de paradigme</span></b><span data-contrast="auto">. Cet article a pour objectif de mettre en lumière les correspondances techniques entre BizTalk et les composants Azure, afin de vous aider à mieux appréhender cette transition. Nous verrons comment les orchestrations, adaptateurs, mappings, pipelines ou encore la gestion des erreurs trouvent leurs équivalents ou évolutions dans l’écosystème Azure.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">En préambule avant de plonger dans les correspondances entre les fonctionnalités de BizTalk et les services Azure, nous allons voir quelles sont les plus-values des plateformes d’intégration Azure.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p>&nbsp;</p>
<h3><span class="TextRun SCXW171360697 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW171360697 BCX8" data-ccp-parastyle="heading 2">Les plus-values </span><span class="NormalTextRun SCXW171360697 BCX8" data-ccp-parastyle="heading 2">de</span><span class="NormalTextRun SCXW171360697 BCX8" data-ccp-parastyle="heading 2">s plateformes d’intégration </span><span class="NormalTextRun SCXW171360697 BCX8" data-ccp-parastyle="heading 2">Azure</span></span><span class="EOP SCXW171360697 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Migrer sa plateforme d’intégration BizTalk vers Azure amène un certain nombre d’avantage qui sont : </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="16" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Une plateforme managée et hautement scalable</span></b><br />
<span data-contrast="auto">Azure Integration Services repose sur des services entièrement managés, libérant les équipes des contraintes liées à l’infrastructure. La plateforme s’adapte automatiquement aux charges de travail, permettant une mise à l’échelle horizontale et verticale selon les besoins, tout en garantissant une haute disponibilité et une résilience native.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Une sécurité native et complète</span></b><br />
<span data-contrast="auto">Azure offre une sécurité intégrée de bout en bout, avec une authentification centralisée via Azure EntraID, le chiffrement automatique des données en transit et au repos, ainsi qu’une gestion fine des accès et des identités (RBAC, Managed Identities). </span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Une architecture modulaire et sur-mesure</span></b><br />
<span data-contrast="auto">Grâce à une approche basée sur des services découplés (Logic Apps, API Management, Service Bus…), la solution s’ajuste aux cas d’usage spécifiques de chaque organisation. Elle permet de composer une plateforme d’intégration sur-mesure, évolutive dans le temps.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">Une interopérabilité étendue et moderne</span></b><br />
<span data-contrast="auto">Azure prend en charge une large variété de protocoles et de formats d’échange, comme REST, JSON, EDIFACT, …. Cela permet une intégration fluide avec les systèmes existants, qu’ils soient on-premise ou dans le cloud. Azure permet également d’adopter de nouveaux patterns modernes comme l’event-driven et le streaming.</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="4" data-aria-level="1"><b><span data-contrast="auto">Un socle technologique robuste basé sur les services Azure mainstream</span></b><br />
<span data-contrast="auto">La plateforme s’appuie sur des composants largement utilisés de l’écosystème Azure, tels que Key Vault (gestion des secrets), Storage Account (stockage cloud), ou Log Analytics Workspace et App Insight (pour la centralisation et l’exploitation des logs).</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span class="TextRun SCXW93379291 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW93379291 BCX8">Après avoir examiné</span><span class="NormalTextRun SCXW93379291 BCX8"> les plus-values d’une migration vers Azure, </span><span class="NormalTextRun SCXW93379291 BCX8">il est désormais pertinent d’analyser les </span><span class="NormalTextRun SCXW93379291 BCX8">correspondances entre BizTalk Server et Azure. Bien identifier ces équivalences, tout en comprenant les différences induites par le changement de paradigme, est essentiel pour se projeter sereinement dans ce chantier de transformation. Cela permet également de poser les bases d’une stratégie de migration claire et structurée</span><span class="NormalTextRun SCXW93379291 BCX8">.</span></span><span class="EOP SCXW93379291 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p>&nbsp;</p>
<h3><span class="TextRun SCXW152185460 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW152185460 BCX8" data-ccp-parastyle="heading 2">Migration BizTalk : quels composants Azure pour remplacer quoi ?</span></span><span class="EOP SCXW152185460 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">À la différence de BizTalk, qui est une solution EAI (Enterprise Application Integration) packagée, où toutes les fonctionnalités sont regroupées dans un outil unique, Azure propose un ensemble de services modulaires à assembler selon les besoins pour construire sa propre plateforme d’intégration. Ce changement peut être déroutant pour les équipes habituées à une approche monolithique.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">C’est pour répondre à cette complexité que Microsoft a regroupé plusieurs de ses services d’intégration sous la suite Azure Integration Services (AIS), afin de clarifier l’offre et de faciliter la mise en œuvre de solutions d’intégration cloud modernes.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Azure Integration Services (AIS) est une boîte à outils complète contenant tout le nécessaire pour concevoir des interfaces d’intégration. Elle se compose de six services clés :</span><br />
<span data-contrast="auto">Logic Apps, Azure Functions, API Management, Service Bus, Event Grid et Azure Data Factory</span><i><span data-contrast="auto">. </span></i><span data-contrast="auto">Pour une description détaillée de chacun de ces services et de leurs cas d’usage, vous pouvez consulter notre article de blog :</span> <a href="https://blog.cellenza.com/developpement-specifique/comment-decliner-sa-plateforme-dintegration-en-services-azure-avec-ais/"><i><span data-contrast="none">Comment décliner sa plateforme d’intégration en services Azure avec AIS ?</span></i></a><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Pour répondre aux enjeux de sécurité, de supervision et de connectivité réseau, AIS est complété par d’autres services Azure mainstream tels que :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Azure Key Vault pour la gestion des secrets,</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Azure Storage Account pour le stockage de fichiers et messages,</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><span data-contrast="auto">et des composants réseau comme Azure Virtual Network (VNet).</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><span data-contrast="auto">Nous allons maintenant passer en revue les principales fonctionnalités de BizTalk Server et présenter leurs équivalents dans l’univers Azure, afin de vous aider à mieux comprendre les correspondances et les adaptations nécessaires pour réussir votre migration.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h5></h5>
<h5><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span><span class="TextRun SCXW267609232 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW267609232 BCX8" data-ccp-parastyle="heading 4">Orchestration</span></span><span class="EOP SCXW267609232 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Le principal atout de BizTalk est la particularité d’enchainer des actions de manière séquentielle. Ce composant est l’“Orchestration”, fonctionnalité majeure dans la création et l’ordonnancement des flux&#8230; </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Côté Azure, c’est le composant </span><b><span data-contrast="auto">LogicApp</span></b><span data-contrast="auto"> qui remplit ce rôle. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Ces actions séquentielles peuvent se faire de manière synchrone, c’est-à-dire que le flux se déroule “en temps réel”, coordonnées. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Bien entendu la possibilité de développer des flux asynchrones est présente. Dans cette situation, le comportement naturel de BizTalk permet de persister et sauvegarder les messages dans la “MessageBox”. Il permet grâce aux orchestrations de pouvoir retourner un message après un certain délai. Dans ce cas, il est possible d’envoyer un appel au partenaire source après avoir reçu la réponse du partenaire destination. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Dans le cas des LogicApps, il est possible de sauvegarder/persister un message grâce au ServiceBus dans le but de le consommer plus tard en le stockant temporairement dans une queue par exemple (utilisation du pattern publish/subscribe).</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-153785 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-151439-600x417.png" alt="" width="600" height="417" srcset="https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-151439-600x417.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-151439-768x533.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-151439.png 825w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h5><span class="TextRun SCXW162750909 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW162750909 BCX8" data-ccp-parastyle="heading 4">Connecteur</span><span class="NormalTextRun SCXW162750909 BCX8" data-ccp-parastyle="heading 4">s</span><span class="NormalTextRun SCXW162750909 BCX8" data-ccp-parastyle="heading 4">-adapteur</span><span class="NormalTextRun SCXW162750909 BCX8" data-ccp-parastyle="heading 4">s et p</span><span class="NormalTextRun SCXW162750909 BCX8" data-ccp-parastyle="heading 4">ort</span><span class="NormalTextRun SCXW162750909 BCX8" data-ccp-parastyle="heading 4">s</span></span><span class="EOP SCXW162750909 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Contrairement à BizTalk, LogicApp concentre à la fois la notion d’orchestrations mais aussi celle de port (send ou receive). Là où BizTalk possède plusieurs éléments à configurer pour qu’un flux soit pleinement fonctionnel, Azure LogicApp permet de centraliser l’ensemble des composants.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Par conséquent, le développement peut être plus rapide et les erreurs moins difficiles à monitorer.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><i><span data-contrast="auto">En détail :</span></i><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">La notion de connecteur dans LogicApp, correspond à la configuration des Send et/ou Receive Port dans BizTalk. Ces artefacts permettent de choisir les connecteurs à utiliser en fonction des besoins. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Il est à noter que dans BizTalk, il y a un nombre très restreint de choix en comparaison avec Azure. On se limite à une dizaine de connecteurs fournis par Microsoft. Néanmoins, nous faisons parfois face à des situations qui demandent l’utilisation de connecteurs spéciaux développés par des éditeurs tiers permettant la communication avec certains applicatifs. Et qui dit éditeurs, dit, bien entendu, coût supplémentaire&#8230; Nous pouvons aussi noter que la maintenabilité n’est pas garantie ne serait-ce qu’avec d&rsquo;anciennes versions ou bien les dernières en date.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Dans LogicApp Azure les connecteurs sont nombreux et maintenus ; c’est une très grande force de ce composant</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">1.Les connecteurs dit “Managed”</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Les connecteurs “Managed” s’exécutent dans des clusters de connecteurs partagés dans le cloud Azure mutualisés. Ils sont accessibles via appel HTTP.  Ces connecteurs possèdent souvent des fonctionnalités supplémentaires et avancés mais sont facturés à l’utilisation. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">2. </span><span data-contrast="auto">Les connecteurs dit “Built-In”</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Les connecteurs “Built-In” s’exécutent dans le même cluster et runtime que la Logic App Standard car ils sont préinstallés dans l’environnement. Ces connecteurs ont la possibilité de se connecter à des VNETs et sont tenu à jour par Microsoft. Et dernier détail important, ils n’entrainent pas de surcoût.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">3.Les connecteurs dit “Custom”</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Azure vous donne la possibilité de créer vos propres connecteurs. On les appelle les connecteurs “custom”. Les paramétrages se font via le composant “Logic App Custom Connector”. Une fois créé il est utilisable par l’ensemble des LogicApp du même tenant. Et, de surcroit, il peut être partagé à plusieurs utilisateurs ou groupes Entra ID. Et bien sûr il est possible de gérer le versionning du composant.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Attention toutefois, les connecteur Managed et Custom engendre des coûts supplémentaires à l’utilisation. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h5></h5>
<h5><span class="TextRun SCXW16977040 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW16977040 BCX8" data-ccp-parastyle="heading 4">Mapping</span></span><span class="EOP SCXW16977040 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Enjeu important dans la communication entre applicatif la transformation des messages.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Dans LogicApp il est possible d’utiliser un « DataMapper », qui est un héritage du DataMapper BizTalk.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Nous avons donc 2 composants relativement identiques pour nos 2 applicatifs à ceci près que concernant le data mapper de LogicApp, celui-ci est compatible avec le XSLT 3.0. Or BizTalk, lui, ne supporte que le 1.0.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Chose importante à prendre en compte, Azure LogicApp Standard et BizTalk utilise le même mécanisme de mapping. Les maps sont développées via le XSLT et les schémas sont au format XSD. Cela assure une compatibilité entre les deux.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Par conséquent, un “lift &amp; shift” des maps XSLT et des schéma XSD depuis BizTalk est très rapide. Pas besoin de redéveloppement.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Un point a noté tout de même, ce lift &amp; shift avec l’utilisation LogicApp Consumption nécessite l’utilisation du service Integration Account qui peut s’avérer onéreux.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h5 aria-level="4"></h5>
<h5 aria-level="4"><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span><span class="TextRun SCXW175243529 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW175243529 BCX8" data-ccp-parastyle="heading 4">APIs</span><span class="NormalTextRun SCXW175243529 BCX8" data-ccp-parastyle="heading 4"> </span></span><span class="EOP SCXW175243529 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Il est bien entendu possible d’utiliser des APIs et de permettre aux différents partenaires de les utiliser. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Au sein de BizTalk, il est nécessaire d’utiliser IIS (le serveur web Microsoft). Il faut configurer l&rsquo;API et se synchroniser avec les équipes infrastructures et/ou réseaux pour permettre aux partenaires de pouvoir les utiliser (credentials, whitelisting, etc.).</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Au contraire, dans Azure on peut utiliser API Management avec tous les avantages que ça procure. La facilité de pouvoir déployer rapidement une API par exemple. Il est tout aussi complet en termes de configuration réseau et de règles firewall ou load balancing. En résumé plus simple et mieux intégré.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Le rôle de Backend peut être endossé par une LogicApp comme mentionner ci-dessus, mais il est tout à fait envisageable de créer des Azure Function pour remplir ce rôle.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h5></h5>
<h5><span class="TextRun SCXW153000101 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW153000101 BCX8" data-ccp-parastyle="heading 4">« Helpers » C#</span></span><span class="EOP SCXW153000101 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Il est possible que les actions disponibles dans une LogicApp ne permettent pas de résoudre une problématique donnée. </span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Pour y répondre, il est possible de développer un “module” encapsulant du code (dans le cas de BizTalk, uniquement en C#).</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Dans cette situation, dans un environnement BizTalk on utilisera Visual Studio et le framework .Net.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Il existe deux possibilités pour exécuter du code dans une Logic App :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<ol>
<li data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Le “Inline C#” : permet d’intégrer du code directement dans la Logic App, idéal pour des traitements simples et ponctuels, sans nécessiter de déploiement externe.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ol>
<ol>
<li data-leveltext="%1." data-font="" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:0,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769242&quot;:[65533,0],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;%1.&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">Les Azure Functions : permettent d’exécuter des traitements plus complexes. Deux approches sont possibles :</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ol>
<ul>
<li data-leveltext="o" data-font="Courier New" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Courier New&quot;,&quot;469769242&quot;:[9675],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;o&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="2"><span data-contrast="auto">Azure Function Embedded : la fonction s’exécute dans le même runtime que la Logic App Standard à laquelle elle est rattachée. Aucun appel réseau n’est nécessaire, ce qui réduit la latence. Ce mode est recommandé lorsque le traitement est spécifique à une seule Logic App. Il permet également de mutualiser le pipeline CI/CD avec celui de la Logic App, simplifiant le déploiement.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<ul>
<li data-leveltext="o" data-font="Courier New" data-listid="14" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Courier New&quot;,&quot;469769242&quot;:[9675],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;o&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="2"><span data-contrast="auto">Azure Function Externe : il s’agit d’un composant propre de la plateforme, avec son runtime, sa configuration et son cycle CI/CD. Cette approche est pertinente lorsque la fonction est partagée entre plusieurs composants (Logic Apps, APIs, etc.). Elle favorise la réutilisabilité du code et une meilleure séparation des responsabilités.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></li>
</ul>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-153791 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152023-600x313.png" alt="" width="600" height="313" srcset="https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152023-600x313.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152023-1024x534.png 1024w, https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152023-768x401.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152023.png 1094w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<h5 aria-level="4"></h5>
<h5 aria-level="4"><i><span data-contrast="none">Durable messaging/persistence</span></i><span data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-ccp-props="{}"> <span class="TextRun SCXW56337236 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW56337236 BCX8">Les messages peuvent être durablement sauvegarder dans la </span><span class="NormalTextRun SCXW56337236 BCX8">“</span><span class="NormalTextRun SpellingErrorV2Themed SCXW56337236 BCX8">M</span><span class="NormalTextRun SpellingErrorV2Themed SCXW56337236 BCX8">essage</span><span class="NormalTextRun SpellingErrorV2Themed SCXW56337236 BCX8">B</span><span class="NormalTextRun SpellingErrorV2Themed SCXW56337236 BCX8">ox</span><span class="NormalTextRun SCXW56337236 BCX8">”</span><span class="NormalTextRun SCXW56337236 BCX8"> BizTalk pour les </span><span class="NormalTextRun SCXW56337236 BCX8">traiter à nouveaux</span><span class="NormalTextRun SCXW56337236 BCX8"> en cas d’erreur</span><span class="NormalTextRun SCXW56337236 BCX8">. </span><span class="NormalTextRun SCXW56337236 BCX8">Il est possible de configurer les orchestrations en </span><span class="NormalTextRun SCXW56337236 BCX8">“</span><span class="NormalTextRun SCXW56337236 BCX8">long running</span><span class="NormalTextRun SCXW56337236 BCX8">” pour</span> <span class="NormalTextRun SCXW56337236 BCX8">ce type de traitement</span><span class="NormalTextRun SCXW56337236 BCX8">.</span></span><span class="EOP SCXW56337236 BCX8" data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></span></p>
<p><span data-contrast="auto">Une possibilité similaire est proposée avec LogicApp en utilisant la configuration Stateful.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Là ou un une LogicApp en mode Stateless doit avoir une durée maximum de 5 minutes, une LogicApp en mode Stateful est limité à 90 jours !</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Il existe un autre composant intervenant dans la persistance de données : le ServiceBus. Celui-ci est l’un des éléments centraux pour mettre en place le pattern publish-subscribe. C’est un message broker, un intermédiaire entre différents composants. Il permet la réception/stockage de messages dans une queue ou un topic. Ils sont sauvegardés suivant le paramètre TTL (Time To Live). A noter que pour le Basic Tier il est de 14 jours. Dans le cas du premium tier, le TTL est paramétrable.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p>&nbsp;</p>
<h5><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span><span class="TextRun SCXW205302522 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW205302522 BCX8" data-ccp-parastyle="heading 4">Monitoring</span></span><span class="EOP SCXW205302522 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Azure bénéficie du service de AppInsight permettant de développer son propre monitoring des flux. Il existe aussi l’outil Log Analytics qui permet de connecter les logs qui prend leur source depuis différents composants. L’atout de Log Analytics est le langage de requête (KQL) qui facilite l’exploitation des données stockées.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Concernant BizTalk plusieurs alternatives peuvent être envisagé. L’exploitation des données stocker dans le BAM par une application tierce (a développé en interne ou grâce à un produit du marché) ou alors l’utilisation seul de la Console d’Administration BizTalk qui, quant à elle, n’est à usage strictement technique.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">Le BHM ou BizTalk Health Monitor peut s’apparenté au composant </span><b><span data-contrast="auto">HealthCheck </span></b><span data-contrast="auto">utilisable par plusieurs composant AIS</span><b><span data-contrast="auto">. </span></b><span data-contrast="auto">Il donne des métriques de « bonne santé » de la plateforme. Il s’agit d’un monitoring orienté technique.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p>&nbsp;</p>
<h5><span class="TextRun SCXW50216110 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SpellingErrorV2Themed SCXW50216110 BCX8" data-ccp-parastyle="heading 4">Routing</span><span class="NormalTextRun SCXW50216110 BCX8" data-ccp-parastyle="heading 4">/</span><span class="NormalTextRun SpellingErrorV2Themed SCXW50216110 BCX8" data-ccp-parastyle="heading 4">Special</span> <span class="NormalTextRun SpellingErrorV2Themed SCXW50216110 BCX8" data-ccp-parastyle="heading 4">rules</span></span><span class="EOP SCXW50216110 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Avec le BRE (Business Rules Engine) il est possible d’appliquer des règles particulières. Il permet de découpler la logique métier à la logique technique.</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<p><span data-contrast="auto">En ce qui concerne Azure un composant en « Preview » est disponible, le Azure Logic Apps Rules Engine</span><span data-ccp-props="{&quot;335551550&quot;:6,&quot;335551620&quot;:6}"> </span></p>
<h5></h5>
<h5><span class="TextRun SCXW188702597 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW188702597 BCX8" data-ccp-parastyle="heading 4">Security</span></span><span class="EOP SCXW188702597 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559738&quot;:80,&quot;335559739&quot;:40}"> </span></h5>
<p><span data-contrast="auto">Du fait des différences structurelles entre un environnement on-premise et le cloud, le volet sécurité ne peut pas être abordé de la même manière dans BizTalk et Azure.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Dans BizTalk, la sécurité repose généralement sur le Single Sign-On (SSO), qui centralise la gestion des connexions entre les différentes briques de la solution.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">En revanche, dans Azure, chaque composant doit gérer son accès de manière autonome. Pour cela, la plateforme s’appuie sur deux mécanismes clés :</span><span data-ccp-props="{}"> </span></p>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span data-contrast="auto">Managed Identity, qui permet à un service Azure de s’authentifier auprès d’un autre sans stocker de secrets,</span><span data-ccp-props="{}"> </span></li>
</ul>
<ul>
<li data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span data-contrast="auto">RBAC (Role-Based Access Control), qui permet de définir précisément les droits d’accès à chaque ressource.</span><span data-ccp-props="{}"> </span></li>
</ul>
<p><span data-contrast="auto">Le stockage des informations sensibles (mots de passe, clés, chaînes de connexion, etc.) s’effectue via le service Azure Key Vault qui est dédié à la gestion des secrets, des certificats et des clés de chiffrement.</span><span data-ccp-props="{}"> </span></p>
<p><span class="TextRun SCXW248383791 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW248383791 BCX8">Pour conclure ce comparatif entre les fonctionnalités de BizTalk et celles d’Azure, voici un </span><span class="NormalTextRun SCXW248383791 BCX8">résumé graphique</span><span class="NormalTextRun SCXW248383791 BCX8"> réalisé par </span></span><span class="TextRun SCXW248383791 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW248383791 BCX8">Harold Campos, Principal Product Manager – Azure Logic Apps chez Microsoft</span></span><span class="TextRun SCXW248383791 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW248383791 BCX8">, qui permet de </span><span class="NormalTextRun SCXW248383791 BCX8">visualiser clairement les équivalences</span><span class="NormalTextRun SCXW248383791 BCX8"> entre les deux environnements :</span></span><span class="EOP SCXW248383791 BCX8" data-ccp-props="{}"> </span></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-153797 aligncenter" src="https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152628-600x324.png" alt="" width="600" height="324" srcset="https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152628-600x324.png 600w, https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152628-768x414.png 768w, https://blog.cellenza.com/wp-content/uploads/2025/06/Capture-decran-2025-06-25-152628.png 999w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p><span class="TextRun SCXW19086555 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="auto"><span class="NormalTextRun SCXW19086555 BCX8">Lien : <a href="https://www.linkedin.com/feed/update/urn:li:activity:7271841022974783488/" rel="nofollow">https://www.linkedin.com/feed/update/urn:li:activity:7271841022974783488/</a></span></span></p>
<p>&nbsp;</p>
<p><span data-contrast="auto">Cet article, met en lumière les </span><b><span data-contrast="auto">équivalences entre BizTalk Server et les composants Azure</span></b><span data-contrast="auto">, montrant que la majorité des concepts clés de l’intégration (orchestrations, adaptateurs, mapping, pipelines, etc.) trouvent leur place – parfois repensée, souvent enrichie – dans l’écosystème Azure : LogicApp, ServiceBus, APIM. Ce comparatif permet de démystifier la migration vers Azure, de mieux comprendre la transition, d’identifier les points d’attention, et de poser les bases d’une migration structurée.</span><span data-ccp-props="{}"> </span></p>
<p><span data-contrast="auto">Au-delà de cette correspondance technique, migrer vers </span><b><span data-contrast="auto">une plateforme cloud comme AIS</span></b><span data-contrast="auto"> ouvre la voie à de </span><b><span data-contrast="auto">nombreux avantages</span></b><span data-contrast="auto"> : une infrastructure managée, hautement scalable, sécurisée nativement, et bâtie sur des services Azure mainstream (KeyVault, LogAnalytics, StorageAccount, …). C’est aussi l’opportunité d’adopter des approches modernes (event-driven, microservices, DevOps), mieux alignées avec les besoins d’agilité et d’interopérabilité d’aujourd’hui.</span><span data-ccp-props="{}"> </span></p>
<p>L’article <a href="https://blog.cellenza.com/developpement-specifique/integration/migration-biztalk-azure-cloud-integration/">BizTalk : comment migrer efficacement vers Azure Integration Services ?</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/developpement-specifique/integration/migration-biztalk-azure-cloud-integration/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">153780</post-id>	</item>
		<item>
		<title>Cellenza et l&#8217;ARSLA : Ensemble, on a défié la SLA !</title>
		<link>https://blog.cellenza.com/actualite-cellenza/defi-solidaire-sla-cellenza-arsla/</link>
					<comments>https://blog.cellenza.com/actualite-cellenza/defi-solidaire-sla-cellenza-arsla/#respond</comments>
		
		<dc:creator><![CDATA[Marine CARTERET]]></dc:creator>
		<pubDate>Wed, 02 Jul 2025 13:00:29 +0000</pubDate>
				<category><![CDATA[Actualité Cellenza]]></category>
		<category><![CDATA[RSE]]></category>
		<category><![CDATA[Vie d'entreprise]]></category>
		<guid isPermaLink="false">https://blog.cellenza.com/?p=153809</guid>

					<description><![CDATA[<p>Juin c&#8217;était le mois de la solidarité et de l&#8217;engagement ! Chez Cellenza, on a participé au challenge « Défie la SLA » main dans la main avec l&#8217;ARSLA (Association pour la Recherche sur la Sclérose Latérale Amyotrophique), dans le cadre de leur initiative « Éclats de Juin ! ».   Notre objectif ? Cumuler un maximum de kilomètres pour [&#8230;]</p>
<p>L’article <a href="https://blog.cellenza.com/actualite-cellenza/defi-solidaire-sla-cellenza-arsla/">Cellenza et l&rsquo;ARSLA : Ensemble, on a défié la SLA !</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span data-contrast="auto">Juin c&rsquo;était le mois de la solidarité et de l&rsquo;engagement ! Chez Cellenza, on a participé au challenge « Défie la SLA » main dans la main avec l&rsquo;ARSLA (Association pour la Recherche sur la Sclérose Latérale Amyotrophique), dans le cadre de leur initiative « Éclats de Juin ! ». </span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<p><span data-contrast="auto">Notre objectif ? Cumuler un maximum de kilomètres pour faire avancer la recherche contre la SLA, plus connue sous le nom de maladie de Charcot.</span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h3><span class="TextRun SCXW33923037 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW33923037 BCX8" data-ccp-parastyle="heading 2">Un défi co</span><span class="NormalTextRun SCXW33923037 BCX8" data-ccp-parastyle="heading 2">llectif, co</span><span class="NormalTextRun SCXW33923037 BCX8" data-ccp-parastyle="heading 2">nnecté et qui a du cœur</span></span><span class="EOP SCXW33923037 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}"> </span></h3>
<p><span data-contrast="auto">Du 1er au 30 juin, les Cellenzans de toutes les régions se sont mobilisés, à pied, à vélo, en courant ou en nageant. Chaque kilomètre a fait la différence !</span><b><span data-contrast="auto"> Le principe était simple :</span></b><span data-contrast="auto"> 1 kilomètre parcouru = 1 € reversé par Cellenza à l&rsquo;ARSLA.</span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<p><span data-contrast="auto">Semaine après semaine, les kilomètres se sont additionnés, transformant chaque effort individuel en un formidable élan collectif en faveur de la recherche.</span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h3><span class="TextRun SCXW175858132 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun CommentStart CommentHighlightPipeRest CommentHighlightRest SCXW175858132 BCX8" data-ccp-parastyle="heading 2">Un impact concret</span></span><span class="EOP CommentHighlightPipeRest SCXW175858132 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:299,&quot;335559739&quot;:299}"> </span></h3>
<p><span data-contrast="auto">Ce défi sportif s’inscrit dans une démarche solidaire plus large, portée notamment par </span><b><span data-contrast="auto">MicroDON</span></b><span data-contrast="auto"> et son dispositif d’</span><b><span data-contrast="auto">arrondi sur salaire,</span></b><span data-contrast="auto"> en place chez Cellenza depuis 2023.</span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<p><span data-contrast="auto">Grâce à ce mécanisme simple et transparent, les collaborateurs peuvent facilement contribuer à un don régulier, prélevé mensuellement directement sur leur salaire. Ce système permet de soutenir durablement et concrètement les différentes actions entreprises par les associations. </span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h3><span class="TextRun SCXW116780459 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW116780459 BCX8" data-ccp-parastyle="heading 2">L&rsquo;esprit </span><span class="NormalTextRun SpellingErrorV2Themed SCXW116780459 BCX8" data-ccp-parastyle="heading 2">OneTeam</span><span class="NormalTextRun SCXW116780459 BCX8" data-ccp-parastyle="heading 2">, plus fort que jamais</span></span><span class="EOP SCXW116780459 BCX8" data-ccp-props="{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:299,&quot;335559739&quot;:299}"> </span></h3>
<p><span data-contrast="auto">Au-delà des nombreux kilomètres parcourus, ce défi a été une formidable démonstration de l’esprit “</span><b><span data-contrast="auto">OneTeam”</span></b><span data-contrast="auto"> qui nous anime, au service d’une cause essentielle. L’énergie, la bonne humeur et l’engagement de chacun ont insufflé une belle dynamique, directement au profit de l’</span><b><span data-contrast="auto">ARSLA</span></b><span data-contrast="auto">.</span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<p><span data-contrast="auto">Un immense </span><b><span data-contrast="auto">merci</span></b><span data-contrast="auto"> et un grand </span><b><span data-contrast="auto">bravo</span></b><span data-contrast="auto"> à toutes celles et ceux qui se sont mobilisés avec cœur et enthousiasme. Votre participation a réellement fait la différence dans notre soutien à la recherche contre la </span><b><span data-contrast="auto">SLA</span></b><span data-contrast="auto"> !</span></p>
<table style="font-weight: 400;" data-tablestyle="MsoNormalTable" data-tablelook="1696" aria-rowcount="45">
<tbody>
<tr aria-rowindex="1">
<td data-celllook="0"><span data-contrast="none">Anne-Gaëlle DEBROISE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="2">
<td data-celllook="0"><span data-contrast="none">Antonio PAIS</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="3">
<td data-celllook="0"><span data-contrast="none">Arthur GUERIN</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="4">
<td data-celllook="0"><span data-contrast="none">Atar EL AZIZ</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="5">
<td data-celllook="0"><span data-contrast="none">Aymen OUENNICHE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="6">
<td data-celllook="0"><span data-contrast="none">Baptiste LACOSTE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="7">
<td data-celllook="0"><span data-contrast="none">Benjamin ATTALI</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="8">
<td data-celllook="0"><span data-contrast="none">Benoit DIGONNAUX</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="9">
<td data-celllook="0"><span data-contrast="none">Candice MONGO GUIPON</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="10">
<td data-celllook="0"><span data-contrast="none">Charlotte RIEUX</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="11">
<td data-celllook="0"><span data-contrast="none">Chengbin XIA</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="12">
<td data-celllook="0"><span data-contrast="none">Chloé TEMPO</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="13">
<td data-celllook="0"><span data-contrast="none">Clément AINAUD</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="14">
<td data-celllook="0"><span data-contrast="none">David FRAPPART</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="15">
<td data-celllook="0"><span data-contrast="none">Edouard LELONG</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="16">
<td data-celllook="0"><span data-contrast="none">Esteban VINCENT</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="17">
<td data-celllook="0"><span data-contrast="none">Florian GARCIA </span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="18">
<td data-celllook="0"><span data-contrast="none">Frédéric VAILLER</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="19">
<td data-celllook="0"><span data-contrast="none">Gaspard DOUTE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="20">
<td data-celllook="0"><span data-contrast="none">Guillaume NURDIN</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="21">
<td data-celllook="0"><span data-contrast="none">Janison JOSEPH</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="22">
<td data-celllook="0"><span data-contrast="none">Jean-Baptiste CLEGUER</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="23">
<td data-celllook="0"><span data-contrast="none">José CABEZA</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="24">
<td data-celllook="0"><span data-contrast="none">Julien LEGRAND</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="25">
<td data-celllook="0"><span data-contrast="none">Karim CHAABANE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="26">
<td data-celllook="0"><span data-contrast="none">Kenny PHAM</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="27">
<td data-celllook="0"><span data-contrast="none">Lilia CHOUBANE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="28">
<td data-celllook="0"><span data-contrast="none">Lucie HALLET</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="29">
<td data-celllook="0"><span data-contrast="none">Manon SENECHAL</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="30">
<td data-celllook="0"><span data-contrast="none">Margaux COURIVAUD</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="31">
<td data-celllook="0"><span data-contrast="none">Marianne FRANCO</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="32">
<td data-celllook="0"><span data-contrast="none">Marie-Anne CLAY</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="33">
<td data-celllook="0"><span data-contrast="none">Marine CARTERET</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="34">
<td data-celllook="0"><span data-contrast="none">Mathilde FRIBOULET</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="35">
<td data-celllook="0"><span data-contrast="none">Maxence POISSON</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="36">
<td data-celllook="0"><span data-contrast="none">Maxime EGLEM</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="37">
<td data-celllook="0"><span data-contrast="none">Nicolas SOTTY</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="38">
<td data-celllook="0"><span data-contrast="none">Pierre DE LACHAUX</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="39">
<td data-celllook="0"><span data-contrast="none">Robin VANDELOISE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="40">
<td data-celllook="0"><span data-contrast="none">Roger BELLON-GRONIER</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="41">
<td data-celllook="0"><span data-contrast="none">Romain DALLE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="42">
<td data-celllook="0"><span data-contrast="none">Sven CUSSEAU</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="43">
<td data-celllook="0"><span data-contrast="none">Thibault LEFEBVRE</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="44">
<td data-celllook="0"><span data-contrast="none">Valérie BERNIER</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
<tr aria-rowindex="45">
<td data-celllook="0"><span data-contrast="none">Yves LE PORS</span><span data-ccp-props="{&quot;335559739&quot;:0}"> </span></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span data-contrast="auto"> </span><b><span data-contrast="auto">Bravo à toutes et à tous pour cette belle mobilisation !</span></b><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<h3><span class="TextRun SCXW33142447 BCX8" lang="FR-FR" xml:lang="FR-FR" data-contrast="none"><span class="NormalTextRun SCXW33142447 BCX8">L&rsquo;élan continue !</span></span><span class="EOP SCXW33142447 BCX8" data-ccp-props="{}"> </span></h3>
<p><b><span data-contrast="auto">L’engagement ne s’arrête pas là.</span></b><br />
<span data-contrast="auto"> La mobilisation autour du mois “</span><b><span data-contrast="auto">Éclats de Juin !”</span></b><span data-contrast="auto"> a été un vrai succès, mais le combat contre la SLA continue.</span><br />
<span data-contrast="auto">Pour découvrir les missions de l’ARSLA, suivre les avancées de la recherche et soutenir durablement leurs actions, rendez-vous dès maintenant sur leur site officiel :</span><br />
<a href="https://eclatsdejuin.arsla.org/home"><span data-contrast="none">https://eclatsdejuin.arsla.org/home</span></a><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<p><span data-contrast="auto">Un grand merci encore à toute la Team Cellenza. À très vite pour de nouveaux défis !</span><span data-ccp-props="{&quot;335559738&quot;:240,&quot;335559739&quot;:240}"> </span></p>
<p>L’article <a href="https://blog.cellenza.com/actualite-cellenza/defi-solidaire-sla-cellenza-arsla/">Cellenza et l&rsquo;ARSLA : Ensemble, on a défié la SLA !</a> est apparu en premier sur <a href="https://blog.cellenza.com">Le blog de Cellenza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.cellenza.com/actualite-cellenza/defi-solidaire-sla-cellenza-arsla/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">153809</post-id>	</item>
	</channel>
</rss>