Ir al contenido principal

Cómo publicar una API en Gravitee API Management y añadir seguridad con API-KEY

Hoy nos centraremos en crear un laboratorio de pruebas de la solución Gravitee API Management basado en docker-compose con seguridad API-KEY y veremos sus diferentes funcionalidades desde un punto de vista práctico.

Seguiremos el siguiente índice:

1. Definición de Gravitee API Management

Gravitee API Management es una solución Open Source bajo licencia Apache 2.0, con posibilidad de soporte Enterprise, de la empresa Gravitee.io. En el siguiente articulo realizamos una review del producto y sus funcionalidades.

-Este artículo te puede interesar: Cómo identificar el nivel de madurez de las APIs y sus necesidades-

2. Arquitectura y componentes de Gravitee API Management

Gravitee API Management se compone de cuatro componentes principales:

APIM Gateway  encargado del runtime de ejecución de las APIs. Es el encargado de asegurar el cumplimiento de las políticas de seguridad así como la gestión de las transformaciones de las peticiones de entrada y salida que pasan por el Gateway (smart proxy).
APIM API encargado de proporcionar un interfaz de comunicación central mediante un API RESTful para todas las labores de administración necesarias por el producto. Es consumido por la consola de administración y por el Portal de Usuario (Developer).
APIM Console encargado de la administración del producto y la gestión del ciclo de vida de las APIs desplegadas en los correspondientes Gateways. Interfaz de usuario para los roles de Administración y API Publisher.
APIM Portal encargado de proporcionar a los desarrolladores de aplicaciones que consumen las APIs de un interfaz de operaciones desde, el que podrán, visualizar la documentación de una API, suscribirse y realizar pruebas.

Como capa de persistencia, se disponemos de las siguientes opciones:

Gestión encargado de todos los datos relativos a la gestión del producto. Puede ser MongoDB, Redis o fuente JDBC.
Rate Limit encargado de todo lo relativo al control de tráfico. Puede ser MongoDB, Redis o fuente JDBC.
Analytics encargado de la persistencia de todo lo relacionado con la analitica (métricas, logs). Por el momento solo puede ser Elasticsearch.

Para nuestro laboratorio utilizaremos MongoDB para gestión y control de tráfico y Elasticsearch para todo lo relacionado a analíticas.

El esquema de arquitectura de nuestro laboratorio será el siguiente:

Esquema de arquitectura

Figura 1. Esquema de arquitectura

Podéis acceder al código fuente del laboratorio en el siguiente enlace https://github.com/ChakrayES/docker-compose-gravitee-api-singlegw (branch main).

3. Inicio del laboratorio de pruebas de la solución Gravitee API Management basado en docker-compose con seguridad API-KEY

Antes de arrancar los servicios de nuestro laboratorio, debemos añadir las siguientes líneas al fichero de DNS local de la máquina. En caso de entornos Linux o Mac, la configuración sería la siguiente:

/etc/hosts

127.0.0.1   portainer.demo.chakray.internal api.demo.chakray.internal mgt-api.demo.chakray.internal mgt-ui.demo.chakray.internal portal-ui.demo.chakray.internal

También existe la opción de registrar los correspondientes registros dentro del Servidor DNS local, en caso de disponer de esta funcionalidad en la LAN.

Una vez registrados los nombres DNS, procedemos con el arranque del laboratorio mediante la ejecución del siguiente comando en el directorio raíz del proyecto:

docker-compose-gravitee-singlegw % docker-compose up -d

Podemos comprobar el estado de los servicios con el siguiente comando:

docker-compose-gravitee-singlegw % docker-compose ps

Estado del servicio

Figura 2. Estado del servicio

Podemos visualizar los logs de los servicios con el siguiente comando:

docker-compose-gravitee-singlegw % docker-compose logs -f –tail 2

Log de los servicios

Figura 3. Logs de los servicios

3.1 Uso de Traefik Ingress para enrutar el tráfico desde la máquina anfitriona a cada uno de los contenedores 

Para poder enrutar el tráfico desde la máquina anfitriona a cada uno de los contenedores hemos usado Traefik Ingress, a la escucha en el puerto :80 para el tráfico y en el puerto :8080 para su consola de administración. En este caso, al ser una entorno de laboratorio, no se ha securizado ninguno de los dos componentes.

Podemos acceder a la consola de administración de Trefil desde la siguiente dirección http://localhost:8080

Consola Trefil

Figura 4. Consola Trefil

Dentro de Traefik Ingress, cada contenedor ha publicado sus rutas de enrutamiento de forma dinámica mediante el uso de etiquetas. Por ejemplo, Gravitee API Management Gateway publica su ruta de acceso con la directiva:

gateway:
    image: graviteeio/apim-gateway:3.18
    container_name: sandbox-gateway
    depends_on:
  	- mongodb
  	- elasticsearch
    environment:
  	- gravitee_management_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000
  	- gravitee_ratelimit_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000
  	- gravitee_reporters_elasticsearch_endpoints_0=http://elasticsearch:9200
    extra_hosts:
  	- "api.demo.chakray.internal:172.29.1.1"
  	- "mgt-am-api.demo.chakray.internal:172.29.1.1"
  	- "mgt-am-ui.demo.chakray.internal:172.29.1.1"
  	- "portal-ui.demo.chakray.internal:172.29.1.1"
    labels:
  	- "traefik.enable=true"
  	- "traefik.http.routers.api.rule=Host(`api.demo.chakray.internal`)"
  	- "traefik.http.routers.api.entrypoints=http"
  	- "traefik.http.routers.api.tls=false"
  	- "traefik.http.services.api.loadbalancer.server.port=8082"  
    networks:
  	- sandbox-frontend-net
  	- sandbox-storage-net

De esta forma, todo el tráfico que llegue a Traefik Ingress hacia la dirección “api.demo.chakray.internal” será enrutado al contenedor de “gateway” por el puerto :8082. 

Desde la consola de administración de Traefik, la ruta quedaría visualmente de la siguiente manera:

Consola de administración de Traefik

Figura 5. Consola de administración de Traefik

Siguiendo la misma estructura, la consola de administración de Gravitee API Management quedaría definida de la siguiente manera:

Consola de administración de Gravitee API Management

Figura 6. Consola de administración de Gravitee API Management

Podemos acceder a ella en la dirección http://mgt-ui.demo.chakray.internal/

4. Publicar nuestra primera API en Gravitee API Management

Como ejemplo de servicio de backend usaremos el siguiente servicio: https://restcountries.com/. El objetivo es acceder a este servicio mediante nuestra capa de API Management, añadir seguridad mediante API-KEY y consultar las analíticas de consumo.

4.1 Crear la definición de la API

En este apartado hablaremos de como crear la definición de la API en la consola.

1.Entrar en la consola de administración y acceder al menú “APIs”, añadir una nueva pulsando en el botón “+” de la zona inferior derecha.

Crear la definición de la API

Figura 7. Crear la definición de la API

2. Seleccionar la opción “Continue in the wizard”

Proceso para crear una API

Figura 8. Proceso para crear una API

3. Completar el nombre, versión, descripción y contexto del API que queremos especificar.

Completar campos

Figura 9. Completar campos

4. Definir el backend hacia el que se van a redirigir las peticiones de entrada en nuestro Gateway. Para nuestro caso, el servicio de backend será https://restcountries.com/v3.1/.

Peticiones Gateway

Figura 10. Peticiones Gateway

5. Definir el plan de consumo, en nuestro caso será “api-key”. Posteriormente podremos ir incluyendo nuevos planes de consumo a nuestra API. En caso de ser necesario, definir los límites de consumo y recursos necesarios.

Plan de consumo

Figura 11. Plan de consumo

6. Incluir toda la documentación disponible para nuestra API. Posteriormente podemos ir enriqueciendo esta documentación añadiendo nuevos contenidos.

Enriquecer información

Figura 12. Enriquecer información

7. Por último, creamos nuestra API y la desplegamos en el Gateway mediante la opción de “Create and start the API”.

Accionar API

Figura 13. Accionar API

8. Si todo ha ido de forma satisfactoria, podemos consultar nuestra API dentro del catalogo de la consola de administración.

Consultar API

Figura 14. Consultar API

4.2 Suscribirse y obtener un API-KEY

Una vez creada la API, debemos suscribirnos a uno de los planes creados para poder consumirla (a no ser que exista un plan keyless, el cual permite su consumo de forma pública). Para ello, accederemos al menú de “Subscriptions” de nuestra API y pulsaremos el botón “+”.

Suscripciones

Figura 15. Suscripciones

Seleccionaremos una de las aplicaciones disponibles y el plan sobre el que nos queremos suscribir.

Crear una suscripción

Figura 16. Crear una suscripción

Suscripción al detalle

Figura 17. Suscripción al detalle

De esta forma, obtendremos un api-key que podremos utilizar para consumir nuestra API. En nuestro caso: 7c37aed2-6cf3-416f-9d26-e0ed893af177

4.3 Consumir nuestra API securizada mediante API-KEY

Para consumir nuestra API securizada mediante api-key, utilizaremos la siguiente instrucción con el comando curl:

curl \

  -H 'X-Gravitee-Api-Key: 7c37aed2-6cf3-416f-9d26-e0ed893af177' \

  "http://api.demo.chakray.internal/myrestcountries/alpha/es" | jq

Consumir API mediante API-KEY

Figura 18. Consumir API mediante API-KEY

4.3.1 Analíticas de consumo de nuestra API

Para acceder a las analíticas de nuestra API debemos acceder al menú “Analytics” de nuestra API.

Analíticas de nuestra API

Figura 19. Analíticas de nuestra API

Desde este cuadro de mando podremos consultar el número de peticiones en función de diferentes aspectos: aplicación, plan, path. También disponemos de un resumen en función del código de respuesta de nuestra API (http status code) y las diferentes latencias de consumo.

Cuadro de mando

Figura 20. Cuadro de mando

4.3.2 Acceder a los logs de nuestra API

Para acceder a los logs de nuestra API debemos acceder al menú “Analytics” de nuestra API. Dentro, accederemos al submenú “Logs”.

Logs

Figura 21. Logs

Cuando accedemos a un registro de log concreto, veremos una versión reducida de los logs. En esta versión reducida no podremos acceder a las cabeceras ni al cuerpo de las peticiones.

Para acceder a una versión ampliada de los logs, configuraremos nuestra API mediante la opción “Configure the logging”. Activaremos las opciones deseadas y guardaremos los cambios.

Configuración Logging

Figura 22. Configuración Logging

En este momento, al acceder a uno de los registros de log obtendremos una versión ampliada de los mismos, siendo capaces de consultar tanto los encabezados como el cuerpo de las peticiones.

Registro

Figura 23. Registro

Registro concreto

Figura 24. Registro concreto

5. Chakray y Gravitee.io

Chakray, como Partner Oficial de Gravitee.io, dispone del conocimiento y las herramientas necesarias para  abordar cualquier proyecto de API Management, brindando la tranquilidad de contar con un equipo especializado en su despliegue, desarrollo y posterior mantenimiento, así como con el apoyo conjunto con el fabricante para los entornos Enterprise. Estaremos encantados de oír su caso de uso y analizar cuál es la mejor estrategia de APIficación para implementar la capa de API Management en su organización. ¡Contáctanos hoy mismo!