Настройка 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
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142