הגדרת VM ב-Azure: Terraform, VMSS ושיטות עבודה מומלצות לאבטחה

מכונות וירטואליות מוגדרות בצורה שגויה ב-Azure מובילות לזמן השבתה, להוצאות יתר ולסיכוני אבטחה. אנו מגדירים Azure VM, VMSS ו-Managed Identity באמצעות Terraform ו-cloud-init, ומבטיחים תשתית אמינה ומאובטחת. הצוות שלנו מספק פרויקטים סוהריים—החל מתכנון גודל ה-VM ועד לתמיכה שוטפת—כך שהפתרון שלכם פועל ביציבות וגדל עם העסק שלכם.

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

שאלות נפוצות

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

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

תארו לעצמכם: פרסתם VM דרך הפורטל, אבל שעה לאחר מכן הוא לא זמין—שכחתם לפתוח פורט ב-NSG. או שבחרתם בסדרת B לסביבת production, ואחרי 10 דקות נקודות ה-CPU אזלו—היישום קרס. טעויות כאלה עולות זמן וכסף. אנו נתקלים לעתים קרובות במצבים שבהם דיסקים אינם מוצפנים, NSG מאפשר את כל התעבורה, וסיסמת ה-VM מאוחסנת בקובץ טקסט פשוט. כל זה הוא דרך ישירה לדליפות מידע או להשבתות. תצורה נכונה מבטלת סיכונים אלה ומפחיתה עלויות ב-15,000–25,000 RUB לחודש עבור פרויקט טיפוסי באמצעות אופטימיזציה של SKU ושימוש ב-VMSS. הכנו מדריך מעשי להקמת VMs מוכנים ל-production. הניסיון שלנו: למעלה מ-5 שנים ב-Azure, 50+ פרויקטים שהופעלו.

כיצד לבחור את גודל ה-VM?

Azure מציעה עשרות סדרות. עבור רוב המשימות, הטבלה הבאה מתאימה. בחירה שגויה היא גורם נפוץ להוצאות יתר: סדרת B ב-production יכולה לעלות 30% יותר עקב השבתות, ו-Premium SSD בסביבת בדיקה הוא כסף מבוזבז.

סדרה מטרה דוגמה המלצה
סדרת D (Dsv5) מטרה כללית, שרתי web ויישומים Standard_D4s_v5 תקן עבור רוב הפרויקטים
סדרת E עומסי זיכרון: Redis, SAP, מסדי נתונים גדולים Standard_E8s_v5 לעומסי in-memory
סדרת F עומסי CPU: שרתי משחקים, batch Standard_F8s_v2 למשימות כבדות חישובית
סדרת L אופטימיזציית אחסון: NoSQL, מחסני נתונים Standard_L8s_v3 לפעולות קלט/פלט דיסק
סדרת B Burstable: סביבות פיתוח/בדיקה Standard_B2s פיתוח בלבד. לא ל-production

סדרת B לפיתוח חוסכת 60–70% בהשוואה לסדרת D. אבל ל-production היא לא מתאימה: נקודות CPU מתרוקנות תחת עומס.

תצורת Terraform

הנה דוגמה לתצורת VM production עם Terraform. נקודות מפתח: רק מפתחות SSH, הצפנת דיסק, זהות SystemAssigned, 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"
  }
}

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

למה להשתמש ב-Managed Identity?

Managed Identity מעניק ל-VMs גישה לשירותי Azure (Key Vault, Storage, ACR) ללא אחסון אישורים על הדיסק. בניגוד לסיסמאות או תעודות, הזהות מסובבת אוטומטית על ידי הפלטפורמה. הפעילו את disk_encryption_set_id—וה-VM מקבל service principal. Managed Identity מבטל לחלוטין אחסון סודות על הדיסק, מה שבטוח פי 10 מסיסמאות. לפי התיעוד הרשמי של Microsoft, זהו התקן לפרויקטים ארגוניים.

# Назначить роль 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 ללא אישורים נוספים:

# Получить токен через 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'

גישה זו מבטלת אחסון סודות בקוד או במאגרים.

רשימת בדיקה לחיזוק האבטחה

אמצעי תיאור
מפתחות SSH במקום סיסמאות SystemAssigned
Managed Identity לגישת שירותים במקום אחסון אישורים על הדיסק
הצפנת דיסק שימוש במפתחות בניהול לקוח דרך Key Vault
NSG: רשימת IP מורשים הגבלת גישה ל-IPs ופורטים נחוצים
השבתת פורטים מיותרים הסרת RDP (3389) ופורטים אחרים שאינם בשימוש
עדכוני מערכת סדירים דרך cloud-init או ניהול עדכונים

Cloud-init להגדרה ראשונית

Cloud-init הוא התקן דה-פקטו להגדרה ראשונית של VM. הוא מתקין חבילות, מפעיל שירותים וכותב קבצי תצורה. אנו משתמשים בקובץ YAML המצורף דרך # Назначить роль 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 . למידע נוסף על הטכנולוגיה בויקיפדיה.

דוגמת 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, ניטור ונקודת בדיקת בריאות.

מה VMSS נותן לכם?

שימו לב: כאשר אתם צריכים מספר VMs זהים עם autoscaling, השתמשו ב-Virtual Machine Scale Sets. הם מספקים עדכונים מתגלגלים, שחזור אוטומטי ואינטגרציה עם load balancer. השוואה בין VMSS ו-VMs בודדים:

תכונה VMs בודדים VMSS
Autoscaling ❌ ✅
עדכונים מתגלגלים ❌ ✅
שחזור אוטומטי ❌ ✅
אינטגרציית 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 פורס עשרות VMs פי 3 מהר יותר מיצירה ידנית. הזמינו ביקורת על התשתית שלכם—נמצא נקודות צמיחה.

תהליך העבודה שלנו

  1. ביקורת תשתית קיימת (אם קיימת) – ניתוח VMs קיימים, עומס, עלויות. איסוף מדדים למשך שבוע לצורך right-sizing נכון.
  2. תכנון – בחירת SKUs, רשתות, מדיניות אבטחה. אנו משתמשים ב-Terraform עבור 99.9% מהתשתית המתוארת.
  3. פריסה דרך Terraform – כל המשאבים מנוהלים בגרסאות קוד ב-Git.
  4. הגדרת ניטור – Azure Monitor, Log Analytics, התראות על CPU, זיכרון, דיסק (עד 10,000 IOPS).
  5. פריסת יישומים – דרך cloud-init או CI/CD (Azure DevOps).
  6. בדיקות ומסירה – אנו בודקים סובלנות לתקלות, אוספים מדדים, מבצעים בדיקות עומס.

מה כלול בתוצאה

  • קוד Terraform (מודולרי, מתועד, במאגר ה-Git שלכם)
  • סקריפטים של cloud-init ליישומים
  • Managed Identity לגישת שירותים
  • ניטור והתראות על CPU, זיכרון, דיסק, בריאות
  • תיעוד לתמיכה ופעולות שגרתיות
  • הדרכת צוות (שעה, יסודות)
  • אחריות תצורה – שבועיים לאחר המסירה: אם משהו נשבר, אנו מתקנים בחינם.

לוח זמנים ועלות

לוח זמנים: בין 2 ל-7 ימים תלוי במורכבות (מספר VMs, VMSS, אינטגרציות). העלות מחושבת באופן אישי לאחר ביקורת. דוגמה: פריסת 3 VMs production עם Terraform, ניטור ו-CI/CD – 3-4 ימים. חיסכון ממוצע בתשתית יכול להגיע ל-15,000–30,000 RUB לחודש עקב בחירת SKU נכונה ושימוש ב-VMSS.

צרו קשר כדי לדון במשימה שלכם. הניסיון שלנו: למעלה מ-5 שנים ו-50+ פרויקטים מוצלחים ב-Azure. קבלו ייעוץ ללא התחייבות.