נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת AZ-104 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסוף מעבדת ידיים זו, תגדיר, באמצעות Terraform פשוט, את עומס העבודה הייחוס של AZ-104 — קבוצת משאבים (Resource Group), רשת וירטואלית (VNet) עם תת-רשת פרטית מוגנת באמצעות NSG, מכונה וירטואלית לינוקס (Linux VM) עם זהות מנוהלת (managed identity) שהוקצתה למערכת, חשבון אחסון (Storage Account) שהמכונה הוירטואלית יכולה לקרוא ממנו באמצעות זהות זו, וסביבת עבודה של Log Analytics שמקבלת אבחוני מכונה וירטואלית. כל בלוק קשור לאחד מחמשת תחומי הבחינה של AZ-104.
הצב את קטעי הקוד בקובץ main.tf אחד, הרץ terraform init, ולאחר מכן terraform apply צעד אחר צעד.
>= 1.5 או OpenTofu >= 1.6.az login).~/.ssh/id_rsa.pub (או שנה את הנתיב בשלב 4) עבור כניסת הניהול של המכונה הוירטואלית.המכונה הוירטואלית היא המקור העיקרי לחיוב:
עצור את המכונה הוירטואלית (az vm deallocate) כשאינך משתמש בה באופן פעיל כדי לחצות את עלות המחשוב. מחק את כל קבוצת המשאבים (RG) כדי לעצור את החיובים לחלוטין.
פתיחת Azure סטנדרטית: הצמד azurerm ~> 4.0, צור את קבוצת המשאבים (Resource Group), קרא את מפתח ה-SSH הציבורי המקומי כמקור נתונים (data source) כך שהמכונה הוירטואלית בשלב 4 תוכל להשתמש בו. תחום Identity and Governance של AZ-104 בודק קבוצות משאבים כטווח ה-RBAC הקטן ביותר; תגיות כאן מתפרסות למעקב עלויות תחת Monitor Azure resources.
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.6"
}
}
}
provider "azurerm" {
features {}
}
resource "random_id" "suffix" {
byte_length = 2
}
locals {
tags = {
Project = "certlabpro-az-104"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-104-rg"
location = "eastus"
tags = local.tags
}כל עומס עבודה של AZ-104 רץ בתוך רשת וירטואלית (Virtual Network). אנו יוצרים VNet /16 ומקצים תת-רשת /24 אחת עבור המכונה הוירטואלית. ה-NSG המחובר לתת-הרשת מאפשר SSH (פורט 22) נכנס — בסביבת ייצור, ה-CIDR המקור יוגבל; המעבדה פותחת אותו ל-* כך שתוכל להתחבר מכל כתובת IP.
תחום Deploy and Manage Networking של AZ-104 בודק שוב ושוב את דפוס האבטחה השכבתית הזה: NSGs הם שמרי מצב (stateful), הם חלים על תת-רשתות או כרטיסי רשת (NICs) (אנו מיישמים על תת-רשת כאן — זוהי התשובה המומלצת ב-AZ-104), ומבנה הכלל 'דחייה כברירת מחדל + אישור מפורש' הוא האופן שבו NSGs של Azure נבדלים מקבוצות אבטחה של AWS (ל-NSGs של Azure יש מספרי כללים מפורשים; ל-SGs של AWS אין).
resource "azurerm_virtual_network" "main" {
name = "certlabpro-az-104-vnet"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
address_space = ["10.0.0.0/16"]
tags = local.tags
}
resource "azurerm_subnet" "app" {
name = "app"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.main.name
address_prefixes = ["10.0.1.0/24"]
}
resource "azurerm_network_security_group" "app" {
name = "certlabpro-az-104-nsg"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
security_rule {
name = "AllowSSH"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
tags = local.tags
}
resource "azurerm_subnet_network_security_group_association" "app" {
subnet_id = azurerm_subnet.app.id
network_security_group_id = azurerm_network_security_group.app.id
}ברירות מחדל של אחסון AZ-104 סטנדרטיות: שכבת Standard, LRS, HTTPS בלבד, TLS 1.2 מינימלי, גישה ציבורית חסומה. בשלב 4, נעניק לזהות המנוהלת של המכונה הוירטואלית הרשאת קריאה לחשבון זה. תחום Manage Azure Identities and Governance בודק דפוס זה של זהות מנוהלת ← משאב כחלופה נטולת סיסמה לאחסון מפתחות חשבון אחסון בתצורת היישום.
resource "azurerm_storage_account" "data" {
name = "az104data${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
tags = local.tags
}המכונה הוירטואלית היא ארטיפקט המחשוב הקנוני של AZ-104. אנו משתמשים ב-Standard_B1s (ה-SKU הקטן ביותר של לינוקס הזכאי לשכבת חינם), Ubuntu 22.04 LTS, אימות מפתח SSH (תשובת האנטי-דפוס לסיסמה ב-AZ-104), וזהות מנוהלת שהוקצתה למערכת.
הקצאת התפקיד מעניקה לאותה זהות מנוהלת תפקיד Storage Blob Data Reader על חשבון האחסון משלב 3 — כלומר, המכונה הוירטואלית יכולה לקרוא לממשקי ה-API של האחסון באמצעות אסימון הזהות שלה, ללא מפתחות המאוחסנים בדיסק. זוהי שאלת הצומת של AZ-104 Implement and Manage Storage + Identity: איך מכונה וירטואלית ניגשת לאחסון ללא אישורים? זהות מנוהלת + הקצאת תפקיד RBAC.
resource "azurerm_public_ip" "vm" {
name = "certlabpro-az-104-vm-pip"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
allocation_method = "Static"
sku = "Standard"
tags = local.tags
}
resource "azurerm_network_interface" "vm" {
name = "certlabpro-az-104-vm-nic"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
ip_configuration {
name = "ipconfig1"
subnet_id = azurerm_subnet.app.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.vm.id
}
tags = local.tags
}
resource "azurerm_linux_virtual_machine" "main" {
name = "certlabpro-az-104-vm"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
size = "Standard_B1s"
admin_username = "azureuser"
disable_password_authentication = true
network_interface_ids = [azurerm_network_interface.vm.id]
admin_ssh_key {
username = "azureuser"
public_key = file("~/.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
identity {
type = "SystemAssigned"
}
tags = local.tags
}
resource "azurerm_role_assignment" "vm_storage_reader" {
scope = azurerm_storage_account.data.id
role_definition_name = "Storage Blob Data Reader"
principal_id = azurerm_linux_virtual_machine.main.identity[0].principal_id
}תחום Monitor and Maintain Azure Resources של AZ-104 (כ-10–15% מהבחינה) נשען על Log Analytics כיעד לכל דבר הניתן לצפייה. אנו יוצרים את סביבת העבודה והגדרת אבחון (Diagnostic Setting) על חשבון האחסון משלב 3 — כל טרנזקציית אחסון נוחתת כעת בצורת KQL הניתנת לשאילתה.
עבור המכונה הוירטואלית, היינו בדרך כלל מתקינים את Azure Monitor Agent (AMA) באמצעות הרחבת VM — זוהי הדרך המודרנית לאחר Log-Analytics-Agent. עבור המעבדה אנו מגדירים את סביבת העבודה; התקנת הסוכן עצמו היא שלב זמן ריצה נפרד (azurerm_virtual_machine_extension) המכוסה ב-עיון / Editorial. הצורה הארכיטקטונית — סביבת עבודה קיימת, משאבים זורמים לתוכה — היא מה ששאלות AZ-104 בודקות.
resource "azurerm_log_analytics_workspace" "main" {
name = "certlabpro-az-104-logs"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "PerGB2018"
retention_in_days = 30
tags = local.tags
}
resource "azurerm_monitor_diagnostic_setting" "storage" {
name = "diag"
target_resource_id = "${azurerm_storage_account.data.id}/blobServices/default/"
log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id
enabled_log {
category = "StorageRead"
}
enabled_log {
category = "StorageWrite"
}
metric {
category = "AllMetrics"
enabled = true
}
}terraform destroy הורס הכל. שתי הערות:
az vm deallocate עוצר את חיוב המחשוב (האחסון עדיין מחויב). terraform destroy מסיר הכל.Static — הוא שורד את ביטול הקצאת המכונה הוירטואלית, ושומר על הזמנת כתובת ה-IP. מחק או המר ל-Dynamic אם אינך רוצה לשלם עבור IP ציבורי שאינו בשימוש (כ-0.005 דולר לשעה).AZ-104 מכסה מגוון רחב של פעולות — Azure Backup, Recovery Services Vault, Site Recovery, Azure Files / Azure File Sync, Azure Migrate, Application Gateway, Load Balancer, Azure Bastion, VPN Gateway, ExpressRoute, Azure Firewall, Azure Policy, Azure Blueprints (בשלבי הוצאה משימוש), Conditional Access ב-Entra ID, B2B/B2C, תפקידי RBAC מותאמים אישית, ותבניות ARM/Bicep.
אנו נצמדים לבסיס VNet + VM + Storage + Monitor מכיוון שזו התשתית שכל שאלה אחרת ב-AZ-104 מניחה. הוסף Application Gateway לניתוב שכבה 7; הוסף VPN Gateway לקישוריות היברידית; הוסף Recovery Services Vault לגיבוי — כל אחד מהם הוא תוסף ממוקד לבסיס זה.
לכיסוי שירות-אחר-שירות, עיין בקטעי עיון, מדריך ו-Editorial בדף אישור זה.