Что такое ARM Templates?

Azure Resource Manager (ARM) Templates — это JSON файлы, которые определяют инфраструктуру и конфигурацию для Azure проектов. ARM Templates позволяют декларативно описать ресурсы Azure и их зависимости, обеспечивая воспроизводимые и консистентные развертывания в облаке Microsoft Azure.

Основные возможности ARM Templates

  • Declarative syntax — описание желаемого состояния инфраструктуры
  • Idempotency — безопасное повторное выполнение развертывания
  • Dependency management — автоматическое управление зависимостями
  • Parallel deployment — параллельное создание ресурсов
  • Validation — проверка шаблона перед развертыванием
  • Modularity — связанные и вложенные шаблоны

Структура ARM Template

 1{
 2  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
 3  "contentVersion": "1.0.0.0",
 4  "parameters": {
 5    // Входные параметры
 6  },
 7  "variables": {
 8    // Переменные для вычислений
 9  },
10  "functions": {
11    // Пользовательские функции
12  },
13  "resources": [
14    // Ресурсы Azure для создания
15  ],
16  "outputs": {
17    // Возвращаемые значения
18  }
19}

Пример ARM Template

 1{
 2  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
 3  "contentVersion": "1.0.0.0",
 4  "parameters": {
 5    "storageAccountName": {
 6      "type": "string",
 7      "metadata": {
 8        "description": "Name of the storage account"
 9      }
10    },
11    "location": {
12      "type": "string",
13      "defaultValue": "[resourceGroup().location]",
14      "metadata": {
15        "description": "Location for all resources"
16      }
17    },
18    "storageAccountType": {
19      "type": "string",
20      "defaultValue": "Standard_LRS",
21      "allowedValues": [
22        "Standard_LRS",
23        "Standard_GRS",
24        "Standard_ZRS",
25        "Premium_LRS"
26      ],
27      "metadata": {
28        "description": "Storage account type"
29      }
30    }
31  },
32  "variables": {
33    "storageAccountName": "[toLower(parameters('storageAccountName'))]"
34  },
35  "resources": [
36    {
37      "type": "Microsoft.Storage/storageAccounts",
38      "apiVersion": "2021-04-01",
39      "name": "[variables('storageAccountName')]",
40      "location": "[parameters('location')]",
41      "sku": {
42        "name": "[parameters('storageAccountType')]"
43      },
44      "kind": "StorageV2",
45      "properties": {
46        "supportsHttpsTrafficOnly": true,
47        "minimumTlsVersion": "TLS1_2",
48        "allowBlobPublicAccess": false
49      }
50    }
51  ],
52  "outputs": {
53    "storageAccountName": {
54      "type": "string",
55      "value": "[variables('storageAccountName')]"
56    },
57    "primaryEndpoint": {
58      "type": "string",
59      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]"
60    }
61  }
62}

Развертывание ARM Templates

 1# Azure CLI
 2# Создание resource group
 3az group create --name myResourceGroup --location "East US"
 4
 5# Развертывание шаблона
 6az deployment group create \
 7  --resource-group myResourceGroup \
 8  --template-file template.json \
 9  --parameters storageAccountName=mystorageaccount
10
11# Развертывание с файлом параметров
12az deployment group create \
13  --resource-group myResourceGroup \
14  --template-file template.json \
15  --parameters @parameters.json
16
17# Проверка шаблона без развертывания
18az deployment group validate \
19  --resource-group myResourceGroup \
20  --template-file template.json \
21  --parameters storageAccountName=mystorageaccount
22
23# Просмотр развертываний
24az deployment group list --resource-group myResourceGroup

PowerShell команды

 1# Подключение к Azure
 2Connect-AzAccount
 3
 4# Создание resource group
 5New-AzResourceGroup -Name "myResourceGroup" -Location "East US"
 6
 7# Развертывание шаблона
 8New-AzResourceGroupDeployment `
 9  -ResourceGroupName "myResourceGroup" `
10  -TemplateFile "template.json" `
11  -storageAccountName "mystorageaccount"
12
13# Тестирование шаблона
14Test-AzResourceGroupDeployment `
15  -ResourceGroupName "myResourceGroup" `
16  -TemplateFile "template.json" `
17  -storageAccountName "mystorageaccount"
18
19# Просмотр развертываний
20Get-AzResourceGroupDeployment -ResourceGroupName "myResourceGroup"

Linked Templates пример

 1{
 2  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
 3  "contentVersion": "1.0.0.0",
 4  "parameters": {
 5    "projectName": {
 6      "type": "string"
 7    }
 8  },
 9  "variables": {
10    "linkedTemplateUri": "https://mystorageaccount.blob.core.windows.net/templates/storage-template.json"
11  },
12  "resources": [
13    {
14      "type": "Microsoft.Resources/deployments",
15      "apiVersion": "2019-10-01",
16      "name": "linkedTemplate",
17      "properties": {
18        "mode": "Incremental",
19        "templateLink": {
20          "uri": "[variables('linkedTemplateUri')]",
21          "contentVersion": "1.0.0.0"
22        },
23        "parameters": {
24          "storageAccountName": {
25            "value": "[concat(parameters('projectName'), 'storage')]"
26          }
27        }
28      }
29    }
30  ]
31}

Bicep как альтернатива

Microsoft разработал Bicep как более простую альтернативу ARM Templates:

// storage.bicep
param storageAccountName string
param location string = resourceGroup().location
param storageAccountType string = 'Standard_LRS'

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-04-01' = {
  name: toLower(storageAccountName)
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
    minimumTlsVersion: 'TLS1_2'
    allowBlobPublicAccess: false
  }
}

output storageAccountName string = storageAccount.name
output primaryEndpoint string = storageAccount.properties.primaryEndpoints.blob

Когда использовать ARM Templates

  • Управление Azure инфраструктурой как кодом
  • Автоматизация развертывания в Azure
  • Создание воспроизводимых сред
  • CI/CD пайплайны для Azure ресурсов
  • Governance и compliance в Azure
  • Disaster recovery планы

Преимущества ARM Templates

  • Нативная интеграция с Azure
  • Декларативный подход
  • Автоматическое управление зависимостями
  • Параллельное развертывание ресурсов
  • Встроенная валидация
  • Интеграция с Azure DevOps и GitHub Actions

Ограничения ARM Templates

  • Работает только с Azure (vendor lock-in)
  • JSON синтаксис может быть многословным
  • Ограниченная логика по сравнению с программными языками
  • Сложность отладки больших шаблонов
  • Не все Azure сервисы поддерживаются сразу

Best Practices

  • Используй параметры для переиспользования шаблонов
  • Создавай модульные шаблоны с linked templates
  • Добавляй metadata и описания
  • Используй переменные для сложных выражений
  • Версионируй шаблоны в системе контроля версий
  • Тестируй шаблоны в dev окружении
  • Рассмотри использование Bicep для новых проектов

Рекомендации по внедрению

Для успешного внедрения ARM Templates рекомендуется:

  • Начать с простых шаблонов и постепенно усложнять
  • Изучить Azure Resource Manager концепции
  • Использовать Azure Resource Manager Tools для VS Code
  • Настроить CI/CD пайплайны для автоматического развертывания
  • Документировать параметры и использование шаблонов
  • Рассмотреть миграцию на Bicep для лучшего опыта разработки

FAQ

Подходят ли ARM Templates для продакшена?

Да, ARM Templates широко используются в production средах и являются рекомендуемым Microsoft способом управления Azure инфраструктурой.

В чем разница между ARM Templates и Bicep?

Bicep — это более простой DSL, который компилируется в ARM Templates. Bicep предоставляет лучший опыт разработки с более читаемым синтаксисом.

Можно ли управлять существующими ресурсами?

Да, можно импортировать существующие Azure ресурсы в ARM Templates или использовать incremental deployment mode для управления частью ресурсов.