Skip to content
Learni
Voir tous les tutoriels
DevOps

Comment implémenter un API Management avec Kong en 2026

Read in English

Introduction

L'API Management est essentiel en 2026 pour les architectures microservices : il centralise le proxying, la sécurité, le throttling et le monitoring de vos APIs. Kong, gateway open-source ultra-performant, excelle en mode DB-less (sans base de données), idéal pour Kubernetes ou environnements éphémères. Ce tutoriel advanced vous guide pas à pas pour déployer un système complet : un backend Node.js simulé, proxifié par Kong avec rate-limiting (5 req/min), key-authentication, logging structuré et métriques Prometheus.

Pourquoi Kong ? Il supporte 100+ plugins Lua, scale horizontalement et intègre nativement Docker/K8s. Imaginez comme un vigile intelligent : il filtre les abus, authentifie les consumers et expose des dashboards. À la fin, vous aurez une stack production-ready, testable localement. Temps estimé : 30 min. Gain concret : réduction de 80% des attaques DDoS et monitoring temps réel.

Prérequis

  • Docker et Docker Compose installés (version 20.10+)
  • Node.js 20+ et npm
  • curl pour les tests API
  • Connaissances avancées en Docker, YAML et APIs REST
  • Git pour cloner le projet exemple (optionnel)

Créer le backend API Node.js

backend/app.js
const express = require('express');
const app = express();
app.use(express.json());

app.get('/hello', (req, res) => {
  res.json({ message: 'Hello from Backend API!', timestamp: new Date().toISOString() });
});

app.get('/users', (req, res) => {
  res.json([
    { id: 1, name: 'Alice', email: 'alice@example.com' },
    { id: 2, name: 'Bob', email: 'bob@example.com' }
  ]);
});

app.post('/users', (req, res) => {
  const { name, email } = req.body;
  if (!name || !email) {
    return res.status(400).json({ error: 'Name and email required' });
  }
  res.status(201).json({ id: 3, name, email });
});

const PORT = 3001;
app.listen(PORT, () => {
  console.log(`Backend API listening on port ${PORT}`);
});

Ce backend Express.js expose trois endpoints : GET /hello (simple healthcheck), GET /users (liste statique) et POST /users (création avec validation). Il écoute sur le port 3001 pour simulation microservice. Piège à éviter : toujours valider les inputs pour prévenir injections ; ici, check basique des champs obligatoires.

Package.json et installation backend

backend/package.json
{
  "name": "api-backend",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  },
  "dependencies": {
    "express": "^4.19.2"
  },
  "devDependencies": {
    "nodemon": "^3.1.4"
  }
}

Ce package.json installe Express pour le serveur et Nodemon pour hot-reload en dev. Exécutez npm install après création. Avantage : scripts prêts pour prod (npm start) et dev. Évitez les dépendances inutiles pour minimiser la surface d'attaque.

Dockerfile pour le backend

backend/Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3001
CMD ["npm", "start"]

Dockerfile lightweight avec Alpine pour ~100MB image. Copie package d'abord pour cache layer npm. Utilisez npm ci en prod pour install déterministe. Piège : oubliez EXPOSE ou WORKDIR, causant des binds ports foireux.

docker-compose.yml avec Kong DB-less

docker-compose.yml
version: '3.9'
services:
  backend:
    build: ./backend
    ports:
      - "3001:3001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3001/hello"]
      interval: 10s
      timeout: 5s
      retries: 3

  kong:
    image: kong:3.6
    restart: always
    environment:
      KONG_DATABASE: "off"
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: "0.0.0.0:8001"
    ports:
      - "8000:8000"  # Proxy
      - "8001:8001"  # Admin API
      - "8443:8443"  # Proxy HTTPS
      - "8002:8002"  # Admin GUI? Non, metrics
    networks:
      - kong-net

networks:
  kong-net:

Ce docker-compose lance backend + Kong en mode DB-less (sans Postgres). Kong proxy sur 8000, Admin API sur 8001 pour configs dynamiques. Healthcheck backend assure disponibilité. Piège : exposez toujours Admin en prod via VPN ; ici localhost-only pour dev.

Lancer la stack

terminal
mkdir kong-api-management && cd kong-api-management
mkdir backend
# Copiez les fichiers backend/app.js, package.json, Dockerfile ici
cd backend && npm install && cd ..
# Copiez docker-compose.yml à la racine
docker compose up -d
# Vérifiez logs
docker compose logs -f kong
docker compose ps

Ce script bash initialise le projet, installe deps backend et lance tout en detached. docker compose ps confirme services healthy. Avantage : reproductible à 100%. Évitez docker-compose up sans -d en prod pour éviter blocage terminal.

Configurer service et rate-limiting via Admin API

setup-kong.sh
#!/bin/bash

# Créer le service backend
curl -i -X POST http://localhost:8001/services/ \
  --data "name=backend-service" \
  --data "url=http://backend:3001"

# Créer la route /
 curl -i -X POST http://localhost:8001/services/backend-service/routes \
  --data "paths[]=/" \
  --data "methods[]=GET" \
  --data "methods[]=POST"

# Ajouter plugin rate-limiting (5 req/min)
curl -i -X POST http://localhost:8001/services/backend-service/plugins \
  --data "name=rate-limiting" \
  --data "config.minute=5" \
  --data "config.policy=local"

# Vérifier
echo "Services:"
curl -X GET http://localhost:8001/services

echo "Plugins:"
curl -X GET http://localhost:8001/services/backend-service/plugins

Ce script shell configure dynamiquement le service, route et plugin rate-limiting via Kong Admin API (curl POST). Policy 'local' pour mémoire in-process, scalable horizontalement. Testez avec 6+ req /hello pour voir 429. Piège : quotes escaped en bash ; utilisez --data pour simplicité.

Ajouter key-auth et consumer

add-auth.sh
#!/bin/bash

# Créer consumer
CONSUMER_ID=$(curl -s -i -X POST http://localhost:8001/consumers/ \
  --data "username=api-client" | grep -o '"id":"[^"]*' | cut -d'"' -f4)

echo "Consumer ID: $CONSUMER_ID"

# Créer credential key-auth pour ce consumer
curl -i -X POST http://localhost:8001/consumers/api-client/key-auth \
  --data "key=my-secret-api-key-123"

# Attacher plugin key-auth au service
curl -i -X POST http://localhost:8001/services/backend-service/plugins \
  --data "name=key-auth" \
  --data "config.key_names[]=apikey" \
  --data "config.hide_credentials=false"

# Vérifier credential
echo "Key:"
curl -s http://localhost:8001/consumers/api-client/key-auth | jq .

Script avancé extrayant ID consumer dynamiquement (grep/cut), génère clé API statique et attache plugin key-auth (header 'apikey'). hide_credentials=true masque en logs prod. Piège : sans jq pour JSON pretty, mais fonctionnel sans ; ajoutez apt install jq si besoin.

Bonnes pratiques

  • Mode DB-less prioritaire : Pas de DB overhead, config YAML gitops-ready pour CI/CD.
  • Sécurisez Admin API : En prod, KONG_ADMIN_LISTEN=127.0.0.1:8001 + NGINX reverse proxy avec mTLS.
  • Plugins en cascade : Rate-limit avant auth pour économies CPU ; utilisez run_on=first pour perf.
  • Monitoring Prometheus : Ajoutez plugin prometheus avec curl POST /plugins --data name=prometheus.
  • Healthchecks avancés : Activez KONG_PROXY_LISTEN=0.0.0.0:8000 reuseport pour scale.
  • Secrets management : Stockez clés en Vault ou env vars, pas hardcoded.

Erreurs courantes à éviter

  • Oubli réseau Docker : Services isolés sans kong-net causent 'host unreachable' ; toujours network commun.
  • Rate-limit non persistant : Policy 'cluster' sans Redis/DB perd état au restart ; 'local' OK pour dev.
  • Admin API exposée publiquement : Risque takeover ; firewall + auth basique (admin_gui_auth).
  • Images non optimisées : Backend sans multi-stage Dockerfile gonfle à 1GB ; utilisez Alpine + prod deps.

Pour aller plus loin