Запуск рабочих нагрузок в Azure — Примеры

Пример 1 — Ключ в настройках приложения

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

resource "azurerm_linux_web_app" "orders" {
  name = "<orders-app>"
  # приложение читает ключ хранилища из своих настроек
}

Решение

resource "azurerm_linux_web_app" "orders" {
  name = "<orders-app>"

  identity {
    type = "SystemAssigned"
  }
}

resource "azurerm_role_assignment" "orders_storage" {
  principal_id         = azurerm_linux_web_app.orders.identity[0].principal_id
  role_definition_name = "<storage-reader-role>"
  scope                = "<storage-account-resource-id>"
}

Приложение получает токен во время работы, и в конфигурации не остаётся ничего секретного, поэтому вопрос «где пароль» исчезает, а ротация перестаёт быть задачей. Поскольку роль ограничена одним ресурсом, утёкшая конфигурация не откроет ничего пригодного к переиспользованию. Обычная ошибка — оставить ключ запасным вариантом «на случай, если идентичность откажет»: так сохраняется именно та учётная запись, ради удаления которой всё делалось.

Пример 2 — Одна группа ресурсов на всё

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

resource "azurerm_resource_group" "shared" {
  name     = "<shared-group>"
  location = "<region>"
}

resource "azurerm_linux_web_app" "orders" {
  name                = "<orders-app>"
  resource_group_name = azurerm_resource_group.shared.name
}

resource "azurerm_linux_web_app" "reporting" {
  name                = "<reporting-app>"
  resource_group_name = azurerm_resource_group.shared.name
}

Решение

resource "azurerm_resource_group" "orders" {
  name     = "<orders-group>"
  location = "<region>"
}

resource "azurerm_resource_group" "reporting" {
  name     = "<reporting-group>"
  location = "<region>"
}
# ресурсы каждого приложения переезжают в собственную группу

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