Что такое 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 для управления частью ресурсов.