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 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 |
- 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!