Integrar Azure Resource Health con SDK oficial: resiliencia, seguridad y modelo operativo cloud

  • Imagen de redactor Daniel J. Saldaña
  • 8 de junio de 2026
Integrar Azure Resource Health con SDK oficial: resiliencia, seguridad y modelo operativo cloud

Por qué usar SDKs oficiales en soluciones cloud nativas

Cuando construimos soluciones sobre la nube, una de las primeras decisiones técnicas que aparece es cómo vamos a integrarnos con los servicios del proveedor cloud.

Podemos hacerlo mediante llamadas REST directas. Podemos crear nuestros propios clientes HTTP. Podemos envolver manualmente cada endpoint que necesitamos consumir. O podemos apoyarnos en los SDKs oficiales que ofrecen proveedores como Azure, AWS o Google Cloud.

A primera vista, usar REST directamente puede parecer más simple. Menos dependencias, más control y una integración aparentemente más ligera. Sin embargo, cuando una solución empieza a crecer, cuando entra en producción y cuando necesita operar con estabilidad, seguridad y trazabilidad, esa simplicidad inicial suele convertirse en deuda técnica.

En entornos cloud nativos, los SDKs oficiales no son solo una comodidad para desarrolladores. Son una pieza importante de arquitectura.

En este artículo veremos por qué usar un SDK oficial, como el SDK de Azure, puede marcar una diferencia real en la calidad de una solución cloud nativa. Tomaremos como ejemplo una integración con Azure Resource Health, un servicio que permite conocer el estado de salud de los recursos desplegados en Azure.

La idea no es centrarnos únicamente en este servicio concreto, sino usarlo como punto de partida para entender una decisión más amplia: por qué conviene construir integraciones cloud sobre herramientas oficiales, mantenidas y alineadas con el propio proveedor.

La nube no es solo una API

Cuando trabajamos con servicios cloud es fácil pensar que todo se reduce a consumir una API.

En cierto sentido, es verdad. Azure, AWS o Google Cloud exponen APIs para crear recursos, consultarlos, monitorizarlos, protegerlos y automatizarlos. Pero una solución cloud nativa no debería tratar esas APIs como simples endpoints aislados.

Detrás de cada llamada hay autenticación, permisos, límites de tasa, paginación, errores transitorios, cambios de versión, modelos de datos, regiones, identidades, políticas de seguridad y mecanismos de observabilidad.

Cuando hacemos una llamada REST directa, toda esa responsabilidad cae sobre nuestro código.

Tenemos que decidir cómo autenticarnos, cómo renovar tokens, cómo gestionar errores temporales, cómo reintentar operaciones, cómo interpretar respuestas parciales, cómo procesar resultados paginados y cómo mantener la integración cuando el proveedor evoluciona.

Un SDK oficial existe precisamente para reducir esa carga.

No elimina la necesidad de diseñar bien la arquitectura, pero sí nos permite apoyarnos en una base más sólida.

El atractivo de las llamadas REST directas

Antes de defender el uso de SDKs, conviene reconocer por qué muchos equipos empiezan con REST directo.

REST es universal. Es fácil de probar. Se puede usar con cualquier lenguaje. Permite ver claramente qué URL se está llamando, qué cabeceras se envían y qué respuesta se recibe.

Para una prueba de concepto, un script rápido o una integración muy pequeña, puede ser suficiente.

El problema aparece cuando esa integración deja de ser pequeña.

Una llamada REST que al principio parecía sencilla empieza a necesitar autenticación robusta, gestión de errores, validaciones, reintentos, control de límites, logs, métricas, trazabilidad y mantenimiento.

En ese momento, el equipo termina construyendo una especie de SDK propio, aunque no lo llame así.

Y ahí aparece la pregunta importante: ¿queremos mantener nosotros esa complejidad o queremos apoyarnos en un SDK oficial diseñado para ese ecosistema?

Qué aporta realmente un SDK oficial

Un SDK oficial no es simplemente una librería que evita escribir URLs a mano.

Un buen SDK representa una forma recomendada de interactuar con los servicios del proveedor. Encapsula patrones comunes, simplifica autenticación, mejora la experiencia de desarrollo y reduce errores repetitivos.

En el caso de Azure, paquetes como @azure/identity y los SDKs de administración permiten integrar servicios cloud de una forma más natural dentro de aplicaciones modernas.

Por ejemplo, si queremos consultar la salud de recursos en Azure, podemos usar el cliente oficial correspondiente:

import { ResourceHealthManagementClient } from "@azure/arm-resourcehealth";
import { DefaultAzureCredential } from "@azure/identity";
export async function fetchAzureHealthIssues(subscriptionId: string) {
const credential = new DefaultAzureCredential();
const client = new ResourceHealthManagementClient(credential, subscriptionId);
const issues = [];
for await (const status of client.availabilityStatuses.listBySubscriptionId()) {
if (status.availabilityState !== "Available") {
issues.push({
id: status.id,
name: status.name,
status: status.availabilityState,
impact: status.reasonChronicity,
description: status.summary,
updatedAt: status.occuredTime
});
}
}
return issues;
}

El código sigue siendo claro, pero ya no estamos gestionando manualmente cada detalle de bajo nivel. Nos concentramos en lo que importa para nuestra solución: obtener estados de salud, filtrar recursos afectados y devolver una estructura útil.

Ese es uno de los principales valores de un SDK: nos acerca al dominio del problema y nos aleja de la fricción repetitiva de integración.

Seguridad: una de las mayores razones para usar SDKs oficiales

La seguridad es probablemente uno de los argumentos más fuertes a favor de los SDKs oficiales.

En soluciones cloud nativas, el manejo de credenciales debe tomarse muy en serio. Una mala decisión en este punto puede afectar a toda la arquitectura.

Cuando se trabaja con llamadas REST manuales, es habitual ver implementaciones donde se gestionan tokens directamente, se almacenan secretos en variables de entorno, se copian claves entre entornos o se crean mecanismos propios de autenticación.

Aunque esto puede funcionar, también aumenta la superficie de error.

El SDK oficial de Azure permite trabajar con DefaultAzureCredential, una pieza muy útil porque centraliza distintas formas de autenticación según el entorno donde se ejecuta la aplicación.

En desarrollo local, puede usar credenciales del entorno del desarrollador. En producción, puede usar una identidad gestionada. En pipelines, puede integrarse con mecanismos seguros de autenticación. Todo esto sin tener que reescribir la lógica principal de la aplicación.

Esta forma de trabajar encaja mucho mejor con un enfoque cloud nativo, donde la identidad de la aplicación debe ser parte del diseño de seguridad.

La gran ventaja es que dejamos de pensar en claves estáticas y empezamos a pensar en identidades, permisos y mínimo privilegio.

Identidades gestionadas: menos secretos, menos riesgo

Una solución nativa en Azure debería aprovechar, siempre que sea posible, las identidades gestionadas.

Una identidad gestionada permite que un recurso de Azure, como una Function App, una App Service, una VM o un contenedor, tenga una identidad propia dentro de Microsoft Entra ID. Esa identidad puede recibir permisos concretos para consultar o administrar otros recursos.

Esto evita tener que almacenar secretos en la aplicación.

En lugar de guardar una clave, la aplicación se autentica usando la identidad del entorno donde se ejecuta. El proveedor cloud se encarga de la emisión y rotación de tokens.

Desde el punto de vista operativo, esto es mucho más limpio:

  • Hay menos secretos que proteger.
  • Se reduce el riesgo de exposición accidental.
  • Los permisos se pueden auditar.
  • Se puede aplicar mínimo privilegio.
  • La rotación de credenciales deja de ser un problema del código.
  • La identidad de la aplicación queda separada de la identidad de las personas.

Este enfoque es difícil de mantener correctamente si cada integración se implementa manualmente. El SDK oficial lo convierte en el camino natural.

Resiliencia ante errores transitorios

En cloud, no todos los errores significan que algo esté roto.

Puede haber latencia temporal, límites de tasa, respuestas parciales, timeouts, problemas de red o situaciones donde reintentar una operación es lo correcto.

Cuando usamos REST directamente, debemos decidir cómo manejar estos escenarios. ¿Cuántos reintentos hacemos? ¿Con qué intervalo? ¿Aplicamos backoff exponencial? ¿Qué errores son reintentables? ¿Cómo evitamos empeorar un problema de rate limiting?

Estas decisiones son importantes. Si se implementan mal, la integración puede volverse inestable.

Un SDK oficial suele incorporar políticas de reintento, gestión de errores y patrones recomendados por el proveedor. Esto no significa que no tengamos que configurar nada, pero sí significa que partimos de una base pensada para trabajar con el servicio real.

En una solución cloud nativa, esto es fundamental.

La integración con el proveedor no debería ser el punto débil de la arquitectura.

Paginación y eficiencia en el procesamiento

Otro aspecto que muchas veces se subestima es la paginación.

En entornos reales, las respuestas no siempre caben en una sola llamada. Una suscripción puede tener muchos recursos. Una consulta puede devolver cientos o miles de elementos. El proveedor puede dividir la respuesta en páginas.

Si hacemos REST directo, tenemos que implementar la lógica para seguir tokens de continuación, unir resultados, controlar errores a mitad del proceso y evitar consumir demasiada memoria.

Con un SDK oficial, este tipo de operaciones suelen estar abstraídas mediante iteradores o métodos preparados para recorrer colecciones de forma natural.

En el ejemplo de Azure Resource Health, el uso de for await permite procesar estados de disponibilidad de manera incremental:

for await (const status of client.availabilityStatuses.listBySubscriptionId()) {
if (status.availabilityState !== "Available") {
issues.push({
id: status.id,
name: status.name,
status: status.availabilityState,
impact: status.reasonChronicity,
description: status.summary,
updatedAt: status.occuredTime
});
}
}

Esto hace que el código sea más expresivo y más eficiente.

No estamos pensando en páginas, tokens o detalles internos del transporte. Estamos pensando en estados de salud de recursos, que es lo que realmente importa para la solución.

Mantener una integración alineada con el proveedor

Los servicios cloud evolucionan constantemente.

Aparecen nuevos campos, cambian versiones de API, se ajustan comportamientos, se deprecian mecanismos antiguos y se incorporan nuevas capacidades.

Cuando usamos llamadas REST directas, debemos estar mucho más pendientes de esos cambios. Hay que revisar documentación, actualizar endpoints, adaptar modelos de respuesta y mantener código de bajo nivel.

Con un SDK oficial, buena parte de ese trabajo queda canalizado mediante actualizaciones de la librería.

Esto no significa que podamos actualizar sin revisar nada. Siempre hay que probar. Pero la integración queda más alineada con la evolución del proveedor.

Además, los SDKs oficiales suelen ofrecer tipos, modelos y convenciones que ayudan a detectar errores antes. En lenguajes como TypeScript, esto es especialmente valioso porque los modelos tipados reducen fallos en tiempo de ejecución.

Mejor experiencia de desarrollo

La calidad de una arquitectura también depende de lo fácil que sea trabajar con ella.

Un SDK oficial suele mejorar la experiencia de desarrollo porque proporciona:

  • Autocompletado.
  • Tipos claros.
  • Modelos de datos definidos.
  • Métodos con nombres descriptivos.
  • Documentación asociada.
  • Ejemplos oficiales.
  • Integración con mecanismos estándar de autenticación.

Esto reduce la curva de aprendizaje y facilita que otros miembros del equipo mantengan el código.

Un endpoint REST manual puede ser muy explícito, pero también obliga a conocer detalles concretos de cada API. En cambio, un SDK ayuda a trabajar con abstracciones más cercanas al servicio.

La diferencia puede parecer pequeña en un primer desarrollo, pero se vuelve muy importante cuando varias personas mantienen la solución durante meses o años.

Un ejemplo práctico: consultar la salud de recursos en Azure

Imaginemos que queremos construir una capa interna que consulte el estado de salud de los recursos de una suscripción de Azure.

El objetivo no es mostrar todos los recursos, sino identificar aquellos que pueden necesitar atención. Por ejemplo, recursos degradados, no disponibles o en estado desconocido.

Podemos diseñar una función de servicio así:

import { ResourceHealthManagementClient } from "@azure/arm-resourcehealth";
import { DefaultAzureCredential } from "@azure/identity";
export async function getAzureResourceHealth(subscriptionId: string) {
const credential = new DefaultAzureCredential();
const client = new ResourceHealthManagementClient(credential, subscriptionId);
const affectedResources = [];
for await (const status of client.availabilityStatuses.listBySubscriptionId()) {
if (status.availabilityState !== "Available") {
affectedResources.push({
resourceId: status.id,
resourceName: status.name,
availabilityState: status.availabilityState,
impact: status.reasonChronicity,
summary: status.summary,
occurredAt: status.occuredTime
});
}
}
return {
provider: "azure",
subscriptionId,
affectedResources,
totalAffected: affectedResources.length,
checkedAt: new Date().toISOString()
};
}

Este código tiene varias características interesantes.

Primero, usa el SDK oficial para comunicarse con Azure.

Segundo, usa DefaultAzureCredential, por lo que la autenticación se adapta al entorno.

Tercero, procesa la información mediante un iterador asíncrono.

Cuarto, filtra el ruido y devuelve una estructura pensada para ser consumida por otra capa del sistema.

Esta es una forma más natural de trabajar en soluciones nativas: cada capa tiene una responsabilidad clara.

El SDK no elimina la arquitectura

Es importante aclarar algo: usar un SDK oficial no significa que la solución ya esté bien diseñada.

El SDK resuelve una parte del problema, pero no sustituye decisiones de arquitectura como:

  • Cómo organizar las capas del sistema.
  • Cómo manejar caché.
  • Cómo registrar errores.
  • Cómo exponer datos al frontend.
  • Cómo controlar permisos.
  • Cómo definir contratos internos.
  • Cómo responder ante fallos.
  • Cómo probar la integración.

El SDK es una base. No es toda la arquitectura.

Una mala integración puede seguir siendo mala aunque use el SDK oficial. Por ejemplo, si el código está acoplado directamente al controlador HTTP, si no hay caché, si no se registran errores o si se exponen datos sensibles sin control.

La recomendación es usar el SDK dentro de una capa de servicio bien definida, no dispersarlo por toda la aplicación.

Separar integración, dominio y presentación

Una forma limpia de organizar una solución cloud nativa es dividir responsabilidades.

La capa de integración se encarga de hablar con el proveedor cloud. Aquí vive el SDK.

La capa de dominio traduce los datos del proveedor a conceptos propios de la aplicación. Por ejemplo, un estado de Azure puede convertirse en un recurso afectado, una incidencia o una señal operativa.

La capa API expone un contrato estable para el resto del sistema.

La capa de presentación muestra esa información en un dashboard, informe, sistema de alertas o agente inteligente.

Esta separación permite cambiar una parte sin romper todo el sistema.

Si mañana cambiamos la forma de consultar Azure Resource Health, el impacto debería quedar limitado a la capa de integración. Si mañana añadimos AWS o Google Cloud, podemos crear nuevas implementaciones manteniendo una respuesta interna común.

La importancia de la caché en integraciones cloud

Otro punto importante en soluciones cloud nativas es no llamar al proveedor en cada interacción del usuario.

Si un dashboard, una API interna o un agente consulta Azure directamente en cada petición, podemos generar latencia innecesaria, aumentar el riesgo de errores y depender demasiado de la disponibilidad inmediata del proveedor.

Una capa de caché bien diseñada permite equilibrar frescura y rendimiento.

En muchos escenarios, los datos de salud, inventario o configuración no necesitan resolverse en tiempo real absoluto. Una ventana de caché de unos minutos puede ser suficiente para ofrecer una buena experiencia y reducir presión sobre las APIs externas.

El patrón sería:

const data = await withCloudCache({
cacheQuery: { subscriptionId, provider: "azure", scope: "health" },
fetcher: () => getAzureResourceHealth(subscriptionId),
});

La idea es sencilla: primero se consulta la caché. Si el dato está vigente, se devuelve inmediatamente. Si ha expirado, se ejecuta el fetcher, se actualiza la caché y se entrega la respuesta.

Esto hace que la integración sea más estable y más predecible.

Observabilidad e inteligencia operativa

Consultar Resource Health no debería quedarse en mostrar un JSON.

El verdadero valor aparece cuando esa información se integra en el modelo operativo de la solución.

Un sistema puede usar estos datos para:

  • Mostrar el estado global de recursos cloud.
  • Avisar de recursos degradados.
  • Relacionar incidencias con servicios internos.
  • Priorizar acciones según criticidad.
  • Alimentar dashboards técnicos o ejecutivos.
  • Generar resúmenes automáticos.
  • Ayudar a equipos de soporte durante incidentes.
  • Detectar patrones de degradación a lo largo del tiempo.

Aquí es donde la integración deja de ser una llamada técnica y se convierte en una capacidad del producto.

La pregunta ya no es solamente “¿cómo llamo a la API de Azure?”, sino “¿cómo convierto esta señal en una decisión útil?”.

SDKs oficiales y soluciones nativas cloud

En una solución nativa cloud, deberíamos intentar aprovechar las capacidades propias del ecosistema donde estamos construyendo.

Esto incluye identidad, permisos, observabilidad, escalabilidad, configuración, eventos, almacenamiento, monitorización y automatización.

Los SDKs oficiales ayudan a trabajar de forma más cercana a ese ecosistema.

Cuando usamos el SDK de Azure junto con identidades gestionadas, control de acceso basado en roles, servicios administrados y una arquitectura bien separada, estamos construyendo una solución más natural para la nube.

No estamos simplemente conectando una aplicación externa a Azure. Estamos diseñando una aplicación que entiende cómo operar dentro de Azure.

Esa diferencia se nota en producción.

Cuándo puede tener sentido usar REST directamente

Aunque el SDK oficial suele ser una buena elección, no significa que REST directo esté prohibido.

Puede tener sentido en algunos casos:

  • Pruebas rápidas.
  • Scripts muy pequeños.
  • Endpoints que aún no están cubiertos por el SDK.
  • Integraciones donde se necesita un control muy específico del protocolo.
  • Entornos donde no existe un SDK maduro para el lenguaje utilizado.

Pero incluso en estos casos, conviene encapsular las llamadas REST en una capa propia, con autenticación, errores, logs y modelos claros.

Lo importante es no llenar la aplicación de llamadas HTTP dispersas. Ese patrón suele ser difícil de mantener.

Buenas prácticas al usar SDKs cloud

Para aprovechar bien un SDK oficial, conviene seguir algunas buenas prácticas.

Primero, inicializar los clientes de forma controlada. Evita crear clientes sin necesidad en cada parte del sistema.

Segundo, usa identidades gestionadas en producción siempre que sea posible.

Tercero, aplica mínimo privilegio a la identidad de la aplicación. No des permisos amplios si solo necesitas lectura.

Cuarto, encapsula el SDK en servicios internos. No lo mezcles directamente con controladores, componentes de UI o lógica de presentación.

Quinto, normaliza las respuestas. No obligues al resto del sistema a conocer todos los detalles del proveedor.

Sexto, añade caché cuando los datos no necesiten tiempo real estricto.

Séptimo, registra errores con contexto suficiente: proveedor, suscripción, operación y alcance.

Octavo, diseña pensando en evolución. Hoy puede ser Azure, mañana puede haber más proveedores o más servicios.

Mi recomendación bajo mi experiencia

Usar SDKs oficiales en soluciones cloud nativas no es solo una cuestión de comodidad. Es una decisión que afecta a la seguridad, la resiliencia, el mantenimiento y la calidad operativa de la solución.

Las llamadas REST directas pueden ser útiles en escenarios simples, pero cuando una integración entra en producción, necesita mucho más que una URL y un token. Necesita autenticación robusta, gestión de errores, paginación, tipos, trazabilidad, seguridad y alineación con el proveedor.

El SDK oficial de Azure, combinado con DefaultAzureCredential, identidades gestionadas y una arquitectura por capas, permite construir integraciones más limpias y preparadas para operar en entornos reales.

Azure Resource Health es un buen ejemplo: no solo consultamos el estado de unos recursos, sino que podemos convertir esa información en una señal operativa para dashboards, alertas, análisis de impacto o sistemas inteligentes.

En definitiva, una solución cloud nativa no debería limitarse a consumir servicios cloud. Debería integrarse con ellos de forma natural, segura y mantenible.

Y para eso, los SDKs oficiales son una de las mejores bases sobre las que construir.=

¡Suscríbete y recibe actualizaciones sobre tecnología, diseño, productividad, programación y mucho más!
0
0