Уявіть: ви розгорнули 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 порівняно з ручним створенням. Замовте аудит вашої інфраструктури — ми знайдемо точки зростання.
Процес роботи
- Аудит поточної інфраструктури (якщо є) — аналізуємо існуючі VM, навантаження, витрати. Збираємо метрики за 1 тиждень для коректного right-sizing.
- Проектування — підбираємо SKU, мережі, політики безпеки. 99.9% часу використовуємо Terraform для описаної інфраструктури.
- Розгортання через Terraform — всі ресурси описуються кодом, версіонуються в Git.
- Налаштування моніторингу — Azure Monitor, Log Analytics, алерти за CPU, memory, disk (до 10 000 IOPS).
- Деплой застосунку — через cloud-init або CI/CD (Azure DevOps).
- Тестування та передача — перевіряємо відмовостійкість, знімаємо метрики, проводимо навантажувальне тестування.
Що входить у результат
- 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. Отримайте консультацію без зобов'язань.







