Autor: Yerry Maycol Tarqui Collatupa

Trabajo: NoSQL App Development

En este artículo se documentan la construcción, el despliegue automatizado y la validación de una aplicación de tareas con Azure Cosmos DB, una base de datos NoSQL, desde el proyecto ASP.NET Core hasta su publicación en Azure con Terraform y GitHub Actions.

Introducción

Las bases de datos NoSQL se utilizan cuando los datos no encajan bien en tablas con un esquema fijo o cuando se necesita escalar con facilidad. En lugar de filas y columnas, guardan documentos, pares clave-valor, grafos o columnas, según el modelo de cada motor. Para entender cómo se integra una de ellas en una aplicación real no basta con instalarla: también hay que conectarla a un servicio, publicarla y automatizar su despliegue.

A partir de ese objetivo se desarrolló NoSQL App Development, un proyecto práctico que construye una aplicación de tareas con ASP.NET Core y Azure Cosmos DB, una base de datos NoSQL de documentos administrada por Microsoft. El proyecto integra la API NoSQL de Cosmos DB, Terraform para describir la infraestructura como código, GitHub Actions para automatizar su creación y su despliegue, y Azure App Service para publicar la aplicación en una nube pública.

La implementación se realizó de forma progresiva. Primero se creó el proyecto y su código; después se ejecutó de manera local contra Cosmos DB, se definió la infraestructura con Terraform y se automatizaron su creación y el despliegue con flujos de GitHub Actions. Finalmente se comprobaron la aplicación publicada y los documentos guardados en la base de datos. Esta publicación documenta las evidencias principales del trabajo.

Arquitectura de la solución

La aplicación sigue un esquema sencillo. El navegador consume una página web y una API REST alojadas en Azure App Service, que ejecuta una aplicación ASP.NET Core sobre .NET 10. La API se conecta a Azure Cosmos DB mediante su SDK y guarda cada tarea como un documento JSON dentro de la colección tareas de la base tareasdb.

Arquitectura de la aplicación de tareas con Azure Cosmos DB, Terraform y GitHub ActionsFigura 1. Arquitectura de la solución: aplicación ASP.NET Core en App Service, base NoSQL en Cosmos DB e infraestructura automatizada con GitHub Actions y Terraform.

La infraestructura y el despliegue se mantienen separados. Un primer flujo, infra.yml, ejecuta Terraform para crear la cuenta de Cosmos DB, la base, la colección, el plan de App Service y la aplicación web. Un segundo flujo, deploy.yml, publica el código de la aplicación en App Service. El estado de Terraform se guarda en una cuenta de Azure Storage para que las ejecuciones sucesivas sean consistentes.

Creación del proyecto

Se partió de un repositorio de Git ya vinculado a GitHub. Con el SDK de .NET se creó el proyecto web mínimo que contendría la API y la página de tareas.

Creación del proyecto ASP.NET Core con dotnet new webFigura 2. Creación del proyecto TareasApi con la plantilla web mínima de ASP.NET Core.

Después se agregó el paquete Microsoft.Azure.Cosmos, que permite conectarse a Azure Cosmos DB desde .NET. El SDK requiere también una referencia explícita a Newtonsoft.Json, por lo que se incorporó al proyecto.

Instalación del paquete Microsoft.Azure.CosmosFigura 3. Instalación del SDK de Azure Cosmos DB en el proyecto.

Código de la aplicación

En Program.cs se configuró el cliente de Cosmos DB con la conexión de la aplicación, se creó la base y la colección si todavía no existen y se definieron los endpoints: /health para comprobar el estado y /api/tareas para listar, consultar, crear, actualizar y eliminar tareas. La llave de acceso no se escribe en el código, sino que se entrega como configuración.

Archivo Program.cs de la API de tareasFigura 4. Endpoints de la API definidos en Program.cs.

El acceso a la base de datos se encapsuló en la clase TareasRepo. Allí se concentran la consulta SQL de Cosmos DB para listar las tareas y las operaciones de lectura, creación, reemplazo y eliminación de documentos, de modo que los endpoints no dependen directamente del SDK. Cada tarea es un documento JSON con identificador, título, estado y fecha.

Clase TareasRepo con el acceso a Cosmos DBFigura 5. Clase TareasRepo para el acceso al contenedor de Cosmos DB.

La interfaz es una página HTML en la carpeta wwwroot que consume la API: permite agregar una tarea, marcarla como completada y eliminarla, y muestra al pie el nombre de la base de datos y la cantidad de tareas guardadas.

Archivo index.html de la aplicaciónFigura 6. Página web que consume la API de tareas.

Ejecución local

Antes de publicar la solución se ejecutó en el equipo local con dotnet run. La conexión a Cosmos DB se entregó mediante variables de entorno, de manera que la llave no aparece en el código ni en las capturas.

Ejecución local de la API con dotnet runFigura 7. Aplicación ejecutándose en el puerto 5100.

Al abrir la página se comprobó que se conectaba a Azure Cosmos DB. Se agregaron tres tareas desde la interfaz: cada una se guardó como un documento en la base y el pie de página mostró la cantidad de tareas almacenadas.

Aplicación local con tareas guardadas en Cosmos DBFigura 8. Tareas creadas desde la interfaz local y guardadas en Azure Cosmos DB.

Infraestructura como código

La infraestructura se describió con Terraform en el archivo main.tf. Allí se definieron la cuenta de Azure Cosmos DB en nivel gratuito, la base tareasdb, la colección tareas, un plan de App Service gratuito (F1) y la aplicación web con .NET 10. La conexión a Cosmos DB se entrega a la aplicación como configuración, y el estado de Terraform se guarda en una cuenta de Azure Storage. El grupo de recursos se creó previamente y Terraform lo utiliza para crear el resto de los recursos.

Archivo main.tf con los recursos de TerraformFigura 9. Recursos de Azure definidos con Terraform en main.tf.

Automatización con GitHub Actions

El primer flujo, infra.yml, inicializa, valida y aplica la configuración de Terraform. Para autenticarse en Azure utiliza los secretos del repositorio asociados a un service principal.

Workflow infra.yml de GitHub ActionsFigura 10. Flujo infra.yml que ejecuta Terraform.

El segundo flujo, deploy.yml, compila y publica la aplicación con dotnet publish, la despliega en App Service y, al final, consulta el endpoint /health de la aplicación publicada para confirmar que responde.

Workflow deploy.yml de GitHub ActionsFigura 11. Flujo deploy.yml que publica la aplicación en App Service.

Las credenciales no se guardan en el repositorio. Con la CLI de GitHub se comprobó que los secretos de Azure estuvieran configurados; la lista muestra únicamente sus nombres, no sus valores.

Secretos configurados en el repositorio de GitHubFigura 12. Secretos de GitHub Actions utilizados por los flujos.

Creación de la infraestructura

Con el código en la rama principal se ejecutó infra.yml. Terraform inició el proceso y comenzó a crear los recursos de Azure.

Flujo infra.yml en ejecuciónFigura 13. Ejecución en curso del flujo infra.yml.

El flujo terminó con estado exitoso y creó los cinco recursos definidos en Terraform: la cuenta de Cosmos DB, la base, la colección, el plan de App Service y la aplicación web.

Ejecución exitosa del flujo infra.ymlFigura 14. Flujo infra.yml finalizado correctamente.

El detalle del trabajo permite revisar cada paso: la inicialización de Terraform, la validación de la configuración y la aplicación de los cambios.

Pasos del trabajo terraformFigura 15. Detalle de los pasos de infra.yml.

Despliegue de la aplicación

Con la infraestructura lista se ejecutó deploy.yml, que compiló y publicó la aplicación en App Service. El flujo terminó correctamente.

Ejecución exitosa del flujo deploy.ymlFigura 16. Flujo deploy.yml finalizado correctamente.

El detalle muestra la compilación, el inicio de sesión en Azure, el despliegue y la prueba final de la aplicación publicada.

Pasos del trabajo deployFigura 17. Detalle de los pasos de deploy.yml.

La lista de ejecuciones de GitHub Actions conserva el historial de ambos flujos. La ejecución en rojo corresponde al primer intento de despliegue, que se lanzó con el push inicial antes de que existiera el código de la aplicación; después de agregar el código, el despliegue se completó con éxito.

Lista de ejecuciones en GitHub ActionsFigura 18. Historial de los flujos infra y deploy.

Recursos en Azure

En el portal de Azure se comprobaron los recursos del grupo: la aplicación web, la cuenta de Cosmos DB, el plan de App Service y la cuenta de almacenamiento donde se guarda el estado de Terraform.

Recursos del grupo rg-tg1-yerrytc en el portal de AzureFigura 19. Recursos creados en el grupo de recursos de Azure.

Después se abrió el Explorador de datos de Cosmos DB y se consultó la colección tareas de la base tareasdb. Allí se ven los documentos JSON que guarda la aplicación, lo que confirma que la base de datos NoSQL es la que almacena la información.

Documentos de la colección tareas en el Explorador de datos de Cosmos DBFigura 20. Documentos JSON almacenados en Azure Cosmos DB.

Aplicación publicada

La aplicación quedó disponible en una URL pública de Azure App Service. Al ingresar se comprobó que se conectaba a Cosmos DB y se agregaron tareas desde la interfaz publicada.

Aplicación de tareas publicada en Azure App ServiceFigura 21. Aplicación publicada en Azure con tareas guardadas en Cosmos DB.

Se marcó una tarea como completada, lo que actualiza su documento en la base de datos, y se eliminó otra, lo que borra su documento.

Tarea marcada como completada en la aplicación publicadaFigura 22. Actualización de una tarea desde la aplicación publicada.

También se consultó directamente la API. El endpoint /health responde con el estado de la aplicación, el nombre de la base de datos y la cantidad de tareas guardadas.

Respuesta del endpoint /health de la aplicación publicadaFigura 23. Respuesta del endpoint /health.

El endpoint /api/tareas devuelve los documentos almacenados en Cosmos DB en formato JSON.

Respuesta del endpoint /api/tareas de la aplicación publicadaFigura 24. Documentos de Cosmos DB devueltos por /api/tareas.

Repositorio público

Todo el trabajo está en un repositorio público de GitHub que contiene el código de la aplicación, la infraestructura de Terraform, los flujos de GitHub Actions y las capturas del proceso. Las llaves de acceso no forman parte del repositorio.

Repositorio público del proyecto en GitHubFigura 25. Repositorio público con el código, la infraestructura y los flujos.

Resultados

La implementación permitió comprobar el recorrido completo de una aplicación con una base de datos NoSQL: desde el código y la ejecución local hasta una aplicación publicada en la nube cuya infraestructura y despliegue se crean de forma automática. Los documentos guardados por la aplicación pudieron verse directamente en el Explorador de datos de Cosmos DB.

La infraestructura se creó con Terraform desde GitHub Actions y la aplicación se despliega con otro flujo que también comprueba su estado, de modo que el proceso puede repetirse sin pasos manuales en el portal de Azure.

Componente Validación Resultado
API ASP.NET Core Ejecución local con dotnet run en el puerto 5100 Tareas guardadas en Cosmos DB
Azure Cosmos DB Colección tareas en el Explorador de datos Documentos JSON visibles
Terraform Cuenta, base, colección, plan y aplicación web Cinco recursos creados
infra.yml Ejecución en GitHub Actions Exitosa
deploy.yml Publicación y prueba de /health Exitosa
App Service Aplicación en una URL pública Publicada
API REST /health y /api/tareas Datos de Cosmos DB
Repositorio público Código, infraestructura y flujos Publicado

Conclusiones

Azure Cosmos DB permitió guardar los datos como documentos JSON sin definir un esquema relacional, y su SDK facilitó las operaciones de lectura y escritura desde .NET.

Terraform permitió describir toda la infraestructura como código, de modo que se crea de forma repetible y sin pasos manuales en el portal de Azure.

GitHub Actions automatizó tanto la creación de la infraestructura como el despliegue de la aplicación, y el endpoint /health permitió verificar el resultado de cada despliegue.

Separar la infraestructura y el despliegue en dos flujos facilita repetir cada tarea de manera independiente: crear los recursos una vez y volver a publicar la aplicación cada vez que cambia el código.

El nivel gratuito de Cosmos DB y el plan F1 de App Service permitieron publicar la aplicación en una nube pública sin costo.

Enlaces del proyecto

Repositorio público: tg1-nosql-tareas-yerrytc en GitHub

Aplicación publicada: Abrir la aplicación en Azure

Nota: La aplicación está desplegada en el plan gratuito F1 de Azure App Service, por lo que puede tardar hasta un minuto en responder después de un periodo de inactividad. Una vez iniciada, funciona con normalidad.

Video de demostración: Ver en YouTube (4 min 35 s)