El artefacto web-reservas existe: compilado una sola vez, probado y almacenado. Pero sigue quieto. Entre ese fichero y app-contoso-reservas-pro todavía está Marta Ríos pegando comandos un viernes por la noche, y mientras eso siga así las métricas DORA de Contoso no se moverán: el tiempo de entrega seguirá siendo de semanas y el de restauración, de horas.
Esta lección recorre ese último tramo, que es el que da miedo. Verás cómo los entornos convierten «creo que en producción está la versión de la semana pasada» en un dato exacto; cómo las comprobaciones y aprobaciones ponen una puerta consciente delante de producción sin volver al despliegue manual; y cómo el intercambio de ranuras que ya conoces del módulo 2 se convierte en un despliegue azul-verde real, con una reversión que tarda segundos. Al final, desplegar dejará de ser un acontecimiento.
Contenido
- Entrega continua frente a despliegue continuo
- Entornos: qué versión hay en cada sitio
- Comprobaciones y aprobaciones
- El pipeline de varias etapas
- Estrategias de despliegue y ranuras de App Service
- La conexión de servicio restringida por entorno
- Migraciones de base de datos: expandir y contraer
- Verificación posterior al despliegue y reversión
- Marcas de característica: desplegar no es activar
- Errores Comunes y Consejos
- Ejercicios
- Conclusión
- Entrega continua frente a despliegue continuo
Dos términos que se usan como sinónimos y no lo son:
| Entrega continua | Despliegue continuo | |
|---|---|---|
| Qué garantiza | Todo cambio validado puede desplegarse en cualquier momento | Todo cambio validado se despliega solo |
| Paso a producción | Una decisión humana, un botón | Automático, sin intervención |
| Requisitos | Pipeline fiable, pruebas sólidas | Además: telemetría, reversión automática, cultura madura |
| Riesgo por despliegue | Bajo | Muy bajo (cambios diminutos y frecuentes) |
Contoso se sitúa en entrega continua con una excepción: desarrollo y preproduccion se despliegan automáticamente en cada fusión a main, y produccion requiere una aprobación. No es falta de ambición, es proporcionalidad: un despliegue erróneo en la web de venta de billetes tiene consecuencias económicas inmediatas, y el equipo aún no tiene la telemetría del módulo 7 ni la reversión automática que justificarían quitar esa puerta. La aprobación es una decisión de riesgo revisable, no un dogma; cuando la tasa de fallo baje del 15 %, tendrá sentido replantearla.
- Entornos: qué versión hay en cada sitio
Un entorno en Azure Pipelines es una entidad con nombre que representa un destino de despliegue —desarrollo, preproduccion, produccion— y que aporta tres cosas que un simple paso de despliegue no da:
- Trazabilidad: registra qué ejecución, qué artefacto y qué confirmaciones se desplegaron, y cuándo. Es la respuesta exacta a «¿qué versión hay en producción?».
- Recursos registrados: opcionalmente asocia máquinas virtuales o espacios de nombres de Kubernetes, con su estado.
- Comprobaciones: es el sitio donde se cuelgan las aprobaciones y las demás puertas. Un detalle importante: la protección vive en el entorno, no en el YAML, de modo que quien edita el pipeline no puede quitarla.
# Los entornos se crean desde el portal (Pipelines > Entornos) o con la API REST.
# Al ejecutarse un trabajo de despliegue contra un entorno inexistente, se crea solo,
# pero conviene crearlos antes para poder configurar sus comprobaciones.
az pipelines runs list --pipeline-name contoso-reservas-cd \
--query "[0].{ejecucion:name, estado:result, rama:sourceBranch}" -o tableContoso crea tres: desarrollo (despliegue automático, sin puertas), preproduccion (automático, con comprobación de rama) y produccion (aprobación humana, ventana de despliegue y comprobación de rama).
- Comprobaciones y aprobaciones
Una comprobación es una condición que debe cumplirse antes de que un trabajo pueda desplegar en el entorno. Las que usa Contoso:
| Comprobación | Configuración en produccion |
Qué evita |
|---|---|---|
| Aprobación | Marta Ríos o el grupo Contoso-Operaciones; quien lanzó la ejecución no puede aprobarse a sí mismo |
Que un cambio llegue sin decisión consciente |
| Ventana de despliegue | Lunes a jueves, 08:00-16:00 (West Europe) |
El despliegue del viernes por la tarde y el fin de semana de apertura de temporada, cuando no hay nadie de guardia |
| Comprobación de rama | Solo refs/heads/main |
Que alguien despliegue una rama de trabajo en producción |
| Invocar función de Azure | Llama a una función que consulta si hay una incidencia abierta de gravedad 1 y devuelve éxito o fallo | Desplegar en mitad de una crisis |
| Consultar puerta de estado | Comprueba las alertas activas de log-contoso-pro |
Desplegar sobre un sistema ya degradado |
La aprobación merece una precisión. No es un trámite burocrático: es el punto en el que una persona con contexto operativo mira qué va a entrar, comprueba que hay alguien disponible por si algo sale mal y decide. Por eso se limita a un grupo pequeño, tiene un tiempo de espera (Contoso pone 3 días, tras los cuales la ejecución se cancela) y permite dejar un comentario que queda registrado.
La ventana de despliegue codifica la regla que todo el mundo dice y nadie cumple. Antes era «intentemos no desplegar los viernes»; ahora la ejecución sencillamente espera hasta el lunes a las 08:00. Y en la semana de apertura de temporada, cuando el volumen de reservas se multiplica, se congela produccion desactivando temporalmente el despliegue automático hacia preproducción o añadiendo una segunda aprobación.
- El pipeline de varias etapas
Este es contoso-reservas-cd, que toma el artefacto de 05-03 y lo lleva a los tres entornos:
name: despliegue-$(Build.BuildNumber)
# Se dispara al COMPLETARSE con exito el pipeline de integracion continua:
# no compila nada, solo consume su artefacto.
resources:
pipelines:
- pipeline: ci # Alias con el que se referencia despues
source: contoso-reservas-ci
trigger:
branches: { include: [ main ] }
trigger: none # Nunca se lanza por un envio directo
variables:
- group: vg-contoso-reservas-comun
stages:
- stage: desarrollo
displayName: Desplegar en desarrollo
jobs:
# 'deployment' (y no 'job') es lo que engancha con un entorno y su historial
- deployment: desplegar_dev
environment: desarrollo
pool: { vmImage: ubuntu-latest }
strategy:
runOnce: # Estrategia mas simple: sustituir y ya
deploy:
steps:
- download: ci # Recuperar el artefacto del pipeline de CI
artifact: web-reservas
- task: AzureWebApp@1
inputs:
azureSubscription: sc-contoso-dev # Conexion de servicio
appName: app-contoso-reservas-dev
package: $(Pipeline.Workspace)/ci/web-reservas
- stage: preproduccion
dependsOn: desarrollo # Solo si la etapa anterior tuvo exito
condition: succeeded()
jobs:
- deployment: desplegar_pre
environment: preproduccion
pool: { vmImage: ubuntu-latest }
strategy:
runOnce:
deploy:
steps:
- download: ci
artifact: web-reservas
- task: AzureWebApp@1
inputs:
azureSubscription: sc-contoso-pro
appName: app-contoso-reservas-pro
deployToSlotOrASE: true
resourceGroupName: rg-contoso-reservas-pro
slotName: preproduccion # La RANURA, no el sitio activo
package: $(Pipeline.Workspace)/ci/web-reservas
- script: |
# Verificar la salud de la ranura ANTES de intercambiarla
curl -f https://app-contoso-reservas-pro-preproduccion.azurewebsites.net/salud
displayName: Comprobar el punto de salud de la ranura
- stage: produccion
dependsOn: preproduccion
# Solo desde main: doble cinturon junto a la comprobacion del entorno
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: intercambiar
environment: produccion # Aqui esperan la aprobacion y la ventana
pool: { vmImage: ubuntu-latest }
strategy:
runOnce:
deploy:
steps:
# El despliegue a produccion NO copia ficheros: intercambia ranuras
- task: AzureAppServiceManage@0
inputs:
azureSubscription: sc-contoso-pro
Action: 'Swap Slots'
WebAppName: app-contoso-reservas-pro
ResourceGroupName: rg-contoso-reservas-pro
SourceSlot: preproduccion
SwapWithProduction: true
- script: curl -f https://www.contosoairlines.example/salud
displayName: Verificacion posterior al despliegueTres piezas merecen atención. resources.pipelines hace que este pipeline se dispare al terminar el de integración continua y pueda descargar su artefacto: no se recompila nada, se despliega exactamente el binario que se probó. deployment en lugar de job es lo que vincula el trabajo con el entorno y alimenta su historial. Y dependsOn más condition encadenan las etapas: producción no se intenta si preproducción falló.
- Estrategias de despliegue y ranuras de App Service
| Estrategia | Cómo funciona | Interrupción | Coste | Reversión |
|---|---|---|---|---|
| Recreación | Se para lo viejo, se arranca lo nuevo | Sí, visible | Ninguno | Volver a desplegar lo anterior (lento) |
| Actualización gradual | Se sustituyen las instancias por tandas | No | Ninguno | Lenta; conviven dos versiones |
| Azul-verde | Dos entornos completos; se conmuta el tráfico de golpe | No | Doble durante el despliegue | Inmediata: se conmuta de vuelta |
| Canario | La versión nueva recibe primero un 5 % del tráfico | No | Bajo | Rápida; se retira el porcentaje |
Contoso usa azul-verde, y lo implementa con las ranuras de despliegue de App Service (02-03), que es donde estas estrategias dejan de ser teoría:
graph LR
subgraph Antes
U1[Usuarios] --> P1["Ranura de producción<br/>v2.4.0 · azul"]
CD1[Pipeline] -.despliega.-> S1["Ranura preproduccion<br/>v2.5.0 · verde"]
end
subgraph "Intercambio con calentamiento"
W["App Service pide /salud a la ranura verde<br/>hasta que responde correctamente"]
end
subgraph Después
U2[Usuarios] --> P2["Ranura de producción<br/>v2.5.0 · verde"]
P2 -.-> S2["Ranura preproduccion<br/>v2.4.0 · azul, lista para revertir"]
end
Antes --> W --> Después
Lo que hace especial al intercambio de App Service es el calentamiento: antes de mover el tráfico, la plataforma arranca la aplicación de la ranura, le aplica los ajustes de producción y le pide su punto /salud hasta que responde correctamente. Solo entonces conmuta. Eso elimina el problema clásico del azul-verde casero, en el que los primeros usuarios pagan el arranque en frío. Y el intercambio es de enrutamiento interno, no de copia de ficheros: tarda segundos y es reversible con la misma operación.
Requisitos que hay que respetar: los ajustes que no deben viajar con el código —cadenas de conexión, referencias @Microsoft.KeyVault(...)— tienen que estar marcados como ajuste de ranura (slot setting) para que se queden anclados a su ranura, y el plan plan-contoso-reservas-pro debe ser Standard o superior (Contoso usa Premium v3 con redundancia de zona, así que cumple de sobra).
- La conexión de servicio restringida por entorno
Las conexiones sc-contoso-dev y sc-contoso-pro de 05-01 no son intercambiables, y hay que impedir activamente que se usen mal:
- Ámbito y rol mínimos:
sc-contoso-protiene Colaborador de sitio web sobrerg-contoso-reservas-pro. Puede desplegar e intercambiar ranuras; no puede tocarrg-contoso-red-proni borrar una base de datos. - Sin acceso abierto: al desactivar «conceder permiso de acceso a todos los pipelines», un pipeline nuevo no hereda la capacidad de desplegar en producción. Autorizarlo es un acto explícito.
- Comprobación de conexión en el entorno: la comprobación Required template o la restricción de la propia conexión permiten exigir que solo se use desde una plantilla aprobada.
- Federación de identidad de carga de trabajo: sin secreto que caduque ni que se pueda exfiltrar.
El principio es el mismo del módulo 4 llevado a la entrega: la credencial que despliega la web no debería poder hacer nada más que desplegar la web.
- Migraciones de base de datos: expandir y contraer
Aquí está el punto donde más despliegues «sin interrupción» se rompen. Durante un intercambio azul-verde, y durante la ventana de reversión posterior, dos versiones del código conviven contra la misma base de datos db-reservas. Por tanto:
Toda migración de esquema debe ser compatible hacia atrás: la versión anterior del código tiene que seguir funcionando con el esquema nuevo.
El patrón que lo garantiza es expandir y contraer, en tres despliegues separados. Supón que Contoso necesita sustituir la columna nombre_pasajero por nombre y apellidos:
| Fase | Despliegue | Esquema | Código |
|---|---|---|---|
| Expandir | 1 | Se añaden nombre y apellidos, admitiendo nulos; nombre_pasajero se conserva |
Escribe en las tres columnas, lee de la antigua |
| Migrar | — | Un proceso rellena nombre/apellidos de las filas históricas |
Sin cambios |
| Contraer | 2 y 3 | Tras confirmar que nadie usa la antigua, se elimina nombre_pasajero |
Despliegue 2: lee de las nuevas. Despliegue 3: deja de escribir en la antigua |
Reglas prácticas: nunca renombrar ni eliminar una columna en el mismo despliegue que introduce su sustituta; nunca añadir una columna NOT NULL sin valor por defecto, porque la versión antigua no la rellenará; y ejecutar las migraciones antes del intercambio, en un paso propio contra sql-contoso-reservas-pro desde un agente de pool-contoso-privado —el servidor solo es accesible por pe-sql-reservas— y con la identidad administrada que aprendiste en 04-02, no con contraseñas.
La consecuencia importante: una migración destructiva rompe la reversión. Si el despliegue elimina una columna y hay que volver atrás, la versión anterior encontrará un esquema que no entiende. Con expandir y contraer, el intercambio inverso siempre funciona.
- Verificación posterior al despliegue y reversión
Desplegar y marcar la ejecución en verde no significa que funcione. Contoso añade dos verificaciones:
- Comprobación de salud:
curl -f https://www.contosoairlines.example/salud, que devuelve error si el punto no responde 200. El punto/saluddebe comprobar dependencias reales —conexión adb-reservas, acceso akv-contoso-pro— y no limitarse a devolver «OK». - Pruebas de humo: un puñado de peticiones que ejercitan el camino crítico (buscar un vuelo, consultar disponibilidad) contra la ranura de preproducción antes del intercambio, no después.
Y cuando algo falla, la reversión. Hay dos formas y no son equivalentes:
| Reintercambio de ranura | Redesplegar la versión anterior | |
|---|---|---|
| Qué hace | Vuelve a conmutar el enrutamiento | Ejecuta de nuevo el pipeline con el artefacto antiguo |
| Tiempo | Segundos | Minutos (descarga, despliegue, calentamiento) |
| Estado de la aplicación | Ya está caliente en la otra ranura | Arranque en frío |
| Cuándo usarla | Siempre que sea posible | Si ya se hizo otro intercambio encima, o si hay que ir varias versiones atrás |
El reintercambio es literalmente la misma tarea Swap Slots ejecutada otra vez, y por eso conviene tener un pipeline de reversión de un solo paso, listo para lanzar sin pensar. Esta es la razón por la que la métrica DORA de tiempo de restauración de Contoso puede pasar de horas a menos de un minuto: no porque el equipo sea más rápido arreglando, sino porque volver atrás ya no consiste en arreglar nada.
Una advertencia: la reversión revierte el código, no los datos. Si la versión nueva escribió registros con un formato que la anterior no entiende, o si ya se ejecutó la fase de contracción, el reintercambio no basta. De ahí la disciplina del apartado anterior.
- Marcas de característica: desplegar no es activar
El último paso para que desplegar deje de dar miedo es separar dos cosas que solemos confundir: desplegar (que el código esté en producción) y activar (que los usuarios lo usen). Una marca de característica es una condición en el código que enciende o apaga una funcionalidad sin desplegar nada:
// El mapa de cabina viaja a produccion apagado; se enciende cuando el equipo
// decide, para un porcentaje de usuarios, y se apaga en segundos si falla.
if (await _marcas.EstaActivaAsync("mapa-cabina"))
{
return View("MapaCabinaInteractivo", modelo);
}
return View("SeleccionAsientoClasica", modelo);Esto habilita tres cosas: que las ramas de característica sean cortas de verdad —el trabajo a medias se fusiona apagado—, que el despliegue canario se haga por porcentaje de usuarios sin infraestructura adicional, y que apagar una funcionalidad rota sea instantáneo y no requiera reversión. Azure App Configuration ofrece este servicio gestionado con su gestor de características, filtros por porcentaje y por grupo de usuarios, e integración directa con App Service.
El coste es real y hay que reconocerlo: cada marca es una bifurcación que multiplica los caminos posibles del código. Se gestionan como deuda —con propietario y fecha de retirada— y se eliminan en cuanto la funcionalidad está consolidada.
Qué se mide después de todo esto es materia del módulo 7: cada despliegue debe verse en Azure Monitor y en Application Insights, con las métricas de errores y latencia antes y después del intercambio. Sin esa realimentación, la aprobación de Marta sigue siendo una decisión a ciegas.
Errores Comunes y Consejos
- Recompilar en cada entorno. Rompe la garantía de que lo probado es lo desplegado. El pipeline de despliegue consume el artefacto, nunca lo regenera.
- Poner las aprobaciones en el YAML. Quien edite el fichero podría quitarlas. Las comprobaciones viven en el entorno, que tiene sus propios permisos.
- Migraciones destructivas en el mismo despliegue. Rompen la reversión justo cuando la necesitas. Expandir y contraer, siempre, en despliegues separados.
- Un punto
/saludque solo devuelve «OK». No comprueba nada. Debe verificar las dependencias reales: base de datos, almacén de secretos, servicios externos críticos. - Ranuras sin ajustes de ranura marcados. La cadena de conexión de producción viaja a preproducción o al revés, y acabas escribiendo en la base de datos equivocada.
- Aprobar por costumbre. Una aprobación que siempre se concede en dos segundos no es una puerta, es un clic. Si nadie mira qué entra, es mejor automatizar y dedicar el esfuerzo a la telemetría.
- Consejo: guarda un pipeline de reversión de un solo paso, y ensáyalo. Una reversión que nunca se ha probado no es una reversión.
- Consejo: etiqueta automáticamente el repositorio al desplegar en producción; así la correspondencia entre etiqueta, artefacto y entorno no depende de nadie.
Ejercicios
Ejercicio 1: diseñar las puertas de un entorno
Contoso Millas (centro-coste=CC-2077) va a montar su despliegue continuo. Su equipo son cuatro desarrolladores y un responsable de infraestructura. Su web tiene mucho menos tráfico que la de reservas y su ventana de mayor uso es los lunes por la mañana.
- ¿Qué entornos crearías y qué comprobación pondrías en cada uno?
- ¿Recomendarías entrega continua o despliegue continuo? Justifícalo con las diferencias respecto a Contoso Reservas.
- ¿Dónde se configuran esas comprobaciones y por qué no en el YAML?
Ejercicio 2: la migración que rompió la reversión
Contoso despliega la versión 2.6.0, que incluye una migración que renombra la columna codigo_reserva a localizador en db-reservas. A los diez minutos aparece un fallo grave en el cálculo de tarifas y Marta lanza el reintercambio de ranura. La web vuelve a la versión 2.5.0 y empieza a fallar con errores de columna inexistente.
- ¿Qué ha ocurrido exactamente y por qué el reintercambio no ha bastado?
- Reescribe el cambio con expandir y contraer, indicando qué hace cada despliegue.
- ¿Desde qué agente debe ejecutarse la migración contra
sql-contoso-reservas-proy con qué credencial?
Ejercicio 3: elegir estrategia y calcular la reversión
Contoso quiere probar un algoritmo nuevo de precios en la API de Disponibilidad, que corre en vmss-api-disponibilidad-pro detrás de lb-api-disponibilidad-pro. El riesgo es alto: un error de precios tiene impacto económico directo. El equipo quiere exponerlo primero a una fracción del tráfico.
- ¿Qué estrategia de despliegue corresponde y por qué no azul-verde puro?
- ¿Cómo la combinarías con una marca de característica?
- Si el algoritmo falla con el 5 % del tráfico, ¿cuál es la vía de reversión más rápida y por qué?
Soluciones
Solución 1:
millas-desarrollosin comprobaciones, con despliegue automático;millas-produccioncon comprobación de rama (solomain) y aprobación del responsable de infraestructura. La ventana de despliegue debería excluir el lunes por la mañana, que es su pico. Un entorno de preproducción es opcional dado el tamaño del equipo, aunque si usan ranuras de App Service el patrón sale casi gratis y conviene mantenerlo.- Entrega continua al principio, por la misma razón que Contoso Reservas: todavía no hay telemetría ni reversión automática que justifiquen quitar la puerta humana. Con menos tráfico y menor impacto económico, sin embargo, es un candidato razonable a despliegue continuo una vez que sus pruebas automáticas sean sólidas y tengan alertas; el criterio no es el tamaño del equipo, es la capacidad de detectar y revertir rápido.
- En el entorno de Azure Pipelines, no en el YAML, porque el YAML lo puede modificar cualquiera con permiso sobre el repositorio: bastaría con enviar una solicitud de cambios que borre la aprobación. Las comprobaciones del entorno tienen sus propios permisos y son independientes del código.
Solución 2:
- La migración renombró la columna, es decir, la eliminó y creó otra. El esquema quedó incompatible con la versión 2.5.0, que sigue consultando
codigo_reserva. El reintercambio revierte el código, pero no revierte el esquema ni los datos: por eso no bastó. La reversión solo funciona si toda migración es compatible hacia atrás. - Despliegue 1 (expandir): añadir la columna
localizadoradmitiendo nulos, conservandocodigo_reserva; el código escribe en ambas y lee decodigo_reserva. Proceso de migración: rellenarlocalizadoren las filas históricas. Despliegue 2: el código lee delocalizadory sigue escribiendo en ambas —aquí ya se puede revertir sin daño—. Despliegue 3 (contraer): el código deja de escribir encodigo_reservay, solo tras confirmar que ninguna versión anterior sigue viva, se elimina la columna. - Desde un agente autohospedado del grupo
pool-contoso-privado, situado ensnet-gestiondentro devnet-contoso-pro, porquesql-contoso-reservas-prosolo es accesible a través depe-sql-reservasy un agente hospedado por Microsoft no tiene ruta hasta él. La credencial debe ser la identidad administrada del agente con permisos de Entra ID sobre la base de datos, nunca una contraseña de administrador de SQL. Y el paso va antes del intercambio.
Solución 3:
- Canario. El azul-verde puro conmuta el 100 % del tráfico de golpe: si el algoritmo calcula mal, todos los clientes ven precios erróneos durante el tiempo que se tarde en detectarlo. El canario limita la exposición a una fracción y permite comparar métricas entre las dos versiones antes de continuar. En
vmss-api-disponibilidad-prose implementa desplegando la versión nueva en un subconjunto de instancias y ponderando el reparto enlb-api-disponibilidad-pro, o publicando un grupo de instancias nuevo y trasladando tráfico progresivamente. - Con una marca de característica por porcentaje de usuarios: se despliega el código nuevo en todas las instancias pero apagado, y se enciende para un 5 % desde Azure App Configuration. Esto es mejor que el canario de infraestructura porque el reparto se controla sin tocar el balanceador, se puede segmentar por tipo de cliente y todas las instancias ejecutan el mismo binario, lo que elimina las diferencias de configuración.
- Apagar la marca de característica: es instantáneo, no requiere despliegue, no requiere intercambio y no toca la infraestructura. Solo si el fallo estuviera fuera de la marca —en código común— habría que recurrir al reintercambio de ranura o a retirar las instancias canario del balanceador. Es exactamente la ventaja de separar el despliegue de la activación: la vía de reversión más rápida deja de ser un despliegue.
Conclusión
El artefacto ya no espera: viaja solo. Sabes distinguir la entrega continua del despliegue continuo y por qué Contoso se sitúa en la primera con una puerta humana delante de producción, no por dogma sino porque aún le falta la telemetría y la reversión automática que justificarían quitarla. Has creado los entornos desarrollo, preproduccion y produccion, que aportan lo que un simple paso de despliegue no da: el registro exacto de qué versión hay en cada sitio y un lugar para colgar las protecciones fuera del YAML, de modo que quien edita el pipeline no pueda quitarlas.
Sobre esos entornos has puesto comprobaciones con sentido: la aprobación de Marta Ríos con su tiempo de espera, la ventana de despliegue que convierte «intentemos no desplegar los viernes» en una regla que se cumple sola, la comprobación de rama y las puertas que consultan si hay una incidencia abierta antes de dejar pasar nada. Has escrito el pipeline contoso-reservas-cd de tres etapas encadenadas con dependsOn y condition, que consume el artefacto de 05-03 sin recompilar y que en producción no copia ficheros sino que intercambia la ranura preproduccion con su calentamiento previo contra /salud: el azul-verde real de Contoso, comparado en tabla con la recreación, la actualización gradual y el canario. Sabes restringir sc-contoso-pro al rol y al ámbito mínimos y a los pipelines autorizados; sabes que toda migración debe ser compatible hacia atrás con el patrón expandir y contraer, porque una columna eliminada rompe la reversión justo cuando la necesitas; y sabes que revertir de verdad es un reintercambio de segundos, no un redespliegue de minutos —el motivo por el que el tiempo de restauración de Contoso puede caer de horas a menos de un minuto—. Y con las marcas de característica has separado desplegar de activar, dejando la vía de reversión más rápida de todas: un interruptor.
Queda un cabo que este módulo arrastra desde el principio. Los cuatro repositorios de Contoso comparten una biblioteca de modelos de reserva que está copiada y pegada en tres de ellos, y ya hay tres versiones distintas circulando: cuando Diego corrige la validación del localizador en la web, la API sigue con la versión vieja y las dos discrepan en producción. Las plantillas de pipeline resolvieron esto para el YAML; falta resolverlo para el código. En la próxima lección, Azure Artifacts, montarás el feed contoso-paquetes, publicarás contoso.reservas.modelos como paquete versionado desde un pipeline, promocionarás versiones entre las vistas @local, @prerelease y @release, y configurarás los orígenes ascendentes que protegen a Contoso de que un paquete público desaparezca y, sobre todo, del ataque de confusión de dependencias.
Curso de Azure
Módulo 1: Introducción a Azure
- ¿Qué es Azure?
- Modelos de servicio, regiones y zonas de disponibilidad
- Crear y configurar tu cuenta de Azure
- Recorrido por el portal de Azure
- Azure Resource Manager: suscripciones, grupos de recursos y etiquetas
- Azure CLI, PowerShell y Cloud Shell
Módulo 2: Servicios principales de Azure
- Máquinas virtuales de Azure
- Escalado y alta disponibilidad del cómputo
- Azure App Service
- Azure Storage: blobs, archivos, colas y tablas
- Redes en Azure: redes virtuales, subredes y NSG
- Conectividad híbrida y entrega global
Módulo 3: Bases de datos de Azure
- Elegir el servicio de datos adecuado
- Azure SQL Database
- Azure Cosmos DB
- Azure Database for MySQL
- Azure Database for PostgreSQL
- Analítica de datos: Data Lake, Data Factory y Synapse
Módulo 4: Seguridad en Azure
- Microsoft Entra ID y gestión de identidades
- RBAC e identidades administradas
- Azure Key Vault
- Protección DDoS y firewall de aplicaciones web
- Microsoft Defender for Cloud
- Gobernanza y cumplimiento con Azure Policy
Módulo 5: Azure DevOps
- Introducción a Azure DevOps
- Azure Repos
- Azure Pipelines: integración continua
- Despliegue continuo con entornos y aprobaciones
- Azure Artifacts
- Infraestructura como código con Bicep
Módulo 6: Servicios avanzados de Azure
- Contenedores en Azure: Container Registry y Container Apps
- Azure Kubernetes Service (AKS)
- Azure Functions
- Azure Logic Apps
- Mensajería y eventos: Service Bus, Event Grid y Event Hubs
- Servicios de IA de Azure
Módulo 7: Monitoreo y gestión
- Azure Monitor: métricas, alertas y paneles
- Log Analytics y consultas KQL
- Application Insights
- Azure Automation y runbooks
- Copias de seguridad y recuperación ante desastres
Módulo 8: Gestión y optimización de costos
- Calculadora de precios y estimación de costes
- Azure Cost Management: análisis, presupuestos y alertas
- Reservas, planes de ahorro y Azure Hybrid Benefit
- Azure Advisor
- Estrategias de optimización y cultura FinOps
