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.
- • 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
- • 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 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
- • 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
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.
Mỗi resource thuộc đúng 1 RG duy nhất — không thể thuộc nhiều RG cùng lúc.
Xóa RG sẽ xóa toàn bộ resource bên trong. Dùng để dọn dẹp lab/project nhanh chóng.
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
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.
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.
Microsoft.Authorization/locks/write (Owner hoặc User Access Administrator). Lock kế thừa từ RG xuống resource con.
- • 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
- • 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
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+
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 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
- • 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
Bài Tập Thực Hành (Lab)
Tạo Resource Groups và gán Tags
# 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"
rg-az104-m07 và rg-az104-m07-target. Mở RG → Tags → xác nhận Environment=Lab, CostCenter=AZ104-Training.
Tạo và kiểm tra ARM Locks
# 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
Di chuyển Resource sang RG khác
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
Xem và quản lý Resource Limits (Quotas)
# 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
Cleanup — Dọn dẹp tài nguyên Lab
# 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
--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
Hiểu luồng xử lý ARM từ request → authentication → RBAC check → resource provider → response
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
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
Validate và thực hiện move resource giữa RG/subscription, xử lý lock và dependency trước khi move
Gán tags có chiến lược, dùng Cost Management filter theo tag để báo cáo chi phí theo department/project
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.
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.
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.
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.
Á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.
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).
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.
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.
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í.
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.