Azure Container Apps (ACA) adalah layanan container serverless yang sepenuhnya dikelola oleh Azure untuk kebutuhan build dan deploy aplikasi maupun microservices. Dengan ACA, developer dapat fokus pada pengembangan aplikasi tanpa perlu repot mengelola infrastruktur.
ACA mendukung fitur-fitur seperti:
- Automatic scaling (termasuk scale to zero)
- Integrated ingress dan traffic splitting
- Dapr integration untuk microservices
- Managed environments untuk keamanan dan jaringan
- Integrasi dengan Azure Monitor dan Log Analytics untuk observabilitas
Membuat Resource Group #
Buat resource group baru jika belum ada:
az group create \
--name <NAMA_RESOURCE_GROUP> \
--location <REGION>
Membuat Container Apps Environment #
Container Apps Environment memungkinkan beberapa container berbagi:
- jaringan virtual (VNET) yang sama,
- serta Log Analytics workspace yang sama.
Dengan environment ini, pengelolaan keamanan, jaringan, dan observability menjadi lebih sederhana.
Jalankan perintah berikut untuk membuat environment:
az containerapp env create \
--name myapp \
--resource-group <NAMA_RESOURCE_GROUP> \
--location <REGION>
Membuat Identity #
Agar container app dapat mengakses resource lain secara aman (misalnya ACR), buat terlebih dahulu Managed Identity:
az identity create \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--location <REGION>
Memberikan Hak Akses ke ACR #
Jika image container yang digunakan tersimpan di Azure Container Registry (ACR), maka identity perlu diberikan role acrpull agar bisa pull image.
ACR_RESOURCE_ID=$(az acr show \
--name <NAMA_ACR> \
--resource-group <NAMA_RESOURCE_GROUP> \
--query 'id' -o tsv)
principalId=$(az identity show \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--query 'principalId' -o tsv)
az role assignment create \
--assignee-object-id $principalId \
--assignee-principal-type ServicePrincipal \
--role acrpull \
--scope $ACR_RESOURCE_ID
Membuat Container App #
Setelah environment dan identity dibuat, langkah berikutnya adalah melakukan deploy container app.
IDENTITY_ID=$(az identity show \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--query 'id' -o tsv)
az containerapp create \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--environment myapp \
--user-assigned $IDENTITY_ID \
--registry-identity $IDENTITY_ID \
--registry-server myacr.azurecr.io \
--image myacr.azurecr.io/nginx:latest \
--target-port 80 \
--ingress external \
--cpu 0.5 \
--memory 1.0Gi \
--min-replicas 1 \
--max-replicas 5
Keterangan penting:
--user-assigned: Identity yang dipakai container app.--registry-identity: Identity yang digunakan untuk menarik image dari ACR.--ingress external: Membuka akses publik dari internet.--min-replicas&--max-replicas: Menentukan skala otomatis aplikasi.
Advanced Scenarios #
Update Container Image #
Untuk update image container app:
az containerapp update \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--image httpd:2.4-alpine \
--set-env-vars deploytime=$(date +%s)
--set-env-vars deploytime=$(date +%s) sering digunakan untuk trigger redeploy karena nilai environment variable akan selalu berubah.
Menambahkan Environment Variables #
Untuk menambahkan atau memperbarui environment variables pada container app:
az containerapp update \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--set-env-vars deploytime=$(date +%s) varName2=varValue2
Scale #
Untuk memperbarui jumlah minimum dan maksimum replika container app:
az containerapp update \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--min-replicas 2 \
--max-replicas 5
Untuk menerapkan rule auto-scaling berdasarkan penggunaan CPU 50%:
az containerapp update \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--scale-rule-name my-cpu-scale-rule \
--scale-rule-type cpu \
--scale-rule-metadata type=Utilization value=50
Untuk menerapkan rule auto-scaling berdasarkan cron:
az containerapp update \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--scale-rule-name "weekend-scale" \
--scale-rule-type "cron" \
--scale-rule-metadata "timezone=Asia/Jakarta" "start=0 0 * * 6" "end=59 23 * * 7" "desiredReplicas=2"
Untuk menerapkan multiple scale rule berdasarkan request dan cpu.
# Konfigurasi yang lebih comprehensive (best practice)
az containerapp update \
--name <container-app-name> \
--resource-group <resource-group-name> \
--min-replicas 1 \
--max-replicas 10 \
--scale-rule-name http-scale-rule \
--scale-rule-type http \
--scale-rule-metadata concurrentRequests=100 \
--scale-rule-name cpu-scale-rule \
--scale-rule-type cpu \
--scale-rule-metadata cpuThreshold=70
Volume Mounts #
Jika belum ada, buat storage account:
az storage account create \
--name <STORAGE_NAME> \
--resource-group <NAMA_RESOURCE_GROUP> \
--location <REGION> \
--sku Standard_RAGRS \
--kind StorageV2 \
--min-tls-version TLS1_2 \
--allow-shared-key-access true
Assign role ke managed identity yang digunakan container app:
storageId=$(az storage account show \
--name <STORAGE_NAME> \
--resource-group <NAMA_RESOURCE_GROUP> \
--query 'id' -o tsv)
principalId=$(az identity show \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--query 'principalId' -o tsv)
az role assignment create \
--assignee-object-id $principalId \
--assignee-principal-type ServicePrincipal \
--role "Storage File Data SMB Share Contributor" \
--scope $storageId
Buat file share dengan kuota 100GB:
az storage share create \
--name <SHARE_NAME> \
--account-name <STORAGE_NAME> \
--quota 100
Tambahkan konfigurasi Azure Files ke environment:
ACCESS_KEY=$(az storage account keys list \
--account-name <STORAGE_NAME> \
--resource-group <NAMA_RESOURCE_GROUP> \
--query '[0].value' -o tsv)
az containerapp env storage set \
--name myapp \
--resource-group <NAMA_RESOURCE_GROUP> \
--storage-name <SHARE_NAME> \
--azure-file-account-name <STORAGE_NAME> \
--azure-file-account-key $ACCESS_KEY \
--azure-file-share-name <SHARE_NAME> \
--access-mode ReadWrite
Export definisi container app ke file YAML:
az containerapp show \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
-o yaml > app.yaml
Kemudian edit bagian berikut:
template:
containers:
volumeMounts:
- mountPath: /app
volumeName: app
subPath: app
volumes:
- mountOptions: uid=1000,gid=1000
name: app
storageName: demo-app
storageType: AzureFile
💡 Hapus
mountOptionsjika ingin volume dimount dengan ownerroot.
Setelah file app.yaml diedit, update kembali container app:
az containerapp update \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--yaml app.yaml
Resiliency #
Fitur Resiliency (saat ini masih preview) berguna untuk membangun skenario high-availability dan fault-tolerant service pada Azure Container Apps. Melalui fitur ini, Anda dapat mengatur timeout, retry policy, serta circuit breaker untuk meningkatkan reliability aplikasi.
- Masuk ke Azure Portal.
- Buka resource Container App yang ingin dikonfigurasi.
- Pilih menu Resiliency (preview).
- Setting policy seperti retry, circuit breaker, dan timeout sesuai kebutuhan.
"properties": {
"timeoutPolicy": {
"connectionTimeoutInSeconds": 5,
"responseTimeoutInSeconds": 30
},
"httpRetryPolicy": {
"maxRetries": 5,
"retryBackOff": {
"initialDelayInMilliseconds": 1000,
"maxIntervalInMilliseconds": 10000
},
"matches": {
"errors": [
"5xx",
"reset"
]
}
},
"circuitBreakerPolicy": {
"consecutiveErrors": 5,
"intervalInSeconds": 30,
"maxEjectionPercent": 50
}
}
Penjelasan:
- timeoutPolicy → Mengatur batas waktu koneksi dan respon.
- httpRetryPolicy → Menentukan jumlah percobaan ulang (retries) dan strategi backoff.
- circuitBreakerPolicy → Melindungi aplikasi dengan memutus sementara aliran trafik jika terjadi terlalu banyak error pada salah satu replica.
Logs #
Melihat Log ContainerApp via CLI #
Ambil 20 baris log terakhir dari console container app:
az containerapp logs show \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP>
Ambil 20 baris log terakhir dari sistem (system logs):
az containerapp logs show \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--type system
Melihat 30 baris terakhir sekaligus mengikuti log secara real-time:
az containerapp logs show \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--follow --tail 30
Melihat Log via Azure Portal (KQL Query) #
Anda juga bisa menjalankan query berikut di Azure Portal → Monitoring → Logs (KQL mode) pada Container App.
Log 24 jam terakhir:
ContainerAppConsoleLogs_CL
| where ContainerName_s == "demo-app"
| where TimeGenerated >= ago(24h)
| project TimeGenerated, ContainerName_s, Log_s
Log dengan rentang waktu tertentu (UTC):
ContainerAppConsoleLogs_CL
| where ContainerName_s == "demo-app"
| where TimeGenerated between (datetime(2025-09-06 15:31:00) .. datetime(2025-09-06 15:40:00))
| project TimeGenerated, ContainerName_s, Log_s
Manage Container Apps #
Menghentikan Revision Container App #
Gunakan perintah berikut untuk men-deactivate seluruh revision aktif dari Container App:
revisionName=$(az containerapp revision list \
--name demo-app \
--resource-group <NAMA_RESOURCE_GROUP> \
--query "[?properties.active==\`true\`].name" \
-o tsv)
az containerapp revision deactivate \
--resource-group <NAMA_RESOURCE_GROUP> \
--revision $revisionName
💡 Catatan: Perintah ini hanya menonaktifkan revision, bukan menghentikan Container App secara keseluruhan.
Menghentikan Container App #
Untuk menghentikan seluruh Container App (bukan hanya revision-nya):
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
az rest \
--method POST \
--url "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/<NAMA_RESOURCE_GROUP>/providers/Microsoft.App/containerapps/demo-app/stop?api-version=2023-05-01"
⚠️ Catatan: Perintah ini akan menghentikan semua revision yang ada dalam Container App
demo-app.
Menghidupkan Container App #
Untuk menghidupkan seluruh Container App (bukan hanya revision-nya):
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
az rest \
--method POST \
--url "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/<NAMA_RESOURCE_GROUP>/providers/Microsoft.App/containerapps/demo-app/start?api-version=2023-05-01"