Lý Thuyết Cốt Lõi
1. Tổng Quan Bộ Công Cụ Azure Storage — Chọn Đúng Cho Đúng Việc
Azure cung cấp bốn công cụ chính để quản lý và di chuyển dữ liệu Storage. Mỗi công cụ phù hợp với một nhóm use-case cụ thể dựa trên khối lượng dữ liệu, môi trường và yêu cầu tự động hóa.
| Công cụ | Giao diện | Dùng khi nào | Giới hạn |
|---|---|---|---|
| Storage Explorer | Desktop GUI (Windows/macOS/Linux) | Quản lý thủ công, browse, upload/download file lẻ | Không tự động hóa được |
| Import/Export Service | Azure Portal + vật lý (ổ cứng) | Di chuyển dữ liệu cực lớn (>1 TB) khi băng thông hạn chế | Cần ship ổ cứng vật lý, mất 7–10 ngày |
| WAImportExport | CLI (Windows only) | Chuẩn bị ổ cứng trước khi gửi cho Import/Export job | Chỉ chạy trên Windows, cần BitLocker |
| AzCopy | CLI (Windows/Linux/macOS) | Copy/sync dữ liệu qua internet, tự động hóa, CI/CD pipeline | Cần băng thông internet ổn định |
2. Azure Storage Explorer — Quản Lý Trực Quan
Storage Explorer là ứng dụng desktop miễn phí (standalone) cho phép quản lý toàn bộ Azure Storage resources từ giao diện đồ họa. Lý tưởng cho administrator cần thao tác thủ công, debug, hoặc dạy học.
- • Quản lý Blob containers, File shares, Queues, Tables trong 1 giao diện
- • Upload, download, xóa, copy, move file/folder
- • Tạo/xóa containers, shares, queues, tables
- • Xem và chỉnh sửa metadata, access tier của blob
- • Tạo và quản lý SAS tokens từ GUI
- • Kết nối qua Storage Account key, SAS URI, Azure AD, hoặc emulator
- • Azure subscription: đăng nhập Azure AD, xem toàn bộ storage accounts
- • Storage Account name + key: kết nối trực tiếp một account
- • SAS URI: kết nối một container/share/queue với quyền hạn cụ thể
- • Azure Storage Emulator / Azurite: kết nối môi trường local dev
- • Connection string: paste connection string từ Portal
- • Azure Portal tích hợp sẵn Storage Explorer (Preview) trong menu của Storage Account
- • Không cần cài ứng dụng riêng — truy cập từ browser
- • Tính năng tương tự standalone nhưng giới hạn hơn
- • Lý tưởng khi cần truy cập nhanh từ máy không cài software
- • Click phải blob → "Change Access Tier" → chọn Hot/Cool/Cold/Archive
- • Xem tier hiện tại trong cột "Access Tier" của danh sách blob
- • Rehydrate blob từ Archive: chọn Standard (1–15 giờ) hoặc High (trong 1 giờ)
- • Bulk change tier cho nhiều blob bằng cách chọn nhiều và right-click
3. Azure Import/Export Service — Di Chuyển Petabyte Qua Ổ Cứng Vật Lý
Khi khối lượng dữ liệu quá lớn để upload qua internet (hàng chục TB trở lên), Azure Import/Export Service cho phép gửi ổ cứng vật lý đến Azure datacenter. Microsoft sẽ copy dữ liệu từ ổ cứng vào Azure Storage (Import) hoặc ngược lại (Export).
- • Mục đích: upload dữ liệu lớn vào Azure Blob hoặc Azure Files
- • Bạn chuẩn bị ổ cứng, mã hóa BitLocker, tạo journal file
- • Ship ổ cứng đến Azure datacenter (FedEx/DHL)
- • Microsoft copy dữ liệu vào storage account của bạn
- • Ổ cứng được ship trả lại sau khi hoàn thành
- • Mục đích: download dữ liệu lớn từ Azure Blob về on-premises
- • Bạn tạo Export job trên Portal, chỉ định containers/blobs cần export
- • Ship ổ cứng trống đến Azure datacenter
- • Microsoft copy dữ liệu từ Blob vào ổ cứng, mã hóa BitLocker
- • Chỉ hỗ trợ Blob Storage (không hỗ trợ Azure Files cho export)
WAImportExport.exe là CLI tool chạy trên Windows để chuẩn bị ổ cứng trước khi gửi Import job. Có hai phiên bản: v1 (cho Blob Storage) và v2 (cho Azure Files).
Chuẩn bị ổ cứng: copy dữ liệu, bật BitLocker, tạo journal file (.jrn) ghi lại mapping giữa local file và destination path trên Azure.
File CSV định nghĩa nguồn dữ liệu: cột Source (đường dẫn local), Destination (blob path trên Azure), Disposition (rename/no-overwrite/overwrite).
File CSV liệt kê các ổ cứng sẽ được dùng: cột DriveId (serial number), BitLockerKey, ManifestFile (đường dẫn journal).
4. AzCopy — Công Cụ Copy Dữ Liệu Tốc Độ Cao
AzCopy là CLI tool được tối ưu hóa để copy và sync dữ liệu đến/từ Azure Storage với hiệu năng cao. Hỗ trợ copy giữa storage accounts, giữa Blob và File, và từ/đến local. Đây là công cụ được dùng nhiều nhất trong CI/CD và automation.
- • Azure AD (OAuth):
azcopy login→ dùng interactive browser. Khuyến nghị cho user interactively. - • SAS Token: append SAS vào URL. Phù hợp cho automation không cần login.
- • Managed Identity: dùng trên Azure VM/App Service — không cần credential. Tốt nhất cho CI/CD trên Azure.
- • Service Principal:
azcopy login --service-principalvới client ID & secret.
- •
azcopy copy— copy file/folder giữa local và Azure hoặc giữa 2 storage accounts - •
azcopy sync— đồng bộ hai-chiều: chỉ copy file mới/thay đổi, xóa file không còn ở nguồn - •
azcopy list— liệt kê nội dung container/share - •
azcopy remove— xóa blob/file trên Azure - •
azcopy jobs list— xem trạng thái các jobs đang chạy - •
azcopy jobs resume [jobId]— tiếp tục job bị gián đoạn
Copy song song nhiều file đồng thời. Điều chỉnh số luồng bằng flag --cap-mbps
Tự động resume nếu mất kết nối giữa chừng — không cần copy lại từ đầu
Copy giữa 2 Azure storage accounts không đi qua máy local — nhanh và không tốn băng thông local
azcopy copy luôn copy file kể cả khi đã tồn tại ở đích. azcopy sync so sánh last-modified time và chỉ copy file mới hoặc thay đổi, có thể xóa file ở đích không còn ở nguồn khi thêm flag --delete-destination=true. Dùng sync cho backup định kỳ, dùng copy cho migration một lần.
Bài Tập Thực Hành (Lab)
Tạo môi trường Lab — 2 Storage Accounts để thực hành copy
# Tạo Resource Group
az group create \
--name rg-az104-m20 \
--location southeastasia \
--tags Module=20 Course=AZ-104
# Tạo Storage Account nguồn (source)
SUFFIX=$(date +%s | tail -c 6)
SRC_ACCOUNT="stm20src${SUFFIX}"
DST_ACCOUNT="stm20dst${SUFFIX}"
echo "Source: $SRC_ACCOUNT | Destination: $DST_ACCOUNT"
az storage account create \
--name $SRC_ACCOUNT \
--resource-group rg-az104-m20 \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2 \
--https-only true \
--min-tls-version TLS1_2
# Tạo Storage Account đích (destination)
az storage account create \
--name $DST_ACCOUNT \
--resource-group rg-az104-m20 \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2 \
--https-only true \
--min-tls-version TLS1_2
# Lấy connection strings
SRC_CONN=$(az storage account show-connection-string \
--name $SRC_ACCOUNT --resource-group rg-az104-m20 --query connectionString -o tsv)
DST_CONN=$(az storage account show-connection-string \
--name $DST_ACCOUNT --resource-group rg-az104-m20 --query connectionString -o tsv)
# Tạo containers
az storage container create --name "source-data" --connection-string "$SRC_CONN"
az storage container create --name "dest-data" --connection-string "$DST_CONN"
az storage container create --name "backup" --connection-string "$DST_CONN"
# Upload file test vào source container
for i in {1..5}; do
echo "Test file $i - AZ-104 Module 20 Lab - $(date)" > /tmp/testfile${i}.txt
az storage blob upload \
--file /tmp/testfile${i}.txt \
--name "folder1/testfile${i}.txt" \
--container-name "source-data" \
--connection-string "$SRC_CONN"
done
echo "5 test files uploaded to source-data container"
az storage blob list --container-name "source-data" --connection-string "$SRC_CONN" \
--query "[].name" -o table
AzCopy — Copy và Sync giữa hai Storage Accounts
# === Cài AzCopy trên Linux/Cloud Shell ===
# Tải AzCopy v10 (latest stable)
wget -q "https://aka.ms/downloadazcopy-v10-linux" -O azcopy_linux.tar.gz
tar -xf azcopy_linux.tar.gz
AZCOPY_BIN=$(find . -name "azcopy" -type f | head -1)
chmod +x $AZCOPY_BIN
sudo mv $AZCOPY_BIN /usr/local/bin/azcopy
azcopy --version
# === Xác thực bằng Azure AD (interactive login) ===
azcopy login
# Mở browser → đăng nhập Azure AD → azcopy được authorized
# === Copy toàn bộ container từ source → dest ===
# Thay tên storage account thực của bạn vào các biến sau
SRC_ACCOUNT="stm20srcXXXXXX"
DST_ACCOUNT="stm20dstXXXXXX"
azcopy copy \
"https://${SRC_ACCOUNT}.blob.core.windows.net/source-data/*" \
"https://${DST_ACCOUNT}.blob.core.windows.net/dest-data/" \
--recursive \
--log-level INFO
# Verify: liệt kê blobs ở đích
azcopy list "https://${DST_ACCOUNT}.blob.core.windows.net/dest-data/"
# === Upload file từ local lên Azure ===
echo "New local file for AzCopy upload test" > /tmp/local-upload.txt
azcopy copy \
"/tmp/local-upload.txt" \
"https://${DST_ACCOUNT}.blob.core.windows.net/dest-data/uploads/local-upload.txt"
# === Download blob về local ===
mkdir -p /tmp/azcopy-download
azcopy copy \
"https://${SRC_ACCOUNT}.blob.core.windows.net/source-data/folder1/testfile1.txt" \
"/tmp/azcopy-download/testfile1.txt"
cat /tmp/azcopy-download/testfile1.txt
# === SYNC: đồng bộ source → backup (chỉ copy file mới/thay đổi) ===
azcopy sync \
"https://${SRC_ACCOUNT}.blob.core.windows.net/source-data/" \
"https://${DST_ACCOUNT}.blob.core.windows.net/backup/" \
--recursive \
--delete-destination=false
echo "Sync complete. Run again to see only changed files are transferred."
# === Xem jobs đã chạy ===
azcopy jobs list
AzCopy với SAS Token — Xác thực không cần đăng nhập Azure AD
SRC_ACCOUNT="stm20srcXXXXXX" # thay thế
DST_ACCOUNT="stm20dstXXXXXX" # thay thế
# Tạo SAS token cho source container (quyền Read, List)
SRC_SAS=$(az storage container generate-sas \
--account-name $SRC_ACCOUNT \
--name "source-data" \
--permissions rl \
--expiry "$(date -u -d '+2 hours' '+%Y-%m-%dT%H:%MZ' 2>/dev/null || date -u -v+2H '+%Y-%m-%dT%H:%MZ')" \
--https-only \
--output tsv)
echo "Source SAS: $SRC_SAS"
# Tạo SAS token cho destination container (quyền Read, Write, List, Create)
DST_SAS=$(az storage container generate-sas \
--account-name $DST_ACCOUNT \
--name "dest-data" \
--permissions rwlc \
--expiry "$(date -u -d '+2 hours' '+%Y-%m-%dT%H:%MZ' 2>/dev/null || date -u -v+2H '+%Y-%m-%dT%H:%MZ')" \
--https-only \
--output tsv)
echo "Destination SAS: $DST_SAS"
# Dùng AzCopy với SAS token (không cần azcopy login)
# Server-side copy: dữ liệu không đi qua máy local
azcopy copy \
"https://${SRC_ACCOUNT}.blob.core.windows.net/source-data/?${SRC_SAS}" \
"https://${DST_ACCOUNT}.blob.core.windows.net/dest-data/sas-copy/?${DST_SAS}" \
--recursive
# Dùng SAS token cấp storage-account level (Account SAS)
ACCOUNT_SAS=$(az storage account generate-sas \
--account-name $SRC_ACCOUNT \
--services b \
--resource-types sco \
--permissions rl \
--expiry "$(date -u -d '+1 hour' '+%Y-%m-%dT%H:%MZ' 2>/dev/null || date -u -v+1H '+%Y-%m-%dT%H:%MZ')" \
--https-only \
--output tsv)
# List tất cả containers trong storage account dùng Account SAS
azcopy list "https://${SRC_ACCOUNT}.blob.core.windows.net/?${ACCOUNT_SAS}"
Chuẩn bị WAImportExport — Tạo dataset.csv và kiểm tra cú pháp
# === Mô phỏng chuẩn bị WAImportExport (không cần ổ cứng thật) ===
# Mục tiêu: hiểu cấu trúc file CSV và command line
# Tạo thư mục làm việc
$workDir = "C:\ImportExportLab"
New-Item -ItemType Directory -Force -Path $workDir
New-Item -ItemType Directory -Force -Path "$workDir\SourceData\Documents"
New-Item -ItemType Directory -Force -Path "$workDir\SourceData\Projects"
New-Item -ItemType Directory -Force -Path "$workDir\Journals"
# Tạo dữ liệu mẫu
1..10 | ForEach-Object {
"File $_ - AZ-104 Module 20 - WAImportExport Demo" |
Out-File "$workDir\SourceData\Documents\doc${_}.txt"
}
"Project config - $(Get-Date)" | Out-File "$workDir\SourceData\Projects\config.json"
# === Tạo dataset.csv (định nghĩa mapping nguồn → đích) ===
$datasetContent = @"
BasePath,DstBlobPathPrefix,BlobType,Disposition,MetadataFile,PropertiesFile
$workDir\SourceData\Documents\,import-job/documents/,BlockBlob,rename,,
$workDir\SourceData\Projects\,import-job/projects/,BlockBlob,no-overwrite,,
"@
$datasetContent | Out-File "$workDir\dataset.csv" -Encoding utf8
Write-Host "dataset.csv created:"
Get-Content "$workDir\dataset.csv"
# === Tạo driveset.csv (danh sách ổ cứng) ===
# DriveId = serial number ổ cứng (lấy từ: Get-Disk | Select SerialNumber)
$drivesetContent = @"
DriveLetter,FormatOption,SilentOrPromptOnFormat,Encryption,ExistingBitLockerKey
X:,Auto,SilentMode,Encrypt,
"@
$drivesetContent | Out-File "$workDir\driveset.csv" -Encoding utf8
Write-Host "`ndriveset.csv created:"
Get-Content "$workDir\driveset.csv"
# === Ví dụ lệnh WAImportExport (chạy khi có ổ cứng thật) ===
$storageKey = "YOUR_STORAGE_ACCOUNT_KEY" # lấy từ Portal → Storage Account → Access keys
Write-Host "`n=== Command để chạy WAImportExport.exe (khi có ổ cứng thật) ==="
Write-Host @"
WAImportExport.exe PrepImport `
/j:"$workDir\Journals\drive1.jrn" `
/id:"session-001" `
/logdir:"$workDir\Logs" `
/sk:"$storageKey" `
/InitialDriveSet:"$workDir\driveset.csv" `
/DataSet:"$workDir\dataset.csv" `
/t:X `
/bk:"YourBitLockerRecoveryKey" `
/EnableBitLock
"@
Write-Host "`nFiles created in: $workDir"
Get-ChildItem $workDir -Recurse | Select Name, Length, LastWriteTime
Cleanup — Dọn dẹp tài nguyên
# Xóa đăng nhập AzCopy (xóa cached tokens)
azcopy logout
# Xóa toàn bộ Resource Group — xóa cả 2 storage accounts và tất cả containers
az group delete --name rg-az104-m20 --yes --no-wait
echo "Resource group rg-az104-m20 deletion initiated."
# Dọn file local (Windows)
# Remove-Item -Recurse -Force "C:\ImportExportLab"
# Dọn file local (Linux/macOS)
rm -rf /tmp/testfile*.txt /tmp/local-upload.txt /tmp/azcopy-download/ /tmp/azcopy_linux.tar.gz
echo "Local temp files cleaned."
Kết Quả Đầu Ra
Kết nối nhiều phương thức (Azure AD, key, SAS), quản lý blob/file/queue/table từ GUI
Phân biệt Import vs Export job, nắm 7 bước quy trình Import, biết khi nào cần dùng
Tạo dataset.csv và driveset.csv đúng cú pháp, hiểu journal file và BitLocker requirement
Copy giữa storage accounts, upload/download local, phân biệt copy vs sync với --delete-destination
Dùng Azure AD login, SAS token, Managed Identity — chọn đúng phương thức cho từng ngữ cảnh
Tích hợp AzCopy vào scripts backup định kỳ, resume job bị gián đoạn, giám sát transfer status
Ứng Dụng Thực Tế
Tình huống 1: Công ty dầu khí — Di chuyển 50 TB seismic data lên Azure
Công ty dầu khí tại Vũng Tàu có 50 TB dữ liệu địa chấn (seismic data) cần đưa lên Azure để phân tích bằng AI/ML. Đường internet tại site chỉ 100 Mbps — upload thẳng mất hơn 45 ngày.
Dùng Azure Import/Export Service. Cài WAImportExport trên workstation Windows, chuẩn bị 6 ổ cứng 10TB mỗi ổ. Mã hóa BitLocker, tạo journal files. Ship ổ cứng đến Azure datacenter Singapore (nearest region). Toàn bộ quy trình mất 10 ngày thay vì 45 ngày.
Dataset.csv định nghĩa 3 loại data: raw-seismic → seismic-raw/container, processed → seismic-processed/container, reports → reports/container. Sau khi Import job hoàn thành, dùng AzCopy sync để đồng bộ incremental dữ liệu mới phát sinh hàng tuần.
Di chuyển 50TB trong 10 ngày. Chi phí Import job thấp hơn bandwidth nếu upload. Dữ liệu được mã hóa BitLocker trong suốt quá trình vận chuyển. Sau migration, AzCopy sync chỉ mất vài giờ mỗi tuần cho dữ liệu mới.
Tình huống 2: Startup công nghệ — Tự động backup build artifacts lên Azure
Startup phần mềm tại Hà Nội cần backup build artifacts (Docker images, deployment packages) sau mỗi CI/CD pipeline. Hiện đang dùng S3 cần migrate sang Azure Blob.
AzCopy trong GitHub Actions / Azure DevOps pipeline. Dùng Managed Identity trên Azure-hosted runner — không cần lưu credential trong CI/CD secrets. AzCopy copy artifacts lên Azure Blob sau mỗi successful build.
Pipeline step: azcopy copy "./dist/*" "https://stprod.blob.core.windows.net/builds/$BUILD_ID/" --recursive. AzCopy sync weekly để xóa builds cũ hơn 30 ngày. Storage Explorer dùng để IT admin kiểm tra và download artifact khi cần troubleshoot production.
Zero credential management nhờ Managed Identity. AzCopy tự resume nếu pipeline runner mất kết nối giữa chừng. Storage Explorer cho phép non-technical stakeholders browse artifacts mà không cần CLI. Tiết kiệm 60% chi phí so với lưu trên máy chủ build.
Tình huống 3: Đài truyền hình — Replicate media library giữa 2 regions
Đài truyền hình địa phương tại Đà Nẵng có 10TB video archive trên Azure Blob (region Southeast Asia) cần replicate sang region East Asia (HK) để giảm latency khi phân phối nội dung quốc tế.
AzCopy server-side copy giữa 2 storage accounts ở 2 regions khác nhau. Dùng SAS token cho cả source (Read) và destination (Write). Script chạy hàng đêm bằng Azure Automation Account để sync video mới được published trong ngày.
azcopy sync "https://stsgp.blob.core.windows.net/media/?$SRC_SAS" "https://sthk.blob.core.windows.net/media/?$DST_SAS" --recursive. Server-side copy: dữ liệu di chuyển trực tiếp trong Azure backbone, không đi qua internet công cộng, không tốn băng thông local. Storage Explorer để editor duyệt và kiểm tra file trước khi publish.
Latency giảm 60% cho viewer quốc tế nhờ nội dung gần hơn (HK vs SG). Server-side copy không tốn egress bandwidth cục bộ. Nếu sync job fail giữa chừng → azcopy jobs resume tự động tiếp tục. Chi phí copy trong cùng Azure backbone thấp hơn download/re-upload.