Despliegue Continuo (CD) de Azure API Management

Introducción

Dado el valor estratégico de los ecosistemas APIs en cualquier entorno empresarial, la implementación de pipelines (CI/CD) que automaticen completamente el proceso de promoción de las APIs de entorno a entorno se ha convertido en un proceso clave.

En el contexto de Azure APIM como gestor de APIs es necesario conocer las distintas opciones que Microsoft ofrece para implementar este tipo de procedimientos con éxito. En esta entrada del blog comentaré las 2 opciones disponibles que considero más relevantes, así cómo escenarios en los que podría utilizarse cada una de ellas.

He de recalcar que esta entrada está destinada exclusivamente a Azure APIM, sin entrar en detalles de la implementación / promoción de los backends que dan soporte a las APIs.

Actualización de API Management Service mediante Git

Cada instancia APIM mantiene una base de datos que contiene información sobre la configuración y los metadatos necesarios para la instancia del servicio. Como ya sabemos, podemos realizar cambios en cualquier recurso de Azure bien a través del portal de Azure, bien mediante Powershell / Azure CLI o directamente llamando a la REST API de Azure. Adicionalmente, para este recurso en concreto, podremos cambiar la configuración del servicio mediante GIT.

Azure API Management GIT

Una vez tengamos salvada la configuración actual de APIM en el repo y clonado dicho repo en nuestra máquina local, la estructura de ficheros será como la mostrada en la figura siguiente:

Azure APIM ficheros

La información más relevante asociada a nuestras APIs se encuentra en los siguientes directorios:

  • Apis: Contienen la configuración de cada una de las APIs. Tendremos una subcarpeta por cada tupla API / versión / revisión. En cada carpeta asociada veremos el esquema de la API en cuestión, así como las operaciones.
  • Policies: Contiene todas las policies (XML). La división es también por APIs y por cada una de ellas habrá un XML asociado a la policy de cada una de las operaciones.
  • Products: Una subcarpeta por producto incluyendo ficheros (json) asociados a la configuración de cada uno de los productos.

Si bien existe documentación acerca del contenido de algunos de estos ficheros, mi recomendación es revisarlos y entender perfectamente el contenido de cada uno de ellos antes de lanzarse a realizar alguna modificación.

Una vez tengamos las modificaciones listas (commit), básicamente haremos push al repo e indicaremos a APIM que se actualice con la última versión de la rama indicada mediante alguna de las operaciones disponibles (Validate + Deploy en este caso).

Si bien la opción preferida para la generación de los artefactos involucrados en el ciclo de CD es la que comentaré a continuación en el siguiente punto, esta opción puede resultar útil en varios escenarios:

  • Snapshots: realizar copias de seguridad de APIM de manera rápida en cualquier momento, lo que nos permitirá realizar un rollback de las modificaciones posteriores de manera inmediata si es necesario.
  • Bulk configuration changes. Imaginemos un escenario en el que el código asociado a cientos de policies por ejemplo debe ser modificado. Realizar este tipo de cambios a través del portal puede resultar muy tedioso y susceptible a errores. Utilizando esta característica de APIM, podríamos realizar los cambios necesarios en el repo local y actualizar posteriormente APIM en una sola operación.

Digital Lover

Azure API Management DevOps Resource Kit

Los compañeros de Microsoft nos ofrecen esta valiosísima herramienta en el repo de Azure hospedado en Github. Se trata de una aplicación de línea de comandos implementada en dotnet core. La aplicación permite generar plantillas ARM tanto a partir de la especificación OpenAPI como de un APIM existente.

  • Creator: Automatiza la creación de plantillas ARM a partir de ficheros de especificación OpenAPI.
  • Extractor: Mediante esta herramienta podremos generar plantillas ARM asociadas a la implementación actual de nuestra APIM.

En el caso que nos ocupa, haremos uso de la herramienta “Extractor” para obtener una imagen de la APIM que queremos promocionar. Dicho de otro modo, la herramienta necesita una instancia de APIM como parámetro de entrada, y generará las plantillas ARM como salida, que serán los artefactos que utilizaremos para promocionar la APIM.

El comportamiento de la herramienta puede configurarse a medida, bien mediante parámetros en la línea de comandos o incluyendo dichos parámetros en un fichero de configuración. Así podremos indicar si queremos generar las plantillas asociadas a una determinada API, versión, etc. o por el contrario queremos volcar la APIM al completo. También podemos indicar cómo queremos que realice la parametrización de las plantillas ARM.

Azure APIM Extractor

En el ejemplo de la imagen anterior, indicamos a la herramienta que incluya parámetros para la URL de los servicios, los loggers y por supuesto los parámetros APIM (named values), dado que los valores de todo lo anterior son diferentes de entorno a entorno.

Una vez ejecutada la herramienta, obtendremos las plantillas ARM en función de los parámetros que hayamos indicado. Siguiendo con el ejemplo anterior, los ficheros generados son los siguientes:

Azure APIM ARM

Aparte de una plantilla para cada una de las características de APIM (apis, products, named values, etc) obtenemos también una plantilla para el despliegue completo de APIM, y el fichero con los parámetros que debemos suministrar para los diferentes entornos.

En el caso de utilizar ADO (Azure DevOps), podremos desplegar las templates obtenidas de la manera habitual, mediante la tarea “AzureResourceManagerTemplateDeployment”.

Una posible implementación del proceso de CD podría implementarse a través de 2 pipelines, la primera para tomar el snapshot de la APIM origen utilizando la herramienta Extractor comentada, y una segunda pipeline que realice el despliegue de las plantillas obtenidas en los diferentes entornos.

Azure APIM pipelines

Si estás pensando en utilizar las plantillas generadas por la herramienta sugerida, existen 2 problemas bien conocidos, pero no te desanimes, ya que la solución es la misma para ambos problemas:

  • PessimisticConcurrencyConflict: Operation on the API is in progress…
  • Developer SKU: Failed to connect to management endpoint xxx.management.azure-api.net:3443 for Developer SKU service which will have inherent downtime during underneath platform upgrades. Please refer to SLA at https://aka.ms/apimsla and considering upgrading to a SKU Tier with higher SLA.

Ambos errores se deben al hecho de que Azure puede desplegar varios recursos de la misma plantilla en paralelo siempre que no exista dependencia entre ellos. Tal como dice la documentación del propio kit, forzando el despliegue secuencial de las operaciones de las APIS ambos problemas desaparecen. Mi consejo es incluir un post-procesado de las plantillas creadas por la herramienta en el propio pipeline de extracción, incluyendo el elemento DependsOn en los recursos que lo necesiten, obligando de esta manera un despliegue secuencial (daisy chain). La contrapartida es que el tiempo de despliegue es sensiblemente mayor, pero evitamos errores pseudo-aleatorios que nos pueden dar muchos quebraderos de cabeza.

Azure APIM pipeline extraccion

 

 

Tags

Guía de posibilidades profesionales sobre Azure
He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA