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.
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.
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:
La información más relevante asociada a nuestras APIs se encuentra en los siguientes directorios:
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:
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.
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.
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:
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.
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:
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.