Régnez sur vos APIs avec Kong
Tags: kong, apimanagement, architecture
Published: 2020-04-09 13:52:00

---
title: Régnez sur vos APIs avec Kong
published: true
date: 2017-02-11 12:00:00 UTC
tags: kong, api management, architecture
canonical_url: https://d3rwan.github.io/d3rwan-blog/posts/kong
---

[Mashape](https://www.mashape.com/) 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](https://getkong.org/), 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.

![](https://d3rwan.github.io/d3rwan-blog/media/kong/modules.png)

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](https://getkong.org/plugins/))

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.

![](https://d3rwan.github.io/d3rwan-blog/media/kong/archi-wo-kong.png)

![Architecture Legacy vs. Architecture orientée API](https://d3rwan.github.io/d3rwan-blog/media/kong/archi-w-kong.png)_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.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#getting-started)Getting started

Dans cette partie, nous utiliserons comme API partenaire celle exposée par le site [http://anapioficeandfire.com/](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 :

{% gist https://gist.github.com/d3rwan/011f9875f4cc3a11fd83860e0a9486f9 %}

- 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

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#how-to)How to

### [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#cr%C3%A9er-une-api)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
```

### [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#activer-lauthentification)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](https://getkong.org/plugins/key-authentication/) de Kong à notre API qui ne sera donc plus accessible sans token d’authentification

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

### [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#ajouter-un-utilisateur)Ajouter un utilisateur

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

### [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#autoriser-ce-nouvel-utilisateur-%C3%A0-acc%C3%A9der-%C3%A0-lapi)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
```

### [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#activer-le-rate-limiting)Activer le [rate-limiting](https://getkong.org/plugins/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/](https://getkong.org/)

Par ailleurs, vous pourrez retrouver la configuration décrite précédemnt directement [sur ce repo github](https://github.com/d3rwan/kong_docker_stack)

Et devenez le _king_ de vos API’s!