Настройка Azure Functions: Terraform, Managed Identity, мониторинг

Когда функция работает локально, а в продакшене возникают тайм-ауты и холодные старты, настройка Azure Functions требует особого подхода. Мы настраиваем serverless-решения с использованием Terraform, Managed Identity и Key Vault, обеспечивая надёжную работу и безопасность. Наша команда реализует проект под ключ — от аудита до внедрения и последующей поддержки.
Часто задаваемые вопросы

Production-конфигурация Azure Functions

Сценарий: функция работает локально, а в продакшене — тайм-ауты, холодный старт до 10 секунд, секреты в коде. Знакомо? Azure Functions — мощный serverless-инструмент, но production-настройка требует внимания к деталям. Мы разберём конфигурацию, которая выдерживает нагрузку. За время практики мы реализовали более 30 serverless-проектов для e-commerce и финтеха и знаем, как избежать типовых ошибок. Получите консультацию — мы оценим ваш проект.

Какой hosting plan выбрать?

Consumption plan — классический serverless: платите за вызовы, масштабируется до нуля. Холодный старт для .NET/Node.js — 1–3 сек, для Java — до 10 сек. Неприемлемо для latency-sensitive HTTP API. Для таких сценариев Premium plan в 2–3 раза быстрее на холодном старте и обеспечивает стабильную latency под 100 мс.

Flex Consumption — новый план с поддержкой VNet integration и холодным стартом <1 сек. Рекомендован для новых проектов, где нужна изоляция сети и быстрый отклик без постоянной оплаты инстансов.

Premium plan — всегда минимум один прогретый инстанс. Нет холодного старта, VNet integration, неограниченное время выполнения. Стоимость в час на 30–40% выше Consumption, но экономия за счёт отсутствия простоев при масштабировании. Для latency-чувствительных сценариев разница критична: при пиковой нагрузке 1000 запросов/сек Premium обрабатывает на 30% быстрее.

Dedicated (App Service plan) — функции на выделенных ВМ. Экономически оправдан, если уже есть App Service Plan: можно разместить функции на том же плане с нулевыми дополнительными затратами на инстансы.

План Холодный старт VNet интеграция Масштабирование Типичный use case
Consumption 1–10 сек Только через Flex До сотен инстансов за секунды Эпизодические вызовы, бэки
Flex Consumption <1 сек Да До 100 инстансов API с низкой задержкой, VNet
Premium Нет Да До 50 инстансов (настраиваемо) Production API, long-running
Dedicated Нет (always on) Да Зависит от плана Уже есть App Service Plan

Сравнение latency: для p95 запросов Premium даёт <200 мс против 800 мс у Consumption. Разница в 4 раза — критично для API.

Как Managed Identity обеспечивает безопасный доступ к Key Vault?

Обратите внимание на SERVICEBUS_CONNECTION — это Key Vault reference. Functions App с managed identity автоматически разрешает @Microsoft.KeyVault(...) при старте. Никаких секретов в переменных окружения напрямую. Этот подход исключает утечку секретов через репозиторий и упрощает ротацию ключей. Как отмечают в Microsoft, использование Managed Identity снижает риски утечки секретов. Он соответствует рекомендациям Microsoft.

# Назначить managed identity доступ к Key Vault
PRINCIPAL_ID=$(az functionapp identity show \
  --name func-app-prod \
  --resource-group my-rg \
  --query principalId --output tsv)

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "Key Vault Secrets User" \
  --scope $(az keyvault show --name my-kv --query id --output tsv)

После настройки функция получает доступ к секретам без явного указания паролей. Это best practices по безопасности.

Пошаговая настройка: от плана до мониторинга

Выберите план под нагрузку: для эпизодических вызовов — Consumption, для постоянного трафика — Premium. Разверните storage account, service plan и функцию с системной Managed Identity через Terraform (пример ниже). Поместите секреты в Key Vault и настройте Key Vault references в app settings. Подключите Application Insights, настройте алерты на failure rate >1% и p95 latency >5 сек.

Terraform-конфигурация для Azure Functions

Мы используем Terraform для развёртывания всей инфраструктуры как кода. Пример минимальной конфигурации для Premium плана:

resource "azurerm_storage_account" "functions" {
  name                     = "stfuncprod123"
  resource_group_name      = azurerm_resource_group.app.name
  location                 = var.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
  min_tls_version          = "TLS1_2"
}

resource "azurerm_service_plan" "functions" {
  name                = "asp-functions-prod"
  resource_group_name = azurerm_resource_group.app.name
  location            = var.location
  os_type             = "Linux"
  sku_name            = "EP1" # Premium Elastic Plan
}

resource "azurerm_linux_function_app" "main" {
  name                       = "func-app-prod"
  resource_group_name        = azurerm_resource_group.app.name
  location                   = var.location
  storage_account_name       = azurerm_storage_account.functions.name
  storage_account_access_key = azurerm_storage_account.functions.primary_access_key
  service_plan_id            = azurerm_service_plan.functions.id

  identity {
    type = "SystemAssigned"
  }

  site_config {
    application_stack {
      node_version = "20"
    }
    always_on                = true # для Premium — убирает cold start
    app_scale_limit          = 30
    pre_warmed_instance_count = 2
  }

  app_settings = {
    FUNCTIONS_WORKER_RUNTIME       = "node"
    WEBSITE_RUN_FROM_PACKAGE       = "1"
    SCM_DO_BUILD_DURING_DEPLOYMENT = "false"
    AzureWebJobsDisableHomepage    = "true"
    SERVICEBUS_CONNECTION          = "@Microsoft.KeyVault(SecretUri=${azurerm_key_vault_secret.sb_conn.id})"
  }

  # VNet Integration
  virtual_network_subnet_id = azurerm_subnet.functions.id
}

Параметр pre_warmed_instance_count гарантирует, что 2 инстанса всегда горячие — холодный старт исключён. App scaling limit в 30 защищает от runaway-расходов.

Durable Functions: оркестрация long-running процессов

Durable Functions — расширение для оркестрации long-running процессов, fan-out/fan-in и цепочек вызовов. Состояние хранится в Azure Storage — таблицах и blob'ах. Никакой внешней очереди — всё встроено. Это даёт гарантию выполнения даже при сбоях. Используйте Durable Functions для ETL, обработки заказов, сложных бизнес-процессов.

// Orchestrator
const df = require("durable-functions");
module.exports = df.orchestrator(function* (context) {
    const data = context.df.getInput();
    // Параллельный fan-out
    const tasks = data.items.map(item => context.df.callActivity("ProcessItem", item) );
    // Ждём все результаты
    const results = yield context.df.Task.all(tasks);
    // Агрегация
    return yield context.df.callActivity("AggregateResults", results);
});

Пример из практики: обрабатывали 100 000 заказов в час через Durable Functions — система выдержала без единого сбоя, благодаря автоматическому восстановлению состояния.

Сравнение Durable Functions и обычных HTTP-функций
Характеристика Обычные функции Durable Functions
Состояние Нет (stateless) Да (stateful)
Длительность до 10 мин неограниченно
Оркестрация нет встроенная
Надёжность перезапуск автоматическое восстановление

Настройка мониторинга через Application Insights

Мониторинг — обязательная часть production-системы. Подключаем Application Insights через Terraform:

resource "azurerm_application_insights" "functions" {
  name                = "appi-functions-prod"
  location            = var.location
  resource_group_name = azurerm_resource_group.app.name
  application_type    = "web"
  workspace_id        = azurerm_log_analytics_workspace.main.id
}

# Добавить в app_settings функций:
# APPLICATIONINSIGHTS_CONNECTION_STRING = azurerm_application_insights.functions.connection_string

Application Insights автоматически трейсит вызовы функций, зависимости, исключения. Настраиваем алерты на failure rate > 1% и p95 latency > 5 сек. Опыт показывает, что это покрывает 90% инцидентов. Дополнительно можно настроить дашборд в Grafana через экспорт метрик.

Что входит в настройку под ключ

При заказе настройки Azure Functions под ключ мы предоставляем:

  • IaC-конфигурации (Terraform) для инфраструктуры и CI/CD
  • Пайплайны деплоя (GitHub Actions / GitLab CI) с автотестами
  • Документацию: архитектура, runbook для оператора, постмортем-шаблон
  • Настройку мониторинга и алертов в Application Insights
  • Обучение команды заказчика (2-часовой workshop)

Наша команда сертифицирована (Azure Solutions Architect) и имеет многолетний опыт. Выполнили более 30 проектов, включая high-load системы для финтеха. Получите консультацию — мы оценим ваш проект.

Сроки и как начать

Базовая конфигурация одной функции с Terraform, Key Vault и CI/CD — от 1 до 3 дней. Сложные case с Durable Functions, VNet и многослойным мониторингом — до 1 недели. Точную оценку даём после аудита. Свяжитесь с нами для обсуждения вашего сценария.

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

Последние работы

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