הגדרת Azure Functions: Terraform, Managed Identity, Monitoring

כשפונקציות רצות בצורה חלקה מקומית אך נתקלות ב-timeouts ו-cold starts בסביבת הייצור, הגדרת Azure Functions דורשת גישה מיוחדת. אנחנו מקימים פתרונות serverless באמצעות Terraform, Managed Identity ו-Key Vault, ומבטיחים פעולה אמינה ואבטחה. הצוות שלנו מספק פרויקטים turnkey—מביקורת ועד הטמעה ותמיכה מתמשכת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

תצורת ייצור של 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)

לאחר התצורה, הפונקציה ניגשת לסודות ללא סיסמאות מפורשות. זהו שיטות עבודה מומלצות לאבטחה.

התקנה שלב אחר שלב: מתוכנית לניטור

  1. בחרו תוכנית לפי עומס: לקריאות אקראיות — Consumption, לתנועה קבועה — Premium.
  2. פרוסו תשתית באמצעות Terraform: חשבון אחסון, תוכנית שירות, ופונקציה עם זהות מנוהלת שהוקצתה על ידי המערכת.
  3. הגדירו הפניות ל-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) ).
  4. חברו את 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_string

Application 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 וניטור רב-שכבתי יכולים לארוך עד שבוע. אנו נותנים הערכה מדויקת לאחר ביקורת. צרו קשר כדי לדון בתרחיש שלכם.