MODULE 07 Compute / IaC 20–25% đề thi

Azure Resource Manager

Nền tảng quản lý hạ tầng Azure — lợi ích ARM, tổ chức Resource Groups, bảo vệ bằng Locks, di chuyển và tái cấu trúc resources, kiểm soát giới hạn tài nguyên.

Lý Thuyết Cốt Lõi

1. Lợi Ích của Azure Resource Manager

Azure Resource Manager (ARM) là lớp quản lý thống nhất (management layer) cho mọi resource Azure. Mọi thao tác tạo, đọc, cập nhật, xóa resource đều đi qua ARM — dù qua Portal, CLI, PowerShell, REST API hay SDK.

Quản lý nhóm (Group Management)
  • • Deploy, quản lý, giám sát toàn bộ resource của một giải pháp như một nhóm thống nhất
  • • Áp dụng tag, lock, policy lên Resource Group — kế thừa xuống resource con
  • • Xem rõ chi phí và phụ thuộc giữa các resource trong nhóm
Triển khai nhất quán (Idempotent Deploy)
  • • Dùng ARM Templates (JSON/Bicep) deploy lại nhiều lần, kết quả luôn nhất quán
  • • Kiểm soát phụ thuộc: ARM xác định thứ tự tạo resource tự động
  • • Rollback dễ dàng khi deploy thất bại (deployment history lưu 800 lần gần nhất)
RBAC tích hợp sẵn
  • • RBAC tích hợp sẵn vào management platform — áp dụng cho mọi resource
  • • Role gán ở cấp RG kế thừa xuống tất cả resource bên trong
  • • Hỗ trợ cả custom role với granular permissions
Audit Trail & Visibility
  • • Activity Log ghi lại mọi thao tác CRUD lên resource (ai làm gì, lúc nào)
  • • Deployment history cho phép xem lại các lần deploy trước
  • • Tích hợp với Azure Monitor, Log Analytics để phân tích sâu
Luồng xử lý ARM: Người dùng gửi request (Portal/CLI/SDK) → Azure AD xác thực → ARM nhận request → Kiểm tra Authorization (RBAC) → Gọi resource provider tương ứng (ví dụ: Microsoft.Compute cho VM) → Trả kết quả.

2. Resource Groups — Tổ Chức Tài Nguyên

Resource Group (RG) là container logic chứa các resource Azure liên quan. Mỗi resource bắt buộc thuộc đúng 1 RG, nhưng resource trong RG này có thể tương tác với resource ở RG khác.

1 RG

Mỗi resource thuộc đúng 1 RG duy nhất — không thể thuộc nhiều RG cùng lúc.

Lifecycle

Xóa RG sẽ xóa toàn bộ resource bên trong. Dùng để dọn dẹp lab/project nhanh chóng.

Region

RG có region riêng (nơi lưu metadata), nhưng resource bên trong có thể ở region khác.

Chiến lược tổ chức RG Phù hợp khi Ví dụ
Theo môi trường Cần phân tách Dev/Staging/Prod rg-myapp-dev, rg-myapp-prod
Theo ứng dụng Nhiều ứng dụng độc lập rg-erp, rg-hrm, rg-ecommerce
Theo team Phân quyền theo bộ phận IT rg-infra-team, rg-devteam-backend
Theo lifecycle Resource có vòng đời giống nhau rg-network-core, rg-shared-services

3. ARM Locks & Di Chuyển Resources

ARM Locks — Bảo Vệ Resource
CanNotDelete (Delete Lock)

Người dùng có quyền đọc và chỉnh sửa resource, nhưng không thể xóa. Phù hợp cho production database, VNet core.

ReadOnly (Read Lock)

Chỉ đọc, không được sửa hoặc xóa. Khắt khe hơn — dùng cho resource nhạy cảm không được thay đổi cấu hình.

Lưu ý: Để thêm/xóa lock, người dùng cần role Microsoft.Authorization/locks/write (Owner hoặc User Access Administrator). Lock kế thừa từ RG xuống resource con.
Di Chuyển Resources Giữa RG/Subscription
Điều kiện di chuyển
  • • Resource phải hỗ trợ move operation (không phải tất cả resource đều hỗ trợ)
  • • Nếu chuyển subscription: cả source lẫn target sub phải cùng Entra ID tenant
  • • Tên resource không đổi, Resource ID thay đổi
Trong khi di chuyển
  • • Source RG và target RG bị lock (không thể modify) trong quá trình move
  • • Resource vẫn hoạt động bình thường (không có downtime)
  • • Azure CLI: az resource move

4. Resource Limits, Tags & Xóa Resources/RG

Resource Limits (Quotas)

Mỗi subscription có giới hạn mặc định cho từng loại resource. Có thể xem và yêu cầu tăng quota.

  • • Portal: Subscriptions → Usage + quotas
  • • CLI: az vm list-usage --location southeastasia
  • • Yêu cầu tăng quota qua Azure Support (chọn "Service and subscription limits")
  • • Ví dụ: vCPU limit mặc định 10/region, có thể tăng lên 200+
Tags — Phân Loại & Quản Lý Chi Phí

Tag là cặp key-value gắn vào resource/RG để phân loại, filter, và phân bổ chi phí.

  • • Tối đa 50 tags/resource, key ≤ 512 ký tự, value ≤ 256 ký tự
  • • Tags không kế thừa từ RG xuống resource (dùng Policy để enforce)
  • • Dùng Cost Management filter theo tag để xem chi phí theo project/team
  • • Ví dụ best practice: Environment=Prod, CostCenter=IT-001, Owner=devteam
Xóa Resources & Resource Groups
  • • Xóa RG sẽ xóa toàn bộ resource trong RG (không thể undo)
  • • Phải xóa/gỡ lock trước khi xóa RG có lock CanNotDelete
  • • CLI: az group delete --name <rg> --yes --no-wait
  • • Portal: chọn RG → Delete resource group → nhập tên để xác nhận
Tái Cấu Trúc (Reorganize) Resources
  • • Di chuyển resource sang RG khác trong cùng subscription: không đổi billing
  • • Di chuyển sang subscription khác: cần validate resource dependencies
  • • Một số resource phải move cùng với resource phụ thuộc (VNet + Subnet)
  • • Sau move: cần cập nhật script/ARM template tham chiếu đến Resource ID mới
Mẹo thi AZ-104: Khi câu hỏi nói về bảo vệ resource khỏi xóa vô tình → chọn CanNotDelete lock. Khi nói về ngăn mọi thay đổi cấu hình → chọn ReadOnly lock. Lock override RBAC — ngay cả Owner cũng bị chặn bởi lock.

Bài Tập Thực Hành (Lab)

Lab 07-A: Tạo & Tổ Chức RG Lab 07-B: ARM Locks Lab 07-C: Di Chuyển Resource Lab 07-D: Resource Limits & Tags
1

Tạo Resource Groups và gán Tags

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Tạo Resource Group chính cho lab
az group create \
  --name rg-az104-m07 \
  --location southeastasia \
  --tags Environment=Lab CostCenter=AZ104-Training Module=07

# Tạo RG thứ hai để demo move resource
az group create \
  --name rg-az104-m07-target \
  --location southeastasia \
  --tags Environment=Lab CostCenter=AZ104-Training Module=07

# Xác nhận RG đã tạo
az group list --query "[?starts_with(name,'rg-az104-m07')]" \
  --output table

# Tạo storage account trong RG nguồn (để demo move)
STORAGE_NAME="stm07lab$(date +%s | tail -c 6)"
az storage account create \
  --name $STORAGE_NAME \
  --resource-group rg-az104-m07 \
  --location southeastasia \
  --sku Standard_LRS \
  --kind StorageV2 \
  --tags Environment=Lab Module=07

echo "Storage account: $STORAGE_NAME"
Verify Portal: Azure Portal → Resource Groups → tìm rg-az104-m07rg-az104-m07-target. Mở RG → Tags → xác nhận Environment=Lab, CostCenter=AZ104-Training.
2

Tạo và kiểm tra ARM Locks

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Tạo CanNotDelete lock trên RG
az lock create \
  --name "LockRgM07-NoDelete" \
  --resource-group rg-az104-m07 \
  --lock-type CanNotDelete \
  --notes "Module 07 Lab — Bảo vệ khỏi xóa vô tình"

# Liệt kê lock
az lock list --resource-group rg-az104-m07 -o table

# Kiểm tra: thử xóa RG khi đang có lock — sẽ báo lỗi
az group delete --name rg-az104-m07 --yes 2>&1 || echo "=> EXPECTED ERROR: RG bị block bởi lock CanNotDelete"

# Tạo ReadOnly lock trên storage account
STORAGE_NAME=$(az storage account list -g rg-az104-m07 --query "[0].name" -o tsv)
az lock create \
  --name "LockStorage-ReadOnly" \
  --resource-group rg-az104-m07 \
  --resource-name $STORAGE_NAME \
  --resource-type Microsoft.Storage/storageAccounts \
  --lock-type ReadOnly \
  --notes "Demo ReadOnly lock trên storage"

# Xem toàn bộ locks trong RG
az lock list --resource-group rg-az104-m07 -o table
Verify Portal: Portal → rg-az104-m07 → Locks → xác nhận 2 lock: "LockRgM07-NoDelete" (CanNotDelete) và "LockStorage-ReadOnly" (ReadOnly) trên storage account. Thử xóa RG từ Portal — nhận thông báo lỗi lock.
3

Di chuyển Resource sang RG khác

Bash— Linux/macOS/Cloud Shell, KHÔNG chạy CMD
SUB_ID=$(az account show --query id -o tsv)
STORAGE_NAME=$(az storage account list -g rg-az104-m07 --query "[0].name" -o tsv)
STORAGE_ID=$(az storage account show \
  --name $STORAGE_NAME \
  --resource-group rg-az104-m07 \
  --query id -o tsv)

echo "Storage ID: $STORAGE_ID"

# Gỡ ReadOnly lock trước khi move (bắt buộc)
LOCK_ID=$(az lock show \
  --name "LockStorage-ReadOnly" \
  --resource-group rg-az104-m07 \
  --resource-name $STORAGE_NAME \
  --resource-type Microsoft.Storage/storageAccounts \
  --query id -o tsv)
az lock delete --ids $LOCK_ID

# Validate move (kiểm tra trước khi thực hiện)
az resource invoke-action \
  --action validateMoveResources \
  --ids "/subscriptions/$SUB_ID/resourceGroups/rg-az104-m07" \
  --request-body "{\"resources\":[\"$STORAGE_ID\"],\"targetResourceGroup\":\"/subscriptions/$SUB_ID/resourceGroups/rg-az104-m07-target\"}" 2>&1 | head -5

# Thực hiện move storage account sang RG target
az resource move \
  --destination-group rg-az104-m07-target \
  --ids $STORAGE_ID

echo "Move completed. Kiểm tra resource ở RG target:"
az storage account list -g rg-az104-m07-target --query "[].name" -o tsv
Verify Portal: Portal → rg-az104-m07-target → Resources → xác nhận storage account đã xuất hiện ở RG mới. Portal → rg-az104-m07 → Resources → storage account đã biến mất. Resource ID của storage account đã thay đổi (chứa tên RG mới).
4

Xem và quản lý Resource Limits (Quotas)

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Xem VM quota tại region southeastasia
az vm list-usage --location southeastasia \
  --query "[?contains(name.value,'cores') || contains(name.value,'vCPUs')]" \
  --output table

# Xem storage account quota
az storage account list \
  --query "length(@)" \
  --output tsv

# Xem toàn bộ resource providers đã đăng ký
az provider list \
  --query "[?registrationState=='Registered'].namespace" \
  --output tsv | head -20

# Kiểm tra limit của một resource provider cụ thể
az provider show \
  --namespace Microsoft.Compute \
  --query "{namespace:namespace,state:registrationState}" \
  --output table

# Xem usage storage accounts trong subscription
az storage account list \
  --query "[].{Name:name,RG:resourceGroup,Location:location,Kind:kind}" \
  --output table
Verify Portal: Portal → Subscriptions → [tên subscription] → Usage + quotas → lọc theo Location "Southeast Asia" → thấy danh sách quotas và current usage. Để tăng quota: click vào resource → "Request increase".
5

Cleanup — Dọn dẹp tài nguyên Lab

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Xóa lock trên RG nguồn trước khi xóa
az lock delete \
  --name "LockRgM07-NoDelete" \
  --resource-group rg-az104-m07

# Xóa cả hai Resource Groups (kéo theo mọi resource bên trong)
az group delete --name rg-az104-m07 --yes --no-wait
az group delete --name rg-az104-m07-target --yes --no-wait

echo "Cleanup initiated. Dùng lệnh sau để kiểm tra:"
az group list --query "[?starts_with(name,'rg-az104-m07')]" --output table
Lưu ý: Flag --no-wait trả về ngay lập tức, quá trình xóa chạy nền. Kiểm tra Portal sau vài phút để xác nhận RG đã biến mất hoàn toàn.

Kết Quả Đầu Ra

Nắm kiến trúc ARM

Hiểu luồng xử lý ARM từ request → authentication → RBAC check → resource provider → response

Tổ chức Resource Groups hiệu quả

Chọn chiến lược tổ chức RG phù hợp (theo môi trường, app, team, lifecycle) cho từng tình huống

Áp dụng ARM Locks đúng loại

Phân biệt CanNotDelete vs ReadOnly lock, biết khi nào dùng lock nào và cách gỡ lock an toàn

Di chuyển resources không downtime

Validate và thực hiện move resource giữa RG/subscription, xử lý lock và dependency trước khi move

Quản lý Tags & phân bổ chi phí

Gán tags có chiến lược, dùng Cost Management filter theo tag để báo cáo chi phí theo department/project

Kiểm tra và tăng Resource Limits

Xem quota hiện tại qua CLI và Portal, biết cách submit request tăng quota khi cần mở rộng hạ tầng

Ứng Dụng Thực Tế

Tình huống 1: Tổng công ty xây dựng — Tái cấu trúc Azure sau M&A

Sau khi mua lại một công ty con, cần sáp nhập hạ tầng Azure của công ty bị mua vào subscription chính, đồng thời giữ nguyên hoạt động không gián đoạn.

Giải pháp

Dùng ARM resource move để di chuyển VM, storage, database từ subscription công ty con sang subscription tổng công ty. Tổ chức lại theo RG mới: rg-subsidiary-prod, rg-subsidiary-dev.

Triển khai

Validate move trước (validateMoveResources), move từng batch resource. Gắn tags CostCenter=Subsidiary-01 để tracking chi phí riêng. Áp CanNotDelete lock lên production DB ngay sau move.

Lợi ích

Zero downtime trong quá trình sáp nhập. Quản lý tập trung từ 1 subscription. Chi phí tách biệt qua tags. Bảo vệ production khỏi thay đổi vô tình trong giai đoạn chuyển tiếp.

Tình huống 2: Công ty fintech — Bảo vệ production khỏi thao tác sai

Developer vô tình xóa production database trong giờ cao điểm giao dịch, gây mất dữ liệu và downtime nghiêm trọng.

Giải pháp

Áp CanNotDelete lock lên toàn bộ RG production (rg-fintech-prod). Mọi resource trong RG đều được bảo vệ khỏi xóa — kể cả Owner cũng phải xóa lock trước.

Triển khai

Lock cấp RG kế thừa xuống tất cả resource. Quy trình xóa lock yêu cầu approval 2 người (Owner + IT Manager). Pipeline CI/CD không có quyền xóa lock (chỉ có Contributor role).

Lợi ích

Ngăn chặn 100% sự cố xóa vô tình. Tốc độ deploy không bị ảnh hưởng (Contributor vẫn tạo/sửa được resource). Audit trail rõ ràng khi lock bị gỡ.

Tình huống 3: Trường đại học — Quản lý resource limit cho nhiều khoa

Mỗi khoa (CNTT, Kinh tế, Y khoa) có subscription riêng trong Azure for Education, cần kiểm soát không vượt quota để tránh phát sinh chi phí ngoài dự toán.

Giải pháp

Monitor resource quota định kỳ bằng Azure CLI script. Tổ chức RG theo khoa: rg-it-dept, rg-econ-dept, rg-med-dept. Tags: Faculty=IT, Semester=2026-1, Course=AZ-104.

Triển khai

Script chạy hàng ngày kiểm tra vCPU usage (az vm list-usage). Alert khi đạt 80% quota. Budget Alert 90% gửi mail cho IT admin. Cuối học kỳ: xóa RG theo khoa, tiết kiệm chi phí.

Lợi ích

Không bao giờ vượt quota bất ngờ. Xóa sạch resource sau học kỳ chỉ bằng 1 lệnh xóa RG. Chi phí theo dõi theo khoa rõ ràng qua tags.

Zalo