MODULE 17 Storage 15–20% đề thi ~3 giờ

Azure Blob Storage

Triển khai Blob Storage, quản lý blob containers, phân tầng lưu trữ Hot/Cool/Cold/Archive, tạo lifecycle management rules, cấu hình object replication và hiểu mô hình định giá.

Lý Thuyết Cốt Lõi

1. Blob Types & Blob Containers

Azure Blob Storage là dịch vụ lưu trữ đối tượng phi cấu trúc cho text, binary, hình ảnh, video, backup, log. Mỗi blob nằm trong một container, container nằm trong storage account.

Block Blob
  • • Lưu trữ text và binary data
  • • Tối đa ~190.7 TiB/blob
  • • Tối ưu upload file lớn (parallel block commit)
  • • Dùng cho: ảnh, video, tài liệu, backup, log
  • • Hỗ trợ tất cả access tiers
Append Blob
  • • Tối ưu hoá cho thao tác append
  • • Không thể sửa/xóa block đã commit
  • • Dùng cho: logging, audit trail, streaming data
  • • Tối đa ~195 GiB/blob
  • • Không hỗ trợ access tier
Page Blob
  • • Tối ưu cho random read/write (4 KB pages)
  • • Tối đa 8 TiB/blob
  • • Dùng cho: VHD/VHDX (VM disks), Azure SQL
  • • Chỉ hỗ trợ LRS replication
  • • Premium performance với SSD backing
Blob Containers — Truy cập công khai
Private (mặc định): chỉ owner account mới truy cập được. Mọi blob đều private.
Blob (public blobs): anonymous có thể đọc blob nhưng không list container.
Container (public container): anonymous có thể đọc blob VÀ list toàn bộ container.

2. Access Tiers — Phân Tầng Lưu Trữ

Azure Blob Storage cung cấp 4 access tiers để tối ưu chi phí dựa trên tần suất truy cập dữ liệu. Chi phí storage và chi phí truy cập bù trừ nhau theo chiều ngược nhau.

Tier Chi phí lưu trữ Chi phí truy cập Latency đọc Use case
Hot Cao nhất Thấp nhất Milliseconds Dữ liệu truy cập thường xuyên (active content, website)
Cool Thấp hơn Hot Cao hơn Hot Milliseconds Ít truy cập (30+ ngày): backup, DR, infrequent reports
Cold Thấp hơn Cool Cao hơn Cool Milliseconds Rất ít truy cập (90+ ngày): compliance archives
Archive Thấp nhất Cao nhất 1–15 giờ (rehydrate) Lưu trữ dài hạn (180+ ngày): legal hold, raw data
Archive Rehydration: Blob ở Archive tier phải rehydrate về Hot hoặc Cool trước khi đọc được. Có 2 priority: Standard (1–15 giờ, rẻ hơn) và High (<1 giờ, đắt hơn). Early deletion penalty: Cool = 30 ngày, Cold = 90 ngày, Archive = 180 ngày.

3. Lifecycle Management Rules

Lifecycle management tự động chuyển blob giữa các tier hoặc xóa blob dựa trên điều kiện tuổi (age) hoặc thời gian truy cập cuối (last accessed). Giúp tối ưu chi phí mà không cần can thiệp thủ công.

Cấu trúc Policy
  • • Policy gồm nhiều rules
  • • Mỗi rule có filters (blob type, prefix, tag) và actions
  • • Actions: tierToCool, tierToCold, tierToArchive, delete
  • • Áp dụng cho: base blob, blob snapshot, blob version
  • • Chạy hàng ngày, tối đa 1 lần/ngày/account
Điều kiện kích hoạt
  • daysAfterModificationGreaterThan: ngày kể từ lần sửa cuối
  • daysAfterLastAccessTimeGreaterThan: ngày kể từ lần đọc cuối (cần bật last access tracking)
  • daysAfterCreationGreaterThan: cho snapshot và version
  • • Kết hợp với blob prefix để áp dụng cho thư mục cụ thể
Ví dụ policy điển hình: Blob tạo >30 ngày → Cool; >90 ngày → Cold; >365 ngày → Archive; >7 năm → Delete. Snapshot của blob >90 ngày → Delete. Log file prefix "logs/" → Delete sau 30 ngày.

4. Object Replication, Upload Blob & Pricing

Object Replication
  • • Sao chép async block blob giữa source và destination container (khác account, khác region)
  • • Yêu cầu: versioning phải bật trên cả 2 accounts; change feed bật trên source
  • • Không hỗ trợ Archive tier và Account Immutability
  • • Dùng cho: DR, data locality, analytics pipeline, content distribution
  • • Khác GRS: Object Replication cho phép chọn container cụ thể, cross-account
Upload Blob — Các phương thức
  • Azure Portal: kéo thả, giới hạn <5 GB/file
  • Azure CLI: az storage blob upload, upload-batch
  • AzCopy: công cụ CLI nhanh nhất, parallel upload, resume, sync; dùng cho large dataset
  • Azure Storage Explorer: GUI cross-platform
  • SDK (Python/Java/.NET): upload programmatic, chunk upload cho file lớn
Mô hình Pricing Blob Storage
  • Data stored ($/GB/tháng): Hot > Cool > Cold > Archive
  • Operations ($/10,000 ops): Hot thấp nhất, Archive cao nhất cho read
  • Data retrieval ($/GB): Hot = $0, Cool/Cold/Archive tăng dần
  • Early deletion: phí phạt nếu xóa blob trước minimum retention (Cool=30d, Cold=90d, Archive=180d)
  • Rehydration: phí đọc data từ Archive + rehydration fee riêng
  • Geo-replication: outbound data transfer từ primary đến secondary tính phí

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

Lab 17-A: Container & Upload Blob Lab 17-B: Access Tiers Lab 17-C: Lifecycle Policy Lab 17-D: Object Replication
1

Tạo Storage Account, Container và Upload Blob bằng Azure CLI

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Tạo Resource Group
az group create \
  --name rg-az104-m17 \
  --location southeastasia \
  --tags Course=AZ-104 Module=17

# Tên storage account phải unique toàn cầu
STORAGE_NAME="staz104m17$(date +%s | tail -c 6)"
echo "Storage: $STORAGE_NAME"

# Tạo storage account GPv2 Standard LRS
az storage account create \
  --name $STORAGE_NAME \
  --resource-group rg-az104-m17 \
  --location southeastasia \
  --sku Standard_LRS \
  --kind StorageV2 \
  --access-tier Hot \
  --https-only true \
  --min-tls-version TLS1_2 \
  --allow-blob-public-access false

# Lấy connection string
CONN_STR=$(az storage account show-connection-string \
  --name $STORAGE_NAME \
  --resource-group rg-az104-m17 \
  --query connectionString -o tsv)

# Tạo container private (mặc định)
az storage container create \
  --name documents \
  --connection-string "$CONN_STR" \
  --public-access off

# Tạo container với blob-level public access (đọc blob nhưng không list)
az storage container create \
  --name public-images \
  --connection-string "$CONN_STR" \
  --public-access blob

# Tạo file test và upload lên container documents
echo "Hello AZ-104 Module 17 - Blob Storage" > /tmp/test-doc.txt
az storage blob upload \
  --container-name documents \
  --name "reports/test-doc.txt" \
  --file /tmp/test-doc.txt \
  --connection-string "$CONN_STR" \
  --tier Hot

# Upload nhiều file từ thư mục (batch)
mkdir -p /tmp/batch-upload
for i in 1 2 3 4 5; do echo "File $i content" > /tmp/batch-upload/file-$i.txt; done
az storage blob upload-batch \
  --destination documents \
  --source /tmp/batch-upload \
  --connection-string "$CONN_STR" \
  --destination-path "batch/"

# Liệt kê blobs trong container
az storage blob list \
  --container-name documents \
  --connection-string "$CONN_STR" \
  --query '[].{Name:name, Tier:properties.blobTier, Size:properties.contentLength}' \
  -o table
Verify Portal: Portal → Storage account → Containers → xác nhận documents (Private) và public-images (Blob). Vào container documents → xác nhận blob reports/test-doc.txt và 5 file trong thư mục batch/.
2

Thay đổi Access Tier và Upload AzCopy

Bash— Linux/macOS/Cloud Shell, KHÔNG chạy CMD
# Đổi tier của blob từ Hot sang Cool
az storage blob set-tier \
  --container-name documents \
  --name "reports/test-doc.txt" \
  --tier Cool \
  --connection-string "$CONN_STR"

# Tạo thêm blob và set thẳng lên Archive
echo "Archive content - long term retention" > /tmp/archive-doc.txt
az storage blob upload \
  --container-name documents \
  --name "archive/archive-doc.txt" \
  --file /tmp/archive-doc.txt \
  --connection-string "$CONN_STR" \
  --tier Archive

# Xác nhận tiers
az storage blob list \
  --container-name documents \
  --connection-string "$CONN_STR" \
  --query '[].{Name:name, Tier:properties.blobTier, Status:properties.archiveStatus}' \
  -o table

# --- Demo AzCopy (cần cài sẵn hoặc dùng Cloud Shell có sẵn) ---
# Lấy SAS token để AzCopy xác thực
SAS_TOKEN=$(az storage account generate-sas \
  --account-name $STORAGE_NAME \
  --permissions rwdlacup \
  --resource-types sco \
  --services b \
  --expiry $(date -u -d "2 hours" +%Y-%m-%dT%H:%MZ) \
  --https-only \
  --connection-string "$CONN_STR" \
  -o tsv)

DEST_URL="https://${STORAGE_NAME}.blob.core.windows.net/documents?${SAS_TOKEN}"

# Upload thư mục với AzCopy (nhanh hơn CLI cho dữ liệu lớn)
azcopy copy "/tmp/batch-upload/*" "$DEST_URL" --recursive --put-md5

echo "AzCopy upload hoàn tất"
Verify Portal: Portal → Storage account → Containers → documents → click reports/test-doc.txt → Properties → Access tier: Cool. Click archive/archive-doc.txt → Properties → Access tier: Archive, Archive status: (trống nếu chưa rehydrate).
3

Tạo Lifecycle Management Policy tự động phân tầng và xóa blob

Bash— Linux/macOS/Cloud Shell, KHÔNG chạy CMD
# Tạo lifecycle policy JSON
cat > /tmp/lifecycle-policy.json << 'EOF'
{
  "rules": [
    {
      "name": "move-old-docs-to-cool",
      "enabled": true,
      "type": "Lifecycle",
      "definition": {
        "filters": {
          "blobTypes": ["blockBlob"],
          "prefixMatch": ["documents/reports/"]
        },
        "actions": {
          "baseBlob": {
            "tierToCool": { "daysAfterModificationGreaterThan": 30 },
            "tierToCold": { "daysAfterModificationGreaterThan": 90 },
            "tierToArchive": { "daysAfterModificationGreaterThan": 365 },
            "delete": { "daysAfterModificationGreaterThan": 2555 }
          },
          "snapshot": {
            "delete": { "daysAfterCreationGreaterThan": 90 }
          }
        }
      }
    },
    {
      "name": "delete-temp-logs",
      "enabled": true,
      "type": "Lifecycle",
      "definition": {
        "filters": {
          "blobTypes": ["blockBlob", "appendBlob"],
          "prefixMatch": ["documents/batch/"]
        },
        "actions": {
          "baseBlob": {
            "delete": { "daysAfterModificationGreaterThan": 30 }
          }
        }
      }
    }
  ]
}
EOF

# Áp dụng lifecycle policy vào storage account
az storage account management-policy create \
  --account-name $STORAGE_NAME \
  --resource-group rg-az104-m17 \
  --policy @/tmp/lifecycle-policy.json

# Xem policy đang có hiệu lực
az storage account management-policy show \
  --account-name $STORAGE_NAME \
  --resource-group rg-az104-m17 \
  --query 'policy.rules[].{Name:name, Enabled:enabled}' \
  -o table
Verify Portal: Portal → Storage account → Data management → Lifecycle management → xác nhận 2 rules: move-old-docs-to-cooldelete-temp-logs đều Enabled. Click vào rule để xem chi tiết conditions và actions.
4

Cấu hình Object Replication giữa 2 Storage Accounts

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Tạo destination storage account (có thể khác region để test cross-region replication)
STORAGE_DEST="staz104m17dst$(date +%s | tail -c 4)"
az storage account create \
  --name $STORAGE_DEST \
  --resource-group rg-az104-m17 \
  --location eastasia \
  --sku Standard_LRS \
  --kind StorageV2 \
  --https-only true \
  --min-tls-version TLS1_2 \
  --allow-blob-public-access false

CONN_DEST=$(az storage account show-connection-string \
  --name $STORAGE_DEST \
  --resource-group rg-az104-m17 \
  --query connectionString -o tsv)

# Bật versioning trên source (bắt buộc cho object replication)
az storage account blob-service-properties update \
  --account-name $STORAGE_NAME \
  --resource-group rg-az104-m17 \
  --enable-versioning true \
  --enable-change-feed true

# Bật versioning trên destination (bắt buộc)
az storage account blob-service-properties update \
  --account-name $STORAGE_DEST \
  --resource-group rg-az104-m17 \
  --enable-versioning true

# Tạo container destination
az storage container create \
  --name documents-replica \
  --connection-string "$CONN_DEST" \
  --public-access off

# Tạo Object Replication Policy: source documents → dest documents-replica
az storage account or-policy create \
  --account-name $STORAGE_DEST \
  --resource-group rg-az104-m17 \
  --source-account $STORAGE_NAME \
  --destination-account $STORAGE_DEST \
  --source-container documents \
  --destination-container documents-replica \
  --min-creation-time "2026-01-01T00:00:00Z"

# Lấy Policy ID vừa tạo
POLICY_ID=$(az storage account or-policy list \
  --account-name $STORAGE_DEST \
  --resource-group rg-az104-m17 \
  --query '[0].policyId' -o tsv)
echo "Replication Policy ID: $POLICY_ID"

# Áp policy lên source account
az storage account or-policy show \
  --account-name $STORAGE_DEST \
  --resource-group rg-az104-m17 \
  --policy-id $POLICY_ID -o json | \
az storage account or-policy create \
  --account-name $STORAGE_NAME \
  --resource-group rg-az104-m17 \
  --policy @-
Verify Portal: Portal → Source Storage account → Data management → Object replication → xác nhận policy active. Upload blob mới vào container documents của source account, sau vài phút kiểm tra documents-replica ở destination account — blob phải xuất hiện tự động.
5

Cleanup — Xóa tài nguyên tránh phát sinh chi phí

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Xóa toàn bộ Resource Group (bao gồm cả 2 storage accounts)
az group delete --name rg-az104-m17 --yes --no-wait

echo "Resource Group rg-az104-m17 đang được xóa nền. Bao gồm: $STORAGE_NAME, $STORAGE_DEST."

Kết Quả Đầu Ra

Phân biệt 3 loại blob

Hiểu Block Blob (object lớn), Append Blob (logging), Page Blob (VM disk) — chọn đúng loại theo use case

Quản lý Blob Containers

Tạo container Private/Blob/Container public access; upload blob đơn lẻ và batch; quản lý thông qua CLI và Portal

Cấu hình Access Tiers

Thiết lập và thay đổi tier Hot/Cool/Cold/Archive; hiểu trade-off chi phí lưu trữ vs chi phí truy cập; rehydrate Archive

Lifecycle Management Policy

Viết policy JSON tự động tierToCool/Cold/Archive và delete theo điều kiện tuổi blob và prefix filter

Object Replication cross-account

Bật versioning + change feed; tạo replication policy; blob tự động sao chép đến account/region khác

Upload đa phương thức & Pricing

Dùng CLI batch upload, AzCopy cho large dataset; hiểu mô hình pricing storage + operations + retrieval + early deletion

Ứng Dụng Thực Tế

Tình huống 1: VTV Digital — Lưu trữ nội dung video on-demand

VTV cần lưu trữ hàng chục nghìn giờ video, từ nội dung mới phát sóng đến archive nhiều thập kỷ. Chi phí lưu trữ là vấn đề cốt lõi.

Giải pháp

Block Blob cho tất cả video. Container hot-content (Hot tier) cho video 30 ngày gần nhất; container vod-library (Cool tier) cho 1 năm; container archive (Archive tier) cho lưu trữ vĩnh viễn.

Triển khai

Lifecycle rule: video >30 ngày chưa xem → Cool; >365 ngày → Cold; >3 năm → Archive. AzCopy migrate từ NAS on-prem lên Blob ban đầu. Azure CDN trước Blob endpoint cho video player.

Lợi ích

Chi phí lưu trữ giảm 75% nhờ tự động phân tầng. Không cần quản lý dung lượng (unlimited scale). CDN giảm latency toàn quốc. Migration AzCopy hoàn tất 50 TB trong 2 ngày.

Tình huống 2: Viettel Cloud — Backup dữ liệu khách hàng enterprise

Viettel cung cấp dịch vụ backup cho doanh nghiệp, cần lưu trữ an toàn với chi phí thấp và đảm bảo khôi phục nhanh khi cần.

Giải pháp

Append Blob cho transaction log liên tục. Block Blob cho full backup. Storage account nguồn tại Southeast Asia (Viettel DC HCM), Object Replication sang East Asia (DR site).

Triển khai

Lifecycle: daily backup >7 ngày → Cool; >30 ngày → Cold; >90 ngày → Archive; >7 năm → Delete. Versioning bật để giữ lịch sử blob. Immutable policy WORM cho backup tuân thủ pháp lý.

Lợi ích

Chi phí giảm 80% so với SAN. Object Replication đảm bảo DR tự động. WORM ngăn xóa backup trong retention period. RTO < 4 giờ (rehydrate Archive standard priority).

Tình huống 3: FPT Analytics — Data Lake cho AI/ML

FPT xây dựng data lake cho hàng trăm data scientist, cần truy cập raw data nhanh và lưu trữ petabyte dữ liệu lịch sử với chi phí tối ưu.

Giải pháp

Azure Data Lake Storage Gen2 (Blob + hierarchical namespace). Premium Block Blobs cho working dataset (Hot); Standard GPv2 cho cold data. Object Replication từ production sang analytics account.

Triển khai

Container raw/ Hot (data mới nhập 30 ngày), curated/ Cool (processed data), archive/ Archive (raw data >1 năm). Lifecycle last-access-based: data không đọc >60 ngày → Cool tự động.

Lợi ích

Data scientist truy cập raw data không cần ETL phức tạp. Last-access lifecycle tự điều chỉnh tier theo behavior thực tế. Chi phí dự báo giảm 65% so với on-prem Hadoop cluster. Scale đến petabyte.

Zalo