Skip to content

2025/10

Git Workflows: GitFlow vs GitHub Flow vs Trunk-Based vs Release Flow

Resumen

Existen múltiples estrategias de branching Git para gestionar el desarrollo de software: GitFlow (modelo complejo con develop/feature/release/hotfix branches para equipos grandes), GitHub Flow (minimalista con feature branches + main + deploy before merge), GitLab Flow (híbrido con environment branches staging/production para control deployment), Trunk-Based Development (commits directos a main con short-lived branches <24h, usado por Google/Facebook), Release Flow (trunk-based + release branches sin merge back, usado por Microsoft Azure), OneFlow (GitFlow simplificado eliminando develop branch), y Feature Branch Workflow (básico con feature branches + pull requests). Cada estrategia se adapta a diferentes tamaños de equipo, frecuencia de releases, madurez CI/CD y control de environments.

Sistema de planificación diaria contextual con Microsoft 365

Resumen

Sistema práctico para planificar el día usando Microsoft 365 (To Do, Outlook, Teams, Power Automate, Viva Insights) con enfoque GTD y priorización realista. Incluye flujo de sincronización tasks.xlsx, tablas operativas y buenas prácticas sin relleno.

¿Qué es este sistema?

  • Origen único de verdad de tareas personales y de equipo
  • Priorización visual (🔴🟡🟢) + Big Rock diario
  • Sincronización automática To Do → Excel (tasks.xlsx) vía Power Automate
  • Integración con Outlook (correo/calendario) y Teams (menciones y actividad)
  • Protección de bloques de foco usando Viva Insights (focus plan)

Arquitectura / Flujo operativo

flowchart LR
    subgraph Input
      Email[Outlook Emails]
      Meetings[Calendar]
      Chats[Teams @mentions]
      Planner[Planner Tasks]
    end
    Email --> ToDo[Microsoft To Do]
    Chats --> ToDo
    Planner --> ToDo
    ToDo <---> PowerAutomate[Power Automate Flow]
    PowerAutomate --> Excel[(tasks.xlsx)]
    Excel --> Reporte[Vista Tablas / Plan Diario]
    Viva[Viva Insights Focus Blocks] --> CalendarSync[Calendario]
    CalendarSync --> Plan
    ToDo --> Plan[Plan Diario]

Componentes clave

Componente Rol Notas
Microsoft To Do Captura y priorización Vista unificada (Outlook + Planner + manual)
Power Automate Sincronización Flujo cada 4h actualiza/crea filas en Excel
Excel Online (Business) tasks.xlsx persistencia Auditoría + posible análisis Power BI
Outlook Calendar Bloques de ejecución Deep Work + comunicaciones en ventanas controladas
Teams Comunicaciones accionables Filtrar @menciones y actividad directa
Viva Insights Focus plan Silencia notificaciones en bloques críticos

Flujo Power Automate (resumen)

Acciones (según JSON del flujo real):

  1. Trigger: Recurrence cada 4h
  2. GetLists (To Do lists)
  3. ForEach listas → List To-Dos
  4. Para cada tarea:
  5. Get_a_to-do (detalle)
  6. Excel List rows present in a table filtrando por IDTarea
  7. If existe → Update a row
  8. Else → Add a row into a table

Campos críticos que se sincronizan: Lista, IDLista, Tarea (title), Estado, Prioridad (importance), FechaVencimiento, Notas, ReminderDateTime, CreatedDateTime, LastModifiedDateTimeToDo, FlagSyncPendiente.

Beneficios:

  • Evita duplicados: Excel refleja estado real
  • Permite validar antes de sugerir una tarea (regla No duplicidad)
  • Base para auditoría (quién, cuándo, cambios)

Así queda por ahora:

alt text

Tip

Se podría implementar que también se borrara una fila del excel si se borrara desde Microsoft TO DO

Warning

No se puede establecer sincronización bidireccional todavía porque los steps de TO DO no están en los conectores de Power Automate(28/10/2025)

Implementación práctica rápida

El prompt completo lo dejé en otro post a parte para mayor legibilidad: Sistema de Planificación Diaria Contextual con Microsoft 365 Prompt

Ejemplo de salida completo (datos ficticios)

1. 🎯 Foco del Día

Campo Valor
Fecha Martes, 28/10/2025
Big Rock Diseñar esquema inicial de automatización "Proyecto Orion"
Tiempo dedicado 2h Deep Work (bloque único)
Herramienta Microsoft To Do (⭐)
Resultado esperado Documento orion_automation_outline.md en OneDrive

2. 🗓️ Agenda y Bloques Temporales

Hora Tipo Actividad Objetivo App Notas
08:45-09:00 Preparación Revisión rápida inbox + To Do Limpiar entrada Outlook/To Do Máx 15 min
09:00-11:00 Deep Work Big Rock Orion Generar estructura Focusing (Viva) Notifs OFF
11:00-11:20 Comunicación Correos 🔴 Desbloquear Outlook Solo alta
11:20-11:40 Comunicación Chats @mención Cerrar pendientes Teams Filtrar actividad
13:00-13:30 Tareas secundarias 2 micro tareas Soporte To Do Ver sección 4
16:30-16:45 Cierre Checklist diario Preparar mañana To Do Big Rock siguiente

3. 📧 Priorización de Comunicaciones (últimas 24h ficticias)

Pri Origen Remitente/Canal Asunto Acción requerida Respuesta sugerida Tiempo
🔴 Outlook "Para mí" Usuario.Test Acl. dependencias Orion Confirmar supuestos "Dependencias validadas: sólo API Core y Storage. Sigo." 8m
🔴 Teams @mención Canal #arquitectura Revisión diagrama preliminar Dar feedback "Añado nota sobre colas y reintentos." 6m
🟡 Teams chat 1:1 Dev.Helper Pregunta naming conv. Indicar patrón "Usar prefijo 'orion-' + función." 4m
🟢 Outlook CC Notificaciones Informe semanal Leer luego - 3m

4. ✅ Tareas Secundarias (máx 3)

# Tarea Origen Tiempo est. Herramienta Dependencias
1 Documentar convención de nombres orion-* To Do 10m OneDrive Ninguna
2 Actualizar lista canales activos To Do 10m Teams Canales vigentes
3 Revisar borrador diagrama cola retry Planner 15m Whiteboard Diagrama creado

5. 📂 Colaboración y Documentos

Documento Ubicación Estado Acción
orion_automation_outline.md /OneDrive/Proyectos/Orion Nuevo Crear secciones
naming_guidelines.md /OneDrive/Shared Borrador Añadir apartado colas
arch_diagram.drawio /OneDrive/Designs Revisión Confirmar flujos

6. 📝 Tareas Faltantes (validación previa)

🔴 [ALTA] Crear outline inicial Proyecto Orion today
🟡 [MEDIA] Añadir sección colas en naming_guidelines.md today
🟢 [BAJA] Programar revisión informal diagrama retry in 3 days
Todas inexistentes en estado completado en la fuente (ejemplo ficticio).

7. ⏭️ Cierre (plantilla aplicada)

Item Estado Acción
Big Rock completado Reprogramar mañana si no
Comunicaciones 🔴 resueltas Escalar si bloqueo
Tareas incompletas movidas Etiqueta #mañana
Sync verificada Revisar timestamps
Big Rock siguiente definido Bloquear 09:00

Checklist:

  • Marcar tareas completadas en To Do
  • Validar no duplicados nuevos
  • Bloquear Deep Work mañana
  • Confirmar ausencia de 🔴 pendientes

Buenas prácticas operativas

Área Recomendación
Captura Procesar inbox máximo 3 veces/día, nunca en continuo
Prioridad 1 solo Big Rock; si falla → causa raíz en cierre
Deep Work Bloques > 90m con notificaciones silenciadas (Focus plan)
Sincronización Revisar flujo si FlagSyncPendiente ≠ FALSE persistente
Ruido Teams Limitar notificaciones a @menciones y chats directos
Excel Evitar editar manualmente filas salvo columna de auditoría
Privacidad No colocar PII sensible en notas de tarea (almacenadas en Excel)

Seguridad y Compliance

  • Minimizar datos sensibles en Notas
  • Revisar permisos de OneDrive (no compartir tasks.xlsx públicamente)
  • Conectores estándar (To Do, Excel Online Business) → cumplimiento base M365
  • Auditoría: timestamps CreatedDateTime y LastModifiedDateTimeToDo permiten trazar secuencia

Limitaciones

Área Límite Mitigación
Frecuencia sync Cada 4h (ejemplo) Ajustar a 4h si alta rotación
Colisiones edición Cambios simultáneos Excel vs flujo Tratar Excel como lectura / solo flujo escribe
Latencia notificaciones Teams Depende configuración usuario Enfoque en bloques revisión comunicaciones
Focus plan Usuarios pueden cancelar bloques Educar en protección mínima diaria

Extensiones posibles

  • Power BI sobre tasks.xlsx (tendencias prioridad)
  • Power Automate adicional: mover tareas vencidas a lista "Revisión"
  • Integrar con Planner para tareas de equipo críticas
  • Script de limpieza de tareas completadas >30 días

Referencias oficiales

  • Microsoft To Do API (Graph): https://learn.microsoft.com/en-us/graph/todo-concept-overview
  • Integración tareas Outlook / To Do / Planner (comparativa): https://learn.microsoft.com/en-us/microsoft-365/community/which-task-management-option
  • Excel Online (Business) connector: https://learn.microsoft.com/en-us/connectors/excelonlinebusiness/
  • Power Automate conexiones: https://learn.microsoft.com/en-us/power-automate/add-manage-connections
  • Teams activity / notificaciones buenas prácticas: https://learn.microsoft.com/en-us/graph/teams-activity-feed-notifications-best-practices
  • Viva Insights Focus / Book focus time: https://learn.microsoft.com/en-us/viva/insights/personal/briefing/be-focus
  • Focus plan / hábitos productividad: https://learn.microsoft.com/en-us/viva/insights/personal/teams/focus
  • Planner + Tasks integración en Teams: https://learn.microsoft.com/en-us/microsoft-365/community/which-task-management-option#tasks-by-planner-and-to-do-teams-app

Cierre

Sistema ligero, incremental y auditable. La clave: una sola fuente de verdad, priorización explícita y bloques de foco protegidos. Itera semanalmente: elimina fricción y automatiza validaciones.

Sistema de Planificación Diaria Contextual con Microsoft 365 (prompt)

Este prompt está relacionado con el artículo Sistema de Planificación Diaria Contextual con Microsoft 365


🎯 CONTEXTO DEL ASISTENTE

Rol: Eres un asistente ejecutivo experto en productividad con Microsoft 365, especializado en técnicas GTD (Getting Things Done) y gestión del tiempo.

Objetivo principal: Ayudar al usuario a planificar y ejecutar su jornada laboral de forma eficiente, priorizando tareas críticas y comunicaciones directas, eliminando redundancias y optimizando el uso de herramientas M365.

Principios de operación:

  1. No duplicidad: Nunca sugerir tareas/correos/reuniones ya procesadas o completadas
  2. Evidencia: Validar contra tasks.xlsx antes de cualquier sugerencia
  3. Priorización: Comunicaciones directas > Comunicaciones grupales
  4. Eficiencia temporal: Ventanas de 24h (diario) o 72h (lunes)
  5. Formato estructurado: Usar tablas Markdown para claridad visual

📋 FUENTES DE DATOS

Archivo de tareas sincronizado

  • Ubicación: tasks.xlsx
  • Propósito: Fuente de verdad para el estado de tareas (completadas/pendientes)
  • Validación: Consultar SIEMPRE antes de sugerir tareas

Ventana temporal

  • Lunes: Analizar últimas 72 horas
  • Resto de días: Analizar últimas 24 horas

Herramientas M365 integradas

  • Microsoft To Do (tareas y prioridades)
  • Outlook (calendario y correos)
  • Microsoft Teams (chats y reuniones)
  • Planner (tareas colaborativas)
  • SharePoint/OneDrive (documentos)

🔄 FLUJO DE TRABAJO (Chain of Thought)

PASO 1: Recopilación

1. Consultar tasks.xlsx para estado actual de tareas
2. Revisar Outlook Calendar para reuniones del día
3. Filtrar correos "Para mí" y chats con @menciones
4. Identificar tareas bloqueadas o con dependencias

PASO 2: Análisis y Priorización

1. Identificar el Big Rock (tarea más crítica del día)
2. Clasificar comunicaciones:
   - ALTA: @menciones directas, correos "Para mí", chats 1:1
   - MEDIA: Correos con acción requerida, canales activos
   - BAJA: Canales generales, CC, notificaciones
3. Detectar conflictos de agenda o sobrecarga
4. Validar que ninguna tarea sugerida esté completada en tasks.xlsx

PASO 3: Estructuración

1. Crear plan de bloques temporales
2. Asignar tareas a bloques específicos
3. Preparar respuestas tipo para correos/chats
4. Generar checklist de cierre

PASO 4: Entrega

Formato: Tablas Markdown estructuradas
Incluir: Prioridades, tiempos estimados, herramienta M365 asociada
Validar: No duplicar elementos ya procesados

📊 ESTRUCTURA DE SALIDA

1. 🎯 Foco del Día

Campo Valor
Fecha [Día de semana, DD/MM/YYYY]
Big Rock [Única tarea más crítica]
Tiempo dedicado [X horas]
Herramienta Microsoft To Do (⭐ Prioridad)
Resultado esperado [Entregable concreto]

Ejemplo:

Campo Valor
Fecha Lunes, 20/10/2025
Big Rock Completar informe Q3 para dirección
Tiempo dedicado 3 horas
Herramienta Microsoft To Do (⭐ Prioridad)
Resultado esperado Documento final en SharePoint

2. 🗓️ Agenda y Bloques Temporales

Hora Tipo Actividad Objetivo App Notas
09:00-09:30 Reunión Standup equipo Sincronización Teams Preparar updates
09:30-12:00 Bloque Deep Work Big Rock: Informe Q3 Avance crítico Outlook (Bloqueado) Sin interrupciones
12:00-13:00 Almuerzo - - - -
13:00-14:00 Comunicación Responder correos alta prioridad Desbloqueadores Outlook Ver sección 3
14:00-15:30 Tareas secundarias Lista To Do Soporte To Do Máx. 3 tareas
15:30-16:00 Cierre Revisión y planificación Preparar mañana To Do Ver sección 7

Principios de bloqueo:

  • Deep Work → Notificaciones OFF, Focus Assist activado
  • Reuniones consecutivas → Dejar 5-10 min buffer
  • Revisar correos en bloques específicos (no constantemente)

3. 📧 Priorización de Comunicaciones

Criterio de filtrado: Menciones directas > Para mí > CC/Canales generales

Pri Origen Remitente/Canal Asunto/Tema Acción requerida Respuesta sugerida Tiempo est.
🔴 Alta Outlook "Para mí" Juan Pérez Aprobación documento Revisar y aprobar "Revisado y aprobado. Documento en SharePoint con comentarios." 15 min
🔴 Alta Teams @mención @María López Bloqueador API Proveer credenciales "Credenciales enviadas por mensaje privado. Validar acceso." 10 min
🟡 Media Teams chat 1:1 Carlos Ruiz Duda proceso Clarificar paso 3 "El paso 3 requiere validación previa. Te envío guía." 5 min
🟢 Baja Canal #general - Anuncio nuevas políticas Leer cuando haya tiempo - 5 min

Regla de oro: Responder comunicaciones 🔴 Alta antes de las 14:00h del mismo día.


4. ✅ Tareas Secundarias

Límite: Máximo 3 tareas de soporte por día (además del Big Rock)

# Tarea Origen Tiempo est. Herramienta Dependencias
1 Actualizar documento técnico sección 4.2 To Do 30 min OneDrive Ninguna
2 Revisar PR #1234 del repositorio Planner 20 min GitHub + Teams Acceso repo
3 Preparar agenda reunión jueves Outlook 15 min Outlook Confirmar asistentes

Validación: ✅ Ninguna de estas tareas aparece como completada en tasks.xlsx


5. 💡 Colaboración y Documentos Clave

Teams - Canales prioritarios
Canal Proyecto Frecuencia revisión Filtro
#proyecto-alpha Alpha v2.0 3x/día Mi Actividad + @menciones
#soporte-ti Incidencias 2x/día Solo @menciones
Documentos activos (SharePoint/OneDrive)
Documento Ubicación Estado Acción pendiente
Informe_Q3_v3.docx /Documentos/Informes/ Borrador Revisar sección financiera
Roadmap_2025.xlsx /Proyectos/Planning/ Revisión Actualizar fechas Q4

Consejo: Anclar documentos frecuentes en OneDrive para acceso rápido.


6. 📝 Listado de Tareas Faltantes para Microsoft To Do

Formato de salida: Una tarea por línea, prioridad incluida en el texto. El tamaño máximo de cada tarea es de 255 caracteres. Se permite decir cuando tendría que estar la tarea (ejemplo: "in 2 days", "next Monday", "10/25/2025").

Validación previa: Las siguientes tareas NO aparecen en tasks.xlsx como completadas:

🔴 [ALTA] Preparar slides para presentación stakeholders today
🔴 [ALTA] Completar sección 4 del informe Q3 3pm
🟡 [MEDIA] Revisar y comentar propuesta de arquitectura v2 tomorrow
🟡 [MEDIA] Actualizar backlog con tareas emergentes de standup next Monday
🟢 [BAJA] Organizar carpeta de emails antiguos (>3 meses) 10/25/2025
🟢 [BAJA] Limpiar lista "Backlog personal" en Planner 10/31
🟢 [BAJA] Enviar resumen semanal al equipo in 2 days
🟢 [BAJA] Completar revisión de documentación técnica en SharePoint in 1 week

Instrucción de importación: Copiar cada línea y pegarla como nueva tarea en Microsoft To Do. El emoji indica prioridad visual.


7. ⏭️ Cierre de Día y Preparación

Tiempo: 10-15 minutos antes de finalizar la jornada

Item Estado Acción
Big Rock completado ✅ Sí / ❌ No Si no → Reprogramar para mañana (primer bloque)
Comunicaciones 🔴 Alta resueltas ✅ Sí / ❌ No Si no → Revisar bloqueo/dependencia
Tareas incompletas [Cantidad] Mover a mañana en To Do con etiqueta 📅
Sincronización tasks.xlsx ✅ Verificada Marcar completadas en Excel y To Do
Big Rock de mañana [Definir] Añadir a To Do con ⭐ Prioridad
Checklist de cierre
  • Revisar tasks.xlsx y marcar tareas completadas hoy
  • Confirmar que no hay correos 🔴 Alta sin responder
  • Mover tareas incompletas a "Mañana" en To Do
  • Definir Big Rock del día siguiente
  • Bloquear tiempo de Deep Work en Outlook para mañana
  • Cerrar todas las pestañas/apps no esenciales

Pregunta reflexiva: ¿El día de mañana está preparado para ser ejecutado sin fricción?


🤖 INSTRUCCIONES CRÍTICAS PARA EL ASISTENTE

Reglas de validación (OBLIGATORIAS)

ANTES de sugerir cualquier tarea:
  1. CONSULTAR tasks.xlsx
  2. SI tarea.completada == TRUE → NO sugerir
  3. SI tarea.no_existe_en_excel → Indicar explícitamente "Nueva tarea detectada"
  4. SI hay duda → PREGUNTAR al usuario antes de asumir

Restricciones de contenido

  • ❌ NO recomendar tareas/correos/reuniones ya procesadas
  • ❌ NO inventar información sobre estado de tareas
  • ❌ NO asumir prioridades sin contexto del usuario
  • ✅ SÍ marcar explícitamente tareas completadas
  • ✅ SÍ indicar cuando una tarea no aparece en tasks.xlsx
  • ✅ SÍ preguntar si hay ambigüedad

Formato de respuesta

  • Usar tablas Markdown para estructuras complejas
  • Usar listas para secuencias de acciones
  • Usar emojis para prioridades visuales (🔴🟡🟢)
  • Usar negritas para elementos críticos
  • Mantener lenguaje claro, conciso y accionable

Contexto temporal

  • Lunes: Ventana de 72 horas (incluir fin de semana)
  • Martes-Viernes: Ventana de 24 horas (día anterior)
  • Fecha actual: Siempre especificar en formato "Día, DD/MM/YYYY"

💡 Consejos Avanzados M365

Integraciones productivas

  • Email → Tarea: Arrastrar email a To Do desde Outlook
  • Focus Assist: Activar durante bloques Deep Work
  • Filtros Teams: Usar "Mi Actividad" para reducir ruido
  • Power Automate: Sincronizar automáticamente tasks.xlsx con To Do
  • Viva Insights: Revisar métricas de colaboración semanalmente

Atajos de teclado esenciales

  • Ctrl+Shift+A: Nueva tarea en To Do
  • Ctrl+Shift+V: Abrir videollamada Teams
  • Alt+H: Ver bandeja de entrada Outlook
  • Ctrl+2: Cambiar a vista Calendario Outlook

📚 Ejemplo Completo de Salida Esperada

Petición del usuario: "Planifica mi día de hoy, lunes 20/10/2025"

Respuesta del asistente:

1. 🎯 Foco del Día

Campo Valor
Fecha Lunes, 20/10/2025
Big Rock Finalizar análisis de requisitos proyecto Beta
Tiempo dedicado 3 horas
Herramienta Microsoft To Do (⭐ Prioridad)
Resultado esperado Documento de requisitos v1.0 en SharePoint

2. 🗓️ Agenda y Bloques Temporales

Hora Tipo Actividad Objetivo App
09:00-09:30 Reunión Kickoff semana con equipo Alineación Teams
09:30-12:30 Deep Work Big Rock: Análisis requisitos Documento final Outlook (Bloqueado)
13:00-13:45 Comunicación Responder 5 correos alta prioridad Desbloqueadores Outlook
14:00-15:00 Tareas Revisar PRs pendientes Soporte desarrollo GitHub

3. 📧 Priorización de Comunicaciones (últimas 72h)

Pri Origen Asunto Acción Respuesta sugerida Tiempo
🔴 Outlook "Para mí" Aprobación presupuesto Q4 Aprobar "Aprobado con observaciones en línea 23. Proceder." 20 min
🔴 Teams @mención Bloqueador en ambiente staging Proveer acceso "Acceso concedido. Validar en 15 min." 10 min

6. 📝 Tareas Faltantes (validadas vs tasks.xlsx)

🔴 [ALTA] Completar análisis de requisitos proyecto Beta (Big Rock)
🟡 [MEDIA] Revisar PRs #445 y #446 antes de 15:00h
🟢 [BAJA] Actualizar firma de correo con nuevo cargo

✅ Validación: Ninguna de estas tareas aparece como completada en tasks.xlsx


Fin del prompt contextual

Azure Deployment Environments: Self-service para desarrolladores

Resumen

Azure Deployment Environments es el reemplazo de DevTest Labs, diseñado para que equipos de desarrollo creen entornos completos (App Service + Cosmos + Key Vault + Storage) desde un catálogo de plantillas IaC sin esperar a Platform Engineering. Dev Centers centralizan la gobernanza, Projects definen permisos, y developers despliegan con CLI/Portal. Zero acceso a subscriptions de producción.

Azure AI Foundry: tu hub unificado para IA generativa en Azure

Resumen

Azure AI Foundry (antes Azure AI Studio) es la plataforma unificada de Microsoft para desarrollar, desplegar y gestionar aplicaciones de IA generativa. Con acceso a 1900+ modelos (GPT-4o, o1, DeepSeek, Llama...), un entorno colaborativo tipo MLOps, y herramientas para RAG, evaluación y monitorización, todo en un portal integrado.

Si trabajas con Azure OpenAI, LangChain, o quieres construir copilots/agents, este es tu punto de partida.

Terraform: Uso de Variables y Secrets de GitHub

Resumen

Cómo usar variables y secrets de GitHub en despliegues con Terraform para Azure. Ejemplo práctico y buenas prácticas para admins y DevOps que quieren CI/CD seguro y reproducible.

¿Qué problema resuelve?

Permite gestionar credenciales y parámetros sensibles (como client secrets, IDs, claves) de forma segura en pipelines de GitHub Actions, evitando exponerlos en el código fuente.

¿Qué es y cómo funciona?

  • Secrets: Valores cifrados almacenados en GitHub (por repo o por entorno). Ej: credenciales Azure, claves API.
  • Variables de configuración: Valores no sensibles, útiles para parámetros de entorno, nombres, ubicaciones, flags, etc. Se gestionan en Settings → Secrets and variables → Actions → Variables.
  • Los workflows de GitHub Actions pueden acceder a estos valores como variables de entorno.
  • Terraform puede consumirlos usando la sintaxis ${{ secrets.SECRET_NAME }} para secrets y ${{ vars.VAR_NAME }} para variables de configuración en el workflow.

Ejemplo sencillo: despliegue de Azure Resource Group con variables y secrets

1. Añadir secrets en GitHub

  • Ve a tu repo → Settings → Secrets and variables → Actions
  • Añade los secrets:
  • AZURE_CLIENT_ID
  • AZURE_TENANT_ID
  • AZURE_SUBSCRIPTION_ID

2. Añadir variables de configuración (no sensibles)

  • Ejemplo: RG_NAME, LOCATION

3. Workflow de GitHub Actions (.github/workflows/terraform.yml)

name: 'Terraform Azure'
on:
  push:
    branches: [ main ]

---
  deploy:
    runs-on: ubuntu-latest
    env:
      # Recomendado: Federated Identity (OIDC) - no uses client secret
      ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
      TF_VAR_rg_name: ${{ vars.RG_NAME }}
      TF_VAR_location: ${{ vars.LOCATION }}
    steps:
      - uses: actions/checkout@v4
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v3
      - name: Terraform Init
        run: terraform init
      - name: Terraform Plan
        run: terraform plan
      - name: Terraform Apply
        run: terraform apply -auto-approve

En este ejemplo, RG_NAME y LOCATION son variables de configuración definidas en GitHub (no secrets) y se pasan automáticamente como variables de entrada a Terraform usando el prefijo TF_VAR_.

4. Código Terraform (main.tf)

provider "azurerm" {
  features {}
}

variable "rg_name" {
  description = "Nombre del resource group"
  type        = string
}

variable "location" {
  description = "Ubicación Azure"
  type        = string
}

resource "azurerm_resource_group" "ejemplo" {
  name     = var.rg_name
  location = var.location
}

Objetos complejos y versiones recientes de Terraform

Desde Terraform 1.3 en adelante, puedes pasar mapas y listas directamente como variables de entorno usando el prefijo TF_VAR_, sin necesidad de jsonencode/jsondecode. Terraform los interpreta automáticamente si el valor es un JSON válido.

Ejemplo directo (Terraform >= 1.3)

env:
  TF_VAR_tags: '{"env":"prod","owner":"devops"}'
variable "tags" {
  type = map(string)
}

resource "azurerm_resource_group" "ejemplo" {
  name     = var.rg_name
  location = var.location
  tags     = var.tags
}
No necesitas usar jsondecode() si la variable ya es del tipo adecuado y el valor es JSON válido.

¿Y si necesitas un objeto complejo y usas versiones antiguas?

Si necesitas pasar un objeto complejo (por ejemplo, un mapa o lista de objetos) y tu versión de Terraform es anterior a 1.3, lo más habitual es usar un secret o variable en formato JSON y parsearlo en Terraform.

env:
  TF_VAR_tags_json: ${{ secrets.TAGS_JSON }}
variable "tags_json" {
  description = "Tags en formato JSON"
  type        = string
}

locals {
  tags = jsondecode(var.tags_json)
}

resource "azurerm_resource_group" "ejemplo" {
  name     = var.rg_name
  location = var.location
  tags     = local.tags
}
Así puedes pasar cualquier estructura compleja (mapas, listas, objetos anidados) como string JSON y usar jsondecode() en Terraform para convertirlo a un tipo nativo. draft: false date: 2025-10-23 authors:

  • rfernandezdo categories:

  • DevOps

  • Terraform
  • GitHub Actions tags:

  • Terraform

  • GitHub Secrets
  • Azure

Buenas prácticas

  • Usa federated identity (OIDC) siempre que sea posible, evita client secrets.
  • Nunca subas secrets al repo ni los hardcodees en el código.
  • Usa GitHub Environments para separar prod/dev y limitar acceso a secrets.
  • Usa variables para parámetros no sensibles (ej: nombres, ubicaciones).
  • Valida siempre con terraform validate antes de aplicar.
  • Rota los secrets periódicamente si usas client secrets legacy.

Referencias

Azure Container Apps en 2025: La Evolución del Serverless para Contenedores

Resumen

Azure Container Apps ha evolucionado significativamente desde su lanzamiento en 2022. Este artículo actualizado explora las capacidades actuales del servicio, las novedades incorporadas en 2024-2025, y cómo se posiciona como la solución ideal para ejecutar aplicaciones nativas de la nube sin la complejidad de gestionar Kubernetes directamente.

TL;DR

  • Azure Container Apps es un servicio serverless que ejecuta contenedores sin gestionar infraestructura, construido sobre Kubernetes, KEDA, Dapr y Envoy
  • Novedades 2024-2025: GPUs serverless, Dynamic Sessions, Azure Functions integradas, workload profiles dedicados con GPUs A100/T4
  • Casos de uso: microservicios, APIs, procesamiento de eventos, cargas AI/ML, aplicaciones con IA generativa
  • Escalado automático (incluso a cero), revisiones, traffic splitting, integración nativa con servicios Azure

El Problema que Resuelve

«Necesito ejecutar aplicaciones Cloud Native en contenedores, pero no quiero la complejidad operativa de Kubernetes, OpenShift, etc.»

Esta es una necesidad recurrente en equipos de desarrollo que quieren aprovechar las ventajas de los contenedores y arquitecturas de microservicios sin dedicar recursos a:

  • Configurar y mantener clusters de Kubernetes
  • Gestionar nodos, redes, almacenamiento
  • Administrar actualizaciones y parches del orquestador
  • Implementar observabilidad y monitorización avanzada desde cero

Azure Container Apps: La Solución Serverless

Azure Container Apps es un servicio gestionado serverless que permite ejecutar contenedores sin preocuparse por la infraestructura subyacente. Lanzado inicialmente en 2022 y con mejoras continuas, se ha convertido en una opción madura para desplegar aplicaciones modernas.

Arquitectura Subyacente

Aunque no gestionas directamente Kubernetes, bajo el telón Azure Container Apps funciona sobre:

  • Azure Kubernetes Service (AKS): proporciona el orquestador
  • KEDA (Kubernetes Event Driven Autoscaling): escalado basado en eventos
  • Dapr (Distributed Application Runtime): integración nativa para microservicios
  • Envoy: proxy para enrutamiento y observabilidad
flowchart TB
  subgraph Internet["Internet / Usuarios"]
    USER["Cliente HTTP/API"]
  end

  subgraph ACA["Azure Container Apps Environment"]
    INGRESS["Ingress (Envoy)"]
    APP1["Container App 1"]
    APP2["Container App 2"]
    APP3["Container App 3"]
    DAPR["Dapr Sidecar"]
    KEDA["KEDA Scaler"]
  end

  subgraph Backend["Servicios Backend"]
    STORAGE["Azure Storage"]
    COSMOSDB["Cosmos DB"]
    SERVICEBUS["Service Bus"]
  end

  USER --> INGRESS
  INGRESS --> APP1
  INGRESS --> APP2
  INGRESS --> APP3
  APP1 --> DAPR
  APP2 --> DAPR
  DAPR --> STORAGE
  DAPR --> COSMOSDB
  SERVICEBUS --> KEDA
  KEDA --> APP3

Características Distintivas

Azure Container Apps se diferencia de otras soluciones de contenedores en Azure por:

  1. Optimización para microservicios: diseñado específicamente para aplicaciones que abarcan múltiples contenedores desplegados como servicios independientes

  2. Tecnologías open-source integradas:

  3. Dapr: service-to-service invocation, pub/sub, state management
  4. KEDA: escalado basado en eventos y métricas
  5. Envoy: balanceo de carga y observabilidad

  6. Arquitecturas event-driven: escalado basado en:

  7. Tráfico HTTP
  8. Mensajes en colas (Service Bus, Storage Queues, Event Hubs)
  9. Métricas personalizadas
  10. Escalado a cero para reducir costes

  11. Soporte para cargas de larga duración: procesos background, jobs y tareas programadas

Novedades 2024-2025: Lo que ha Cambiado

Desde el post original de 2022, Azure Container Apps ha incorporado capacidades empresariales significativas:

1. GPUs Serverless y Dedicadas (2024)

Serverless GPUs disponibles en regiones West US 3, Australia East y Sweden Central:

  • NVIDIA T4: coste-efectivas para inferencia de modelos pequeños (<10GB)
  • NVIDIA A100: para modelos grandes (>10GB), training, y cargas computacionales intensivas

Dedicated GPU workload profiles:

  • Perfiles NC24-A100, NC48-A100, NC96-A100
  • Aislamiento garantizado con hardware dedicado
  • Ideal para cargas de IA/ML continuas con baja latencia
# Ejemplo: Crear environment con GPU serverless
az containerapp env create \
  --name my-gpu-environment \
  --resource-group my-rg \
  --location westus3 \
  --enable-workload-profiles

# Desplegar app con GPU T4
az containerapp create \
  --name my-ai-app \
  --resource-group my-rg \
  --environment my-gpu-environment \
  --image myregistry.azurecr.io/ml-inference:latest \
  --cpu 8 --memory 56Gi \
  --workload-profile-name Consumption-GPU-NC8as-T4 \
  --target-port 8080 \
  --ingress external

2. Dynamic Sessions (Preview - 2024)

Ejecución segura y aislada de código generado por IA, ideal para:

  • Sandboxing de código no confiable
  • Evaluación de código generado por LLMs
  • Agentes de IA que ejecutan código dinámicamente

Características:

  • Aislamiento completo mediante Hyper-V
  • Contenedores gestionados (Python, Node.js) o personalizados
  • Escalado rápido y efímero

3. Azure Functions en Container Apps (GA - 2024)

Despliegue de Azure Functions como contenedores dentro de Container Apps:

  • Todos los triggers de Functions disponibles
  • Escalado basado en KEDA
  • Compartir infraestructura con microservicios y APIs
  • Soporte para GPUs en funciones compute-intensive
# Crear Function App optimizada para Container Apps
az containerapp create \
  --name my-function-app \
  --resource-group my-rg \
  --environment my-environment \
  --image myregistry.azurecr.io/my-functions:latest \
  --kind functionapp \
  --ingress external \
  --target-port 80

4. Workload Profiles Mejorados

Consumption Profile (por defecto):

  • Escalado automático
  • Pago solo por uso activo
  • Hasta 4 vCPU / 8 GiB memoria por réplica

Dedicated Profiles (opcionales):

  • General purpose (D4, D8, D16, D32)
  • Memory optimized (E4, E8, E16, E32)
  • GPU enabled (NC24-A100, NC48-A100, NC96-A100)

5. Networking y Seguridad Avanzada

  • Private Endpoints: acceso privado sin exposición pública
  • User Defined Routes (UDR): control total del tráfico de salida
  • NAT Gateway integration: simplifica conectividad saliente
  • Azure Front Door integration: CDN y WAF con Private Link
  • Client certificate authentication (mTLS): autenticación mutua TLS

6. Certificados Gestionados y Key Vault (GA - 2024)

  • Certificados TLS gratuitos gestionados automáticamente
  • Integración con Azure Key Vault para certificados personalizados
  • Renovación automática

7. Componentes Java Gestionados (Preview - 2024)

Para aplicaciones Spring:

  • Eureka Server: service discovery gestionado
  • Config Server: configuración centralizada
  • Tomcat support: despliegue directo desde código
  • JVM memory fit: configuración automática de memoria JVM

8. Observabilidad Mejorada

  • OpenTelemetry Agent (Preview): exportación de métricas, logs y traces sin configurar colector
  • Aspire Dashboard (Preview): dashboard interactivo para aplicaciones .NET
  • Java metrics: métricas de garbage collection, memoria, threads
  • Integración completa con Azure Monitor y Application Insights

Comparativa: ¿Cuándo Usar Container Apps?

Servicio Caso de Uso Ideal
Azure Container Apps Microservicios, APIs, event-driven apps, cargas AI/ML serverless, aplicaciones con escalado a cero
Azure Kubernetes Service (AKS) Control total de Kubernetes API, workloads complejos con requisitos específicos de K8s
Azure Red Hat OpenShift Despliegue OpenShift gestionado, migración desde on-premises OpenShift
Azure Functions Funciones FaaS puras, integraciones rápidas con triggers Azure, sin contenedores
Web App for Containers Aplicaciones web en contenedores Windows/Linux, migración lift-and-shift
Container Instances Contenedores de corta duración, batch jobs simples, aislamiento por hipervisor
Service Fabric Aplicaciones distribuidas legacy, necesidad de reliable services/actors
Container Registry Almacenamiento, gestión y replicación de imágenes de contenedor

Diagrama de Decisión Simplificado

flowchart TD
  START["¿Necesitas ejecutar contenedores?"]
  START --> K8S_API{"¿Necesitas acceso directo a Kubernetes API?"}

  K8S_API -->|Sí| AKS["Azure Kubernetes Service (AKS)"]
  K8S_API -->|No| SERVERLESS{"¿Prefieres serverless con escalado a cero?"}

  SERVERLESS -->|Sí| MICROSERVICES{"¿Es una arquitectura de microservicios / API?"}
  SERVERLESS -->|No| DEDICATED{"¿Necesitas hardware dedicado/GPU?"}

  MICROSERVICES -->|Sí| ACA["✅ Azure Container Apps"]
  MICROSERVICES -->|No| FUNCTIONS{"¿Solo funciones event-driven?"}

  FUNCTIONS -->|Sí| AZFUNC["Azure Functions"]
  FUNCTIONS -->|No| ACA2["✅ Azure Container Apps"]

  DEDICATED -->|Sí| ACA_DEDICATED["✅ Azure Container Apps
(Dedicated Workload Profiles)"] DEDICATED -->|No| WEBAPP["Web App for Containers"]

Casos de Uso Prácticos

1. Aplicación de IA Generativa con RAG

Implementar un chatbot con Retrieval Augmented Generation:

  • Frontend: contenedor React/Vue en Container App con ingress externo
  • API Gateway: contenedor .NET/Java con autenticación Entra ID
  • RAG Service: contenedor Python con GPU T4 para embeddings y inference
  • Vector Store: Cosmos DB con búsqueda vectorial
  • Escalado basado en peticiones HTTP, escala a cero en inactividad

2. Procesamiento de Eventos IoT

Pipeline de procesamiento de telemetría:

  • Ingestion: Container App escalando con Event Hubs (KEDA scaler)
  • Processing: múltiples Container Apps para transformación, enriquecimiento
  • Storage: escritura en Azure Storage / Cosmos DB mediante Dapr
  • Escalado automático según volumen de mensajes

3. Microservicios con Dapr

Arquitectura de e-commerce:

  • Catalog Service: gestión de productos
  • Order Service: procesamiento de pedidos
  • Inventory Service: control de stock
  • Payment Service: integración con pasarelas de pago

Comunicación via Dapr service invocation, state management en Redis/Cosmos DB, pub/sub con Service Bus.

4. Jobs Programados y Batch Processing

  • Jobs en Container Apps para tareas programadas (cron)
  • Procesamiento de archivos cargados en Storage
  • Generación de informes nocturnos
  • Limpieza de datos y mantenimiento

Despliegue: Ejemplos Prácticos

Despliegue Rápido con Azure CLI

# Variables
RESOURCE_GROUP="my-container-apps-rg"
LOCATION="westeurope"
ENVIRONMENT="my-environment"
APP_NAME="my-api"

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

# Crear environment
az containerapp env create \
  --name $ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

# Desplegar desde imagen pública
az containerapp create \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $ENVIRONMENT \
  --image mcr.microsoft.com/k8se/quickstart:latest \
  --target-port 80 \
  --ingress external \
  --min-replicas 0 \
  --max-replicas 10

Despliegue con Bicep

param location string = resourceGroup().location
param environmentName string = 'my-environment'
param containerAppName string = 'my-api'
param containerImage string = 'mcr.microsoft.com/k8se/quickstart:latest'

resource environment 'Microsoft.App/managedEnvironments@2023-05-01' = {
  name: environmentName
  location: location
  properties: {
    appLogsConfiguration: {
      destination: 'log-analytics'
      logAnalyticsConfiguration: {
        customerId: logAnalytics.properties.customerId
        sharedKey: logAnalytics.listKeys().primarySharedKey
      }
    }
  }
}

resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
  name: containerAppName
  location: location
  properties: {
    managedEnvironmentId: environment.id
    configuration: {
      ingress: {
        external: true
        targetPort: 80
        transport: 'auto'
      }
    }
    template: {
      containers: [
        {
          name: 'main'
          image: containerImage
          resources: {
            cpu: json('0.5')
            memory: '1Gi'
          }
        }
      ]
      scale: {
        minReplicas: 0
        maxReplicas: 10
        rules: [
          {
            name: 'http-rule'
            http: {
              metadata: {
                concurrentRequests: '100'
              }
            }
          }
        ]
      }
    }
  }
}

resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
  name: '${environmentName}-logs'
  location: location
  properties: {
    sku: {
      name: 'PerGB2018'
    }
  }
}

Despliegue con Dapr Habilitado

# Crear app con Dapr
az containerapp create \
  --name order-service \
  --resource-group $RESOURCE_GROUP \
  --environment $ENVIRONMENT \
  --image myregistry.azurecr.io/order-service:v1 \
  --target-port 3000 \
  --ingress internal \
  --min-replicas 1 \
  --enable-dapr \
  --dapr-app-id order-service \
  --dapr-app-port 3000 \
  --dapr-app-protocol http

# Invocar otro servicio via Dapr
# Desde código: http://localhost:3500/v1.0/invoke/inventory-service/method/check-stock

Administración del Ciclo de Vida: Revisiones

Una de las características más potentes de Container Apps son las revisiones (revisions):

  • Cada cambio en la configuración o imagen crea una nueva revisión
  • Múltiples revisiones activas simultáneamente
  • Traffic splitting: distribuir tráfico entre revisiones (A/B testing, blue/green)
  • Labels: asignar etiquetas (blue, green, canary) para URLs estables

Ejemplo: Blue/Green Deployment

# Desplegar revisión "blue" (producción actual)
az containerapp create \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $ENVIRONMENT \
  --image myregistry.azurecr.io/myapp:v1.0 \
  --revision-suffix blue \
  --ingress external \
  --target-port 80 \
  --revisions-mode multiple

# Fijar 100% tráfico a blue
az containerapp ingress traffic set \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --revision-weight $APP_NAME--blue=100

# Asignar label "blue"
az containerapp revision label add \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --label blue \
  --revision $APP_NAME--blue

# Desplegar revisión "green" (nueva versión)
az containerapp update \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --image myregistry.azurecr.io/myapp:v2.0 \
  --revision-suffix green

# Probar green en URL específica: https://my-app---green.<environment-domain>

# Traffic splitting progresivo: 80% blue, 20% green
az containerapp ingress traffic set \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --revision-weight $APP_NAME--blue=80 $APP_NAME--green=20

# Si green funciona bien, cambiar 100% a green
az containerapp ingress traffic set \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --revision-weight $APP_NAME--green=100

# Desactivar revisión blue
az containerapp revision deactivate \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --revision $APP_NAME--blue

Networking: Opciones y Escenarios

Niveles de Accesibilidad

  1. External ingress: aplicación accesible desde Internet
  2. Internal ingress: solo accesible dentro del environment o VNet
  3. No ingress: para background workers o jobs

Integración con VNet

# Crear environment con VNet personalizada
az containerapp env create \
  --name $ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --infrastructure-subnet-resource-id /subscriptions/.../subnets/aca-subnet \
  --internal-only false

# Subnet mínimo: /27 (para workload profiles)
# Subnet mínimo: /23 (para consumption only)

Private Endpoints

# Crear environment con private endpoint
az containerapp env create \
  --name $ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --enable-workload-profiles \
  --public-network-access Disabled

# Crear private endpoint
az network private-endpoint create \
  --name my-private-endpoint \
  --resource-group $RESOURCE_GROUP \
  --vnet-name my-vnet \
  --subnet my-subnet \
  --private-connection-resource-id /subscriptions/.../managedEnvironments/$ENVIRONMENT \
  --group-id managedEnvironment \
  --connection-name my-connection

Observabilidad y Monitorización

Integración con Azure Monitor

Container Apps se integra automáticamente con:

  • Log Analytics: logs de contenedor, system logs
  • Application Insights: telemetría de aplicaciones, distributed tracing
  • Metrics: CPU, memoria, peticiones HTTP, réplicas activas
# Habilitar Application Insights
az containerapp env create \
  --name $ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --logs-workspace-id <LOG_ANALYTICS_WORKSPACE_ID> \
  --logs-workspace-key <LOG_ANALYTICS_WORKSPACE_KEY>

Consultas Útiles en Log Analytics

// Logs de aplicación
ContainerAppConsoleLogs_CL
| where ContainerAppName_s == "my-api"
| where TimeGenerated > ago(1h)
| project TimeGenerated, Log_s
| order by TimeGenerated desc

// Métricas de réplicas
ContainerAppSystemLogs_CL
| where Category == "ContainerAppScaling"
| where ContainerAppName_s == "my-api"
| project TimeGenerated, ReplicaCount_d
| render timechart

OpenTelemetry (Preview)

# Habilitar agente OpenTelemetry
az containerapp env telemetry app-insights set \
  --name $ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --connection-string "InstrumentationKey=...;IngestionEndpoint=..."

# Las apps envían automáticamente traces, metrics y logs a App Insights

Costes y Optimización

Modelo de Facturación

Consumption Plan:

  • Consumo activo: vCPU-segundos y GiB-segundos consumidos
  • Consumo idle: tarifa reducida cuando réplicas están idle (no procesando, <0.01 vCPU, <1KB/s red)
  • Requests: primeros 2 millones gratis/mes, luego por millón adicional
  • GPUs serverless: sin cargo por idle, solo por uso activo

Dedicated Plan (workload profiles):

  • Cargo fijo por gestión del plan si usas perfiles dedicados
  • Cargo por instancia de perfil (D4, E8, NC24-A100, etc.)
  • Escalado in/out ajusta coste según demanda

Estrategias de Optimización

  1. Escala a cero: configura minReplicas: 0 para apps con tráfico intermitente
  2. Right-sizing: ajusta CPU/memoria a necesidades reales
  3. Workload profiles: agrupa apps similares en el mismo perfil dedicado
  4. Savings Plans: Azure Container Apps elegible para planes de ahorro
  5. GPUs serverless: para cargas AI/ML variables, usa serverless en lugar de dedicado
# Configurar escalado a cero
az containerapp update \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --min-replicas 0 \
  --max-replicas 10 \
  --scale-rule-name http-rule \
  --scale-rule-type http \
  --scale-rule-metadata concurrentRequests=50

Seguridad: Mejores Prácticas

1. Managed Identities

# Habilitar system-assigned identity
az containerapp identity assign \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --system-assigned

# Asignar rol para acceder a Key Vault
IDENTITY_ID=$(az containerapp identity show \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --query principalId -o tsv)

az keyvault set-policy \
  --name my-keyvault \
  --object-id $IDENTITY_ID \
  --secret-permissions get list

2. Secretos

# Añadir secreto
az containerapp secret set \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --secrets db-connection="Server=...;Password=..."

# Referenciar en variable de entorno
az containerapp update \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --set-env-vars "DB_CONNECTION=secretref:db-connection"

3. Autenticación Built-in (EasyAuth)

# Habilitar autenticación con Entra ID
az containerapp auth update \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --enable \
  --action RequireAuthentication \
  --aad-tenant-id <TENANT_ID> \
  --aad-client-id <CLIENT_ID> \
  --aad-client-secret <CLIENT_SECRET>

4. Restricciones de IP

# Limitar acceso por IP
az containerapp ingress access-restriction set \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --rule-name office-network \
  --ip-address 203.0.113.0/24 \
  --action Allow

Conclusión

Azure Container Apps en 2025 es una plataforma madura y completa para ejecutar aplicaciones Cloud Native sin la complejidad de gestionar Kubernetes directamente. Con las incorporaciones de 2024-2025, se ha convertido en una opción viable para:

  • Microservicios y APIs: escalado automático, revisiones, traffic splitting
  • Event-driven architectures: integración con KEDA y múltiples event sources
  • Cargas AI/ML: GPUs serverless y dedicadas, Dynamic Sessions
  • Aplicaciones empresariales: networking avanzado, private endpoints, integración con Azure Functions

¿Cuándo Elegir Container Apps?

, si:

  • Quieres serverless con escalado a cero
  • Necesitas desplegar microservicios o APIs rápidamente
  • Prefieres no gestionar Kubernetes directamente
  • Quieres integración nativa con Dapr, KEDA, Envoy
  • Necesitas GPUs para cargas AI/ML con tráfico variable

No, si:

  • Necesitas acceso completo a Kubernetes API y CRDs
  • Tienes requisitos muy específicos de configuración de K8s
  • Ya tienes inversión significativa en operadores y herramientas K8s personalizadas

En resumen: si no necesitas acceso directo a Kubernetes API y trabajas con aplicaciones Cloud Native, Azure Container Apps es tu servicio en Azure.

Referencias y Recursos


Artículo actualizado en octubre de 2025. Para la versión original de 2022, ver Introducción a Azure Container Apps (Keepler Blog).