Обзор поставщика Terraform AzAPI

Поставщик AzAPI — это тонкий слой поверх REST API Azure ARM. Он позволяет управлять любым типом ресурсов Azure с помощью любой версии API, что позволяет использовать последние функциональные возможности в Azure. AzAPI — это поставщик первого класса, предназначенный для использования самостоятельно или в тандеме с поставщиком AzureRM.

Преимущества использования поставщика AzAPI

Поставщик AzAPI имеет следующие преимущества:

  • Поддерживает все службы контрольной плоскости Azure:
    • Предварительные версии служб и функций
    • Все версии API
  • Полная целостность файла состояния Terraform
    • Свойства и значения сохраняются в состоянии
  • Нет зависимости от Swagger
  • Общая и согласованная проверка подлинности Azure
  • Встроенная предварительная проверка готовности
  • Детальный контроль над разработкой инфраструктуры
  • Расширение Microsoft Visual Studio Code Terraform

Ресурсы

Чтобы разрешить управлять всеми ресурсами и функциями Azure без необходимости обновления, поставщик AzAPI включает следующие универсальные ресурсы:

Имя ресурса Описание
azapi_resource Используется для полного управления любым ресурсом Azure контрольной плоскости (API) с полным CRUD.
   Примеры вариантов использования:
      Новая предварительная версия службы
      Новая функция, добавленная в существующую службу
      Любой ресурс Azure, доступный через API ARM
azapi_update_resource Используется для управления ресурсами или частями ресурсов, которые не имеют полного CRUD
   Примеры вариантов использования:
      Обновление новых свойств существующей службы
      Обновите предварительно созданный дочерний ресурс, например запись SOA DNS.
azapi_resource_action Используется для выполнения одной операции с ресурсом без управления жизненным циклом ресурса.
   Примеры вариантов использования:
      Завершение работы виртуальной машины
      Добавление секрета в Key Vault
azapi_data_plane_resource Используется для управления определенным подмножеством ресурсов плоскости данных Azure
   Примеры вариантов использования:
      Контакты сертификатов KeyVault
      Библиотеки рабочей области Synapse

Подробное описание того, как работает платформа плоскости данных и как parent_id отличается от ресурсов плоскости управления, см. в разделе "Общие сведения о платформе плоскости данных AzAPI".

Иерархия использования

В целом процесс использования должен следовать следующим шагам.

  1. Начните с выполнения как можно больше операций в пределах azapi_resource.
  2. Если тип ресурса не существует в пределах azapi_resource , но не соответствует одному из типов, поддерживаемых azapi_data_plane_resource, используйте это.
  3. Если ресурс уже существует в AzureRM или имеет свойство, к которому не удается получить доступ azapi_resource, используйте azapi_update_resource для доступа к этим конкретным свойствам. Ресурсы, которые azapi_resource или azapi_data_plane_resource не поддерживаются, не могут быть обновлены с помощью этого ресурса.
  4. Если вы пытаетесь выполнить действие, которое не основано на ресурсе Azure, поддерживающем операции CRUD, использование azapi_resource_action будет менее очевидным, чем azapi_update_resource, но более гибким.

Примеры конфигурации ресурсов

Следующий фрагмент кода настраивает ресурс Azure непосредственно через API ARM:

resource "azapi_resource" "publicip" {
  type      = "Microsoft.Network/Customipprefixes@2021-03-01"
  name      = "exfullrange"
  parent_id = azurerm_resource_group.example.id
  location  = "westus2"

  body = {
    properties = {
      cidr          = "10.0.0.0/24"
      signedMessage = "Sample Message for WAN"
    }
  }
}

Следующий фрагмент кода настраивает свойство предварительной версии для существующего ресурса из AzureRM:

resource "azapi_update_resource" "test" {
  type        = "Microsoft.ContainerRegistry/registries@2020-11-01-preview"
  resource_id = azurerm_container_registry.acr.id

  body = {
    properties = {
      anonymousPullEnabled = var.bool_anonymous_pull
    }
  }
}

Следующий фрагмент кода настраивает действие ресурса для существующего ресурса AzureRM:

resource "azapi_resource_action" "vm_shutdown" {
  type = "Microsoft.Compute/virtualMachines@2023-07-01"
  resource_id = azurerm_linux_virtual_machine.example.id
  action = "powerOff”
}

Следующий фрагмент кода настраивает ресурс, который в настоящее время не существует в поставщике AzureRM из-за развёртывания на уровне данных.

resource "azapi_data_plane_resource" "dataset" {
  type      = "Microsoft.Synapse/workspaces/datasets@2020-12-01"
  parent_id = trimprefix(data.azurerm_synapse_workspace.example.connectivity_endpoints.dev, "https://")
  name      = "example-dataset"
  body = {
    properties = {
      type = "AzureBlob",
      typeProperties = {
        folderPath = {
          value = "@dataset().MyFolderPath"
          type  = "Expression"
        }
        fileName = {
          value = "@dataset().MyFileName"
          type  = "Expression"
        }
        format = {
          type = "TextFormat"
        }
      }
      parameters = {
        MyFolderPath = {
          type = "String"
        }
        MyFileName = {
          type = "String"
        }
      }
    }
  }
}

Пример использования предварительной проверки

Ошибки в следующем фрагменте кода возникают во время этапа terraform plan из-за встроенной предварительной проверки AzAPI.

provider "azapi" {
  enable_preflight = true
}
resource "azapi_resource" "vnet" {
  type      = "Microsoft.Network/virtualNetworks@2024-01-01"
  parent_id = azapi_resource.resourceGroup.id
  name      = "example-vnet"
  location  = "westus"
  body = {
    properties = {
      addressSpace = {
        addressPrefixes = [
          "10.0.0.0/160", # preflight will throw an error here
        ]
      }
    }
  }
}

При включении, предварительная проверка выявляет ошибки конфигурации во время terraform plan, а не в момент применения.

Источники данных

Поставщик AzAPI поддерживает различные полезные источники данных:

Имя источника данных Описание
azapi_resource Используется для чтения сведений из любого ресурса Azure (уровня управления) (API).
   Примеры вариантов использования:
      Новая предварительная версия службы
      Новая функция, добавленная в существующую службу
      Любой ресурс Azure, доступный через API ARM
azapi_client_config Доступ к данным клиента, таким как идентификатор подписки и идентификатор клиента.
azapi_resource_action Используется для выполнения одной операции чтения в ресурсе без управления жизненным циклом.
   Примеры вариантов использования:
      Список ключей
      Состояние чтения виртуальной машины
azapi_data_plane_resource Используется для доступа к определенному подмножеству ресурсов плоскости данных Azure
   Примеры вариантов использования:
      Контакты сертификатов KeyVault
      Библиотеки рабочей области Synapse
azapi_resource_id Доступ к идентификатору ресурса с возможностью вывода таких сведений, как идентификатор подписки, родительский идентификатор, имя группы ресурсов и имя ресурса.
azapi_resource_list Перечислите все ресурсы, связанные с указанным идентификатором родительского ресурса.
   Примеры вариантов использования:
      Ресурсы в подписке или группе ресурсов
      Подсети в виртуальной сети

Пример использования azapi_resource_list с фильтрацией JMESPath см. в разделе Список ресурсов Azure с поставщиком AzAPI Terraform.

Прочитайте существующий ресурс с azapi_resource источником данных

Источник данных azapi_resource считывает текущее состояние любого ресурса Azure и предоставляет его свойства через атрибут output. Используйте его, если требуется свойство, которое поставщик AzureRM не предоставляет:

data "azapi_resource" "aks" {
  type      = "Microsoft.ContainerService/managedClusters@2024-02-01"
  resource_id = azurerm_kubernetes_cluster.example.id

  # Extract the OIDC issuer URL, not exposed by azurerm_kubernetes_cluster
  response_export_values = ["properties.oidcIssuerProfile.issuerURL"]
}

output "oidc_issuer_url" {
  value = data.azapi_resource.aks.output.properties.oidcIssuerProfile.issuerURL
}

Использование response_export_values и JMESPath

response_export_values определяет, какие свойства извлекаются из необработанного ответа API ARM и становятся доступными в атрибуте output . Он принимает список или карту:

  • Список: укажите пути свойств JSON для извлечения. Используется ["*"] для экспорта полного текста ответа.
  • Картирование. Используйте выражения JMESPath для фильтрации и преобразования ответа. Ключ — это имя поля вывода; значением является запрос JMESPath.

Форма карты предпочтительна для ответов списка и случаев, когда необходимо преобразовать выходные данные:

data "azapi_resource_list" "storage_accounts" {
  type      = "Microsoft.Storage/storageAccounts@2023-01-01"
  parent_id = azurerm_resource_group.example.id

  response_export_values = {
    "names"     = "value[].name"
    "locations" = "value[].location"
  }
}

Полное руководство см. в List Azure resources with the AzAPI Terraform provider.

Проверка подлинности с помощью поставщика AzAPI

Поставщик AzAPI включает те же методы проверки подлинности, что и поставщик AzureRM. Дополнительные сведения о параметрах проверки подлинности см. в статье "Аутентификация Terraform" в Azure.

Опыт и жизненный цикл поставщика AzAPI

В этом разделе описаны некоторые инструменты для использования поставщика AzAPI.

Расширение VS Code и сервер языка

Расширение VS Code Microsoft Terraform VS Code предоставляет широкий интерфейс разработки для поставщиков AzureRM и AzAPI, в том числе:

  • Список всех доступных типов ресурсов и версий API. Список всех доступных типов ресурсов
  • Автозавершение допустимых свойств и значений для любого ресурса. Список разрешенных свойств
  • Отображение подсказок при наведении указателя мыши на свойство. Отображение подсказки при наведении указателя мыши на свойство
  • Проверка синтаксиса Проверка синтаксиса
  • Автозавершение с примерами кода. Автозавершение с примерами кода

Расширение также поддерживает вставку как AzAPI (преобразует JSON ARM в блоки azapi_resource), экспорт ресурсов Azure с помощью aztfexport, миграцию AzureRM-to-AzAPI и предварительную проверку. Полное руководство см. в разделе Использование расширения MICROSOFT Terraform VS Code.

средство миграции aztfmigrate

Средство aztfmigrate предназначено для переноса существующих ресурсов между поставщиками AzAPI и AzureRM.

aztfmigrate имеет два режима: планирование и миграция:

  • План отображает ресурсы AzAPI, которые можно перенести.
  • Миграция переносит ресурсы AzAPI в ресурсы AzureRM как в файлах HCL, так и в состоянии.

aztfmigrate гарантирует, что после миграции конфигурация Terraform и состояние соответствуют фактическому состоянию. Можно подтвердить обновление состояния, выполнив terraform plan после завершения миграции, чтобы убедиться, что никаких изменений не произошло.

Пошаговое руководство см. в статье "Миграция ресурсов из AzAPI в AzureRM".

Импорт существующих ресурсов Azure

Чтобы перенести существующий ресурс Azure в управление AzAPI без повторного создания, используйте блок import (Terraform 1.5 и более поздней версии) или команду terraform import. Идентификатор ресурса должен включать версию API в качестве параметра запроса:

import {
  to = azapi_resource.example
  id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/virtualNetworks/example-vnet?api-version=2023-11-01"
}

resource "azapi_resource" "example" {
  type      = "Microsoft.Network/virtualNetworks@2023-11-01"
  name      = "example-vnet"
  parent_id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg"
  location  = "westus"
  body = {
    properties = {
      addressSpace = {
        addressPrefixes = ["10.0.0.0/16"]
      }
    }
  }
}

Чтобы импортировать несколько ресурсов одновременно из существующей инфраструктуры Azure, используйте Azure Экспорт для Terraform (aztfexport), который создает конфигурацию HCL и блоки импорта автоматически.

Детализированное управление инфраструктурой

Одним из основных преимуществ AzAPI является возможность точно настроить конфигурацию, чтобы соответствовать правильным шаблонам дизайна. Это можно сделать несколькими способами:

Параметры конфигурации поставщика

Блок поставщика AzAPI принимает несколько параметров, которые применяются глобально ко всем ресурсам в конфигурации:

Опция Описание
enable_preflight Включает проверку готовности на этапе планирования. По умолчанию — false. Подробности см.: в разделе "Включение предварительной проверки в поставщике AzAPI Terraform".
ignore_no_op_changes Подавляет помехи временных изменений, обусловленные no-op различиями между конфигурацией и нормализованными ответами API. По умолчанию — true.
disable_default_output Если установлено значение true, отключает автоматический вывод свойств только для чтения, если response_export_values не указано. По умолчанию — false.
default_location Задает значение по умолчанию location для всех ресурсов, которые явно не указывают один.
default_tags Задает теги по умолчанию, применяемые ко всем ресурсам. Переопределите эти значения по умолчанию на уровне tags ресурсов.
skip_provider_registration Пропускает автоматическую регистрацию поставщика ресурсов. Установите значение true в ограниченных средах.

Для получения полного списка параметров конфигурации поставщика см. схему поставщика AzAPI.

Пошаговое руководство по включению предварительной проверки см. в разделе "Включение предварительной проверки в поставщике AzAPI Terraform".

Функции поставщика

AzAPI версии 2.0 и более поздних версий включает несколько функций поставщика:

Имя функции Описание
build_resource_id Создает идентификатор ресурса Azure с учетом родительского идентификатора, типа ресурса и имени ресурса.
Полезно для создания идентификаторов ресурсов верхнего уровня и вложенных ресурсов в рамках определённой области.
extension_resource_id Создает идентификатор ресурса расширения Azure с учетом идентификатора базового ресурса, типа ресурса и других имен ресурсов.
management_group_resource_id Создает идентификатор ресурса области группы управления Azure с учетом имени группы управления, типа ресурса и имен ресурсов.
parse_resource_id Эта функция принимает идентификатор ресурса Azure и тип ресурса, а затем анализирует идентификатор на отдельные компоненты, такие как идентификатор подписки, имя группы ресурсов, пространство имен поставщика и другие части.
resource_group_resource_id Создает идентификатор ресурса области группы ресурсов Azure с идентификатором подписки, именем группы ресурсов, типом ресурсов и именами ресурсов.
subscription_resource_id Создает идентификатор ресурса области подписки Azure с идентификатором подписки, типом ресурсов и именами ресурсов.
tenant_resource_id Создает идентификатор ресурса области клиента Azure с учетом типа ресурса и имен ресурсов.

Пользовательские ошибки, которые можно повторно обработать, с блоком retry

Провайдер AzAPI обрабатывает ожидаемые ошибки с помощью блока retry. Например, используйте следующую конфигурацию, чтобы выполнить повторную попытку при тайм-ауте создания ресурса.

resource "azapi_resource" "example" {
    # usual properties
    retry {
        interval_seconds     = 5
        randomization_factor = 0.5 # adds randomization to retry pattern
        multiplier           = 2 # if try fails, multiplies time between next try by this much
        error_message_regex  = ["ResourceNotFound"]
    }
    timeouts {
        create = "10m"
}

Блок retry принимает следующие атрибуты:

Атрибут Описание
error_message_regex Обязательно. Список регулярных выражений, сопоставленных с сообщениями об ошибках. Запрос повторяется при любом совпадении выражений.
interval_seconds Базовое время ожидания между повторными попытками. По умолчанию — 10.
max_interval_seconds Максимальное время ожидания между повторными попытками. По умолчанию — 180.
multiplier Умножение применяется к интервалу после каждой неудачной попытки. По умолчанию — 1.5.
randomization_factor Добавляет случайное смещение в интервал повтора, чтобы избежать эффекта набегающего стада. По умолчанию — 0.5.

Объедините retry с блоком timeouts, чтобы задать верхнюю границу общей продолжительности попыток повторных действий:

timeouts {
  create = "10m"
}

Эфемерные ресурсы и свойства только для записи

AzAPI версии 2.x поддерживает аргументы только для записи (Terraform 1.11 и более поздние версии) с помощью атрибута sensitive_body на azapi_resource. Свойства, доступные только для записи, отправляются в API ARM, но не хранятся в состоянии Terraform, что полезно для секретов и учетных данных:

resource "azapi_resource" "example" {
  type      = "Microsoft.SomeService/resources@2024-01-01"
  name      = "example"
  parent_id = azurerm_resource_group.example.id

  body = {
    properties = {
      name = "example"
    }
  }

  # Write-only — not stored in state
  sensitive_body = {
    properties = {
      adminPassword = var.admin_password
    }
  }
}

Используйте sensitive_body_version для управления тем, когда свойства только для записи заново отправляются в API (например, при ротировании учетных данных).

Триггеры для замены ресурсов

Поставщик AzAPI позволяет настроить параметры для замены ресурсов:

replace_triggers_external_values

Заменяет ресурс, если значение изменяется. Например, если переменные SKU или зоны должны были быть изменены, этот ресурс будет создан повторно:

resource "azapi_resource" "example" {
  name      = var.name
  type      = "Microsoft.Network/publicIPAddresses@2023-11-01"
  parent_id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example"
  body      = properties = {
    sku   = var.sku
    zones = var.zones
  }
  replace_triggers_external_values = [
    var.sku,
    var.zones,
  ]
}

Этот триггер работает для широкого набора ресурсов, например, при изменении свойств определения происходит присвоение политики.

replace_triggers_refs

Заменяет ресурс, если указанное значение изменяется. Например, если имя или уровень SKU изменено, этот ресурс будет создан повторно:

resource "azapi_resource" "example" {
  type      = "Microsoft.Relay/namespaces@2021-11-01"
  parent_id = azurerm_resource_group.example.id
  name      = "xxx"
  location  = "westus"
  body = {
    properties = {
    }
    sku = {
      name = "Standard"
      tier = "Standard"
    }
  }

  replace_triggers_refs = ["sku"]
}

Это не приведет к замещению, если изменится номер SKU другого ресурса.

Следующие шаги