Trong phần này, chúng ta sẽ tạo nền tảng cơ bản cho hệ thống MLOps bằng cách thiết lập Resource Group và phân quyền Identity & Access Management (IAM). Resource Group sẽ là container logic để quản lý tập trung các tài nguyên Azure liên quan đến dự án, trong khi IAM đảm bảo việc kiểm soát truy cập và bảo mật theo nguyên tắc least privilege. Đây là bước đầu tiên quan trọng trước khi triển khai các thành phần MLOps khác như Azure ML Workspace, Storage, và Compute Resources.
✅ Tạo Resource Group riêng cho môi trường development
✅ Thiết lập tagging strategy chuẩn enterprise
✅ Cấu hình RBAC permissions phù hợp
✅ Đảm bảo cost tracking và governance
1. Basic Configuration:
retail-dev-rg2. Naming Convention:
{project}-{environment}-rgretail-staging-rg, retail-prod-rg sau nàyStep 1: Navigate to Resource Groups
Azure Portal → Resource groups → Create resource group
Step 2: Basic Configuration
retail-dev-rgStep 3: Tags Configuration
developmentretail-forecastmlops-teamml-engineeringmlops-platforminternal{your-email}Step 4: Review & Create
# Xem lại cấu hình
Subscription: [Your Subscription]
Resource Group: retail-dev-rg
Region: Southeast Asia
Tags: 7 tags configured
# Click "Create" để tạo Resource Group
Required Tags cho MLOps Project:
| Tag Name | Value | Purpose | Example |
|---|---|---|---|
Environment |
development |
Môi trường deployment | dev/staging/prod |
Project |
retail-forecast |
Tên dự án | retail-forecast |
Owner |
mlops-team |
Team sở hữu | mlops-team |
CostCenter |
ml-engineering |
Cost allocation | ml-engineering |
CreatedBy |
{your-email} |
Người tạo | user@company.com |
Purpose |
mlops-platform |
Mục đích sử dụng | mlops-platform |
DataClassification |
internal |
Phân loại dữ liệu | internal/confidential |
User Groups cần tạo:
1. CloudEngineer Group:
2. DataEngineer Group:
3. Analyst Group:
4. Owners Group:
UI Flow:
Azure Portal → Azure Active Directory → Groups → New group
Group Configuration:
{role}-retail-dev (e.g., CloudEngineer-retail-dev){role} team for retail forecast developmentPurpose: DevOps automation, CI/CD pipelines
UI Flow:
Azure Portal → Azure Active Directory → App registrations → New registration
Configuration:
sp-retail-devopsAPI Permissions:
Azure Service Management: user_impersonationMicrosoft Graph: Directory.Read.AllCertificates & Secrets:
Assign Contributor role cho 4 groups:
UI Flow:
Resource Group retail-dev-rg → Access control (IAM) → Add role assignment
Role Assignments:
ContributorContributorContributorContributorContributorScope: Resource Group level (inherits to all resources)
Khi có Azure ML Workspace, gán cho Managed Identity:
Required Role Assignments:
| Resource | Role | Purpose |
|---|---|---|
| Azure Container Registry | AcrPull |
Pull container images |
| Storage Account | Storage Blob Data Reader |
Read training data |
| Key Vault | Key Vault Secrets User |
Access secrets/certificates |
| Azure ML Workspace | Machine Learning Workspace Contributor |
Manage ML resources |
Scope: Specific resource level (not Resource Group)
# Login to Azure
az login
# Set subscription
az account set --subscription "your-subscription-id"
# Create Resource Group with tags
az group create \
--name retail-dev-rg \
--location southeastasia \
--tags \
Environment=development \
Project=retail-forecast \
Owner=mlops-team \
CostCenter=ml-engineering \
Purpose=mlops-platform \
DataClassification=internal \
CreatedBy=$(az account show --query user.name --output tsv)
# Get Resource Group ID
RG_ID=$(az group show --name retail-dev-rg --query id --output tsv)
# Assign Contributor role to groups
for GROUP in "CloudEngineer-retail-dev" "DataEngineer-retail-dev" "Analyst-retail-dev" "Owners-retail-dev"; do
az role assignment create \
--assignee $GROUP \
--role "Contributor" \
--scope $RG_ID
done
# Assign Contributor to Service Principal
az role assignment create \
--assignee $(az ad sp list --display-name sp-retail-devops --query '[0].objectId' -o tsv) \
--role "Contributor" \
--scope $RG_ID
# Create Service Principal
APP=$(az ad sp create-for-rbac \
--name sp-retail-devops \
--role Contributor \
--scopes $RG_ID \
--sdk-auth)
# Save credentials
echo "$APP" > sp-retail-devops.json
# Login using Service Principal
az login --service-principal \
-u $(jq -r .clientId sp-retail-devops.json) \
-p $(jq -r .clientSecret sp-retail-devops.json) \
--tenant $(jq -r .tenantId sp-retail-devops.json)
retail-dev-rgSoutheast AsiaActivesp-retail-devopsContributor roleaz account show output showing correct subscriptionaz group show command workingretail-dev-rg hiển thị trong portal#!/bin/bash
# setup-resource-group.sh
# Variables
SUBSCRIPTION_ID="your-subscription-id"
RG_NAME="retail-dev-rg"
LOCATION="southeastasia"
# Set subscription
az account set --subscription $SUBSCRIPTION_ID
# Create resource group with tags
echo "🏗️ Creating Resource Group..."
az group create \
--name $RG_NAME \
--location $LOCATION \
--tags \
Environment=development \
Project=retail-forecast \
Owner=mlops-team \
CostCenter=ml-engineering \
Purpose=mlops-platform \
DataClassification=internal \
CreatedBy=$(az account show --query user.name --output tsv)
# Get Resource Group ID
RG_ID=$(az group show --name $RG_NAME --query id --output tsv)
# Create Service Principal
echo "🔐 Creating Service Principal..."
az ad sp create-for-rbac \
--name sp-retail-devops \
--role Contributor \
--scopes $RG_ID \
--sdk-auth > sp-retail-devops.json
echo "✅ Resource Group and Service Principal created successfully!"
echo "📁 Service Principal credentials saved to sp-retail-devops.json"
# Display Resource Group info
echo "📋 Resource Group Details:"
az group show --name $RG_NAME --output table
Cho 4 user groups (CloudEngineer, DataEngineer, Analyst, Owners):
# Đăng nhập bằng Azure CLI
az login
# Chọn đúng subscription
az account set --subscription "your-subscription-id"
# Verify quyền truy cập
az group show --name retail-dev-rg
Kiểm tra quyền truy cập:
# Xem role assignments của user hiện tại
az role assignment list --assignee $(az account show --query user.name -o tsv) --scope /subscriptions/{subscription-id}/resourceGroups/retail-dev-rg
# Test tạo resource trong Resource Group
az group show --name retail-dev-rg --output table
Cho DevOps automation (sp-retail-devops):
# Method 1: Sử dụng file credentials đã tạo
az login --service-principal \
-u $(jq -r .clientId sp-retail-devops.json) \
-p $(jq -r .clientSecret sp-retail-devops.json) \
--tenant $(jq -r .tenantId sp-retail-devops.json)
# Method 2: Sử dụng environment variables
export AZURE_CLIENT_ID=$(jq -r .clientId sp-retail-devops.json)
export AZURE_CLIENT_SECRET=$(jq -r .clientSecret sp-retail-devops.json)
export AZURE_TENANT_ID=$(jq -r .tenantId sp-retail-devops.json)
az login --service-principal \
-u $AZURE_CLIENT_ID \
-p $AZURE_CLIENT_SECRET \
--tenant $AZURE_TENANT_ID
Verify Service Principal permissions:
# Kiểm tra quyền truy cập
az group show --name retail-dev-rg
# List resources trong Resource Group
az resource list --resource-group retail-dev-rg --output table
Common Issues & Solutions:
1. “Insufficient privileges” error:
# Kiểm tra user có được add vào group chưa
az ad user show --id user@company.com --query "memberOf"
# Verify group membership
az ad group member list --group CloudEngineer-retail-dev
2. “Invalid credentials” for Service Principal:
# Check if client secret expired
az ad app credential list --id $(jq -r .clientId sp-retail-devops.json)
# Regenerate client secret if needed
az ad app credential reset --id $(jq -r .clientId sp-retail-devops.json)
3. “Resource group not found”:
# Verify subscription context
az account show --output table
# Switch to correct subscription
az account set --subscription "correct-subscription-id"
Verify Contributor role functionality:
# Test 1: Read Resource Group
az group show --name retail-dev-rg --query "name"
# Test 2: List resources (should work with Contributor)
az resource list --resource-group retail-dev-rg --output table
# Test 3: Create a test storage account (optional)
az storage account create \
--name teststorage$(date +%s) \
--resource-group retail-dev-rg \
--location southeastasia \
--sku Standard_LRS
# Test 4: Clean up test resource
az storage account delete \
--name teststorage$(date +%s) \
--resource-group retail-dev-rg \
--yes
retail-dev-rg ← Currentretail-staging-rg ← Futureretail-prod-rg ← FutureMỗi môi trường cần Resource Group riêng để isolation và governance.
Best Practice: Resource Group naming convention nên consistent across environments. Format: {project}-{environment}-rg giúp dễ dàng automation và governance.
Security Note: Không assign Owner permissions cho service principals. Sử dụng Contributor role với custom policies khi cần thiết. Managed Identity permissions sẽ được gán khi tạo Azure ML Workspace.
Resource Group foundation hoàn tất! 🎉 Tiếp tục với Task 3: Data Upload & Storage Configuration.