Microservicios sin servidor integrados en la red virtual

Azure API Management
Azure Cosmos DB
Azure Functions
Azure Key Vault
Azure Virtual Network

En esta solución de Azure, Azure API Management (APIM) controla el acceso a la API desde un único punto de conexión administrado. El back-end de la aplicación consta de dos aplicaciones de microservicio de Azure Functions interdependientes que crean y administran registros de pacientes y de auditoría. APIM y las dos aplicaciones de funciones acceden entre sí mediante una red virtual bloqueada.

En este artículo y en el proyecto de código asociado se sintetiza el escenario de ejemplo en los componentes técnicos principales para que actúen como scaffolding para implementaciones específicas. La solución automatiza todas las implementaciones de infraestructura y código con Terraform e incluye la integración automatizada, la unidad y las pruebas de carga.

Architecture

En el diagrama siguiente se muestra el flujo de solicitud de creación de registros de pacientes:

Diagram showing virtual network integrated microservices.

Descargue un archivo Visio de esta arquitectura.

Flujo de trabajo

  1. Fuera de los servicios y los clientes, realice una solicitud POST a APIM, con un cuerpo de datos que incluya la información de los pacientes.
  2. APIM llama a la función CreatePatient en la API de pacientes con la información de paciente indicada.
  3. La función CreatePatient de la API de pacientes llama a la función CreateAuditRecord en la aplicación de funciones de la API de auditoría para crear un registro de auditoría.
  4. La función de la API de auditoríaCreateAuditRecord crea el registro de auditoría en Azure Cosmos DB y devuelve una respuesta correcta a la función de la API de pacientesCreatePatient.
  5. La función CreatePatient crea el documento de pacientes en Azure Cosmos DB y devuelve una respuesta correcta a APIM.
  6. Los clientes y servicios externos reciben la respuesta correcta de APIM.

Componentes

La solución usa los siguientes componentes:

  • Azure API Management (APIM) es una plataforma híbrida de varias nubes para administrar API en todos los entornos. En esta solución, APIM controla el acceso interno y de terceros a la API de pacientes que permite leer o escribir datos. APIM permite una integración sencilla con distintos mecanismos de autenticación.

  • Azure Functions es una plataforma de proceso sin servidor que administra fragmentos pequeños de código orientados a eventos. La infraestructura en la nube proporciona los servidores actualizados necesarios para ejecutar las funciones a escala. La solución actual usa un conjunto de dos microservicios de API de Azure Functions que crean y administran las operaciones para los resultados de pruebas y los registros de auditoría de los pacientes.

  • Azure Virtual Network proporciona un entorno de aplicación aislado y de alta seguridad mediante la restricción del acceso de red a direcciones IP o subredes específicas. Tanto APIM como Azure Functions admiten la restricción de acceso y la implementación en redes virtuales. En esta solución se usa la integración de redes virtuales regionales para implementar aplicaciones de funciones en la misma red virtual y en la misma región.

  • Azure Key Vault almacena, cifra y administra de forma centralizada el acceso a las claves, los certificados y las cadenas de conexión. Esta solución mantiene las claves de host de Azure Functions y las cadenas de conexión de Azure Cosmos DB en una instancia de Key Vault a la que solo pueden acceder las identidades especificadas.

  • Azure Cosmos DB es una base de datos sin servidor totalmente administrada con escalado automático e instantáneo. En la solución actual, ambos microservicios almacenan los datos en Azure Cosmos DB, mediante el controlador de Node.js de MongoDB. Los servicios no comparten datos y puede implementar cada servicio en su propia base de datos independiente.

  • Application Insights, una característica de Azure Monitor, informa sobre el rendimiento de la aplicación, el uso, la disponibilidad y el comportamiento para detectar y ayudar a diagnosticar anomalías.

    Los errores en la arquitectura basada en microservicios suelen distribuirse a través de una variedad de componentes y no se pueden diagnosticar examinando los servicios de forma aislada. La capacidad de correlacionar la telemetría entre componentes es fundamental para diagnosticar estos problemas. La telemetría de Application Insights centraliza el registro a lo largo de toda la canalización de solicitudes para detectar anomalías de rendimiento. La telemetría comparte un identificador de operación común, lo que permite la correlación entre componentes.

    APIM y el entorno en tiempo de ejecución de Azure Functions tienen compatibilidad integrada con Application Insights para generar y correlacionar una gran variedad de opciones de telemetría, incluida la salida de la aplicación estándar. Las aplicaciones de función usan el SDK de Node.js de Application Insights para realizar un seguimiento manual de las dependencias y otros tipos de telemetría personalizados.

    Para obtener más información sobre el seguimiento de telemetría distribuida en esta solución, consulte Telemetría distribuida.

Alternativas

Detalles del escenario

En este artículo se describe una solución integrada para la administración de registros de pacientes. Una organización de mantenimiento necesita almacenar digitalmente grandes cantidades de datos de pruebas médicas de pacientes altamente confidenciales en la nube. Los sistemas internos y de terceros deben poder leer y escribir datos de forma segura mediante una interfaz de programación de aplicaciones (API). Todas las interacciones con los datos se deben registrar en un registro de auditoría.

Posibles casos de uso

  • Acceda a datos altamente confidenciales desde puntos de conexión externos designados.
  • Implemente una auditoría segura para las operaciones de acceso a datos.
  • Integre aplicaciones de microservicios interdependientes con acceso y seguridad comunes.
  • Use características de seguridad de red virtual a la vez que aprovecha la flexibilidad y el ahorro de costos sin servidor.

Ventajas

Algunas de las ventajas de las aplicaciones sin servidor como Azure Functions son el ahorro de costos y la flexibilidad de usar solo los recursos de proceso necesarios, en lugar de pagar por adelantado los servidores dedicados. Esta solución permite a Azure Functions usar restricciones de acceso a la red virtual por seguridad, sin incurrir en el costo y la sobrecarga operativa de las instancias completas de Azure App Service Environment (ASE).

APIM controla el acceso interno y de terceros a un conjunto de microservicios de API basados en Azure Functions. La API de pacientes proporciona operaciones de creación, lectura, actualización y eliminación (CRUD) para pacientes y sus resultados de pruebas. La aplicación de funciones de la API de auditoría proporciona operaciones para crear entradas de auditoría.

Cada aplicación de funciones almacena sus datos en una base de datos independiente de Azure Cosmos DB. Azure Key Vault contiene de forma segura todas las claves, secretos y cadenas de conexión asociados con las aplicaciones y bases de datos. Azure Monitor y la telemetría de Application Insights centralizan el registro en el sistema.

Consideraciones

Estas consideraciones implementan los pilares del marco de buena arquitectura de Azure, que es un conjunto de principios guía que se pueden usar para mejorar la calidad de una carga de trabajo. Para más información, consulte Marco de buena arquitectura de Microsoft Azure.

Tenga en cuenta los aspectos siguientes al implementar esta solución.

Seguridad

La seguridad proporciona garantías contra ataques deliberados y el abuso de datos y sistemas valiosos. Para más información, consulte Introducción al pilar de seguridad.

Debido a la confidencialidad de los datos, la seguridad es primordial en esta solución. La solución usa varios mecanismos para proteger los datos:

  • Administración de puerta de enlace de APIM
  • Restricciones de acceso a la red virtual
  • Claves de acceso y cadenas de conexión del servicio
  • Administración de cadenas de conexión y claves en Key Vault
  • Rotación de claves en Key Vault
  • Identidades de servicio administradas

Puede proteger la instancia de Azure API Management frente a ataques de denegación de servicio distribuido (DDoS) mediante la protección contra DDoS de Azure. Azure DDoS Protection proporciona características de mitigación de DDoS mejoradas para la defensa contra los ataques de DDoS volumétricos y de protocolo.

Para obtener más información sobre el patrón de seguridad de esta solución, consulte Patrón de seguridad para la comunicación entre API Management, aplicaciones de funciones y Azure Cosmos DB.

Administración de puerta de enlace de API

El sistema solo es accesible públicamente mediante el punto de conexión de APIM administrado único. La subred de APIM restringe el tráfico entrante a las direcciones IP del nodo de puerta de enlace especificado.

APIM permite una integración sencilla con distintos mecanismos de autenticación. La solución actual requiere una clave de suscripción, pero también puede usar Microsoft Entra ID para proteger el punto de conexión de APIM sin necesidad de administrar las claves de suscripción en APIM.

Virtual network

Para evitar exponer las API y las funciones públicamente, Azure Virtual Network restringe el acceso de red para las API y las funciones a subredes o direcciones IP específicas. Tanto API Management como Azure Functions admiten la restricción de acceso y la implementación en redes virtuales.

Las aplicaciones de funciones pueden restringir el acceso de subred de IPv4, IPv6 y red virtual. De forma predeterminada, una aplicación de funciones permite todo el acceso, pero una vez que agrega una o varias restricciones de dirección o subred, la aplicación deniega el resto del tráfico de red.

En esta solución, las aplicaciones de función solo permiten interacciones dentro de su propia red virtual. La API de pacientes permite llamadas de la subred de APIM al agregar la subred de APIM a la lista de permitidos de las restricciones de acceso. La API de auditoría permite la comunicación con la API de pacientes al agregar la subred de API de pacientes a su lista de permitidos de restricciones de acceso. Las API rechazan el tráfico de otros orígenes.

En esta solución se usa la integración de redes virtuales regionales para integrar APIM y las aplicaciones de funciones con la misma red virtual y región de Azure. Hay varias consideraciones importantes para usar la integración de red virtual regional:

  • Debe usar la SKU Premium de Azure Functions para tener tanto la integración como la escalabilidad de la red virtual regional.
  • Para habilitar la conectividad de VNET, es preciso usar la SKU Desarrollador o Premium de APIM.
  • Dado que las aplicaciones de funciones se implementan en una subred de la red virtual, las restricciones de acceso de las aplicaciones de funciones se configuran para permitir el tráfico desde otras subredes de la red virtual.
  • La integración de red virtual regional solo limita el tráfico saliente desde la función de Azure a la red virtual. El tráfico de entrada se sigue enrutando fuera de la red virtual, aunque está limitado por la lista de acceso de la aplicación.

Solo App Service Environment ofrece un aislamiento completo de red virtual de nivel de red. Las instancias de ASE pueden requerir muchos más gastos y esfuerzos de implementación que Azure Functions, que admite la integración de redes virtuales regionales. El escalado de ASE también es menos elástico.

Claves de acceso

Puede llamar a APIM y a las aplicaciones de funciones sin usar claves de acceso. Sin embargo, deshabilitar las claves de acceso no es una buena práctica de seguridad, por lo que todos los componentes de esta solución requieren claves para el acceso.

  • El acceso a APIM requiere una clave de suscripción, por lo que los usuarios deben incluir Ocp-Apim-Subscription-Key en los encabezados HTTP.
  • Todas las funciones de la aplicación de funciones de la API de pacientes requieren una clave de acceso de API, por lo que APIM debe incluir x-functions-key en el encabezado HTTP al llamar a la API de pacientes.
  • Para llamar a CreateAuditRecord en la aplicación de funciones de la API de auditoría, se necesita una clave de acceso de API, de modo que la API de pacientes debe incluir x-functions-key en el encabezado HTTP al llamar a la función CreateAuditRecord.
  • Ambas aplicaciones de funciones usan Azure Cosmos DB como almacén de datos, por lo que deben usar cadenas de conexión para tener acceso a las bases de datos de Azure Cosmos DB.

Almacenamiento de Key Vault

Aunque es posible mantener las claves de acceso y las cadenas de conexión en la configuración de la aplicación, no es recomendable, ya que cualquiera que pueda acceder a la aplicación puede ver las claves y las cadenas. El procedimiento recomendado, especialmente para los entornos de producción, es conservar las claves y cadenas en Azure Key Vault y usar las referencias de Key Vault para llamar a las aplicaciones. Key Vault solo permite el acceso a las identidades administradas especificadas.

APIM usa una directiva de entrada para almacenar en caché la clave de host de API de pacientes para mejorar el rendimiento. En el caso de los intentos posteriores, APIM busca la clave en la memoria caché en primer lugar.

  • APIM recupera la clave del host de la API de pacientes de Key Vault, la almacena en la memoria caché y la coloca en un encabezado HTTP al llamar a la aplicación de funciones de la API de pacientes.
  • La aplicación de funciones de la API de pacientes recupera la clave de host de la API de auditoría de Key Vault y la coloca en un encabezado HTTP al llamar a la aplicación de funciones de API de auditoría.
  • El entorno en tiempo de ejecución de Azure Functions valida las claves de los encabezados HTTP de las solicitudes entrantes.

Rotación de claves

La rotación de claves de Key Vault mejora la protección del sistema. Puede rotar las claves automáticamente de forma periódica o hacerlo manualmente o a petición en caso de fuga.

La rotación de claves implica la actualización de varias opciones:

  • La propia clave de host de la aplicación de funciones
  • El secreto de Key Vault que almacena la clave de host
  • La referencia de Key Vault en la configuración de aplicación de la aplicación de funciones, para hacer referencia a la última versión del secreto.
  • La referencia de Key Vault en la directiva de almacenamiento en caché de APIM para la API de pacientes

La solución actual usa Terraform para la mayoría de tareas de rotación de claves. Para obtener más información, consulte patrón de rotación de claves con Terraform.

Identidades administradas

En esta solución, APIM y las aplicaciones de funciones usan las identidades de servicio administradas (MSI) asignadas por el sistema de Azure para tener acceso a los secretos de Key Vault. Key Vault tiene las siguientes directivas de acceso individual para la identidad administrada de cada servicio:

  • APIM puede obtener la clave de host de la aplicación de funciones de la API de pacientes.
  • La aplicación de funciones de la API de pacientes puede obtener la clave de host de la API de auditoría y la cadena de conexión de Azure Cosmos DB para su almacén de datos.
  • La aplicación de funciones de la API de auditoría puede obtener la cadena de conexión de Azure Cosmos DB para su almacén de datos.

Optimización de costos

La optimización de costos trata de buscar formas de reducir los gastos innecesarios y mejorar las eficiencias operativas. Para más información, vea Información general del pilar de optimización de costos.

Una de las principales ventajas de las aplicaciones sin servidor como Azure Functions es el ahorro de costos que supone pagar solo por el consumo, en lugar de pagar por adelantado los servidores dedicados. La compatibilidad con redes virtuales requiere el plan Azure Functions Premium, con un cargo adicional. Azure Functions Premium es compatible con la integración de redes virtuales regionales, a la vez que admite el escalado dinámico. La SKU de Azure Functions Premium incluye la integración de la red virtual en APIM.

Para obtener más información y acceder a la calculadora de precios, consulte Precios de Azure Functions.

Functions también se puede hospedar en máquinas virtuales de App Service. Solo App Service Environment (ASE) ofrece un aislamiento completo de red virtual de nivel de red. ASE puede ser mucho más caro que un plan de Azure Functions que admita la integración de redes virtuales regionales y el escalado de ASE es menos elástico.

Implementación de este escenario

El código fuente de esta solución está en microservicios sin servidor integrados en la red virtual de Azure.

El código fuente de Typescript para la API de PatientTest y la API de auditoría se encuentra en la carpeta /src. El origen de cada API incluye un contenedor de desarrollo que tiene todos los requisitos previos instalados para ayudarle a empezar a trabajar rápidamente.

Ambas API tienen un completo conjunto de pruebas unitarias y de integración automatizadas para ayudar a evitar regresiones al realizar cambios. El proyecto también está configurado para linting con ESLint, con el fin de mantener los estilos de código y ayudar a protegerse frente a errores involuntarios. Los archivos LÉAME correspondientes a los servicios contienen información sobre cómo ejecutar las pruebas y el linting.

Implementación de Terraform

La carpeta /env del proyecto de código incluye scripts y plantillas para la implementación de Terraform. Terraform implementa APIM y las aplicaciones de funciones, y las configura para usar la instancia de Application Insights implementada. Terraform también aprovisiona todos los recursos y configuraciones, incluido el bloqueo de red y el patrón de seguridad de la clave de acceso.

El archivo LÉAME de implementación explica cómo implementar el entorno de Terraform en su propia suscripción de Azure. La carpeta /env también incluye un contenedor de desarrollo que tiene todos los requisitos previos instalados para la implementación de Terraform.

Prueba de carga de Locust

Para medir el rendimiento de la API, puede ejecutar pruebas de carga en las API con las pruebas de carga de Locust incluidas. Locust es una herramienta de prueba de carga de código abierto y las pruebas se escriben en Python. Puede ejecutar las pruebas de carga localmente o de forma remota en un clúster de Azure Kubernetes Service (AKS). Las pruebas realizan una serie de operaciones en el punto de conexión de APIM y verifican los comportamientos según los criterios de corrección y error.

Colaboradores

Microsoft mantiene este artículo. Originalmente lo escribieron los siguientes colaboradores.

Autor principal:

  • Hannes Nel | Director principal de ingeniería de software

Para ver los perfiles no públicos de LinkedIn, inicie sesión en LinkedIn.

Pasos siguientes

Las arquitecturas siguientes abarcan escenarios clave de API Management:

En los artículos siguientes se tratan escenarios clave de funciones: