En la lección anterior creaste un grupo de recursos y una cuenta de almacenamiento haciendo clics, y quedaron preguntas en el aire: ¿qué es realmente un grupo de recursos? ¿Por qué borrarlo elimina todo lo que contiene? ¿Por qué las etiquetas no se heredan? ¿Y cómo es posible que el portal, la línea de comandos y una plantilla hagan exactamente lo mismo?
La respuesta a todas es la misma: Azure Resource Manager (ARM), el plano de control de Azure. Entender ARM es lo que separa a quien "sabe usar el portal" de quien entiende Azure. Esta lección es la más importante del módulo desde el punto de vista conceptual, y sus consecuencias prácticas —organización, gobierno, coste, protección de producción— te acompañarán hasta el último módulo.
Contenido
- Qué es Azure Resource Manager
- La jerarquía completa de Azure
- Proveedores de recursos y su registro
- El ID de recurso y cómo leerlo
- Criterios reales para agrupar recursos
- Bloqueos de recurso: proteger producción
- Mover recursos entre grupos y suscripciones
- Etiquetas: para qué sirven de verdad
- El esquema de etiquetado de Contoso Airlines
- Plantillas ARM y Bicep como concepto
- Límites y cuotas de suscripción
- Errores Comunes y Consejos
- Ejercicios
- Conclusión
- Qué es Azure Resource Manager
Azure Resource Manager es el servicio de gestión de Azure: la única puerta por la que pasan todas las operaciones de creación, modificación, lectura y eliminación de recursos. No es una herramienta que uses directamente; es la API que hay detrás de todas las herramientas.
graph TD
P[Portal de Azure] --> ARM
C[Azure CLI] --> ARM
PS[Azure PowerShell] --> ARM
S[SDK: .NET, Python, Java...] --> ARM
T[Plantillas ARM / Bicep / Terraform] --> ARM
R[REST API directa] --> ARM
ARM["Azure Resource Manager<br/>autenticacion, autorizacion RBAC,<br/>validacion, control de politicas,<br/>orquestacion y registro de actividad"]
ARM --> RP1[Proveedor: Microsoft.Compute]
ARM --> RP2[Proveedor: Microsoft.Storage]
ARM --> RP3[Proveedor: Microsoft.Web]
ARM --> RP4[Proveedor: Microsoft.Sql]
Consecuencias prácticas de este diseño, todas comprobables:
- Coherencia total. Lo que puedes hacer por el portal puedes hacerlo por CLI, y viceversa. Si algo aparece en una herramienta y no en otra, suele ser cuestión de versión, no de capacidad.
- Un solo punto de seguridad. Los permisos RBAC (módulo 4) y las políticas (módulo 4) se aplican en ARM, así que valen para todas las herramientas por igual. No puedes "esquivar" una política usando la CLI.
- Auditoría unificada. El registro de actividad que viste en la lección anterior recoge las operaciones vengan de donde vengan.
- Despliegues declarativos. ARM acepta plantillas que describen el estado deseado, resuelve el orden de creación y paraleliza lo que puede.
- Operaciones idempotentes. Enviar dos veces el mismo estado deseado no crea dos recursos: converge al mismo resultado. Esta propiedad es la base de la infraestructura como código.
Un matiz que evita confusiones futuras: ARM gobierna el plano de control (crear una cuenta de almacenamiento, cambiar su nivel). El plano de datos (subir un blob, ejecutar una consulta SQL) lo atiende cada servicio con su propio extremo y sus propios permisos. Dos planos, dos modelos de acceso.
- La jerarquía completa de Azure
Cuatro niveles, de mayor a menor alcance. Cada uno tiene un propósito distinto y es donde se aplican determinadas cosas.
graph TD
MG0[Grupo de administracion raiz<br/>Contoso Airlines]
MG0 --> MG1[Grupo de administracion<br/>Produccion]
MG0 --> MG2[Grupo de administracion<br/>No produccion]
MG1 --> S1[Suscripcion<br/>Contoso Airlines - Produccion]
MG2 --> S2[Suscripcion<br/>Contoso Airlines - Desarrollo]
S1 --> RG1[rg-contoso-reservas-pro]
S1 --> RG2[rg-contoso-red-pro]
S2 --> RG3[rg-contoso-reservas-dev]
RG1 --> R1[app-contoso-reservas-pro]
RG1 --> R2[sttarjetascontosopro]
RG1 --> R3[sql-contoso-reservas-pro]
RG2 --> R4[vnet-contoso-pro]
| Nivel | Qué es | Para qué sirve | Se aplica aquí |
|---|---|---|---|
| Grupo de administración | Contenedor de suscripciones, anidable hasta 6 niveles | Aplicar gobierno a muchas suscripciones a la vez | Políticas, permisos RBAC heredados por todas las suscripciones que contiene |
| Suscripción | Unidad de facturación y contenedor de recursos | Separar entornos, departamentos o clientes; límite de cuotas | Facturación, cuotas, políticas, permisos |
| Grupo de recursos | Contenedor lógico dentro de una suscripción | Organizar por ciclo de vida; borrado y despliegue conjunto | Permisos, políticas, bloqueos, despliegues |
| Recurso | La instancia concreta (una VM, una base de datos) | Hacer el trabajo | Permisos, bloqueos, configuración |
Reglas de hierro que hay que memorizar:
- Todo recurso pertenece a exactamente un grupo de recursos, y este a exactamente una suscripción.
- Los permisos y las políticas se heredan hacia abajo. Un permiso concedido en la suscripción se aplica a todos sus grupos y recursos.
- Las etiquetas NO se heredan. Insisto porque es contraintuitivo justo por el punto anterior. Lo veremos en el apartado 8.
- Un grupo de recursos puede contener recursos de regiones distintas. Su propia región solo dice dónde se guardan los metadatos del grupo.
- Borrar un grupo de recursos borra todo su contenido, sin excepción y sin papelera.
Sobre los grupos de administración: Contoso todavía no los necesita con dos suscripciones, pero son la herramienta correcta en cuanto haya varias. Permiten, por ejemplo, aplicar una política de "solo se puede desplegar en regiones europeas" a todo lo que cuelgue del grupo Producción, sin repetirla suscripción a suscripción. Se desarrollan en la lección 04-06 (Azure Policy).
- Proveedores de recursos y su registro
Un proveedor de recursos (resource provider) es el componente de ARM que sabe crear y gestionar una familia de recursos. Su nombre tiene la forma Microsoft.<Familia>:
| Proveedor | Qué gestiona | Tipos de recurso de ejemplo |
|---|---|---|
Microsoft.Compute |
Cómputo IaaS | virtualMachines, disks, availabilitySets |
Microsoft.Storage |
Almacenamiento | storageAccounts |
Microsoft.Web |
App Service y Functions | sites, serverfarms |
Microsoft.Sql |
Azure SQL | servers, servers/databases |
Microsoft.Network |
Redes | virtualNetworks, networkSecurityGroups, publicIPAddresses |
Microsoft.KeyVault |
Key Vault | vaults |
Microsoft.Insights |
Monitorización | components, metricAlerts |
Cada proveedor debe estar registrado en la suscripción para poder usarlo. El portal registra automáticamente el proveedor cuando creas el primer recurso de esa familia, por eso normalmente ni te enteras. Pero cuando despliegas por CLI o con una plantilla, un proveedor sin registrar produce un error críptico del tipo "The subscription is not registered to use namespace 'Microsoft.X'".
# Lista el estado de registro de todos los proveedores de la suscripción activa.
az provider list --query "[].{Proveedor:namespace, Estado:registrationState}" --output table
# Registra manualmente un proveedor (operación asíncrona: puede tardar un par de minutos).
az provider register --namespace Microsoft.Storage
# Comprueba si ya está registrado.
az provider show --namespace Microsoft.Storage --query "registrationState" --output tsvLos proveedores también determinan qué versiones de API están disponibles y en qué regiones existe cada tipo de recurso:
# Muestra en qué regiones está disponible el tipo "cuenta de almacenamiento".
# Útil para verificar antes de desplegar en una región poco común.
az provider show --namespace Microsoft.Storage \
--query "resourceTypes[?resourceType=='storageAccounts'].locations" \
--output json
- El ID de recurso y cómo leerlo
Cada recurso de Azure tiene un identificador único y global. Aparece en los registros, en los mensajes de error, en las plantillas y en cualquier automatización, así que hay que saber leerlo de un vistazo.
/subscriptions/8f4c2b7a-1d3e-4a55-9c11-0a7b6e2d4f90/resourceGroups/rg-contoso-reservas-pro/providers/Microsoft.Storage/storageAccounts/sttarjetascontosopro
Desglose por segmentos:
| Segmento | Valor en el ejemplo | Significado |
|---|---|---|
/subscriptions/ |
8f4c2b7a-...-4f90 |
Identificador de la suscripción (GUID) |
/resourceGroups/ |
rg-contoso-reservas-pro |
Grupo de recursos que lo contiene |
/providers/ |
Microsoft.Storage |
Proveedor de recursos responsable |
| Tipo de recurso | storageAccounts |
Tipo concreto dentro del proveedor |
| Nombre | sttarjetascontosopro |
Nombre del recurso |
Los recursos hijos anidan el patrón. Una base de datos dentro de un servidor SQL:
/subscriptions/{sub}/resourceGroups/rg-contoso-reservas-pro/providers/Microsoft.Sql/servers/sql-contoso-reservas-pro/databases/db-reservasY algunos recursos viven directamente en la suscripción, sin grupo (por ejemplo, una asignación de política a nivel de suscripción):
Obtener el ID de un recurso desde la CLI:
# Devuelve solo el ID, en texto plano, listo para usar en otro comando o script.
az storage account show \
--name sttarjetascontosodev \
--resource-group rg-contoso-reservas-dev \
--query id --output tsv
- Criterios reales para agrupar recursos
La pregunta que todo el mundo hace: "¿cuántos grupos de recursos creo y qué pongo en cada uno?". La respuesta profesional no es "uno por proyecto" sin más.
El criterio principal: ciclo de vida compartido
Pon en el mismo grupo lo que nace y muere junto. Si vas a borrar la aplicación de reservas, ¿quieres que desaparezca también la red virtual corporativa? No. Entonces no van en el mismo grupo.
Criterios secundarios
| Criterio | Regla | Ejemplo en Contoso |
|---|---|---|
| Entorno | Nunca mezcles producción y desarrollo en el mismo grupo | rg-contoso-reservas-pro y rg-contoso-reservas-dev |
| Permisos | Los recursos que comparten quién puede administrarlos van juntos, porque RBAC se asigna cómodamente a nivel de grupo | La red corporativa la administra solo Marta: grupo propio |
| Ciclo de vida | Lo compartido y duradero, separado de lo efímero | Red y Key Vault duran años; una aplicación de campaña, semanas |
| Facturación | Los grupos son un eje natural de análisis de coste, complementado con etiquetas | Coste por grupo en Cost Management (módulo 8) |
Antipatrones que verás en empresas reales
- "Todo junto": un único grupo con 300 recursos. Imposible de dar permisos con criterio, imposible de borrar nada con seguridad.
- "Uno por recurso": 300 grupos con un recurso cada uno. Toda la sobrecarga de gestión y ninguna de las ventajas.
- "Por tipo de recurso": un grupo para todas las VM, otro para todas las bases de datos. Suena ordenado y es un desastre: nada comparte ciclo de vida y no puedes borrar un proyecto sin ir pieza a pieza.
La organización de Contoso Airlines
| Grupo de recursos | Contenido | Ciclo de vida |
|---|---|---|
rg-contoso-reservas-pro |
Web, API, base de datos y almacenamiento de la plataforma en producción | Vive mientras viva el producto |
rg-contoso-reservas-dev |
Los mismos componentes en versión de desarrollo | Se puede recrear entero cuando convenga |
rg-contoso-red-pro |
Red virtual, subredes, puerta de enlace de VPN | Larga duración, compartida por varias aplicaciones |
rg-contoso-seguridad-pro |
Key Vault, espacio de trabajo de Log Analytics | Larga duración, permisos muy restringidos |
Los tres últimos se irán poblando en los módulos 2, 4 y 7. Fíjate en que la red está separada: es exactamente el tipo de recurso compartido y duradero que no debe morir con una aplicación.
- Bloqueos de recurso: proteger producción
Un bloqueo (lock) impide operaciones destructivas incluso a quien tiene permisos de propietario. Es la red de seguridad contra el error humano, no contra el ataque.
| Tipo de bloqueo | Qué impide | Qué permite |
|---|---|---|
| CanNotDelete (No se puede eliminar) | Eliminar el recurso | Leer y modificar |
| ReadOnly (Solo lectura) | Eliminar y modificar | Solo lectura |
Se pueden aplicar a suscripción, grupo de recursos o recurso individual, y se heredan hacia abajo: un bloqueo en el grupo protege a todos sus recursos.
# Bloqueo CanNotDelete sobre el grupo de producción completo.
# --notes documenta por qué existe; tu yo del futuro te lo agradecerá.
az lock create \
--name "no-borrar-produccion" \
--lock-type CanNotDelete \
--resource-group rg-contoso-reservas-pro \
--notes "Protege la plataforma de venta. Solicitar a Marta Rios para retirarlo."
# Listar los bloqueos existentes en un grupo.
az lock list --resource-group rg-contoso-reservas-pro --output table
# Eliminar un bloqueo (requiere permiso específico sobre Microsoft.Authorization/locks).
az lock delete --name "no-borrar-produccion" --resource-group rg-contoso-reservas-proDesde el portal: recurso o grupo → Bloqueos → Agregar.
Efectos secundarios que hay que conocer
ReadOnly es más agresivo de lo que parece y provoca sorpresas:
- Un
ReadOnlysobre un grupo con una cuenta de almacenamiento impide listar las claves de acceso, porque esa operación es técnicamente una escritura (listKeys). Aplicaciones que funcionaban dejan de funcionar. - Un
ReadOnlysobre una máquina virtual impide iniciarla o detenerla. - Los bloqueos afectan al plano de control, no al de datos: con
CanNotDeletesobre una cuenta de almacenamiento, nadie puede borrar la cuenta, pero cualquiera con permisos de datos sí puede borrar los blobs de dentro. Para eso existen otras protecciones (retención, eliminación temporal), que se ven en el módulo 2.
Práctica recomendada en Contoso: CanNotDelete en todos los grupos de producción y en los recursos con estado (bases de datos, cuentas de almacenamiento, Key Vault). ReadOnly solo en casos muy justificados y con pruebas previas.
- Mover recursos entre grupos y suscripciones
Los recursos se pueden mover, pero con reglas. Es una operación habitual cuando reorganizas o cuando un proyecto pasa de desarrollo a producción.
# Mover una cuenta de almacenamiento a otro grupo de recursos de la misma suscripción.
# --ids acepta uno o varios IDs completos, separados por espacios.
az resource move \
--destination-group rg-contoso-reservas-pro \
--ids "/subscriptions/8f4c2b7a-1d3e-4a55-9c11-0a7b6e2d4f90/resourceGroups/rg-contoso-reservas-dev/providers/Microsoft.Storage/storageAccounts/sttarjetascontosodev"Límites que debes conocer antes de intentarlo
- No todos los recursos se pueden mover. Existe una lista oficial por tipo de recurso; comprueba siempre antes. Ejemplos habituales de restricción: puertas de enlace de VPN, algunas configuraciones de red y ciertos recursos con dependencias regionales.
- Mover no cambia la región. Un recurso en West Europe sigue en West Europe aunque lo muevas a un grupo cuya región sea otra. Para "moverlo de región" hay que recrearlo o replicarlo.
- Durante el movimiento, el grupo de origen y el de destino quedan bloqueados para escritura hasta que termine.
- Hay que mover los recursos dependientes juntos. Una VM necesita ir con su interfaz de red, sus discos y su IP pública.
- Los identificadores cambian, porque el ID incluye el grupo. Cualquier script, alerta o asignación de política que apunte al ID antiguo dejará de funcionar.
- Las asignaciones de permisos y las políticas no viajan con el recurso: se aplican las del nuevo ámbito. Revisa el acceso después de mover.
- Mover entre suscripciones exige además que ambas estén en el mismo inquilino de Microsoft Entra ID y que los proveedores estén registrados en la de destino.
Consejo práctico: en un movimiento importante, valida primero:
# Simula la validación del movimiento sin ejecutarlo (endpoint validateMoveResources).
# Si devuelve error, te dice exactamente qué recurso no se puede mover y por qué.
az resource invoke-action \
--action validateMoveResources \
--ids "/subscriptions/{sub}/resourceGroups/rg-contoso-reservas-dev" \
--request-body '{
"resources": ["/subscriptions/{sub}/resourceGroups/rg-contoso-reservas-dev/providers/Microsoft.Storage/storageAccounts/sttarjetascontosodev"],
"targetResourceGroup": "/subscriptions/{sub}/resourceGroups/rg-contoso-reservas-pro"
}'
- Etiquetas: para qué sirven de verdad
Una etiqueta (tag) es un par nombre-valor que se adjunta a una suscripción, un grupo de recursos o un recurso. Cada recurso admite hasta 50 etiquetas.
Las etiquetas parecen un adorno hasta que la empresa tiene 400 recursos. Entonces se convierten en la única forma de responder a preguntas críticas:
| Pregunta real | Etiqueta que la responde |
|---|---|
| ¿Cuánto nos cuesta el proyecto de reservas frente al de fidelización? | proyecto |
| ¿A qué centro de coste imputamos esta factura? | centro-coste |
| ¿A quién llamo si esta máquina falla el domingo? | propietario |
| ¿Qué recursos son de producción y no se pueden tocar? | entorno |
| ¿Qué se puede apagar por la noche para ahorrar? | horario o entorno |
| ¿Qué recursos contienen datos personales? | clasificacion-datos |
Es decir: coste, propiedad y cumplimiento. Sin etiquetas, la conversación del módulo 8 con Nuria Peña ("¿por qué gastamos 4.000 € este mes?") es imposible de mantener, porque Cost Management sabrá decirte que gastas en máquinas virtuales, pero no de quién son.
La herencia que NO existe
Las etiquetas no se heredan. Una etiqueta puesta en un grupo de recursos no aparece en los recursos que contiene. Es la trampa número uno de Azure para quien viene del portal, porque todo lo demás (permisos, políticas, bloqueos) sí se hereda.
¿Por qué importa tanto? Porque los informes de coste se agregan por la etiqueta del recurso que genera el cargo. Si etiquetaste solo el grupo, tus informes por centro-coste saldrán vacíos.
Las tres soluciones reales:
- Etiquetar en la creación, siempre, en la pestaña Etiquetas o con el parámetro
--tags. Es la disciplina básica. - Azure Policy con efecto
Modify: una política que añade automáticamente al recurso la etiqueta heredada del grupo. Es la solución profesional y se ve en la lección 04-06. - Infraestructura como código: las etiquetas van escritas en la plantilla y se aplican solas en cada despliegue (lección 05-06).
Otros detalles operativos:
- Los nombres de etiqueta no distinguen mayúsculas de minúsculas para las operaciones, pero los valores sí las conservan tal cual los escribes. Elige un formato y respétalo:
produccionyProduccionse contarán como valores distintos en los informes. - No pongas secretos en etiquetas: son visibles para cualquiera con permiso de lectura.
- Algunos tipos de recurso no admiten etiquetas; son minoría, pero existen.
Trabajar con etiquetas desde la CLI
# Aplicar (o reemplazar) el conjunto completo de etiquetas de un grupo de recursos.
# Cuidado: "az tag create" REEMPLAZA todas las etiquetas existentes.
az tag create \
--resource-id "/subscriptions/{sub}/resourceGroups/rg-contoso-reservas-pro" \
--tags entorno=produccion proyecto=contoso-reservas centro-coste=CC-1042 [email protected]
# Añadir o actualizar etiquetas SIN borrar las que ya existen.
az tag update \
--resource-id "/subscriptions/{sub}/resourceGroups/rg-contoso-reservas-pro" \
--operation Merge \
--tags criticidad=alta
# Listar todos los recursos que llevan una etiqueta concreta, en toda la suscripción.
az resource list --tag proyecto=contoso-reservas --output table
# Ver las etiquetas de un recurso concreto en formato JSON.
az resource show \
--name sttarjetascontosodev \
--resource-group rg-contoso-reservas-dev \
--resource-type "Microsoft.Storage/storageAccounts" \
--query tagsSalida típica del último comando:
{
"centro-coste": "CC-1042",
"entorno": "desarrollo",
"propietario": "[email protected]",
"proyecto": "contoso-reservas"
}Y en el portal: recurso o grupo → sección Etiquetas → añadir pares nombre/valor → Aplicar. Para etiquetar muchos recursos a la vez, usa Todos los recursos, marca las casillas y pulsa Asignar etiquetas.
- El esquema de etiquetado de Contoso Airlines
Marta Ríos publica este esquema como norma interna. Es obligatorio en todos los recursos y lo usaremos durante todo el curso.
| Etiqueta | Obligatoria | Valores permitidos | Para qué |
|---|---|---|---|
entorno |
Sí | produccion, desarrollo, pruebas |
Distinguir qué se puede tocar y qué no; base de las políticas |
proyecto |
Sí | contoso-reservas (y futuros proyectos) |
Agrupar coste por producto |
centro-coste |
Sí | CC-1042 (reservas) |
Imputación contable para Nuria Peña |
propietario |
Sí | Correo corporativo de una persona | Saber a quién llamar |
criticidad |
Recomendada | alta, media, baja |
Priorizar en incidencias y decidir redundancia |
horario |
Opcional | 24x7, laborable |
Permitir apagado automático nocturno (módulo 7) |
Reglas del esquema:
- Todos los valores en minúsculas y sin acentos, para que los informes agrupen bien.
propietarioes siempre una persona, no un departamento: los departamentos no responden al teléfono.- Los recursos sin las cuatro etiquetas obligatorias se marcan como no conformes y aparecerán en el informe de cumplimiento cuando implantemos Azure Policy (lección 04-06).
Aplicado a los recursos que ya conoces:
# Etiquetado completo del grupo de producción de Contoso.
az group create \
--name rg-contoso-reservas-pro \
--location westeurope \
--tags entorno=produccion \
proyecto=contoso-reservas \
centro-coste=CC-1042 \
[email protected] \
criticidad=alta \
horario=24x7
- Plantillas ARM y Bicep como concepto
Ya sabes que ARM acepta descripciones declarativas del estado deseado. Esas descripciones son las plantillas ARM (JSON) y Bicep (un lenguaje más legible que se compila a JSON). Aquí solo el concepto: el desarrollo completo está en la lección 05-06.
Una plantilla ARM en JSON, reducida a lo mínimo:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"nombreCuenta": { "type": "string" }
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"name": "[parameters('nombreCuenta')]",
"location": "westeurope",
"sku": { "name": "Standard_LRS" },
"kind": "StorageV2",
"tags": {
"entorno": "desarrollo",
"proyecto": "contoso-reservas",
"centro-coste": "CC-1042",
"propietario": "[email protected]"
}
}
]
}Lo mismo en Bicep, mucho más legible:
param nombreCuenta string
resource cuenta 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: nombreCuenta
location: 'westeurope'
sku: { name: 'Standard_LRS' }
kind: 'StorageV2'
tags: {
entorno: 'desarrollo'
proyecto: 'contoso-reservas'
'centro-coste': 'CC-1042'
propietario: '[email protected]'
}
}Tres ideas para quedarse:
- Es declarativo: describes el resultado, no los pasos. ARM calcula qué hay que crear, modificar o dejar igual.
- Es idempotente: desplegar cinco veces deja el mismo resultado que desplegar una.
- Es versionable: la plantilla vive en Git, se revisa en un pull request y se despliega desde una tubería (módulo 5).
Truco de aprendizaje que ya viste en el portal: en cualquier recurso, sección Automatización → Exportar plantilla, obtienes el JSON del recurso existente. Es la mejor forma de aprender la sintaxis a partir de algo que ya funciona.
- Límites y cuotas de suscripción
Azure no es infinito. Cada suscripción tiene límites (algunos fijos, otros ampliables abriendo una solicitud de soporte). Enterarse de un límite en mitad de un despliegue urgente es una experiencia desagradable y evitable.
| Elemento | Límite orientativo por suscripción | Ampliable |
|---|---|---|
| Grupos de recursos | 980 | No |
| Recursos por grupo de recursos | 800 por tipo de recurso (varía) | Algunos sí |
| Núcleos de máquina virtual por región | Cuota inicial baja (a menudo 10-20 en cuentas nuevas), por familia de VM | Sí, es la solicitud más común |
| Cuentas de almacenamiento por región | 250 | Sí |
| Redes virtuales | 1.000 | Sí |
| Direcciones IP públicas estándar | 1.000 | Sí |
| Etiquetas por recurso | 50 | No |
| Despliegues por grupo de recursos (histórico) | 800 | No (se depura el histórico) |
Las cifras exactas cambian; consulta siempre "Suscripción de Azure y límites, cuotas y restricciones del servicio" en la documentación oficial.
La cuota que más problemas da a los principiantes es la de núcleos de VM por región y familia: una cuenta gratuita nueva puede tener margen para muy pocas máquinas, y el error al desplegar ("Operation could not be completed as it results in exceeding approved quota") desconcierta porque parece un fallo del despliegue y no lo es.
Consultar tu cuota real:
# Uso y límite de núcleos de cómputo en West Europe.
# CurrentValue = lo que ya usas; Limit = tu tope actual.
az vm list-usage --location westeurope --output table
# Filtrar solo las familias donde ya estás consumiendo algo.
az vm list-usage --location westeurope \
--query "[?currentValue > \`0\`].{Recurso:localName, Usado:currentValue, Limite:limit}" \
--output tablePara ampliar cuota: portal → Suscripciones → tu suscripción → Uso + cuotas → Solicitar aumento. Suele resolverse en minutos u horas.
Errores Comunes y Consejos
- Crear un grupo de recursos "cajón de sastre". Si no sabes por qué un recurso está ahí, está mal ubicado. Agrupa por ciclo de vida.
- Creer que las etiquetas se heredan. No se heredan. Etiqueta cada recurso en la creación o automatízalo con Azure Policy.
- Etiquetar con valores inconsistentes.
Produccion,produccion,PROyprodson cuatro valores distintos en los informes de coste, y el informe queda inservible. Fija el vocabulario y respétalo. - Poner
ReadOnlyalegremente. Puede romper aplicaciones al impedir operaciones que parecen de lectura pero son de escritura (como listar claves). Prueba primero en desarrollo. - Confiar en
CanNotDeletepara proteger datos. Protege el recurso, no su contenido. Los blobs de dentro se pueden borrar igualmente. - Mover recursos sin comprobar la lista de soportados ni avisar de que los IDs cambiarán. Revisa después las alertas, los scripts y los permisos.
- Ignorar el registro de proveedores al automatizar en una suscripción nueva. Registra los proveedores al principio del script.
- Descubrir la cuota de núcleos en mitad de un despliegue. Consúltala antes con
az vm list-usage. - Consejo de coste: los grupos de recursos, las etiquetas y los bloqueos son gratuitos. Úsalos sin miedo: son la infraestructura de gobierno más barata que existe y la que más dinero ahorra a medio plazo.
Ejercicios
Ejercicio 1: Diseñar la organización de recursos
Contoso Airlines va a lanzar además un programa de fidelización ("Contoso Millas"), con su propia web, su base de datos y su centro de coste CC-2077, propiedad de Diego Salas. Compartirá la red virtual corporativa y el Key Vault existentes.
- Propón los grupos de recursos necesarios y qué contiene cada uno.
- Justifica por qué la red virtual no debe estar en el grupo del proyecto.
- Escribe el conjunto de etiquetas obligatorias para el grupo de producción de Contoso Millas.
Ejercicio 2: Leer y construir identificadores
- Descompón este ID en sus cinco partes e indica qué es cada una:
/subscriptions/8f4c2b7a-1d3e-4a55-9c11-0a7b6e2d4f90/resourceGroups/rg-contoso-red-pro/providers/Microsoft.Network/virtualNetworks/vnet-contoso-pro
- Construye el ID que tendría una subred llamada
snet-webdentro de esa misma red virtual. - Escribe el comando de la CLI que devuelve solo el ID de la cuenta de almacenamiento
sttarjetascontosoprodel gruporg-contoso-reservas-pro.
Ejercicio 3: Proteger y consultar
- Escribe los comandos para crear el grupo
rg-contoso-reservas-proen West Europe con las cuatro etiquetas obligatorias y aplicarle un bloqueoCanNotDelete. - Escribe el comando que lista todos los recursos de la suscripción etiquetados con
proyecto=contoso-reservas. - Marta intenta borrar el grupo desde el portal y falla. Explica qué ocurre y qué debe hacer para conseguirlo legítimamente.
- Diego pone
ReadOnlysobre el grupo de desarrollo y, al día siguiente, la aplicación de pruebas deja de arrancar porque no puede leer las claves de la cuenta de almacenamiento. Explica por qué.
Soluciones
Solución 1:
- Grupos propuestos:
| Grupo | Contenido |
|---|---|
rg-contoso-millas-pro |
Web, base de datos y almacenamiento de fidelización en producción |
rg-contoso-millas-dev |
Los mismos componentes en desarrollo |
rg-contoso-red-pro (ya existe) |
Red virtual y subredes, compartidas |
rg-contoso-seguridad-pro (ya existe) |
Key Vault y Log Analytics, compartidos |
-
La red virtual tiene un ciclo de vida distinto: sobrevive a los proyectos y la comparten varias aplicaciones. Si viviera dentro del grupo del proyecto, al retirar Contoso Millas se borraría la red de todos, y además habría que dar a los desarrolladores permisos sobre un recurso de infraestructura que no deben administrar.
-
Etiquetas del grupo de producción de Millas:
az group create \
--name rg-contoso-millas-pro \
--location westeurope \
--tags entorno=produccion \
proyecto=contoso-millas \
centro-coste=CC-2077 \
[email protected]Solución 2:
- Descomposición:
| Parte | Valor |
|---|---|
| Suscripción | 8f4c2b7a-1d3e-4a55-9c11-0a7b6e2d4f90 |
| Grupo de recursos | rg-contoso-red-pro |
| Proveedor | Microsoft.Network |
| Tipo de recurso | virtualNetworks |
| Nombre | vnet-contoso-pro |
- ID de la subred (recurso hijo, se anida tipo/nombre):
/subscriptions/8f4c2b7a-1d3e-4a55-9c11-0a7b6e2d4f90/resourceGroups/rg-contoso-red-pro/providers/Microsoft.Network/virtualNetworks/vnet-contoso-pro/subnets/snet-web
- Comando:
az storage account show \
--name sttarjetascontosopro \
--resource-group rg-contoso-reservas-pro \
--query id --output tsvSolución 3:
- Creación y bloqueo:
az group create \
--name rg-contoso-reservas-pro \
--location westeurope \
--tags entorno=produccion proyecto=contoso-reservas \
centro-coste=CC-1042 [email protected]
az lock create \
--name "no-borrar-produccion" \
--lock-type CanNotDelete \
--resource-group rg-contoso-reservas-pro \
--notes "Plataforma de venta en produccion"- Listado por etiqueta:
-
El bloqueo
CanNotDeleteimpide la eliminación aunque Marta sea propietaria. Para borrarlo legítimamente debe primero eliminar el bloqueo (az lock deleteo portal → Bloqueos), lo que exige permiso sobreMicrosoft.Authorization/locks, y después borrar el grupo. Ese paso extra, deliberadamente incómodo, es exactamente el punto: obliga a una decisión consciente. -
Porque
ReadOnlybloquea cualquier operación de escritura en el plano de control, y obtener las claves de una cuenta de almacenamiento se implementa como la acciónlistKeys, que ARM clasifica como escritura. La aplicación no puede recuperar las claves y falla al arrancar. Solución: retirar elReadOnly(usarCanNotDeleteen su lugar) y, mejor aún, dejar de usar claves y pasar a identidades administradas (lección 04-02).
Conclusión
Azure Resource Manager es el plano de control único de Azure: portal, CLI, PowerShell, SDK y plantillas hablan con la misma API, y por eso los permisos, las políticas y la auditoría son coherentes vengas de donde vengas. Sobre él se apoya la jerarquía grupo de administración → suscripción → grupo de recursos → recurso, donde los permisos y las políticas se heredan hacia abajo... y las etiquetas no.
Has aprendido a leer un ID de recurso, a registrar proveedores, a agrupar recursos por ciclo de vida y entorno (evitando el "todo junto" y el "uno por tipo"), a proteger producción con bloqueos —conociendo las trampas de ReadOnly y los límites de CanNotDelete—, a mover recursos sabiendo que los IDs cambian y que los permisos no viajan, y a diseñar un esquema de etiquetado serio: el de Contoso Airlines, con entorno, proyecto, centro-coste y propietario como obligatorias. También has visto de qué van las plantillas ARM y Bicep, y dónde están los límites y cuotas que conviene mirar antes y no después.
Has notado que en esta lección los ejemplos ya eran, casi todos, comandos. No es casualidad: gobernar decenas de recursos con etiquetas y bloqueos a base de clics no escala. En la última lección del módulo, Azure CLI, PowerShell y Cloud Shell, aprenderás a manejar Azure desde la línea de comandos y escribirás tu primer script completo, parametrizado e idempotente, que crea toda la base de Contoso Airlines y sabe limpiarse después.
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
