Desplegando ms-microsoftgraph: El Puente Hacia la Identidad
Llegamos al despliegue del último microservicio central de nuestro ecosistema: ms-microsoftgraph
. Este componente no gestiona un dominio de negocio tradicional, sino que cumple una función de infraestructura crítica: actúa como un adaptador o puente entre nuestro mundo interno y el proveedor de identidad externo, Microsoft Entra ID.
Su operación es bidireccional y altamente reactiva:
- Reacciona a eventos externos: A través de sus endpoints REST, recibe las llamadas de las Custom Authentication Extensions de Entra ID durante el registro de un usuario e inicia el proceso de replicación interna.
- Reacciona a eventos internos: A través de su Async Worker, escucha eventos de dominio (como
RoleCreated
dems-roles
oUserUpdated
dems-users
) y sincroniza esos cambios de vuelta a Microsoft Entra ID.
Un Vistazo a la Arquitectura de ms-microsoftgraph
Section titled “Un Vistazo a la Arquitectura de ms-microsoftgraph”Flujo de la API a los Casos de Uso (CQRS)
Section titled “Flujo de la API a los Casos de Uso (CQRS)”- REST: Expone los endpoints que son invocados por las Custom Authentication Extensions de Entra ID (
OnAttributeCollectionSubmit
yTokenIssuanceStart
). - Async Workers: Escucha una amplia gama de eventos de dominio de otros microservicios (
ms-roles
,ms-users
) para mantener sincronizado Entra ID. - Casos de Uso: Los
Commands
comoReplicateUser
(manejado porCreateUserCiamCommandHandler
) inician el proceso de creación de un usuario en nuestro sistema después de un registro exitoso en Entra ID.
El Modelo de Dominio
Section titled “El Modelo de Dominio”El dominio de ms-microsoftgraph
se centra en mantener una representación coherente de las entidades de identidad.
UserAggregate
yRoleAggregate
: Mantienen una copia o “sombra” de los usuarios y roles para facilitar la sincronización.UserCiamAggregate
: Actúa como un registro de auditoría de los usuarios que provienen del proveedor de identidad (CIAM), rastreando si ya han sido replicados.
Parte 1: Prerrequisitos - Creando la Identidad en Microsoft Entra ID
Section titled “Parte 1: Prerrequisitos - Creando la Identidad en Microsoft Entra ID”Para que ms-microsoftgraph
pueda interactuar con la API de Microsoft Graph, necesita su propia identidad (un “App Registration”) con los permisos adecuados.
-
Navegar a App Registrations En el Microsoft Entra admin center, ve a
Identity > Applications > App registrations
y haz clic en+ New registration
. -
Registrar la Aplicación
InventoryAppMicrosoftGraph
Dale un nombre descriptivo y haz clic en “Register”. -
Crear un Secreto de Cliente Ve a
Certificates & secrets
, haz clic en+ New client secret
. -
Añadir Permisos de API Ve a
API permissions
, haz clic en+ Add a permission
, y seleccionaMicrosoft Graph
.Elegimos
Application permissions
y añadimos los siguientes permisos:- Directory.ReadWrite.All
- Group.ReadWrite.All
- GroupMember.ReadWrite.All
- User.ReadWrite.All
- DeviceManagementServiceConfig.ReadWrite.All
- DeviceManagementConfiguration.ReadWrite.All
-
Otorgar Consentimiento de Administrador Una vez añadidos todos los permisos necesarios, haz clic en el botón
Grant admin consent for ...
para activarlos.
Despliegue y Configuración Paso a Paso
Section titled “Despliegue y Configuración Paso a Paso”-
Configurando los Secretos en Vault Almacenamos en Vault las credenciales base y, muy importante, el
ClientSecret
que acabamos de generar para la App Registration dems-microsoftgraph
.Terminal window vault kv put -mount=inventory-keyvalue ms-microsoftgraph `vault kv put -mount=inventory-keyvalue ms-microsoftgraph `"RabbitMQ:UserName=<USERNAME_FROM_RABBITMQ_SECRET>" `"RabbitMQ:Password=<PASSWORD_FROM_RABBITMQ_SECRET>" `"Redis:Instances:Core:ConnectionString=<CONNECTION_STRING_FROM_REDIS>" `"Mongo:ConnectionString=<VAULT_TRANSIT_PASSWORD>""Graph:ClientSecret=<CLIENT_SECRET_FROM_GRAPH>" `"Vault:Transit:SecretContexts:vault_transit_password_temp=<VAULT_TRANSIT_PASSWORD>" -
Desplegando los Entrypoints con Helm Desplegaremos los dos entrypoints de
ms-microsoftgraph
: REST para los webhooks de Entra ID y el Worker para los eventos internos.-
Preparar los Archivos
values.yaml
Necesitaremos dos archivos,values-rest.yaml
yvalues-worker.yaml
, que definirán las variables de entorno no sensibles y la conexión a Vault. Las variables clave son lasGRAPH__*
, que le dicen al microservicio cómo identificarse ante la API de Microsoft Graph.ms-base:resources:limits:cpu: 500mmemory: 256Mirequests:cpu: 100mmemory: 128Mienv:- name: RESOURCES__ENABLEvalue: "true"- name: RESOURCES__SERVERvalue: "http://ms-services-grpc.inventory.svc.cluster.local:5001"- name: SECURITY__VALIDISSUERvalue: "https://devcodedesignplus.ciamlogin.com/dfee7752-2c8a-4171-ad95-62ddc82d6ed8/v2.0/"- name: SECURITY__CLIENTIDvalue: "305f759d-d1d2-467b-9eab-4a61389c7329"- name: SECURITY__VALIDAUDIENCES__0value: "305f759d-d1d2-467b-9eab-4a61389c7329"- name: RABBITMQ__HOSTvalue: "rabbitmq-cluster.srv-rabbitmq.svc"- name: LOGGER__OTELENDPOINTvalue: "http://inventory-opentelemetry-collector.otel-collector.svc.cluster.local:4317"- name: OBSERVABILITY__SERVEROTELvalue: "http://inventory-opentelemetry-collector.otel-collector.svc.cluster.local:4317"- name: GRAPH__CLIENTIDvalue: "4e52651c-1c59-4d91-9817-e57ed0256e9c"- name: GRAPH__TENANTIDvalue: "dfee7752-2c8a-4171-ad95-62ddc82d6ed8"- name: GRAPH__ISSUERIDENTITYvalue: "devcodedesignplus.ciamlogin.com"vault:server: http://vault.vault.svc.cluster.local:8200solution: inventorytoken: ANGq0*B2acD1n5%FvirtualService:create: truenamespace: istio-ingresshosts:- services.codedesignplus.appgateways:- istio-ingress/istio-inventory-gatewayhttp:- name: ms-microsoftgraphmatch:- uri:prefix: /ms-microsoftgraph/rewrite:uri: /route:- destination:host: ms-microsoftgraph-rest.inventory.svc.cluster.localport:number: 5000ms-base:image:pullPolicy: Alwaysresources:limits:cpu: 500mmemory: 256Mirequests:cpu: 100mmemory: 128Mienv:- name: RESOURCES__ENABLEvalue: "false"- name: SECURITY__VALIDISSUERvalue: "https://devcodedesignplus.ciamlogin.com/dfee7752-2c8a-4171-ad95-62ddc82d6ed8/v2.0/"- name: SECURITY__CLIENTIDvalue: "305f759d-d1d2-467b-9eab-4a61389c7329"- name: SECURITY__VALIDAUDIENCES__0value: "305f759d-d1d2-467b-9eab-4a61389c7329"- name: RABBITMQ__HOSTvalue: "rabbitmq-cluster.srv-rabbitmq.svc"- name: LOGGER__OTELENDPOINTvalue: "http://inventory-opentelemetry-collector.otel-collector.svc.cluster.local:4317"- name: OBSERVABILITY__SERVEROTELvalue: "http://inventory-opentelemetry-collector.otel-collector.svc.cluster.local:4317"vault:server: http://vault.vault.svc.cluster.local:8200solution: inventorytoken: ANGq0*B2acD1n5%F -
Ejecutar el Despliegue con Helm Instalamos ambos charts en el namespace
inventory
.Terminal window # Desplegar el entrypoint RESThelm upgrade --install ms-microsoftgraph-rest codedesignplus/ms-microsoftgraph-rest -f ./values-rest.yaml --namespace inventory# Desplegar el entrypoint Async Workerhelm upgrade --install ms-microsoftgraph-worker codedesignplus/ms-microsoftgraph-worker -f ./values-worker.yaml --namespace inventory
-
Parte 3: Verificación del Despliegue
Section titled “Parte 3: Verificación del Despliegue”-
Verificar los Pods en Lens En Lens, bajo “Workloads > Pods”, ahora vemos los dos nuevos pods,
ms-microsoftgraph-rest
yms-microsoftgraph-worker
, corriendo en el namespaceinventory
. -
Verificar el
VirtualService
de Istio El Helm chart dems-microsoftgraph-rest
ha creado automáticamente elVirtualService
. Este es el endpoint al que apuntarán nuestras Custom Authentication Extensions en Entra ID.
Conclusión Final de la Fase de Despliegue
Section titled “Conclusión Final de la Fase de Despliegue”¡Lo has logrado! Con el despliegue de ms-microsoftgraph
, hemos instalado el último microservicio central del ecosistema CodeDesignPlus. Ahora tienes una plataforma completamente funcional, donde la identidad externa y el dominio de negocio interno están perfectamente sincronizados a través de una arquitectura reactiva y orientada a eventos.
Este despliegue no solo añade una pieza más; marca la finalización de la Fase 2 de nuestra serie. Has construido y desplegado con éxito un ecosistema de microservicios de nivel empresarial desde cero. La plataforma está viva y todos los componentes base están en su lugar, comunicándose entre sí.
Para cerrar esta monumental fase de construcción y despliegue con broche de oro, en nuestro próximo y último artículo de esta etapa, haremos una pausa para consolidar todo nuestro trabajo. Recapitularemos la increíble plataforma que hemos levantado y, lo más importante, te proporcionaremos un script de despliegue optimizado para que puedas levantar todo este ecosistema de forma automatizada en el futuro. También repasaremos los puntos más importantes y las lecciones aprendidas en el camino.
Te invitamos a unirte a nosotros para este capítulo final de resumen, que te dejará con una base sólida y una herramienta poderosa para tus propios proyectos.