Налаштування Azure VM: Terraform, VMSS та безпека

Неправильне налаштування віртуальних машин в Azure призводить до простоїв, переплат і ризиків безпеки. Ми налаштовуємо Azure VM, VMSS і Managed Identity за допомогою Terraform і cloud-init, забезпечуючи надійну та захищену інфраструктуру. Наша команда реалізує проєкт під ключ — від вибору розміру VM до подальшої підтримки, щоб ваше рішення працювало стабільно та масштабувалося разом із бізнесом.
Часті запитання

Уявіть: ви розгорнули VM через Portal, але через годину вона недоступна — забули відкрити порт у NSG. Або обрали B-series для продакшену, і через 10 хвилин CPU credits закінчилися — застосунок впав. Такі помилки коштують часу та грошей. Нерідко зустрічаємо ситуації, коли диск не шифрується, NSG дозволяє весь трафік, а пароль від VM зберігається у plain-файлі. Все це — прямий шлях до витоку даних або простою. Правильне налаштування усуває ці ризики та скорочує витрати на $150–250 на місяць для типового проекту за рахунок оптимізації SKU та використання VMSS. Ми підготували практичний посібник із налаштування production-ready VM. Наш досвід — понад 5 років в Azure, 50+ розгорнутих проектів.

Як вибрати розмір VM?

Azure пропонує десятки серій. Для більшості завдань підходить наступна таблиця. Неправильний вибір — часта причина переплати: B-series у продакшені може коштувати на 30% дорожче через простої, а Premium SSD на тестовому оточенні — зайві витрати.

Серія Призначення Приклад Рекомендація
D-series (Dsv5) Загальне призначення, web, app servers Standard_D4s_v5 Стандарт для більшості проектів
E-series Memory-intensive: Redis, SAP, великі БД Standard_E8s_v5 Для in-memory навантажень
F-series CPU-intensive: ігрові сервери, batch Standard_F8s_v2 Для compute-heavy задач
L-series Storage-optimized: NoSQL, data warehouses Standard_L8s_v3 Для дискових I/O
B-series Burstable: dev/test оточення Standard_B2s Тільки для dev. Не для продакшену

B-series для dev — економія 60-70% порівняно з D-series. Але для продакшену не підходить: CPU credits вичерпуються під навантаженням.

Terraform-конфігурація

Ось приклад production-конфігурації VM з Terraform. Ключові моменти: тільки SSH-ключі, шифрування дисків, SystemAssigned identity, cloud-init.

resource "azurerm_linux_virtual_machine" "app" {
  name = "vm-app-prod-01"
  resource_group_name = azurerm_resource_group.app.name
  location = azurerm_resource_group.app.location
  size = "Standard_D4s_v5"
  admin_username = "azureuser"
  disable_password_authentication = true
  # тільки SSH ключ
  admin_ssh_key {
    username = "azureuser"
    public_key = data.azurerm_key_vault_secret.ssh_key.value
  }
  network_interface_ids = [azurerm_network_interface.app.id]
  os_disk {
    caching = "ReadWrite"
    storage_account_type = "Premium_LRS"
    disk_size_gb = 64
    disk_encryption_set_id = azurerm_disk_encryption_set.main.id
  }
  source_image_reference {
    publisher = "Canonical"
    offer = "0001-com-ubuntu-server-jammy"
    sku = "22_04-lts-gen2"
    version = "latest"
  }
  identity {
    type = "SystemAssigned"
  }
  custom_data = base64encode(file("cloud-init/app.yaml"))
  boot_diagnostics {}
  # у managed storage, зручно при дебазі
  tags = {
    environment = "production"
    managed-by = "terraform"
  }
}

Параметр disable_password_authentication = true гарантує, що паролі не використовуються. disk_encryption_set_id включає шифрування дисків з customer-managed ключами через Key Vault.

Чому варто використовувати Managed Identity?

Managed Identity — спосіб надати VM доступ до Azure-сервісів (Key Vault, Storage, ACR) без зберігання credentials на диску. На відміну від паролів або сертифікатів, identity автоматично ротується платформою. Увімкнули SystemAssigned — і VM отримала service principal. Managed Identity повністю виключає зберігання секретів на диску, що в 10 разів безпечніше за паролі. Згідно з офіційною документацією Microsoft, це стандарт для enterprise-проектів.

# Призначити роль Key Vault Secrets User
PRINCIPAL_ID=$(az vm show \
  --name vm-app-prod-01 \
  --resource-group my-rg \
  --query identity.principalId \
  --output tsv)
az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "Key Vault Secrets User" \
  --scope /subscriptions/.../resourceGroups/my-rg/providers/Microsoft.KeyVault/vaults/my-kv

На VM секрет читається через IMDS без додаткових credentials:

# Отримати токен через IMDS
TOKEN=$(curl -s "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net" \
  -H "Metadata: true" | jq -r '.access_token')

# Отримати секрет
curl -s "https://my-kv.vault.azure.net/secrets/db-password?api-version=7.4" \
  -H "Authorization: Bearer $TOKEN" | jq -r '.value'

Такий підхід виключає зберігання секретів у коді або репозиторії.

Чек-лист security hardening

Міра Опис
SSH-ключі замість паролів disable_password_authentication = true
Managed Identity для доступу до сервісів Замість зберігання credentials на диску
Шифрування дисків Використовувати customer-managed ключі через Key Vault
NSG: білий список IP Обмежити доступ тільки необхідними IP та портами
Вимкнення непотрібних портів Видалити RDP (3389) та інші невикористовувані порти
Регулярні оновлення ОС Через cloud-init або update management

Cloud-init для початкового налаштування

Cloud-init — де-факто стандарт для первинної конфігурації VM. За його допомогою встановлюються пакети, запускаються служби, записуються конфіги. Ми використовуємо YAML-файл, який підключається через custom_data. Детальніше про технологію читайте на Wikipedia.

Приклад cloud-init YAML
---
# cloud-init/app.yaml
#cloud-config
package_update: true
package_upgrade: true
packages:
  - nginx
  - curl
  - jq
runcmd:
  - systemctl enable nginx
  - systemctl start nginx
  - curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
  # Встановлення Azure Monitor Agent
  - wget -qO- https://raw.githubusercontent.com/microsoft/OMS-Agent-for-Linux/master/installer/scripts/install_omsagent.sh | sh
write_files:
  - path: /etc/nginx/sites-available/app
    content: |
      server {
        listen 80;
        location /health {
          return 200 'ok';
        }
        location / {
          proxy_pass http://127.0.0.1:8080;
        }
      }

Цей код встановлює nginx, моніторинг та health-check.

Що дає VMSS?

Зазначимо: коли потрібно декілька ідентичних VM з автоскейлінгом — Virtual Machine Scale Sets. Вони забезпечують rolling-оновлення, автоматичне відновлення та інтеграцію з load balancer. Порівняємо VMSS та окремі VM:

Характеристика Окремі VM VMSS
Автоскейлінг ❌ ✅
Rolling-оновлення ❌ ✅
Автовідновлення ❌ ✅
Інтеграція з LB Вручну Автоматично
Ціна за управління Вища Нижча до 30%
resource "azurerm_linux_virtual_machine_scale_set" "app" {
  name = "vmss-app-prod"
  resource_group_name = azurerm_resource_group.app.name
  location = var.location
  sku = "Standard_D4s_v5"
  instances = 2
  upgrade_mode = "Rolling"

  rolling_upgrade_policy {
    max_batch_instance_percent = 20
    max_unhealthy_instance_percent = 20
    max_unhealthy_upgraded_instance_percent = 5
    pause_time_between_batches = "PT0S"
  }

  automatic_os_upgrade_policy {
    enable_automatic_os_upgrade = true
    disable_automatic_rollback = false
  }

  # ... решта конфігурації аналогічна VM
}

VMSS в 3 рази швидше розгортає десятки VM порівняно з ручним створенням. Замовте аудит вашої інфраструктури — ми знайдемо точки зростання.

Процес роботи

  1. Аудит поточної інфраструктури (якщо є) — аналізуємо існуючі VM, навантаження, витрати. Збираємо метрики за 1 тиждень для коректного right-sizing.
  2. Проектування — підбираємо SKU, мережі, політики безпеки. 99.9% часу використовуємо Terraform для описаної інфраструктури.
  3. Розгортання через Terraform — всі ресурси описуються кодом, версіонуються в Git.
  4. Налаштування моніторингу — Azure Monitor, Log Analytics, алерти за CPU, memory, disk (до 10 000 IOPS).
  5. Деплой застосунку — через cloud-init або CI/CD (Azure DevOps).
  6. Тестування та передача — перевіряємо відмовостійкість, знімаємо метрики, проводимо навантажувальне тестування.

Що входить у результат

  • Terraform-код (модульний, з коментарями, у вашому Git)
  • Cloud-init скрипти для застосунків
  • Managed Identity для доступу до сервісів
  • Моніторинг та алерти за CPU, memory, disk, health
  • Документація з підтримки та типових операцій
  • Навчання команди (1 година, основи)
  • Гарантія на конфігурацію — 2 тижні після здачі: якщо щось зламалося, лагодимо безкоштовно.

Терміни та вартість

Терміни: від 2 до 7 днів залежно від складності (кількість VM, VMSS, інтеграції). Вартість розраховується індивідуально після аудиту. Приклад: розгортання 3 production VM з Terraform, моніторингом та CI/CD — 3-4 дні. Середня економія на інфраструктурі досягає $150–300 на місяць за рахунок правильного вибору SKU та використання VMSS.

Зв'яжіться з нами, щоб обговорити вашу задачу. Наш досвід — понад 5 років та 50+ успішних проектів в Azure. Отримайте консультацію без зобов'язань.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1140