Skip to content

Blog

Azure Container Apps Dynamic Sessions

Resumen

Azure Container Apps Dynamic Sessions proporciona acceso rápido a entornos sandbox seguros y aislados, ideales para ejecutar código generado por IA o aplicaciones que requieren aislamiento. Con inicio en milisegundos, gestión automática del ciclo de vida y escalado masivo, es la solución perfecta para escenarios de code interpreter, ejecución de agentes de IA o sandboxing de código no confiable.

¿Qué son las Dynamic Sessions?

Las Dynamic Sessions son entornos sandboxed que se ejecutan dentro de un session pool y proporcionan:

Características clave:

  • Aislamiento Hyper-V: Cada sesión aislada en sandbox independiente
  • Inicio ultra rápido: Nuevas sesiones en milisegundos (warm pool)
  • Acceso REST API: Gestión simple vía HTTP endpoints
  • Gestión automática: Limpieza automática tras inactividad
  • Alta escalabilidad: Cientos/miles de sesiones concurrentes
  • Network isolation opcional: Seguridad adicional para workloads críticos

Tipos de sesiones

1. Code Interpreter Sessions (Built-in)

Sesiones pre-configuradas para ejecutar código Python/Node.js sin gestionar infraestructura:

# Crear session pool con code interpreter
az containerapp sessionpool create \
    --name my-code-interpreter-pool \
    --resource-group my-rg \
    --location eastasia \
    --max-sessions 100 \
    --container-type PythonLTS \
    --cooldown-period 300

Casos de uso: - Código generado por LLMs (ChatGPT, Claude, etc.) - Evaluación de código de usuarios en SaaS apps - Jupyter notebooks serverless - Herramientas de IA (LangChain, LlamaIndex, Semantic Kernel)

2. Custom Container Sessions

Sesiones con contenedores personalizados para entornos especializados:

{
  "type": "Microsoft.App/sessionPools",
  "apiVersion": "2024-08-02-preview",
  "name": "custom-session-pool",
  "location": "eastus",
  "properties": {
    "environmentId": "/subscriptions/<SUB_ID>/resourceGroups/<RG>/providers/Microsoft.ContainerApps/environments/<ENV>",
    "poolManagementType": "Dynamic",
    "containerType": "CustomContainer",
    "scaleConfiguration": {
      "maxConcurrentSessions": 50,
      "readySessionInstances": 10
    },
    "customContainerTemplate": {
      "containers": [{
        "image": "myregistry.azurecr.io/custom-sandbox:1.0",
        "name": "sandbox",
        "resources": {
          "cpu": 0.5,
          "memory": "1Gi"
        }
      }],
      "ingress": {
        "targetPort": 8080
      }
    },
    "dynamicPoolConfiguration": {
      "executionType": "Timed",
      "cooldownPeriodInSeconds": 600
    }
  }
}

Arquitectura y flujo

flowchart TB
    A[Aplicación cliente] -->|REST API| B[Session Pool]
    B -->|Asigna| C[Ready Session]
    C -->|Hyper-V Isolation| D[Sandbox Container]
    D -->|Ejecuta código| E[Results]
    E -->|Devuelve| A
    C -.->|Cooldown| F[Auto cleanup]

    style C fill:#2ecc71
    style D fill:#3498db
    style F fill:#e74c3c

Flujo de ejecución:

  1. Cliente solicita sesión vía identifier
  2. Si no existe → pool asigna sesión ready del warm pool
  3. Código se ejecuta en sandbox Hyper-V aislado
  4. Resultados se devuelven al cliente
  5. Tras cooldown sin actividad → limpieza automática

Configuración práctica

Paso 1: Crear Azure Container Apps environment

# Variables
RESOURCE_GROUP="aca-sessions-rg"
LOCATION="eastasia"
ENVIRONMENT_NAME="aca-sessions-env"

# Crear resource group y environment
az group create --name $RESOURCE_GROUP --location $LOCATION

az containerapp env create \
    --name $ENVIRONMENT_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION

Paso 2: Crear session pool

SESSION_POOL_NAME="ai-code-interpreter"

az containerapp sessionpool create \
    --name $SESSION_POOL_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --max-sessions 100 \
    --container-type PythonLTS \
    --cooldown-period 300

Paso 3: Obtener management endpoint

# Obtener endpoint del pool
SESSION_POOL_ENDPOINT=$(az containerapp sessionpool show \
    -n $SESSION_POOL_NAME \
    -g $RESOURCE_GROUP \
    --query "properties.poolManagementEndpoint" \
    -o tsv)

echo "Pool Management Endpoint: $SESSION_POOL_ENDPOINT"

Paso 4: Ejecutar código en sesión

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUB_ID>/resourceGroups/<RG>/sessionPools/<POOL_NAME>/identifier/<SESSION_ID>/code/execute?api-version=2024-02-02-preview
Content-Type: application/json
Authorization: Bearer <TOKEN>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "import pandas as pd\ndf = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})\nprint(df.describe())"
    }
}

Respuesta:

{
    "status": "Success",
    "result": {
        "stdout": "       A    B\ncount  3.0  3.0\nmean   2.0  5.0\nstd    1.0  1.0\nmin    1.0  4.0\n25%    1.5  4.5\n50%    2.0  5.0\n75%    2.5  5.5\nmax    3.0  6.0",
        "stderr": "",
        "executionTimeMs": 120
    }
}

Integración con frameworks de IA

LangChain

from langchain.agents import Tool
from langchain_azure_dynamic_sessions import SessionsPythonREPLTool

# Configurar tool con session pool
sessions_tool = SessionsPythonREPLTool(
    pool_management_endpoint=SESSION_POOL_ENDPOINT
)

# Crear agente con herramienta
tools = [
    Tool(
        name="Python REPL",
        func=sessions_tool.run,
        description="Ejecuta código Python en sandbox seguro"
    )
]

LlamaIndex

from llama_index.tools.azure_code_interpreter import AzureCodeInterpreterToolSpec
from llama_index.agent.react import ReActAgent

# Configurar tool
tool_spec = AzureCodeInterpreterToolSpec(
    pool_management_endpoint=SESSION_POOL_ENDPOINT
)

# Crear agente
agent = ReActAgent.from_tools(
    tool_spec.to_tool_list(),
    llm=llm,
    verbose=True
)

# Ejecutar query
response = agent.chat("Analiza este dataset CSV y crea un gráfico de tendencias")

Seguridad y network isolation

Habilitar network isolation

# Actualizar session pool con network isolation
az containerapp sessionpool update \
    --name $SESSION_POOL_NAME \
    --resource-group $RESOURCE_GROUP \
    --session-network-status EgressEnabled

Beneficios: - Bloquea acceso saliente no autorizado - Previene exfiltración de datos - Compatible con VNet integration - Logs de conexiones en Azure Monitor

Autenticación con Managed Identity

{
  "identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "<IDENTITY_RESOURCE_ID>": {}
    }
  },
  "properties": {
    "managedIdentitySettings": [{
      "identity": "<IDENTITY_RESOURCE_ID>",
      "lifecycle": "None"
    }]
  }
}

Casos de uso reales

1. Agente de análisis de datos con GPT-4

# Prompt del usuario
user_query = "Analiza ventas_2024.csv y muestra top 5 productos"

# Agent genera y ejecuta código
code_generated = """
import pandas as pd
df = pd.read_csv('/data/ventas_2024.csv')
top_products = df.groupby('producto')['ventas'].sum().nlargest(5)
print(top_products.to_string())
"""

# Ejecutar en dynamic session
response = execute_in_session(
    session_id="analysis-001",
    code=code_generated
)

2. Sandbox para código de usuarios (SaaS app)

# Usuario envía código no confiable
user_code = request.json.get('code')

# Ejecutar en sesión aislada con timeout
result = execute_code_safely(
    code=user_code,
    session_id=f"user-{user_id}",
    timeout=30,
    max_memory="512Mi"
)

if result['status'] == 'Success':
    return jsonify(result['output'])
else:
    return jsonify({'error': result['error']}), 400

3. Jupyter notebooks serverless

# Crear sesión interactiva para notebook
notebook_session = create_session(
    pool_name="jupyter-pool",
    session_id=f"notebook-{session_token}",
    idle_timeout=3600  # 1 hora
)

# Ejecutar celdas secuencialmente
for cell in notebook_cells:
    result = execute_cell(
        session_id=notebook_session,
        code=cell['code']
    )
    cell['output'] = result

Limitaciones y consideraciones

Limitaciones actuales:

  • Max 100 sesiones concurrentes (configurable hasta 1000)
  • Cooldown mínimo: 60 segundos
  • Timeouts: 30 min por ejecución (synchronous), sin límite (asynchronous)
  • Network isolation no soporta inbound connections
  • Storage efímero (no persistente entre sesiones)

Pricing: - Pago por uso: tiempo de sesión activa + vCPU/memory - Warm pool incluido sin coste adicional - Estimado: ~$0.03/hora por sesión estándar (0.25 vCPU, 0.5 Gi)

Monitorización

# Logs de sesiones en Log Analytics
az monitor log-analytics query \
    --workspace $WORKSPACE_ID \
    --analytics-query "ContainerAppSystemLogs_CL
    | where ContainerAppName_s == '$SESSION_POOL_NAME'
    | where TimeGenerated > ago(1h)
    | project TimeGenerated, Log_s
    | order by TimeGenerated desc"

Buenas prácticas

  1. Dimensionamiento del pool:
  2. readySessionInstances: 10-20% del maxConcurrentSessions
  3. Ajustar cooldownPeriod según patrón de uso (300-600s típico)

  4. Gestión de sesiones:

  5. Usar session IDs únicos y descriptivos
  6. Implementar cleanup explícito tras finalizar
  7. Monitorizar métricas de pool saturation

  8. Seguridad:

  9. Habilitar network isolation para código no confiable
  10. Validar inputs antes de ejecutar código
  11. Limitar recursos (CPU/memory) por sesión
  12. Revisar logs de ejecución regularmente

  13. Cost optimization:

  14. Escalar readySessionInstances dinámicamente según demanda
  15. Implementar timeout agresivo para sesiones idle
  16. Evaluar custom containers vs built-in (PythonLTS más económico)

Referencias

Azure Automation Runbooks: PowerShell y Python para automatización IT

Resumen

Azure Automation proporciona Process Automation mediante runbooks (scripts PowerShell 7.2, Python 3.10, Graphical) ejecutables en cloud (3-hour fair share limit) o Hybrid Runbook Workers (sin límite, on-premises/multicloud). Webhooks permiten triggers desde Logic Apps, Functions, ITSM, monitoring alerts. Ideal para: VM lifecycle management, scheduled maintenance, incident response, configuration drift remediation.

Resumen

Azure Private Link permite acceder a servicios Azure (Storage, SQL Database, Key Vault) y servicios de terceros desde VNets privadas sin exponerlos a internet mediante private endpoints (IPs privadas en tu subnet). Integración DNS automática con private DNS zones (privatelink.*.core.windows.net) resuelve FQDNs a IPs privadas. Escenarios: VNet workloads, peered VNets, on-premises con DNS forwarder, hub-spoke topology.

Microsoft Defender for Cloud CSPM: Governance y Attack Paths

Resumen

Defender CSPM (Cloud Security Posture Management) proporciona visibilidad avanzada de riesgos en entornos Azure, AWS y GCP mediante governance rules (asignación automática de owners y SLAs), attack path analysis (modelado de rutas de ataque explotables), Cloud Security Explorer (queries para detectar misconfiguraciones) y risk prioritization de recommendations. Plan Defender CSPM ~$12/recurso/mes.

Azure Front Door Standard/Premium: WAF, Caching y Rules Engine

Resumen

Azure Front Door Standard/Premium es un CDN global con capacidades integradas de WAF (Web Application Firewall), caching avanzado, rules engine para manipulación de requests/responses y anycast routing desde 118+ PoPs Microsoft. Proporciona aceleración de aplicaciones HTTP/HTTPS, balanceo global, failover automático y protección DDoS L7, reemplazando a Front Door Classic y CDN from Microsoft (classic).

Azure Backup Immutable Vaults: Protección contra ransomware

Resumen

Los Immutable Vaults en Azure Backup bloquean operaciones que podrían eliminar recovery points (stop backup, delete backup data, disable soft delete), protegiendo contra ransomware y actores maliciosos. Al habilitar immutability con lock irreversible, se garantiza que los backups son intocables durante el periodo de retención, cumpliendo requisitos regulatorios (HIPAA, SOC 2, GDPR) y asegurando recuperación ante ataques.

Azure Arc GitOps con Flux v2 para Kubernetes

Resumen

Azure Arc-enabled Kubernetes con GitOps (Flux v2) permite gestionar configuraciones de clusters Kubernetes (on-premises, multicloud, edge) desde repositorios Git de forma declarativa. Flux v2 reconcilia automáticamente el estado deseado definido en Git con el estado real del cluster, proporcionando drift reconciliation, auditoría completa y despliegues automatizados.

Scripts de Reporte para Credenciales Federadas de Azure: Visibilidad Total de tus Identidades Administradas

¡Hola a todos! En el mundo de la seguridad en la nube, mantener un control exhaustivo sobre las credenciales federadas es fundamental para una gestión de identidades robusta. Hoy quiero compartir con vosotros una solución que he desarrollado para resolver uno de los retos más comunes: generar reportes completos de las credenciales federadas de identidades administradas en Azure.

Si habéis trabajado con GitHub Actions, Azure DevOps, o cualquier sistema CI/CD que se integre con Azure usando identidades administradas, sabréis lo importante que es tener visibilidad sobre qué credenciales están configuradas, dónde y cómo.

El Problema: Falta de Visibilidad

Cuando gestionáis múltiples suscripciones de Azure con decenas o cientos de identidades administradas, es muy difícil responder a preguntas básicas como:

  • ¿Qué credenciales federadas tengo configuradas en todas mis suscripciones?
  • ¿Qué repositorios de GitHub tienen acceso a mis recursos de Azure?
  • ¿Hay credenciales obsoletas que debería eliminar?
  • ¿Cómo puedo auditar todas mis configuraciones de identidad federada?

El portal de Azure nos permite ver esto recurso por recurso, pero no hay una vista consolidada que nos permita tener el "big picture" de toda nuestra configuración de seguridad.

La Solución: Scripts de Reporte Automatizados

He desarrollado una solución completa que incluye scripts tanto en Python como en PowerShell para generar reportes detallados de todas las credenciales federadas de identidades administradas en vuestro entorno Azure.

Características Principales

Soporte Multi-Suscripción: Procesa todas las suscripciones disponibles o las que especifiquéis
Filtrado por Tenant: Permite filtrar suscripciones por tenant específico
Múltiples Formatos: Exporta a JSON, CSV y Excel
Logging Robusto: Logs detallados separados de los datos de salida
Validación de Datos: Evita procesar identidades con datos inválidos
Autenticación Flexible: Soporta Managed Identity, Azure CLI, MFA, etc.
Archivo de Tuplas: Genera un archivo adicional con solo las tuplas de credenciales

¿Qué Información Captura?

Los scripts capturan información completa tanto de las identidades administradas como de sus credenciales federadas:

Información de la Identidad: - Nombre y ID de la identidad - Grupo de recursos y ubicación - Principal ID y Client ID - Tenant ID

Información de las Credenciales Federadas: - Nombre e ID de la credencial - Issuer (emisor) - Subject (sujeto) - Audiences (audiencias) - Descripción y tipo

Metadatos del Reporte: - ID y nombre de la suscripción - Tenant ID - Timestamp del reporte

¿Cómo Empezar?

Requisitos Previos

Para Python:

pip install azure-identity azure-mgmt-msi azure-mgmt-resource pandas openpyxl

Para PowerShell:

Install-Module -Name Az.Accounts, Az.ManagedServiceIdentity, Az.Resources, ImportExcel

Ejemplos de Uso

Script de Python:

# Reporte de todas las suscripciones
python federated-identity-credentials-report.py --all-subscriptions --format excel

# Reporte filtrado por tenant
python federated-identity-credentials-report.py --tenant-id "your-tenant-id" --all-subscriptions --format json

# Reporte de una suscripción específica
python federated-identity-credentials-report.py --subscription-id "12345678-1234-1234-1234-123456789012" --format csv

Script de PowerShell:

# Reporte de todas las suscripciones
.\federated-identity-credentials-report.ps1 -AllSubscriptions -Format Excel

# Reporte filtrado por tenant
.\federated-identity-credentials-report.ps1 -TenantId "your-tenant-id" -AllSubscriptions -Format JSON

# Reporte de un grupo de recursos específico
.\federated-identity-credentials-report.ps1 -SubscriptionId "12345678-1234-1234-1234-123456789012" -ResourceGroupName "my-rg" -Format CSV

Características Avanzadas

Archivo de Tuplas de Credenciales

Además del reporte principal, los scripts generan automáticamente un archivo adicional con solo las tuplas de credenciales (credential_issuer, credential_subject, credential_audiences, credential_type). Esto es especialmente útil para:

  • Análisis de patrones de configuración
  • Auditorías de seguridad
  • Integración con otras herramientas de análisis

Logging Separado

Una característica importante es que los logs nunca se mezclan con los datos de salida. Los logs van a stderr y a un archivo de log separado, mientras que los datos puros van a stdout o al archivo especificado. Esto es crucial para la automatización y integración con pipelines de CI/CD.

Validación de Datos

Los scripts incluyen validación robusta para evitar procesar identidades con nombres vacíos o nulos, lo que puede ocurrir en ciertos escenarios de configuración incompleta.

Casos de Uso Reales

1. Auditoría de Seguridad

# Generar reporte completo en Excel para auditoría
python federated-identity-credentials-report.py --all-subscriptions --format excel --output security-audit-$(date +%Y%m%d).xlsx

2. Cleanup de Credenciales Obsoletas

# Exportar a CSV para análisis con herramientas de datos
python federated-identity-credentials-report.py --all-subscriptions --format csv | grep "old-repo-name"

3. Monitoreo Continuo

# Integrar en pipeline de CI/CD para monitoreo continuo
python federated-identity-credentials-report.py --tenant-id "$TENANT_ID" --all-subscriptions --format json > daily-report.json

Estructura de Archivos Generados

Archivo Principal (federated_identity_credentials_report_YYYYMMDD_HHMMSS.json/csv/xlsx):

[
  {
    "identity_name": "github-actions-identity",
    "identity_id": "/subscriptions/.../userAssignedIdentities/github-actions-identity",
    "identity_resource_group": "security-rg",
    "identity_location": "eastus",
    "credential_name": "GitHub-Main-Branch",
    "credential_issuer": "https://token.actions.githubusercontent.com",
    "credential_subject": "repo:myorg/myrepo:ref:refs/heads/main",
    "credential_audiences": "api://AzureADTokenExchange",
    "subscription_name": "Production",
    "tenant_id": "12345678-1234-1234-1234-123456789012",
    "report_timestamp": "2025-07-01T10:30:00"
  }
]

Archivo de Tuplas (credential_tuples_YYYYMMDD_HHMMSS.json/csv/xlsx):

[
  {
    "credential_issuer": "https://token.actions.githubusercontent.com",
    "credential_subject": "repo:myorg/myrepo:ref:refs/heads/main",
    "credential_audiences": "api://AzureADTokenExchange",
    "credential_type": "Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials"
  }
]

Mejores Prácticas de Uso

1. Automatización

Integrad estos scripts en vuestros pipelines de CI/CD para generar reportes automáticos:

# GitHub Actions ejemplo
- name: Generate Federated Credentials Report
  run: |
    python federated-identity-credentials-report.py --all-subscriptions --format json --output report-${{ github.run_number }}.json

- name: Upload Report as Artifact
  uses: actions/upload-artifact@v3
  with:
    name: federated-credentials-report
    path: report-*.json

2. Monitoreo Regular

Ejecutad los scripts de forma regular (diaria o semanal) para detectar cambios no autorizados:

# Cron job ejemplo
0 6 * * 1 /usr/bin/python3 /path/to/federated-identity-credentials-report.py --all-subscriptions --format excel --output /reports/weekly-$(date +\%Y\%m\%d).xlsx

3. Análisis de Drift

Comparad reportes de diferentes fechas para detectar cambios de configuración:

# Comparar reportes para detectar cambios
diff <(jq -S . report-20250701.json) <(jq -S . report-20250708.json)

Consideraciones de Seguridad

⚠️ Permisos Mínimos: Los scripts requieren permisos de lectura sobre las identidades administradas y sus credenciales federadas
⚠️ Datos Sensibles: Los reportes contienen información de configuración sensible - almacenadlos de forma segura
⚠️ Logs: Revisad los logs regularmente para detectar errores de autenticación o acceso

Conclusión

Tener visibilidad completa sobre las credenciales federadas de vuestras identidades administradas es fundamental para mantener una postura de seguridad sólida en Azure. Estos scripts os permitirán:

  • Reducir el riesgo de seguridad mediante auditorías regulares
  • Cumplir con requisitos de compliance generando reportes detallados
  • Optimizar la gestión identificando credenciales obsoletas o mal configuradas
  • Automatizar el monitoreo integrando los scripts en vuestros procesos existentes

Los scripts están disponibles en mi repositorio y son completamente gratuitos y de código abierto. Si os resultan útiles, no dudéis en contribuir con mejoras o reportar issues.

¡Espero que esta herramienta os ayude a mantener vuestros entornos Azure más seguros y mejor documentados!

Enlaces útiles: - 📖 Documentación completa y scripts


Os presento inventariographdrawio: De vuestro Azure a un Diagrama, Automáticamente

¡Hola a todos! Como muchos profesionales que trabajáis día a día con la nube, seguro que os habéis enfrentado al mismo reto que yo una y otra vez: mantener una documentación visual de la infraestructura que sea fiel a la realidad. Dibujar diagramas a mano es tedioso y, peor aún, quedan obsoletos casi al instante.

Cansado de esta tarea manual y de la eterna duda de si un diagrama reflejaba o no el estado real de los recursos, decidí que tenía que haber una forma mejor de hacerlo.

Por eso, hoy quiero presentaros con mucha ilusión un proyecto personal en el que he estado trabajando: inventariographdrawio.

¿Qué es inventariographdrawio?

Es una herramienta de línea de comandos que he creado para solucionar este problema de raíz. Se conecta a una suscripción de Microsoft Azure, analiza los recursos que tienes desplegados y genera automáticamente un diagrama limpio y organizado en formato Draw.io (diagrams.net).

En pocas palabras, es mi solución para pasar de la infraestructura real en Azure a un diagrama editable, sin esfuerzo y en segundos.

¿Por qué lo creé? (Mis Objetivos Principales)

Cuando empecé a desarrollar esta herramienta, tenía varios objetivos en mente:

  1. Ahorrar tiempo: Mi primer objetivo era eliminar las horas que todos perdemos en tareas de documentación repetitivas. Quería que el análisis y el dibujo lo hiciera una máquina, para poder dedicar mi tiempo a lo que de verdad importa: diseñar y mejorar la arquitectura.
  2. Tener una fuente de la verdad: Necesitaba un diagrama en el que pudiera confiar. Con inventariographdrawio, el resultado es un reflejo exacto de lo que hay desplegado, perfecto para auditorías, revisiones o para explicarle la arquitectura a un nuevo compañero.
  3. Mejorar la visibilidad: A veces, en el portal de Azure es difícil ver el "big picture". Representar los recursos de forma gráfica me ayuda a entender las dependencias y la estructura general de un solo vistazo.
  4. Enfocarme en Azure: Decidí centrarme exclusivamente en Azure para poder ofrecer un buen nivel de detalle y precisión en los recursos y servicios específicos de la plataforma, que es donde trabajo principalmente.

¿Cómo podéis empezar a usarlo?

He intentado que sea lo más sencillo posible. Solo tenéis que seguir estos pasos:

  1. Clonar el repositorio:

    git clone https://github.com/rfernandezdo/inventariographdrawio.git
    cd inventariographdrawio
    
  2. Instalar las dependencias: La herramienta tiene unas pocas dependencias que podéis instalar fácilmente (revisad el fichero README.md para las instrucciones exactas).

  3. Configurar el acceso a Azure: Aseguraos de tener vuestra sesión de Azure activa (por ejemplo, con az login desde Azure CLI) para que la herramienta pueda autenticarse y leer los recursos.

  4. Ejecutar y ¡listo! Lanzad el script y veréis cómo aparece un nuevo fichero .drawio en la carpeta del proyecto, listo para abrir y editar.

Aquí un ejemplo navegable de un diagrama de Azure con iconos, creado con draw.io y exportado como un enlace para visualizarlo directamente en el navegador, es navegable:

Microsoft Entra Domain Services con Replica Set en una vpn Vnet2Vnet

El futuro

Este es solo el comienzo del proyecto. Mi idea es seguir ampliándolo para que sea compatible con más servicios de Azure y añadir nuevas funcionalidades que lo hagan aún más útil.

Al ser un proyecto de código abierto, cualquier ayuda es bienvenida. Si os animáis, podéis abrir issues con sugerencias o incluso enviar vuestros propios pull requests.

Espero de corazón que esta herramienta os resulte útil y os ahorre tanto tiempo como a mí.

¡Gracias por leer!