Tạo Resource Group, VNet và RBAC bằng Azure CLI + PowerShell
🎯 Mục tiêu: Tạo Resource Group và VNet 3-subnet bằng Azure CLI; tạo Service Principal và gán role Contributor bằng Azure PowerShell; kiểm chứng bằng Portal.
🧰 Công cụ / nền tảng: Azure CLI 2.x (az version), Azure PowerShell module Az (Get-Module Az -ListAvailable).
📦 Chuẩn bị: Cài Azure CLI (winget install Microsoft.AzureCLI) và Az PowerShell module (Install-Module Az -Scope CurrentUser). Đăng nhập: az login / Connect-AzAccount.
▶️ Phần 1: Azure CLI — Resource Group và VNet
# Biến môi trường
RG="rg-devops-lab"
LOCATION="southeastasia"
VNET="vnet-devops"
# 1. Tạo Resource Group
az group create \
--name $RG \
--location $LOCATION \
--tags Project=DevOpsLab Owner=HoaTran
# 2. Tạo VNet
az network vnet create \
--resource-group $RG \
--name $VNET \
--address-prefix 10.0.0.0/16 \
--location $LOCATION
# 3. Tạo 3 subnet
az network vnet subnet create \
--resource-group $RG --vnet-name $VNET \
--name snet-public \
--address-prefix 10.0.1.0/24
az network vnet subnet create \
--resource-group $RG --vnet-name $VNET \
--name snet-app \
--address-prefix 10.0.11.0/24
az network vnet subnet create \
--resource-group $RG --vnet-name $VNET \
--name snet-data \
--address-prefix 10.0.21.0/24
# 4. Tạo NSG và gán cho snet-app
az network nsg create \
--resource-group $RG \
--name nsg-app
# Cho phép HTTP từ snet-public
az network nsg rule create \
--resource-group $RG --nsg-name nsg-app \
--name AllowHTTPFromPublic \
--priority 100 \
--source-address-prefixes 10.0.1.0/24 \
--destination-port-ranges 80 443 \
--protocol Tcp --access Allow --direction Inbound
az network vnet subnet update \
--resource-group $RG --vnet-name $VNET \
--name snet-app \
--network-security-group nsg-app
# 5. Xem kết quả
az network vnet show \
--resource-group $RG --name $VNET \
--query '{name:name,addressSpace:addressSpace.addressPrefixes,subnets:subnets[*].{name:name,prefix:addressPrefix}}'
▶️ Phần 2: Azure PowerShell — Service Principal và RBAC
# Chạy trong PowerShell (sau Connect-AzAccount)
# 1. Lấy Subscription ID
$SubId = (Get-AzContext).Subscription.Id
Write-Host "Subscription: $SubId"
# 2. Tạo Service Principal với role Contributor trên Resource Group
$sp = New-AzADServicePrincipal `
-DisplayName "sp-devops-cicd" `
-Role "Contributor" `
-Scope "/subscriptions/$SubId/resourceGroups/rg-devops-lab"
# 3. Hiển thị credentials (lưu lại — chỉ hiển thị 1 lần)
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.PasswordCredentials.SecretText)
$plainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Write-Host "AppId (ClientId): $($sp.AppId)"
Write-Host "TenantId: $((Get-AzContext).Tenant.Id)"
Write-Host "Password: $plainPassword" # Lưu vào Key Vault ngay!
# 4. Kiểm tra role assignment
Get-AzRoleAssignment `
-ServicePrincipalName $sp.AppId `
-ResourceGroupName "rg-devops-lab" |
Select-Object DisplayName, RoleDefinitionName, Scope
# 5. Test đăng nhập bằng Service Principal
az login --service-principal `
--username $sp.AppId `
--password $plainPassword `
--tenant (Get-AzContext).Tenant.Id
az group list --query "[?name=='rg-devops-lab']"
🖥️ Đối chiếu Azure Portal:
Resource Groups → rg-devops-lab → Virtual Networks → vnet-devops: thấy 3 subnet. Tab Access control (IAM) của RG: Role assignments → sp-devops-cicd có Contributor.
✅ Kết quả mong đợi: az network vnet show hiển thị 3 subnet đúng CIDR. Get-AzRoleAssignment liệt kê sp-devops-cicd với role Contributor. Service principal đăng nhập CLI thành công, list được Resource Group.
🧹 Cleanup:
# PowerShell
Remove-AzADServicePrincipal -DisplayName "sp-devops-cicd" -Force
# Azure CLI (xóa RG xóa toàn bộ tài nguyên bên trong)
az group delete --name rg-devops-lab --yes --no-wait