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_stringApplication 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 недели. Точную оценку даём после аудита. Свяжитесь с нами для обсуждения вашего сценария.







