Группы ресурсов и модель ресурсов

Знакомимся с главной «папкой» Azure: как группы ресурсов задают жизненный цикл, зачем нужны теги, почему учебную песочницу удаляют одной командой и как называть ресурсы, чтобы не запутаться.

Группа ресурсов (Resource Group, RG) — контейнер жизненного цикла: всё, что создаётся, живёт и умирает вместе, кладут в одну группу. Она бесплатна, но именно она определяет, что вы удалите одной командой.

Новичок обычно воспринимает RG как «просто папку, чтобы не путаться». Это недооценка: группа ресурсов — это одновременно граница удаления, граница прав доступа и удобная единица учёта затрат.

Зачем это нужно на практике

Без групп подписка через месяц превращается в свалку: 40 объектов с именами вроде vm1, vm1-disk, test-db-final2, и никто не помнит, что из этого можно удалять. С группами всё иначе — RG отвечает сразу на три вопроса:

  • Что удалять вместе? Удалили RG — исчезли все ресурсы внутри неё. Ни одного «сироты» не осталось.
  • Кому давать права? Роли RBAC назначают на группу: «эта команда — Contributor в rg-shop-dev-weu» — и в прод они не попадут.
  • Сколько это стоит? Cost Management умеет группировать расходы по группам ресурсов и по тегам.

Правила игры

  • Ресурс принадлежит ровно одной группе ресурсов.
  • Группы нельзя вкладывать друг в друга — иерархия ровно одноуровневая.
  • У группы есть свой location, но это регион её метаданных, а не ограничение для содержимого: в группе с location westeurope спокойно могут лежать ресурсы из eastus. Впрочем, если регион метаданных недоступен, управлять группой вы временно не сможете — поэтому обычно берут регион, где живёт основная часть ресурсов.
  • Ресурсы можно переносить между группами (az resource move), но не все типы это поддерживают, и операция небезболезненная. Проще сразу нарезать правильно.

Как нарезать группы

Главный принцип — по жизненному циклу и окружению. Всё, что рождается, обновляется и умирает вместе, идёт в одну группу.

ПодходПримерОценка
Одна группа на приложение + окружениеrg-shop-dev-weu, rg-shop-prod-weu✅ Рабочий стандарт
Одна группа на всёrg-all❌ Свалка: нельзя ни права разграничить, ни удалить безопасно
Отдельная группа на каждый ресурсrg-vm1, rg-vm1-disk❌ Бюрократия без пользы
Отдельная группа под долгоживущее общееrg-shared-network-weu (VNet, Key Vault)✅ Оправдано: их жизненный цикл длиннее приложения

Последняя строка важна. Виртуальную сеть и хранилище секретов обычно создают один раз и надолго, а приложения над ними пересоздают. Держать их в одной RG с приложением — значит рискнуть снести сеть вместе с экспериментом.

Именование

У Microsoft есть готовая конвенция (Cloud Adoption Framework): {тип}-{нагрузка}-{окружение}-{регион}-{номер}.

rg-shop-prod-weu-001      группа ресурсов
vm-web-prod-weu-001       виртуальная машина
vnet-shop-prod-weu-001    виртуальная сеть
kv-shop-prod-weu-001      Key Vault
stshopprodweu001          storage account (особый случай!)

Обратите внимание на последнюю строку. У части сервисов имя попадает в публичное DNS-имя, поэтому оно должно быть глобально уникальным во всём Azure и подчиняется жёстким правилам. У storage account: только строчные латинские буквы и цифры, 3–24 символа, дефисы запрещены. Похожая история у App Service (*.azurewebsites.net) и Key Vault. Если получаете ошибку «name is already taken» — значит, это имя занял кто-то другой на планете; добавьте суффикс.

Теги

Тег — пара «ключ-значение», которую можно повесить на группу или ресурс (до 50 тегов на объект). Теги бесплатны, но именно они превращают счёт из загадки в отчёт: в Cost Analysis можно посмотреть расходы в разрезе тега project или env.

az group create \
  --name rg-shop-dev-weu \
  --location westeurope \
  --tags env=dev owner=ernest project=shop delete-after=2026-08-01

Джентльменский набор тегов: env (dev/stage/prod), owner (кому писать, если ресурс подозрительный), project (на кого списывать расходы), delete-after (дата, после которой временный ресурс можно смело удалять).

Важная тонкость: теги группы не наследуются ресурсами автоматически. Ресурс, созданный внутри rg-shop-dev-weu, тега env=dev сам по себе не получит. Наследование настраивают через Azure Policy (встроенная политика «Inherit a tag from the resource group»), либо теги проставляют в IaC-шаблоне.

Базовые команды

# создать
az group create -n rg-shop-dev-weu -l westeurope --tags env=dev owner=ernest

# посмотреть все группы
az group list -o table

# что лежит внутри группы
az resource list -g rg-shop-dev-weu -o table

# добавить тег к существующей группе
az group update -n rg-shop-dev-weu --set tags.project=shop

# защитить прод от случайного удаления
az lock create --name no-delete --lock-type CanNotDelete \
  --resource-group rg-shop-prod-weu

# и главный трюк учебной песочницы: снести всё разом
az group delete -n rg-shop-dev-weu --yes --no-wait

Результат:

Name              Location    Status
----------------  ----------  ---------
rg-shop-dev-weu   westeurope  Succeeded

Последняя команда — это буквально главная защита вашего кошелька в учебном курсе. Создавайте все эксперименты внутри одной временной группы — и, закончив работу, удаляйте её целиком. Тогда за вами не остаётся ни забытых дисков, ни публичных IP, ни балансировщиков, которые тихо капают в счёт.

Как это работает

Группа ресурсов — не физический объект, а запись в Azure Resource Manager: список ресурсов, их location, теги и назначения ролей. Сама по себе она ничего не стоит, потому что ничего не занимает.

Самое интересное происходит при удалении. az group delete отправляет в ARM одну асинхронную операцию; ARM строит граф зависимостей внутри группы и удаляет ресурсы в правильном порядке — сначала виртуальную машину, потом её сетевой интерфейс, потом IP-адрес, и только потом сеть. Флаг --no-wait возвращает вам приглашение терминала сразу, не дожидаясь конца — удаление продолжится на стороне Azure.

Важные исключения, о которые спотыкаются все:

  • Если на группе или на ресурсе висит lock типа CanNotDelete, удаление упадёт с ошибкой. Это фича, а не баг: так защищают прод.
  • Часть сервисов имеет soft-delete. Key Vault после удаления сохраняется «в корзине» (обычно 90 дней) и продолжает занимать своё имя — создать новый Key Vault с тем же именем не выйдет, пока вы не выполните az keyvault purge. Аналогично ведут себя некоторые другие сервисы, например хранилища резервных копий, которые могут вообще заблокировать удаление группы, пока в них есть защищённые элементы.
  • Удаление RG — необратимо. Корзины для группы ресурсов нет. Восстановить можно только то, что вы заранее забэкапили.

Частые ошибки

  • Удалить виртуальную машину и думать, что всё чисто. Диск, сетевой интерфейс и публичный IP могут пережить хозяина и продолжить тарифицироваться. Регулярно ищите «сирот»:
    az disk list --query "[?managedBy==null].{name:name, rg:resourceGroup, gb:diskSizeGb}" -o table
    Если всё лежало в одной RG — проблемы нет: удалили группу, ушли все.
  • Удалить не ту группу ресурсов. Ошибка на одну букву в имени — и прод исчез без корзины. Лечится тремя вещами: разные подписки для dev и prod, lock типа CanNotDelete на прод-группах, привычка выполнять az resource list -g … перед удалением.
  • Смешать dev и prod в одной RG. Тогда невозможно дать разработчику права на его окружение, не открыв ему прод.
  • Не поставить теги сразу. Через три месяца никто не вспомнит, чей это ресурс и куда списывать 200 долларов. Тег ставится в момент создания одной строкой — потом это уже археология.
  • Ожидать, что теги группы «протекут» на ресурсы. Не протекут. Нужна Azure Policy или явные теги в шаблоне.
  • Путать location группы с location ресурсов. Группа в westeurope не мешает создать в ней машину в eastus — и вы случайно заплатите за трафик между регионами.
  • Пытаться пересоздать Key Vault с тем же именем сразу после удаления группы. Имя держит soft-delete; нужен az keyvault purge --name ….

Итоги

  • Группа ресурсов — контейнер жизненного цикла: в неё кладут то, что живёт и умирает вместе. Сама по себе бесплатна.
  • RG — это ещё и граница прав (RBAC) и удобная единица учёта затрат.
  • Нарезайте группы по приложению и окружению (rg-shop-dev-weu), а долгоживущую общую инфраструктуру выносите отдельно.
  • Имена — по конвенции {тип}-{нагрузка}-{окружение}-{регион}-{номер}; у storage account, App Service и Key Vault имя глобально уникально и с жёсткими правилами.
  • Теги (env, owner, project, delete-after) ставьте при создании; наследование от группы — только через Azure Policy.
  • Учебная песочница = одна временная RG + az group delete --yes --no-wait в конце. Это лучшая защита от неожиданного счёта.
  • На прод вешайте lock: удаление группы необратимо, корзины нет.
Проверьте себя
1. Почему учебные эксперименты советуют создавать внутри одной временной группы ресурсов?
AГруппа ресурсов даёт скидку на все ресурсы внутри неё
BОдной командой az group delete удаляются все ресурсы группы, и не остаётся забытых дисков и IP, за которые продолжают списывать деньги
CРесурсы внутри одной группы работают быстрее
DAzure не разрешает создавать ресурсы более чем в одной группе
2. Вы повесили тег env=dev на группу ресурсов rg-shop-dev-weu и создали в ней виртуальную машину. Какой тег будет у машины?
Aenv=dev — теги группы наследуются ресурсами автоматически
BНикакого — теги группы не наследуются, их задают явно или через Azure Policy
Cenv=prod — по умолчанию Azure ставит prod
DТег появится, но только через 24 часа