L'API Management consiste à gérer, surveiller et sécuriser les API (Application Programming Interfaces) de manière centralisée. Gravitee.io est une plateforme open source qui offre des fonctionnalités d'API Management.
Elle permet aux organisations de gérer efficacement leurs APIs en fournissant un ensemble d'outils et de fonctionnalités pour :

  • Gérer des API : Gravitee permet de créer, publier, versionner et supprimer des API. Vous pouvez également définir des politiques de sécurité, de limitation, etc., pour contrôler l'API.
  • Portail développeur : Permet de découvrir, documenter et tester les API. Les développeurs peuvent obtenir des clés d'API, accéder à la documentation et suivre leur utilisation.
  • Analyse et surveillance : Gravitee permet le suivi de l'utilisation des API, de surveillance en temps réel, de journalisation et de génération de rapports pour comprendre comment les API sont utilisées et identifier les problèmes potentiels.
  • Sécurité des APIs : Vous pouvez mettre en place des stratégies de sécurité telles que l'authentification, l'autorisation, la gestion des tokens, et le chiffrement des données pour protéger vos API contre les menaces.

Prérequis pour la mise en place de l'APIM Gravitee avec Docker

  • Docker
  • Un éditeur de code ( ex : VS Code )

Mise en place des services API 

Pour installer Gravitee avec Docker nous avons besoin d’un dossier ( ex : apim_gravitee) dans lequel on va créer un fichier : docker.compose.yml

Pour créer les services dont on a besoin, on va commencer par créer des networks Docker. Cela permettra aux conteneurs de communiquer entre eux, ainsi que la connexion entre les conteneurs et les réseaux externes.

version : '3.5'

services:
networks:
frontend :
name: frontend
storage :
name: storage

L’ordre des services importe peu, mais ici on va commencer ici par créer ceux liés avec l’API, on pourra ensuite rajouter les services de la gateway et l’API de management.

gateway:

image: graviteeio/apim-gateway:4.0

entrypoint: ["/bin/sh", "-c", "/opt/graviteeio-gateway/docker-entrypoint.sh"]

container_name: apim_gateway

hostname: apim_gateway

restart: always

volumes:

      - ./logs/apim-gateway:/opt/graviteeio-gateway/logs

      - ./gravitee-gateway-entrypoint.sh:/opt/graviteeio-gateway/docker-entrypoint.sh

    environment:

      - MONGO_DB_URI=mongodb://mongodb:27017/gravitee

      - ELASTIC_ENDPOINT=http://elasticsearch:9200

    networks:

      - frontend

      - storage

  management_api:

    image: graviteeio/apim-management-api:4.0

    container_name: apim_management_api

    restart: always

    entrypoint: ["/bin/sh", "-c", "/opt/graviteeio-management-api/docker-entrypoint.sh"]

    volumes:

      - ./logs/apim-apim:/opt/graviteeio-management-api/logs

      - ./gravitee-api-entrypoint.sh:/opt/graviteeio-management-api/docker-entrypoint.sh

    environment:

      - MONGO_DB_URI=mongodb://mongodb:27017/gravitee

ELASTIC_ENDPOINT=http://elasticsearch:9200

networks:

-frontend

-storage

Pour ces deux services, on va avoir besoin d’entrypoint, qui va importer le certificat de mongodb, Il va falloir un fichier gravitee-api-entrypoint.sh, à rajouter à la racine du projet.

#!/bin/sh

keytool -importcert -file /opt/graviteeio-management-api/ssl/mongodb-cert.pem -keystore "$JAVA_HOME/lib/security/cacerts" -storepass changeit -alias "mongodb-cert" -noprompt

/opt/graviteeio-management-api/bin/gravitee

Il va falloir également un fichier gravitee-gateway-entrypoint.sh, à rajouter à la racine du projet.

#!/bin/sh

keytool -importcert -file /opt/graviteeio-gateway/ssl/mongodb-cert.pem -keystore "$JAVA_HOME/lib/security/cacerts" -storepass changeit -alias "mongodb-cert" -noprompt

/opt/graviteeio-gateway/bin/gravitee

Mise en place des services de stockage 

Gravitee a besoin des services Elasticsearch et Mongo pour pouvoir tourner.
Gravitee.io peut générer une grande quantité de logs et de données d'audit liées à la gestion des API. Elasticsearch peut être utilisé pour stocker, indexer et rechercher ces logs. MongoDB est une base de données NoSQL qui peut être utilisée pour stocker des données de configuration, des métadonnées et d'autres informations utilisées par Gravitee. On va donc ici déployer une image ElasticSearch et une Mongodb.

elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
container_name: apim_elasticsearch
restart: always
volumes:
- data-elasticsearch:/usr/share/elasticsearch/data
environment:
- http.host=0.0.0.0
- transport.host=0.0.0.0
- xpack.monitoring.enabled=false
- cluster.name=elasticsearch
- bootstrap.memory_lock=true
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
nofile: 65536
ports:
- 9200:9200
networks:
- storage

mongodb:
image: mongo:6.0
container_name: apim_mongodb
restart: always
entrypoint: [ "/usr/bin/mongod", "--config", "/data/config/mongodb.conf" ]
volumes:
- data-mongo:/data/db
- ./logs/apim-mongodb:/var/log/mongodb
- ./mongo-config/mongodb.conf:/data/config/mongodb.conf
ports:
- 27017:27017'
networks:
- storage
volumes:
data-elasticsearch:
data-mongo:

Config Mongo à mettre dans le dossier mongo-config puis dans le fichier mongodb.conf. Celle-ci déterminera le port ainsi que l’IP d’accès de mongoDB.

net:

  port: 27017

  bindIp: 0.0.0.0

Mise en place des services “visuels”

Ces services vont permettre aux utilisateurs d’avoir des interfaces graphiques pour interagir avec les APIs. Ici le portail développeur et l’interface de management d’API sont déployés.

management_ui:
image: graviteeio/apim-management-ui:4.0
container_name: apim_management_ui
restart: always
depends_on:
- management_api
environment:
- MGMT_API_URL=http://api.api-manager.impod.net/management/organizations/DEFAULT/environments/DEFAULT
volumes:
- ./logs/apim-management-ui:/var/log/nginx
networks:
- frontend

portal_ui:
image: graviteeio/apim-portal-ui:4.0
container_name: apim_portal_ui
restart: always
depends_on:
- management_api
environment:
- PORTAL_API_URL=http://api.api-manager.impod.net/portal/environments/DEFAULT
volumes:
- ./logs/apim-portal-ui:/var/log/nginx
networks:
- frontend

Mise en place du service Nginx

On va utiliser Nginx comme un proxy pour pouvoir rediriger vers les adresses que l’on souhaite.

nginx:
image: nginx:latest
container_name: apim_nginx
restart: always
ports:
- "80:80"
volumes:
- ./logs/nginx:/var/log/nginx
- ./nginx-config/:/etc/nginx/conf.d/
links:
- portal_ui
- management_api
- management_ui
- gateway
networks:
- frontend

Mise en place des configurations Nginx

Pour pouvoir assurer la redirection sur les bonnes URL, nous avons besoin de configurer chaque service.

Les fichiers seront similaires donc à adapter pour cet exemple.

Dans le dossier nginx-config, créer un fichier pour chaque service par exemple : graviteeio-<nom_du_service>.conf.

server {
listen 80;

server_name <url_service>;

location / {
proxy_pass http://<nom_du_service>:<port_du_service>;
}
}

Une fois toutes ces étapes réalisées, nous pouvons enfin lancer notre service Gravitee. Il faudra se placer dans le répertoire du docker.compose.yml en question, puis exécuter la commande :

docker compose -f docker-compose.yml up

Une fois les conteneurs bien lancés, lorsque que l’on tape sur les URL, des serveurs que l’on a définis dans les configurations Nginx. Les services Gravitee devraient bien répondre, c'est-à-dire que les services comme le portail ou l’API Management seront visibles.

On espère que cet article vous aura été utile ! Suivez notre wiki pour d'autres astuces et tutos !

Nos développeurs Next Decision ont les compétences techniques et les environnements de travail parfaits pour répondre à vos besoins. Contactez-nous et échangeons sur votre projet !