Развертывание ресурсов с помощью шаблонов ARM и REST API Resource Manager

В этой статье описано, как использовать REST API Resource Manager с шаблонами Azure Resource Manager (ARM) для развертывания ресурсов в Azure.

Вы можете включить шаблон в текст запроса или связать с файлом. Файл может быть локальным или внешним, доступным по универсальному коду ресурса (URI). Если шаблон находится в учетной записи хранения, то во время развертывания можно ограничить доступ к шаблону и предоставить маркер подписанного URL-адреса (SAS).

Необходимые разрешения

Для развертывания файла Bicep или шаблона ARM необходим доступ с правом записи для развертываемых ресурсов и доступ ко всем операциям с типом ресурсов Microsoft.Resources/deployments. Например, для развертывания виртуальной машины необходимы разрешения Microsoft.Compute/virtualMachines/write и Microsoft.Resources/deployments/*. Операция what-if имеет те же требования к разрешениям.

Список ролей и разрешений см. в статье Встроенные роли Azure.

Область развертывания

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

В примерах, приведенных в этой статье, мы используем развертывание в группе ресурсов.

Развертывание с помощью REST API

  1. Задайте общие параметры и заголовки, включая маркеры аутентификации.

  2. Если развертывание выполняется в несуществующей группе ресурсов, создайте группу ресурсов. Укажите идентификатор подписки, имя новой группы ресурсов и расположение, необходимое для решения. Дополнительную информацию см. в разделе Создание группы ресурсов.

    PUT https://management.azure.com/subscriptions/<YourSubscriptionId>/resourcegroups/<YourResourceGroupName>?api-version=2020-06-01
    

    С текстом запроса:

    {
     "location": "West US",
     "tags": {
       "tagname1": "tagvalue1"
     }
    }
    
  3. Перед развертыванием шаблона можно просмотреть изменения, которые шаблон внесет в среду. Используйте операцию what-if, чтобы убедиться в том, что необходимые изменения будут внесены. Операция what-if также служит для проверки шаблона на наличие ошибок.

  4. Чтобы развернуть шаблон, укажите идентификатор подписки, имя группы ресурсов, имя развертывания и URI запроса.

    PUT https://management.azure.com/subscriptions/<YourSubscriptionId>/resourcegroups/<YourResourceGroupName>/providers/Microsoft.Resources/deployments/<YourDeploymentName>?api-version=2020-10-01
    

    В тексте запроса укажите ссылку на шаблон и файл параметров. Дополнительные сведения о файле параметров см. в статье Создание файла параметров Resource Manager.

    Обратите внимание, что для параметра mode выбрано значение Incremental (Добавочный). Чтобы выполнить полное развертывание, установите для параметра mode значение Complete (Завершено). Будьте внимательны при использовании полного режима, так как вы можете случайно удалить ресурсы, которые находятся не в шаблоне.

    {
     "properties": {
       "templateLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/template.json",
         "contentVersion": "1.0.0.0"
       },
       "parametersLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/parameters.json",
         "contentVersion": "1.0.0.0"
       },
       "mode": "Incremental"
     }
    }
    

    Если вы хотите регистрировать в журнале содержимое запроса или содержимое ответа (или и то и другое), добавьте в запрос параметр debugSetting.

    {
     "properties": {
       "templateLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/template.json",
         "contentVersion": "1.0.0.0"
       },
       "parametersLink": {
         "uri": "http://mystorageaccount.blob.core.windows.net/templates/parameters.json",
         "contentVersion": "1.0.0.0"
       },
       "mode": "Incremental",
       "debugSetting": {
         "detailLevel": "requestContent, responseContent"
       }
     }
    }
    

    Можно настроить учетную запись хранения для использования маркера подписанного URL-адреса (SAS). Дополнительные сведения см. в статье Делегирование доступа с помощью подписанного URL-адреса.

    Если требуется предоставить конфиденциальное значение для параметра (например, пароль), добавьте это значение в хранилище ключей. Получите хранилище ключей во время развертывания, как показано в предыдущем примере. Дополнительные сведения см. в статье Использование Azure Key Vault для передачи защищенного значения параметра во время развертывания.

  5. Вместо создания ссылки на файлы для шаблона и параметров их можно включить в тексте запроса. В следующем примере приведен текст запроса, в котором напрямую указаны шаблон и параметр.

    {
       "properties": {
       "mode": "Incremental",
       "template": {
         "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
         "contentVersion": "1.0.0.0",
         "parameters": {
           "storageAccountType": {
             "type": "string",
             "defaultValue": "Standard_LRS",
             "allowedValues": [
               "Standard_LRS",
               "Standard_GRS",
               "Standard_ZRS",
               "Premium_LRS"
             ],
             "metadata": {
               "description": "Storage Account type"
             }
           },
           "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
               "description": "Location for all resources."
             }
           }
         },
         "variables": {
           "storageAccountName": "[format('{0}standardsa', uniquestring(resourceGroup().id))]"
         },
         "resources": [
           {
             "type": "Microsoft.Storage/storageAccounts",
             "apiVersion": "2022-09-01",
             "name": "[variables('storageAccountName')]",
             "location": "[parameters('location')]",
             "sku": {
               "name": "[parameters('storageAccountType')]"
             },
             "kind": "StorageV2",
             "properties": {}
           }
         ],
         "outputs": {
           "storageAccountName": {
             "type": "string",
             "value": "[variables('storageAccountName')]"
           }
         }
       },
       "parameters": {
         "location": {
           "value": "eastus2"
         }
       }
     }
    }
    
  6. Чтобы получить состояние развертывания шаблона, используйте инструкции из статьи Развертывания: получение.

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Resources/deployments/{deploymentName}?api-version=2020-10-01
    

Развертывание с помощью ARMClient

ARMClient — это простое средство командной строки для вызова API Azure Resource Manager. Чтобы установить это средство, воспользуйтесь документацией по ARMClient на ресурсе GitHub.

Получение списка подписок:

armclient GET /subscriptions?api-version=2021-04-01

Получение списка групп ресурсов:

armclient GET /subscriptions/<subscription-id>/resourceGroups?api-version=2021-04-01

Вместо <subscription-id> укажите реальный идентификатор подписки Azure.

Создание группы ресурсов в регионе Центральная часть США:

armclient PUT /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>?api-version=2021-04-01  "{location: 'central us', properties: {}}"

Кроме того, вы можете поместить текст запроса в файл формата JSON с именем CreateRg.json:

{
  "location": "Central US",
  "properties": { }
}
armclient PUT /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>?api-version=2021-04-01 '@CreateRg.json'

Дополнительные сведения см. в статье ARMClient: a command line tool for the Azure API (ARMClient: средство командной строки для API Azure).

Deployment name (Имя развертывания)

Можно присвоить развертыванию имя, например ExampleDeployment .

Каждый раз при выполнении развертывания в журнал развертывания группы ресурсов добавляется запись с именем развертывания. Если запустить другое развертывание и присвоить ему такое же имя, то предыдущая запись будет заменена текущим развертыванием. Если требуется создать уникальные записи в журнале развертывания, присвойте каждому развертыванию уникальное имя.

Чтобы создать уникальное имя, можно добавить к нему случайное число. Также можно добавить дату.

При выполнении параллельных развертываний в одной группе ресурсов с тем же именем развертывания завершается только последнее развертывание. Все развертывания с тем же именем, которые не были завершены, заменяются последним развертыванием. Например, если вы запускаете развертывание с именем newStorage, которое развертывает учетную запись хранения с именем storage1 и в то же время запускает другое развертывание с именем newStorage, которое развертывает учетную запись хранения с именем storage2, развертывается только одна учетная запись хранения. Созданная учетная запись хранения получает имя storage2.

Однако если вы запустите развертывание с именем newStorage, которое развертывает учетную запись хранения с именем storage1, и сразу после завершения работы запустите другое развертывание с именем newStorage, которое развертывает учетную запись хранения с именем storage2, то будут созданы две учетные записи хранения. Одна получит имя storage1, а другая — storage2. Но в журнал развертывания будет внесена только одна запись.

Если для каждого развертывания указано уникальное имя, их можно запускать параллельно без возникновения конфликтов. Например, если вы запустите развертывание с именем newStorage1, которое развертывает учетную запись хранения с именем storage1, и в то же время запустите другое развертывание с именем newStorage2, которое развертывает учетную запись хранения с именем storage2, будут созданы две учетные записи хранения и две записи в журнале развертывания.

Чтобы избежать конфликтов между параллельными развертываниями и обеспечить уникальность записей в журнале развертывания, присваивайте каждому развертыванию уникальное имя.

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