תצורת ייצור של Azure Functions
ייתכן שתתקלו בבעיה: הפונקציה עובדת מקומית, אבל בייצור — פסקי זמן, התחלות קרות עד 10 שניות, סודות בקוד. Azure Functions הוא כלי serverless חזק, אבל תצורת ייצור דורשת תשומת לב לפרטים. אנו מכסים בחירת תוכנית אירוח של Azure Functions, תשתית Terraform, Managed Identity עם Key Vault, תיאום Durable Functions, וניטור Application Insights. בניסיון שלנו, סיפקנו מעל 30 פרויקטים של serverless למסחר אלקטרוני ופינטק ואנו יודעים כיצד להימנע ממלכודות נפוצות. קבלו ייעוץ — נבחן את הפרויקט שלכם.
באיזו תוכנית אירוח לבחור?
תוכנית Consumption — serverless קלאסי: תשלום לפי קריאה, קנה מידה לאפס. התחלה קרה עבור .NET/Node.js היא 1–3 שניות, עבור Java עד 10 שניות. לא מקובל עבור API רגיש לזמן תגובה. לתרחישים כאלה, תוכנית Premium מהירה פי 2–3 בהתחלה קרה ומספקת זמן תגובה יציב מתחת ל-100 אלפיות השנייה. עבור 1M בקשות בחודש, תוכנית Premium עולה כ-$200, חוסכת $40 בהשוואה ל-Consumption עם קנה מידה של התחלה קרה.
Flex Consumption — תוכנית חדשה עם שילוב VNet והתחלה קרה <1 שנייה (מהירה עד פי 10 מ-Consumption). מומלץ לפרויקטים חדשים הזקוקים לבידוד רשת ותגובה מהירה ללא תשלום קבוע עבור מופע.
תוכנית Premium — תמיד לפחות מופע חם אחד. אין התחלה קרה, שילוב VNet, זמן ביצוע בלתי מוגבל. עלות לשעה גבוהה ב-30–40% מ-Consumption, אבל חיסכון מקנה מידה ללא התחלה קרה. לתרחישים רגישים לזמן תגובה, ההבדל קריטי: בעומס שיא של 1000 בקשות/שנייה, Premium מעבד 30% מהר יותר. Premium מהירה פי 4 מ-Consumption עבור זמן תגובה p95 (200 אלפיות השנייה לעומת 800 אלפיות השנייה).
Dedicated (תוכנית App Service) — פונקציות על מכונות וירטואליות ייעודיות. מוצדק כלכלית אם כבר יש לכם תוכנית App Service: אפשר לארח פונקציות על אותה תוכנית ללא עלות נוספת עבור מופע.
| תוכנית | התחלה קרה | שילוב VNet | קנה מידה | מקרה שימוש טיפוסי | הערכת עלות |
|---|---|---|---|---|---|
| Consumption | 1–10 שניות | רק דרך Flex | מאות מופעים בשניות | קריאות אפיזודיות, עבודות אצווה | ~$0.000016/ביצוע |
| Flex Consumption | <1 שנייה | כן | עד 100 מופעים | API עם זמן תגובה נמוך, צרכי VNet | ~$0.00002/ביצוע |
| Premium | לא | כן | עד 50 מופעים (ניתן להגדרה) | API ייצור, משימות ארוכות טווח | ~$1.50/שעה |
| Dedicated | לא (תמיד פעיל) | כן | תלוי בתוכנית | כבר יש תוכנית App Service | כלול בתוכנית |
כיצד Managed Identity מאבטח גישה ל-Key Vault?
שימו לב ל-SERVICEBUS_CONNECTION — זו הפניה ל-Key Vault. אפליקציית Functions עם זהות מנוהלת פותרת אוטומטית את @Microsoft.KeyVault(...) בעת ההפעלה. אין סודות ישירות במשתני סביבה. גישה זו מונעת דליפת סודות דרך מאגרי קוד ומפשטת סיבוב מפתחות. זה עוקב אחר המלצות 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)לאחר התצורה, הפונקציה ניגשת לסודות ללא סיסמאות מפורשות. זהו שיטות עבודה מומלצות לאבטחה.
התקנה שלב אחר שלב: מתוכנית לניטור
- בחרו תוכנית לפי עומס: לקריאות אקראיות — Consumption, לתנועה קבועה — Premium.
- פרוסו תשתית באמצעות Terraform: חשבון אחסון, תוכנית שירות, ופונקציה עם זהות מנוהלת שהוקצתה על ידי המערכת.
-
הגדירו הפניות ל-Key Vault בהגדרות האפליקציה (לדוגמה,
# Назначить 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)). - חברו את Application Insights: הוסיפו מחרוזת חיבור להגדרות האפליקציה, הגדירו התראות על שיעור כשלים >1% וזמן תגובה p95 >5 שניות. התקנה מלאה זו מפחיתה את זמן הייצור ב-60% בהשוואה לתצורה ידנית.
תצורת 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
}
הפרמטר 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 של 30 מגן מפני עלויות בלתי מבוקרות.
Durable Functions: תיאום תהליכים ארוכי טווח
Durable Functions הוא הרחבה לתיאום תהליכים ארוכי טווח, fan-out/fan-in, ושרשראות קריאות. המצב נשמר ב-Azure Storage — טבלאות ו-blobs. אין תור חיצוני — הכל מובנה. זה מבטיח ביצוע גם במהלך כשלים. השתמשו ב-Durable Functions עבור ETL, עיבוד הזמנות, זרימות עבודה עסקיות מורכבות. Azure Functions עם Durable Functions ו-Application Insights מספק נראות מלאה.
// 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 |
|---|---|---|
| מצב | אין (ללא מצב) | כן (עם מצב) |
| משך זמן | עד 10 דקות | בלתי מוגבל |
| תיאום | לא | מובנה |
| אמינות | הפעלה מחדש | שחזור אוטומטי |
הגדרת ניטור באמצעות Application Insights
ניטור הוא חלק חובה בכל מערכת ייצור. אנו מחברים את 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 עוקב אוטומטית אחר קריאות פונקציות, תלויות וחריגות. אנו מגדירים התראות על שיעור כשלים > 1% וזמן תגובה p95 > 5 שניות. הניסיון מראה שזה מכסה 90% מהתקריות. אופציונלית, ניתן להגדיר לוח מחוונים של Grafana דרך ייצוא מדדים.
תוצרים
בהזמנת התקנת Azure Functions סוהר, אנו מספקים:
- תצורות IaC (Terraform) לתשתית ו-CI/CD
- צינורות פריסה (GitHub Actions / GitLab CI) עם בדיקות אוטומטיות
- תיעוד: ארכיטקטורה, מדריך תפעול, תבנית postmortem
- הגדרת ניטור והתראות ב-Application Insights
- הדרכת צוות הלקוח (סדנה של שעתיים)
הצוות שלנו מוסמך (Azure Solutions Architect) ובעל ניסיון רב. השלמנו מעל 30 פרויקטים, כולל מערכות בעומס גבוה לפינטק. קבלו ייעוץ — נבחן את הפרויקט שלכם.
ציר זמן וכיצד להתחיל
תצורה בסיסית של פונקציה אחת עם Terraform, Key Vault ו-CI/CD אורכת 1 עד 3 ימים. מקרים מורכבים עם Durable Functions, VNet וניטור רב-שכבתי יכולים לארוך עד שבוע. אנו נותנים הערכה מדויקת לאחר ביקורת. צרו קשר כדי לדון בתרחיש שלכם.







