< Home

Régnez sur vos APIs avec Kong

Mashape est un catalogue public d’API, permettant à ses utilisateurs de partager ses APIs ou d’utiliser celle des autres. Afin de sécuriser et gérer ces quelques 15000 micro-services présents dans leur catalogue, Mashape a crée Kong, une solution d’API management.

Kong est une solution open-source basée sur NGinx, qui permet de répondre aux contraintes des milliards de requêtes par mois que doit gérer Mashape.

Kong s’appuie également sur une base de données Cassandra (possibilité d’utiliser PostgreSQL), ainsi que sur un ensemble de plug-ins. Par défaut, la solution offre déjà un socle de modules permettant l’authentification, la sécurité, le rate-limiting ou encore la supervision. Il vous sera également possible si besoin de créer vos propres plug-in (cf. la documentation officielle)

Dans votre infrastructure, l’API manager se place en amont des services à exposer (approche reverse-proxy), et prendra en charge les fonctionnalités que vous lui déléguez. Dès lors, chacun de vos services métiers n’aura plus à gérer ces taches techniques et pourra se concentrer sur son coeur métier.

Architecture Legacy vs. Architecture orientée APIArchitecture Legacy vs. Architecture orientée API

Alors, que vous deviez gérer un ensemble de micro-services, une API qui commence à devenir populaire ou simplement un backend web/mobile, il est peut-être temps de commencer à gérer vos APIs.

Getting started

Dans cette partie, nous utiliserons comme API partenaire celle exposée par le site http://anapioficeandfire.com/ et qui expose les données relatives à l’univers de Game of Thrones.

Pour déployer Kong, nous utiliserons des conteneurs Docker orchestrés par docker-compose. La configuration de la stack est la suivante :

version: "2"
services:
cassandra:
image: cassandra:2.2.8
container_name: cassandra
ports:
- "9042:9042"
kong:
image: kong
container_name: kong
ports:
- "8000:8000"
- "8443:8443"
- "8001:8001"
- "7946:7946"
- "7946:7946/udp"
links:
- cassandra:cassandra
environment:
- KONG_DATABASE=cassandra
- KONG_CASSANDRA_CONTACT_POINTS=cassandra
depends_on:
- cassandra
restart: always
command: ["/bin/bash", "-c", " while ! nc cassandra 9042; do sleep 5; done && kong start"]
ui:
image: pgbi/kong-dashboard
container_name: ui
ports:
- "8080:8080"
links:
- kong:kong
depends_on:
- kong
view raw docker-compose.yml hosted with ❤ by GitHub

  • Démarrer la stack

Depuis le répertoire contenant le fichier docker-compose.yml décrit précédemment

    # run (daemon)
    docker-compose up -d
    # show logs
    docker-compose logs -f

Une fois la stack démarrée, nous pouvons accéder à ses différents composants

localhost si vous utilisez Docker sous Mac ou Linux, l’adresse de docker-machine sinon

  • API Manager - localhost**:8001

    • API grâce à laquelle nous allons administrer Kong
  • API Gateway - localhost**:8000

    • API grâce à laquelle nous accéderons à nos API
  • Kong Dashboard - localhost:8080

    • IHM open-source qui utilise l’API d’administration afin d’offrir une interface d’administration

A présent, nous allons pouvoir utiliser notre API manager.

Dans la suite de l’article, nous directement l’API via des appels REST, mais nous pourrions également utiliser l’IHM de Kong Dashboard pour configurer Kong

How to

Créer une API

curl -i -X POST http://localhost:8001/apis/ \
 --data 'name=GOT' \
 --data 'upstream_url=http://anapioficeandfire.com/api/' \
 --data 'request_path=/got/' \
 --data 'preserve_host=false'\
 --data 'strip_request_path=true'

On crée une API qu’on appelle GOT et qui pointe vers notre API partenaire, sur le path /got/ de notre API gateway. On peut désormais y accéder via l’API gateway

curl -i -X GET http://localhost:8000/got/characters/583

Activer l’authentification

curl -i -X POST http://localhost:8001/apis/GOT/plugins/ \
  --data 'name=key-auth' \
  --data 'config.key_names=apiKey'

On associe le plugin key-auth de Kong à notre API qui ne sera donc plus accessible sans token d’authentification

curl -i -X GET http://localhost:8000/got/characters/583

Ajouter un utilisateur

curl -i -X POST http://localhost:8001/consumers/ \
  --data "username=erwan"

Autoriser ce nouvel utilisateur à accéder à l’API

curl -i -X POST http://localhost:8001/consumers/erwan/key-auth \
  --data "key=secret"

Notre API est donc bien sécurisée, et seulement accessible avec la clé d’authentification

curl -i -X GET [http://localhost:8000/got/characters/583](http://localhost:8000/got/characters/583)
curl -i -X GET [http://localhost:8000/got/characters/583](http://localhost:8000/got/characters/583)?apiKey=secret

Activer le rate-limiting

curl -X POST  http://localhost:8001/apis/GOT/plugins \
  --data "name=rate-limiting" \
  --data "config.hour=2"

Notre API est à présent limitée à 2 appels par heure.

curl -i -X GET http://localhost:8000/got/characters/583?apiKey=secret
curl -i -X GET http://localhost:8000/got/characters/583?apiKey=secret
curl -i -X GET http://localhost:8000/got/characters/583?apiKey=secret

L’accès à notre API peut à présent se faire via notre API manager après seulement quelques minutes de configuration. Grâce à Kong, on pourra par la suite ajouter des contraintes d’accès, des règles de réécriture de requêtes ou encore du monitoring sans devoir modifier notre coeur métier, ou demander à nos partenaires de le faire.

N’hésitez pas non plus à parcourir le site de Kong, et sa documentation plutôt complète pour voir tout ce qu’il pourrait faire pour vous.

Site officiel - https://getkong.org/

Par ailleurs, vous pourrez retrouver la configuration décrite précédemnt directement sur ce repo github

Et devenez le king de vos API’s!