Lý Thuyết Cốt Lõi
1. Cloud Service Responsibilities — IaaS, PaaS, SaaS
Azure Virtual Machine là dịch vụ IaaS (Infrastructure as a Service). Hiểu mô hình trách nhiệm giúp bạn biết mình phải quản lý gì và Azure lo gì.
| Trách nhiệm | On-Prem | IaaS (VM) | PaaS | SaaS |
|---|---|---|---|---|
| Physical hardware | Bạn | Azure | Azure | Azure |
| Network & Storage | Bạn | Azure | Azure | Azure |
| OS & Virtualization | Bạn | Bạn | Azure | Azure |
| Runtime & Middleware | Bạn | Bạn | Azure | Azure |
| Application & Data | Bạn | Bạn | Bạn | Azure |
2. Lập Kế Hoạch VM — Planning Checklist
Trước khi tạo VM, cần xác định rõ 5 yếu tố sau để đảm bảo VM đáp ứng yêu cầu về hiệu năng, bảo mật và chi phí:
- • VNet và Subnet phải tồn tại trước hoặc tạo cùng lúc
- • VM trong cùng VNet giao tiếp qua private IP (không tốn phí)
- • NSG gắn vào NIC hoặc Subnet để kiểm soát traffic
- • Public IP tùy chọn — không cần nếu dùng Bastion
- • Quy tắc:
<role>-<env>-<region>-<nn> - • Ví dụ:
web-prod-sea-01 - • Tên VM không đổi được sau khi tạo
- • Computer name ≤ 15 ký tự (Windows), ≤ 64 (Linux)
- • Chọn region gần người dùng cuối để giảm latency
- • Giá VM và storage khác nhau theo region
- • Không phải mọi VM size đều có ở mọi region
- • Data residency: dữ liệu VN nên để southeastasia
- • Pay-as-you-go: tính theo giờ, linh hoạt nhất
- • Reserved (1/3 năm): tiết kiệm 40–72%
- • Spot VM: giảm đến 90% — workload có thể ngắt
- • Azure Hybrid Benefit: dùng Windows Server/SQL license có sẵn
Boot diagnostics và OS guest diagnostics cần storage account. Azure Managed Disks không cần storage account riêng — Azure quản lý nội bộ. Khuyến nghị luôn bật Boot Diagnostics để debug VM không khởi động được.
3. VM Sizing — Chọn Đúng Series & Size
Azure nhóm VM size theo series, mỗi series tối ưu cho một loại workload khác nhau. Có thể resize VM bất cứ lúc nào (cần restart).
CPU burst credit khi cần, tiết kiệm chi phí cho workload không đều. Thích hợp: web server nhỏ, dev/test, CI runners, microservice nhẹ.
B1s, B2s, B4ms, B8ms...
Cân bằng CPU/RAM/storage. Thích hợp: web tier, app server, database nhỏ, enterprise app. Dv5 dùng thế hệ Intel Ice Lake/Cascade Lake.
D2s_v5, D4s_v5, D8s_v5...
RAM cao, CPU vừa. Thích hợp: in-memory database (SAP HANA, Redis cache lớn), SQL Server với buffer pool lớn, data warehouse.
E4s_v5, E8s_v5, E32s_v5...
CPU nhiều, RAM ít. Thích hợp: batch processing, game server, video transcoding, web scraping, medium traffic web tier cần CPU cao.
F2s_v2, F4s_v2, F8s_v2...
Có GPU NVIDIA. Thích hợp: AI/ML training (NC series), GPU rendering (NV series), HPC. Chi phí cao, nên dùng Spot khi có thể.
NC6, NV6, ND40rs_v2...
NVMe SSD local, IOPS cực cao. Thích hợp: NoSQL database (Cassandra, MongoDB), data warehouse, log analytics cần I/O nhanh.
L8s_v3, L16s_v3, L32s_v3...
Standard_D4s_v5 = Tier_Series+vCPU+features_version. Ký tự s = hỗ trợ Premium SSD; d = có temp disk; a = AMD CPU; p = ARM Ampere.
4. VM Storage & Kết Nối VM
- • Chứa hệ điều hành — bắt buộc có
- • Windows: mặc định 127 GB
- • Linux: mặc định 30–50 GB
- • Persistent — dữ liệu giữ khi restart/deallocate
- • Khuyến nghị: Premium SSD hoặc SSD v2
- • Chứa dữ liệu ứng dụng, database
- • Tách riêng khỏi OS disk — best practice
- • Có thể detach/attach giữa các VM
- • Số lượng max phụ thuộc VM size
- • Persistent — dữ liệu giữ nguyên
- • Local SSD trên physical host
- • Windows:
D:\— Linux:/dev/sdb - • MẤT DỮ LIỆU khi deallocate/resize/maintenance
- • Dùng cho swap file, temp cache
- • KHÔNG lưu dữ liệu quan trọng ở đây
| Managed Disk Type | Max IOPS | Latency | Use Case |
|---|---|---|---|
| Standard HDD | 2,000 | < 10ms | Dev/test, backup, archive |
| Standard SSD | 6,000 | Single-digit ms | Web server, light production |
| Premium SSD | 20,000 | < 1ms | Production DB, ERP, SAP |
| Ultra Disk (SSD v2) | 160,000+ | Sub-ms | High-perf DB, IOPS-intensive |
Windows VM — port TCP 3389. Mở NSG inbound rule cho port 3389. Tải file .RDP từ Portal hoặc dùng mstsc /v:<public-ip>. Just-in-Time (JIT) VM access khóa port 3389 mặc định, chỉ mở theo yêu cầu.
Linux VM — port TCP 22. Dùng SSH key pair (khuyến nghị) hoặc password. Lệnh: ssh -i ~/.ssh/id_rsa azureuser@<public-ip>. Azure tạo SSH key pair tự động khi tạo VM qua Portal.
Kết nối RDP/SSH qua trình duyệt — không cần Public IP, không cần mở port 3389/22. Bastion host deploy trong AzureBastionSubnet (/26 tối thiểu). Tăng bảo mật đáng kể, giảm attack surface.
Bài Tập Thực Hành (Lab)
Tạo Resource Group, VNet và VM Linux Ubuntu qua Azure CLI
# Biến môi trường
RG="rg-az104-m21"
LOCATION="southeastasia"
VNET="vnet-m21"
SUBNET="subnet-app"
VM_NAME="vm-web-m21-01"
ADMIN_USER="azureadmin"
# Tạo Resource Group
az group create \
--name $RG \
--location $LOCATION \
--tags Course=AZ-104 Module=21 Environment=Lab
# Tạo VNet và Subnet
az network vnet create \
--resource-group $RG \
--name $VNET \
--address-prefix 10.21.0.0/16 \
--subnet-name $SUBNET \
--subnet-prefix 10.21.1.0/24
# Tạo NSG và rule cho SSH
az network nsg create \
--resource-group $RG \
--name nsg-m21
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-m21 \
--name Allow-SSH \
--priority 1000 \
--protocol Tcp \
--destination-port-range 22 \
--access Allow \
--direction Inbound
# Tạo VM Ubuntu 22.04 LTS — Standard_B2s (2 vCPU, 4 GB RAM)
az vm create \
--resource-group $RG \
--name $VM_NAME \
--image Ubuntu2204 \
--size Standard_B2s \
--vnet-name $VNET \
--subnet $SUBNET \
--nsg nsg-m21 \
--admin-username $ADMIN_USER \
--generate-ssh-keys \
--public-ip-sku Standard \
--os-disk-size-gb 30 \
--storage-sku Premium_LRS \
--tags Course=AZ-104 Module=21 Environment=Lab Role=WebServer
# Xem Public IP vừa được cấp
az vm show \
--resource-group $RG \
--name $VM_NAME \
--show-details \
--query publicIps -o tsv
Tạo và Gắn Data Disk Premium SSD 64 GB vào VM
RG="rg-az104-m21"
VM_NAME="vm-web-m21-01"
# Tạo managed disk Premium SSD 64 GB
az disk create \
--resource-group $RG \
--name disk-data-m21-01 \
--size-gb 64 \
--sku Premium_LRS \
--tags Course=AZ-104 Module=21
# Gắn disk vào VM (hot-attach, VM không cần tắt)
az vm disk attach \
--resource-group $RG \
--vm-name $VM_NAME \
--name disk-data-m21-01 \
--lun 0
# SSH vào VM để format và mount disk
PUBLIC_IP=$(az vm show --resource-group $RG --name $VM_NAME \
--show-details --query publicIps -o tsv)
echo "SSH vào VM: ssh azureadmin@$PUBLIC_IP"
echo "Sau khi SSH, chạy các lệnh sau trên VM:"
cat << 'INNEREOF'
# Kiểm tra disk mới gắn vào (thường /dev/sdc)
lsblk
# Format disk với ext4
sudo mkfs.ext4 /dev/sdc
# Tạo mount point
sudo mkdir -p /data
# Mount disk
sudo mount /dev/sdc /data
# Lấy UUID để mount tự động khi reboot
sudo blkid /dev/sdc
# Thêm vào /etc/fstab (thay UUID thực tế)
# UUID=<uuid-thuc-te> /data ext4 defaults,nofail 0 2
INNEREOF
Triển khai Azure Bastion và Kết nối VM qua Trình Duyệt
RG="rg-az104-m21"
VNET="vnet-m21"
# Tạo AzureBastionSubnet (bắt buộc tên chính xác, /26 tối thiểu)
az network vnet subnet create \
--resource-group $RG \
--vnet-name $VNET \
--name AzureBastionSubnet \
--address-prefix 10.21.255.0/26
# Tạo Public IP cho Bastion (Standard SKU bắt buộc)
az network public-ip create \
--resource-group $RG \
--name pip-bastion-m21 \
--sku Standard \
--location southeastasia \
--allocation-method Static
# Tạo Bastion host (mất khoảng 5-10 phút)
az network bastion create \
--resource-group $RG \
--name bastion-m21 \
--vnet-name $VNET \
--public-ip-address pip-bastion-m21 \
--location southeastasia \
--sku Basic
echo "Bastion đang được provision. Vào Portal để kết nối khi hoàn tất."
echo "Portal: VM vm-web-m21-01 → Connect → Bastion → dùng SSH key hoặc password"
Resize VM — Thay đổi Size từ B2s lên D2s_v5
RG="rg-az104-m21"
VM_NAME="vm-web-m21-01"
# Xem size hiện tại
az vm show \
--resource-group $RG \
--name $VM_NAME \
--query hardwareProfile.vmSize \
-o tsv
# Kiểm tra size nào available trong region (lọc theo series D)
az vm list-vm-resize-options \
--resource-group $RG \
--name $VM_NAME \
--query "[?contains(name, 'Standard_D')].name" \
-o table
# Deallocate VM trước khi resize (bắt buộc nếu size mới không có trên cùng host)
az vm deallocate \
--resource-group $RG \
--name $VM_NAME
# Resize lên Standard_D2s_v5
az vm resize \
--resource-group $RG \
--name $VM_NAME \
--size Standard_D2s_v5
# Khởi động lại VM
az vm start \
--resource-group $RG \
--name $VM_NAME
# Xác nhận size mới
az vm show \
--resource-group $RG \
--name $VM_NAME \
--query hardwareProfile.vmSize \
-o tsv
Cleanup — Dọn dẹp toàn bộ tài nguyên Lab 21
# Xóa toàn bộ Resource Group (kéo theo VM, disk, NIC, NSG, VNet, Bastion, IP)
az group delete --name rg-az104-m21 --yes --no-wait
echo "Resource Group rg-az104-m21 đang được xóa ở background."
echo "Kiểm tra: az group show --name rg-az104-m21 (sẽ báo lỗi khi xóa xong)"
Kết Quả Đầu Ra
Xác định đúng trách nhiệm quản lý theo từng mô hình dịch vụ cloud
Xác định network, naming, region, pricing model phù hợp trước khi triển khai
Phân biệt B/D/E/F/N/L series, chọn size tối ưu cho từng workload
Phân biệt OS/data/temp disk; tạo, gắn, format managed disk Premium SSD
Tạo VM Linux đầy đủ: VNet, NSG, SSH key, managed disk bằng Azure CLI
Triển khai Azure Bastion, kết nối SSH/RDP qua browser không cần Public IP hoặc mở port
Ứng Dụng Thực Tế
Tình huống 1: Công ty fintech TP.HCM — Nâng cấp hệ thống core banking lên Azure
Hệ thống on-prem đang chạy trên máy chủ vật lý cũ, cần migration lên Azure VM trong thời gian bảo trì cuối tuần, đảm bảo không mất dữ liệu và kết nối an toàn cho admin.
Chọn Standard_E8s_v5 (8 vCPU, 64 GB RAM) cho SQL Server core banking. OS disk Premium SSD 127 GB + data disk Ultra SSD 512 GB. Bastion thay thế VPN để admin truy cập — không cần mở port RDP ra ngoài.
Dùng Azure Migrate để assess on-prem server. Tạo VM prod trong subnet riêng (10.0.1.0/24). NSG chỉ cho phép inbound từ Bastion subnet. Azure Hybrid Benefit tiết kiệm license Windows Server.
Latency thấp (southeastasia gần TP.HCM). Không cần quản lý phần cứng. Bastion + JIT Access giảm attack surface xuống gần 0. Reserved Instance 3 năm tiết kiệm 60% chi phí.
Tình huống 2: Trường đại học Hà Nội — Môi trường lab thực hành sinh viên
Cần 50 VM Linux cho sinh viên thực hành môn Cloud Computing, mỗi VM dùng không liên tục, cần tiết kiệm chi phí tối đa.
Standard_B2s cho mỗi sinh viên (2 vCPU, 4 GB — đủ chạy Docker, Python lab). Script tự động deallocate VM sau giờ học (6 PM đến 7 AM) bằng Azure Automation hoặc Logic Apps.
ARM template tạo 50 VM đồng loạt (foreach loop). Bastion 1 instance cho cả 50 VM trong cùng VNet — sinh viên kết nối qua browser không cần cài client. Tag Student=<mã-sv> để theo dõi chi phí.
Chi phí giảm 60% so với để VM chạy 24/7. Sinh viên truy cập từ bất kỳ máy nào qua browser. Không cần VPN phức tạp. Môi trường nhất quán, dễ reset khi cần.
Tình huống 3: Studio game Đà Nẵng — Render farm GPU cho game mobile
Cần render 3D asset cho game, công việc chạy batch theo dự án, không cần server thường trực, đôi khi cần burst lên nhiều node song song.
Standard_NV6 Spot VM (GPU NVIDIA M60) cho render. Spot VM giảm 85% chi phí so với pay-as-you-go. Workload render có thể chịu được interruption — checkpoint định kỳ. Storage: temp disk NVMe cho render cache.
Script Azure CLI spin up 10 Spot VM khi có batch job, tự động terminate sau khi xong. Output render lưu vào Azure Blob Storage (persistent). Data disk Standard SSD cho source assets (đọc nhiều, ghi ít).
Không tốn tiền khi không render. GPU on-demand không cần mua phần cứng đắt tiền. Thời gian render giảm 10x so với CPU. Mở rộng sang 50 node khi deadline gấp chỉ mất vài phút.