Microsoft Azure dari Nol hingga Profesional: 100 Contoh dengan CLI, Bicep, dan Python

Microsoft Azure dari Nol hingga Profesional: 100 Contoh dengan CLI, Bicep, dan Python

Microsoft Azure adalah platform cloud untuk menjalankan situs web, basis data, kontainer, pipeline data, dan layanan AI tanpa membeli server. Artikel ini membawa Anda dari masuk pertama kali hingga pengaturan yang siap produksi dalam 100 contoh. Anda akan mempelajari Azure CLI, grup sumber daya dan tag, infrastruktur sebagai kode dengan Bicep, identitas dengan managed identity dan RBAC, mesin virtual, App Service, kontainer dan Kubernetes, penyimpanan dengan SAS dan aturan siklus hidup, SQL dan Cosmos DB, Functions tanpa server, jaringan virtual dan private endpoint, Service Bus dan Event Hubs, pemantauan dengan Log Analytics dan Application Insights, Key Vault, serta pengendalian biaya. Catatan kejujuran: perintah cloud dan contoh SDK tidak dijalankan karena membutuhkan langganan Azure. Contoh yang bertanda dapat dijalankan telah dieksekusi di komputer ini, dan keluaran nyatanya ditampilkan setelah kode.

Yang Anda butuhkan

Akun Azure dengan langganan (uji coba gratis cukup untuk sebagian besar contoh), Azure CLI, Python 3.10 atau lebih baru, dan editor kode seperti Visual Studio Code dengan ekstensi Bicep. Gunakan langganan sandbox untuk belajar dan jangan pernah menempelkan rahasia asli ke perintah atau kode. Beberapa sumber daya dikenai biaya, jadi hapus grup sumber daya latihan saat selesai.

Cara memakai contoh

Contoh bash memakai Azure CLI, dan contoh Bicep memakai Azure CLI atau VS Code. Contoh Python yang tidak membutuhkan akun Azure dijalankan dengan python dan menampilkan keluaran nyatanya. Contoh yang memanggil Azure membutuhkan langganan sebelum bisa berfungsi.

Topik 1: Memulai dengan Azure

Azure tersusun atas langganan, grup sumber daya, dan sumber daya. Pelajari cara masuk, memeriksa di mana perintah Anda akan berjalan, dan memakai nama yang mudah ditemukan dan dihitung biayanya.

Azure CLI dan masuk

Azure CLI adalah satu alat untuk setiap layanan Azure. Pasang, jalankan az login, dan periksa dengan az account show. Perintah bekerja pada langganan yang sedang dipilih, jadi pastikan langganannya sebelum membuat atau menghapus apa pun.

Wilayah dan penamaan

Setiap sumber daya berada di satu wilayah, jadi pilih wilayah yang paling dekat dengan pengguna dan pastikan layanan yang Anda butuhkan tersedia di sana. Nama akun penyimpanan ketat: 3 sampai 24 huruf kecil dan angka, dan harus unik di seluruh Azure.

Konvensi penamaan

Pola seperti rg-app-env-region-01 menjaga nama tetap konsisten, sehingga orang mudah menemukan sumber daya dan memahami biayanya. Bangun nama dengan fungsi kecil dan pakai ulang di setiap skrip.

Ilustrasi

Cara aplikasi Azure yang umum tersusun: pengguna mencapai aplikasi web melalui load balancer, aplikasi membaca rahasia dari Key Vault dan data dari basis data, lalu log dan metrik mengalir ke Log Analytics
Cara aplikasi Azure yang umum tersusun: pengguna mencapai aplikasi web melalui load balancer, aplikasi membaca rahasia dari Key Vault dan data dari basis data, lalu log dan metrik mengalir ke Log Analytics

Contoh 1: Pasang Azure CLI dan masuk

Siapkan alat baris perintah dan masuk ke akun Anda.

winget install -e --id Microsoft.AzureCLI
az --version
az login

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 2: Periksa langganan yang aktif

Pastikan langganan mana yang akan diubah perintah Anda.

az account show --output table
az account list --query "[].{name:name, id:id, default:isDefault}" --output table

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 3: Buat grup sumber daya

Wadah untuk sumber daya terkait di satu wilayah.

az group create --name rg-learn-dev --location southeastasia

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 4: Daftar wilayah Azure

Temukan wilayah tempat Anda bisa menerapkan sumber daya.

az account list-locations --query "[?metadata.regionCategory=='Recommended'].name" --output tsv

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 5: Validasi nama akun penyimpanan

Nama harus 3 sampai 24 huruf kecil dan angka.

import re

def valid_storage_name(name):
    return re.fullmatch(r"[a-z0-9]{3,24}", name) is not None

for candidate in ("stlearndev01", "Store-1", "ab", "a" * 25):
    print(repr(candidate), valid_storage_name(candidate))

Keluaran:

'stlearndev01' True
'Store-1' False
'ab' False
'aaaaaaaaaaaaaaaaaaaaaaaaa' False

Contoh 6: Bangun nama sumber daya dari konvensi

Nama yang konsisten memudahkan pencarian dan penagihan.

def resource_name(kind, app, env, region, index=1):
    return f"{kind}-{app}-{env}-{region}-{index:02d}"

print(resource_name("rg", "shop", "dev", "sea"))
print(resource_name("app", "shop", "prod", "sea", 3))

Keluaran:

rg-shop-dev-sea-01
app-shop-prod-sea-03

Topik 2: Grup sumber daya, tag, dan keluaran CLI

Grup sumber daya menampung sumber daya satu aplikasi atau satu lingkungan. Tag mencatat pemilik dan biaya, dan CLI dapat menyaring serta memformat keluarannya untuk orang atau skrip.

Grup sumber daya dan penghapusan

Kumpulkan sumber daya yang terkait dalam satu grup agar bisa dikelola dan dihapus bersama. Menghapus grup akan menghapus semua isinya, jadi gunakan --no-wait hanya jika Anda yakin, dan jangan pernah menghapus grup yang tidak Anda buat.

Tag untuk kepemilikan dan biaya

Tag berupa pasangan kunci dan nilai seperti owner dan costcenter. Tambahkan saat membuat sumber daya dan cari yang belum diberi tag dengan skrip. Laporan biaya dapat mengelompokkan pengeluaran berdasarkan tag.

Keluaran, kueri, dan nilai default

Gunakan --output table untuk orang dan json untuk skrip. --query memakai JMESPath untuk menyaring kolom. Atur grup dan wilayah default dengan az configure agar tidak perlu diulang.

Contoh 7: Beri tag pada grup sumber daya

Tag mencatat pemilik, pusat biaya, dan lingkungan.

az group update --name rg-learn-dev \
  --tags owner=team-a costcenter=1001 environment=dev

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 8: Periksa tag yang wajib

Temukan sumber daya yang tidak punya tag yang dibutuhkan tim.

REQUIRED = {"owner", "costcenter", "environment"}

def missing_tags(tags):
    return sorted(REQUIRED - set(tags))

print(missing_tags({"owner": "team-a", "environment": "dev"}))
print(missing_tags({"owner": "x", "costcenter": "1", "environment": "prod"}))

Keluaran:

['costcenter']
[]

Contoh 9: Hapus grup sumber daya tanpa menunggu

Hapus seluruh grup sumber daya dengan satu perintah.

az group delete --name rg-learn-test --yes --no-wait

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 10: Pilih wilayah terdekat berdasarkan latensi

Pilih wilayah yang paling cepat merespons pengguna.

latency_ms = {"southeastasia": 42, "japaneast": 71, "eastus": 210, "westeurope": 185}

best = min(latency_ms, key=latency_ms.get)
print("closest region:", best, latency_ms[best], "ms")

Keluaran:

closest region: southeastasia 42 ms

Contoh 11: Saring keluaran dengan kueri JMESPath

Tampilkan hanya kolom dan baris yang Anda perlukan.

az vm list \
  --query "[?powerState=='VM running'].{name:name, rg:resourceGroup}" \
  --output table

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 12: Pilih format keluaran

Tabel, JSON, atau YAML untuk manusia atau skrip.

az group list --output table
az group list --output json
az group list --output yaml

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 13: Perulangan sumber daya dalam skrip

Jalankan satu perintah untuk setiap grup sumber daya.

for rg in $(az group list --query "[].name" -o tsv); do
  echo "resource group: $rg"
done

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 14: Atur grup dan wilayah default

Tidak perlu mengetik opsi yang sama di setiap perintah.

az configure --defaults group=rg-learn-dev location=southeastasia
az configure --list-defaults

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 3: Skrip dan otomatisasi

Pekerjaan yang berulang sebaiknya ditulis dalam skrip. Perulangan, percobaan ulang, dan penguraian JSON mengubah perintah sekali pakai menjadi otomatisasi andal yang bisa dijalankan pipeline.

Perulangan pada sumber daya

Perulangan shell menjalankan satu perintah untuk setiap sumber daya dalam daftar. Jaga daftar tetap kecil dan periksa hasilnya sebelum mengubah apa pun.

Mengurai keluaran JSON

Minta CLI menghasilkan JSON lalu urai dengan program, daripada membaca teks. Kelompokkan sumber daya berdasarkan jenisnya untuk membuat ringkasan yang mudah dibaca.

Percobaan ulang dan backoff

Azure API membatasi klien yang terlalu sering memanggil. Coba lagi dengan jeda yang makin lama, sehingga skrip bisa pulih tanpa membanjiri layanan.

Contoh 15: Urai keluaran JSON dari CLI

Ubah daftar sumber daya menjadi ringkasan.

import json

sample = """[{"name": "vm-web-01", "type": "Microsoft.Compute/virtualMachines", "location": "southeastasia"},
           {"name": "stlearn01", "type": "Microsoft.Storage/storageAccounts", "location": "southeastasia"}]"""

resources = json.loads(sample)
by_type = {}
for r in resources:
    by_type.setdefault(r["type"].split("/")[-1], []).append(r["name"])
for kind, names in sorted(by_type.items()):
    print(kind, names)

Keluaran:

storageAccounts ['stlearn01']
virtualMachines ['vm-web-01']

Contoh 16: Coba ulang panggilan dengan backoff

Tunggu lebih lama setelah setiap permintaan yang dibatasi.

import time

def call_with_retry(fn, attempts=4, base_delay=0.05):
    for n in range(attempts):
        try:
            return fn()
        except ConnectionError as e:
            if n == attempts - 1:
                raise
            delay = base_delay * (2 ** n)
            print(f"attempt {n + 1} failed ({e}); retrying in {delay:.2f}s")
            time.sleep(delay)

state = {"calls": 0}
def flaky_list():
    state["calls"] += 1
    if state["calls"] < 3:
        raise ConnectionError("throttled")
    return ["rg-learn-dev"]

print(call_with_retry(flaky_list))

Keluaran:

attempt 1 failed (throttled); retrying in 0.05s
attempt 2 failed (throttled); retrying in 0.10s
['rg-learn-dev']

Contoh 17: Periksa versi CLI dan ekstensi

Jaga alat dan ekstensinya tetap mutakhir.

az version
az extension list --output table
az extension add --name containerapp --upgrade

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 18: Buat service principal dengan aman

Identitas aplikasi untuk otomatisasi dengan cakupan sekecil mungkin.

# Store the output securely: it contains a password. Never commit it to Git.
az ad sp create-for-rbac --name sp-learn-deploy --role Contributor \
  --scopes /subscriptions/<subscription-id>/resourceGroups/rg-learn-dev

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 4: Infrastruktur sebagai kode dengan Bicep

Bicep mendeskripsikan sumber daya Azure sebagai kode. Templat dapat ditinjau, diberi versi, dan diterapkan dengan cara yang sama setiap kali, yang lebih aman daripada mengklik di portal.

Sumber daya, parameter, dan keluaran

Deklarasi sumber daya menyebut jenis dan versi API, lalu mengatur propertinya. Parameter membuat templat dapat dipakai ulang, dan @secure mencegah kata sandi masuk ke log. Keluaran mengembalikan nilai seperti ID ke pemanggil.

Modul, kondisi, dan perulangan

Modul memecah templat besar menjadi berkas yang dapat dipakai ulang. Kondisi membuat sumber daya hanya jika benar, misalnya di produksi. Perulangan membuat beberapa sumber daya dari satu daftar.

Penerapan yang aman

Gunakan az deployment group what-if untuk melihat pratinjau perubahan sebelum membuat sumber daya. Nama yang dibuat dengan uniqueString menghindari bentrokan antarlingkungan dalam satu langganan yang sama.

Contoh 19: Akun penyimpanan Bicep minimal

Deskripsikan akun penyimpanan sebagai kode.

param location string = resourceGroup().location
param storageName string

resource storage 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    minimumTlsVersion: 'TLS1_2'
    allowBlobPublicAccess: false
  }
}

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 20: Parameter, keluaran, dan nilai rahasia

Gunakan ulang templat dan jangan simpan kata sandi di berkas.

@minLength(3)
@maxLength(24)
param storageName string

@allowed([
  'dev'
  'test'
  'prod'
])
param environment string = 'dev'

@secure()
param adminPassword string

output storageId string = storage.id
resource storage 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageName
  location: resourceGroup().location
  sku: { name: environment == 'prod' ? 'Standard_GRS' : 'Standard_LRS' }
  kind: 'StorageV2'
}

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 21: Terapkan modul dari main.bicep

Pecah templat besar menjadi modul yang bisa dipakai ulang.

// main.bicep
targetScope = 'resourceGroup'
module network './modules/network.bicep' = {
  name: 'networkDeploy'
  params: {
    prefix: 'shop-dev'
  }
}
output vnetId string = network.outputs.vnetId

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 22: Sumber daya bersyarat

Buat sumber daya hanya di produksi.

param environment string

resource logs 'Microsoft.OperationalInsights/workspaces@2022-10-01' = if (environment == 'prod') {
  name: 'log-shop-prod'
  location: resourceGroup().location
  properties: {
    retentionInDays: 90
  }
}

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 23: Perulangan kontainer di Bicep

Buat beberapa kontainer blob dari satu daftar.

param containerNames array = [
  'uploads'
  'exports'
  'backups'
]

resource storage 'Microsoft.Storage/storageAccounts@2023-05-01' existing = {
  name: 'stlearndev01'
}

resource containers 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-05-01' = [for name in containerNames: {
  name: '${storage.name}/default/${name}'
}]

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 24: Nama unik dengan uniqueString

Hasilkan nama yang tidak bentrok di dalam langganan.

param prefix string = 'shop'

var uniqueSuffix = uniqueString(resourceGroup().id)
var storageName = toLower('st${prefix}${uniqueSuffix}')

output generatedName string = storageName

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 25: Terapkan berkas Bicep

Buat atau perbarui sumber daya dari templat.

az deployment group create \
  --resource-group rg-learn-dev \
  --template-file main.bicep \
  --parameters storageName=stlearndev01 environment=dev

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 26: Pratinjau perubahan dengan what-if

Lihat dulu apa yang akan ditambah, diubah, atau dihapus.

az deployment group what-if \
  --resource-group rg-learn-dev \
  --template-file main.bicep \
  --parameters storageName=stlearndev01

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 5: Identitas dan kontrol akses

Keamanan dimulai dari menentukan siapa boleh melakukan apa. Managed identity memberi aplikasi kredensial tanpa kata sandi, dan kontrol akses berbasis peran hanya memberi setiap identitas izin yang ia butuhkan.

Managed identity

Managed identity adalah akun yang dikelola Azure untuk aplikasi Anda, sehingga aplikasi mendapatkan token tanpa menyimpan rahasia. Gunakan identitas yang ditetapkan pengguna saat beberapa sumber daya berbagi satu identitas.

RBAC dan hak akses minimum

Penetapan peran menghubungkan identitas ke peran pada suatu cakupan, misalnya satu akun penyimpanan. Pilih peran bawaan yang sesuai dengan pekerjaan, dan buat peran kustom hanya jika tidak ada yang cocok.

Service principal dan token

Service principal adalah identitas untuk otomatisasi. Kata sandinya adalah rahasia, jadi simpan di brankas pipeline. Token adalah string yang ditandatangani dan memiliki waktu kedaluwarsa, yang bisa dibaca dari payload-nya.

Contoh 27: Identitas terkelola yang ditetapkan pengguna

Identitas yang dipakai aplikasi tanpa menyimpan kata sandi.

param location string = resourceGroup().location

resource appIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: 'id-shop-dev'
  location: location
}

output principalId string = appIdentity.properties.principalId

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 28: Berikan akses baca dengan RBAC

Beri identitas hanya peran yang dibutuhkannya.

PRINCIPAL_ID=$(az identity show --name id-shop-dev --resource-group rg-learn-dev --query principalId -o tsv)
az role assignment create \
  --assignee-object-id "$PRINCIPAL_ID" \
  --assignee-principal-type ServicePrincipal \
  --role "Storage Blob Data Reader" \
  --scope /subscriptions/<subscription-id>/resourceGroups/rg-learn-dev/providers/Microsoft.Storage/storageAccounts/stlearndev01

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 29: Masuk pipeline dengan service principal

Otomatisasi masuk menggunakan rahasia dari pipeline.

az login --service-principal \
  --username "$AZURE_CLIENT_ID" \
  --password "$AZURE_CLIENT_SECRET" \
  --tenant "$AZURE_TENANT_ID"

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 30: Periksa penugasan peran

Tinjau siapa yang boleh melakukan apa pada sumber daya.

assignments = [
    {"principal": "id-shop-dev", "role": "Storage Blob Data Reader", "scope": "stlearndev01"},
    {"principal": "sp-learn-deploy", "role": "Contributor", "scope": "rg-learn-dev"},
    {"principal": "id-shop-dev", "role": "Key Vault Secrets User", "scope": "kv-shop-dev"},
]

def roles_for(principal):
    return sorted(a["role"] for a in assignments if a["principal"] == principal)

print(roles_for("id-shop-dev"))
print(roles_for("nobody"))

Keluaran:

['Key Vault Secrets User', 'Storage Blob Data Reader']
[]

Contoh 31: Masuk di VM dengan identitas terkelolanya

VM mendapatkan token tanpa kata sandi.

az login --identity
az account show --query "user.assignedIdentityInfo" -o tsv

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 32: Baca waktu kedaluwarsa token JWT

Token membawa waktu kedaluwarsa di payload-nya.

import base64
import json

def jwt_payload(token):
    part = token.split(".")[1]
    part += "=" * (-len(part) % 4)
    return json.loads(base64.urlsafe_b64decode(part))

payload = {"aud": "https://management.azure.com/", "exp": 1767225600, "upn": "[email protected]"}
raw = base64.urlsafe_b64encode(json.dumps(payload).encode()).decode().rstrip("=")
token = f"header.{raw}.signature"

claims = jwt_payload(token)
print("audience:", claims["aud"])
print("expires at unix time:", claims["exp"])

Keluaran:

audience: https://management.azure.com/
expires at unix time: 1767225600

Contoh 33: Peran kustom dengan hak minimum

Izinkan satu aksi pada satu cakupan saja.

{
  "Name": "Blob Uploader",
  "IsCustom": true,
  "Description": "Can upload blobs to one storage account only.",
  "Actions": [],
  "DataActions": [
    "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write"
  ],
  "AssignableScopes": [
    "/subscriptions/<subscription-id>/resourceGroups/rg-learn-dev"
  ]
}

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 34: Buat peran kustom

Daftarkan definisi peran di langganan.

az role definition create --role-definition @blob-uploader.json

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 6: Komputasi: mesin virtual dan App Service

Azure menjalankan kode Anda di mesin virtual atau platform terkelola. App Service menghilangkan sebagian besar pekerjaan server, sedangkan mesin virtual memberi kendali penuh atas sistem operasi.

Mesin virtual dan scale set

Mesin virtual memiliki ukuran, image, disk, dan antarmuka jaringan. Scale set menjalankan mesin virtual yang identik dan menambah atau mengurangi jumlahnya sesuai permintaan. Matikan mesin pengembangan di malam hari untuk menghemat biaya.

Paket App Service dan aplikasi web

Paket menentukan mesin dan harganya, dan aplikasi web berjalan di atasnya. Terapkan kode sebagai berkas zip, atur konfigurasi lewat pengaturan aplikasi, dan gunakan slot deployment untuk menguji sebelum pengguna melihat perubahan.

Keputusan penskalaan otomatis

Aturan penskalaan membandingkan metrik, misalnya rata-rata CPU, dengan ambang batas, lalu menambah atau menghapus instans. Masa tenang mencegah sistem berpindah-pindah ukuran.

Contoh 35: Buat VM Linux

Jalankan mesin virtual dengan ukuran dan image yang dipilih.

az vm create \
  --resource-group rg-learn-dev \
  --name vm-web-01 \
  --image Ubuntu2204 \
  --size Standard_B2s \
  --admin-username azureuser \
  --generate-ssh-keys

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 36: Daftar ukuran VM dan disk

Periksa kapasitas dan penyimpanan sebelum mengubah ukuran.

az vm list-sizes --location southeastasia --output table | head -n 10
az vm disk list --resource-group rg-learn-dev --output table

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 37: Virtual machine scale set

Jalankan VM identik yang bertambah dan berkurang bersama-sama.

resource vmss 'Microsoft.Compute/virtualMachineScaleSets@2023-09-01' = {
  name: 'vmss-web'
  location: resourceGroup().location
  sku: {
    name: 'Standard_B2s'
    capacity: 2
  }
  properties: {
    upgradePolicy: { mode: 'Rolling' }
    // osProfile, networkProfile and storageProfile go here
  }
}

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 38: Mati otomatis untuk VM pengembangan

Matikan mesin uji setiap malam untuk menghemat biaya.

az vm auto-shutdown --resource-group rg-learn-dev --name vm-web-01 --time 2100

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 39: Buat paket App Service dan aplikasi web

Jalankan aplikasi web di server Linux terkelola.

az appservice plan create --name plan-shop-dev --resource-group rg-learn-dev --sku B1 --is-linux
az webapp create --name app-shop-dev-01 --resource-group rg-learn-dev \
  --plan plan-shop-dev --runtime "PYTHON:3.12"

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 40: Terapkan kode dari berkas zip

Unggah paket aplikasi ke aplikasi web.

zip -r app.zip . -x "*.git*"
az webapp deploy --resource-group rg-learn-dev --name app-shop-dev-01 \
  --src-path app.zip --type zip

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 41: Pengaturan aplikasi dan slot staging

Uji versi baru sebelum sampai ke pengguna.

az webapp config appsettings set --resource-group rg-learn-dev --name app-shop-dev-01 \
  --settings ENVIRONMENT=dev LOG_LEVEL=info
az webapp deployment slot create --resource-group rg-learn-dev --name app-shop-dev-01 --slot staging

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 42: Keputusan penskalaan dari CPU

Tambah instans saat sibuk dan kurangi saat sepi.

def scale_decision(cpu_samples, instances, minimum=1, maximum=5):
    average = sum(cpu_samples) / len(cpu_samples)
    if average > 75 and instances < maximum:
        return instances + 1, f"scale out (avg CPU {average:.0f}%)"
    if average < 25 and instances > minimum:
        return instances - 1, f"scale in (avg CPU {average:.0f}%)"
    return instances, f"hold (avg CPU {average:.0f}%)"

print(scale_decision([82, 90, 78], 2))
print(scale_decision([10, 12, 15], 2))
print(scale_decision([40, 45, 50], 2))

Keluaran:

(3, 'scale out (avg CPU 83%)')
(1, 'scale in (avg CPU 12%)')
(2, 'hold (avg CPU 45%)')

Topik 7: Kontainer: registry, Container Apps, dan Kubernetes

Kontainer mengemas aplikasi bersama semua yang dibutuhkannya. Azure menyimpan image di registry dan menjalankannya di Container Apps atau Kubernetes, tergantung seberapa besar kendali yang Anda butuhkan.

Azure Container Registry

Registry adalah tempat penyimpanan image yang privat. Bangun image di Azure dengan az acr build agar prosesnya tidak bergantung pada komputer Anda, lalu dorong hasilnya ke registry.

Container Apps dan AKS

Container Apps menjalankan kontainer tanpa mengelola klaster dan dapat diskalakan hingga nol. AKS adalah Kubernetes terkelola untuk sistem yang lebih besar. AKS bisa menarik image dari registry Anda memakai managed identity-nya, sehingga tidak perlu kata sandi.

Tag dan pembersihan

Beri tag pada setiap image dengan versi, tanggal, dan commit agar Anda bisa kembali ke versi sebelumnya. Jadwalkan tugas purge untuk menghapus image lama yang tidak ber-tag agar biaya penyimpanan terkendali.

Contoh 43: Buat container registry

Tempat pribadi untuk menyimpan image kontainer.

az acr create --resource-group rg-learn-dev --name acrshopdev01 --sku Basic
az acr login --name acrshopdev01

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 44: Bangun dan unggah image

Bangun image di Azure dan simpan di registry.

az acr build --registry acrshopdev01 --image shop-api:1.0.0 .
az acr repository show-tags --name acrshopdev01 --repository shop-api -o table

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 45: Jalankan aplikasi kontainer

Jalankan kontainer tanpa mengelola server.

az containerapp env create --name cae-shop-dev --resource-group rg-learn-dev --location southeastasia
az containerapp create --name ca-shop-api --resource-group rg-learn-dev \
  --environment cae-shop-dev \
  --image acrshopdev01.azurecr.io/shop-api:1.0.0 \
  --target-port 8080 --ingress external --min-replicas 0 --max-replicas 3

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 46: Buat klaster AKS

Klaster Kubernetes terkelola yang mengambil image dari registry Anda.

az aks create \
  --resource-group rg-learn-dev \
  --name aks-shop-dev \
  --node-count 2 \
  --enable-managed-identity \
  --attach-acr acrshopdev01 \
  --generate-ssh-keys
az aks get-credentials --resource-group rg-learn-dev --name aks-shop-dev

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 47: Terapkan ke Kubernetes

Terapkan manifes dan tunggu rollout selesai.

kubectl apply -f deployment.yaml
kubectl rollout status deployment/shop-api
kubectl get pods -l app=shop-api

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 48: Manifes deployment Kubernetes

Deskripsikan pod, jumlah replika, dan sumber dayanya.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: shop-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: shop-api
  template:
    metadata:
      labels:
        app: shop-api
    spec:
      containers:
        - name: shop-api
          image: acrshopdev01.azurecr.io/shop-api:1.0.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 100m
              memory: 128Mi

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 49: Hasilkan tag image

Beri tag setiap image dengan versi, tanggal, dan commit.

from datetime import date

def image_tag(version, commit, when):
    short = commit[:7]
    return f"{version}-{when.strftime('%Y%m%d')}-{short}"

print(image_tag("1.4.2", "9f3c1ab7e54d0a12", date(2026, 1, 15)))

Keluaran:

1.4.2-20260115-9f3c1ab

Contoh 50: Bersihkan image lama dengan tugas

Hapus image tanpa tag sesuai jadwal untuk menghemat penyimpanan.

az acr task create --name purge-old-images --registry acrshopdev01 \
  --cmd "acr purge --filter 'shop-api:.*' --ago 30d --untagged" \
  --schedule "0 1 * * *" --context /dev/null

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 8: Penyimpanan: blob, antrean, dan kontrol akses

Akun penyimpanan menyimpan berkas, pesan, dan tabel. Amankan akses dengan Entra ID, gunakan tautan SAS berumur pendek saat harus membagikan, dan biarkan aturan siklus hidup memindahkan data lama ke tingkat yang lebih murah.

Blob dan penamaan path

Kontainer blob menyimpan berkas. Gunakan path yang memuat perangkat dan tanggal agar data satu hari bisa dicantumkan atau dihapus dengan cepat. Biarkan akses publik mati kecuali konten memang harus publik.

Shared access signature

Tautan SAS memberi akses terbatas dalam waktu singkat. Berikan hanya izin yang diperlukan, misalnya baca, dan pilih masa berlaku terpendek yang masih berfungsi.

Aturan siklus hidup dan antrean

Aturan siklus hidup memindahkan blob ke tingkat cool atau archive dan menghapusnya setelah sejumlah hari tertentu. Antrean menyimpan pesan untuk pekerja latar belakang, sehingga tugas yang lambat tidak menghambat permintaan web.

Contoh 51: Buat akun penyimpanan

Default aman: TLS 1.2 dan tanpa akses blob publik.

az storage account create \
  --name stlearndev01 \
  --resource-group rg-learn-dev \
  --location southeastasia \
  --sku Standard_LRS \
  --kind StorageV2 \
  --min-tls-version TLS1_2 \
  --allow-blob-public-access false

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 52: Path blob dengan partisi tanggal

Atur unggahan per perangkat dan tanggal agar kueri tetap cepat.

from datetime import datetime

def blob_path(device, when, filename):
    return f"telemetry/{device}/{when:%Y/%m/%d}/{when:%H%M%S}-{filename}"

print(blob_path("sensor-7", datetime(2026, 1, 15, 8, 30, 5), "batch.json"))

Keluaran:

telemetry/sensor-7/2026/01/15/083005-batch.json

Contoh 53: Unggah blob

Salin berkas ke kontainer dengan CLI.

az storage container create --name uploads --account-name stlearndev01 --auth-mode login
az storage blob upload --account-name stlearndev01 --container-name uploads \
  --name reports/2026-01.csv --file ./report.csv --auth-mode login

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 54: Unggah dari Python dengan Entra ID

Gunakan identitas Azure, bukan kunci akun.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

client = BlobServiceClient(
    account_url="https://stlearndev01.blob.core.windows.net",
    credential=DefaultAzureCredential(),
)
blob = client.get_blob_client(container="uploads", blob="reports/2026-01.csv")
with open("report.csv", "rb") as data:
    blob.upload_blob(data, overwrite=True)

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 55: Buat SAS berumur pendek

Tautan yang kedaluwarsa dan hanya memberi akses baca.

EXPIRY=$(date -u -d "+1 hour" '+%Y-%m-%dT%H:%MZ')
az storage blob generate-sas --account-name stlearndev01 --container-name uploads \
  --name reports/2026-01.csv --permissions r --expiry "$EXPIRY" --auth-mode login --as-user --output tsv

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 56: Jelaskan izin SAS

Jelaskan apa yang diizinkan shared access signature dan berapa lama.

from datetime import datetime, timedelta, timezone

def describe_sas(permissions, expiry):
    names = {"r": "read", "w": "write", "d": "delete", "c": "create"}
    allowed = ", ".join(names[p] for p in permissions)
    left = expiry - datetime(2026, 1, 15, 8, 0, tzinfo=timezone.utc)
    return f"allows {allowed} for {int(left.total_seconds() // 60)} minutes"

print(describe_sas("rw", datetime(2026, 1, 15, 9, 0, tzinfo=timezone.utc)))

Keluaran:

allows read, write for 60 minutes

Contoh 57: Aturan siklus hidup blob

Pindahkan data lama ke penyimpanan yang lebih murah lalu hapus.

{
  "rules": [
    {
      "enabled": true,
      "name": "archive-telemetry",
      "type": "Lifecycle",
      "definition": {
        "filters": { "blobTypes": ["blockBlob"], "prefixMatch": ["telemetry/"] },
        "actions": {
          "baseBlob": {
            "tierToCool": { "daysAfterModificationGreaterThan": 30 },
            "delete": { "daysAfterModificationGreaterThan": 365 }
          }
        }
      }
    }
  ]
}

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 58: Penyimpanan antrean untuk pekerjaan latar belakang

Masukkan tugas ke antrean dan biarkan pekerja memprosesnya nanti.

az storage queue create --name jobs --account-name stlearndev01 --auth-mode login
az storage message put --queue-name jobs --content "resize:photo-42" \
  --account-name stlearndev01 --auth-mode login

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 9: Basis data: Azure SQL dan Cosmos DB

Azure menawarkan basis data relasional terkelola dan basis data NoSQL yang didistribusikan secara global. Hubungkan dengan identitas, bukan kata sandi, dan selalu gunakan parameter dalam kueri.

Azure SQL

Azure SQL adalah basis data SQL Server terkelola. Aktifkan autentikasi Microsoft Entra ID dan private endpoint, sehingga basis data tidak memiliki kata sandi tersimpan dan tidak memiliki alamat publik.

Kueri berparameter

Kirim masukan pengguna sebagai parameter, jangan pernah menggabungkan teks ke dalam SQL. Basis data akan memperlakukan masukan sebagai data, sehingga mencegah SQL injection.

Cosmos DB dan kunci partisi

Cosmos DB menyimpan dokumen JSON dalam kontainer. Kunci partisi menentukan bagaimana data tersebar ke mesin-mesin. Kunci dengan banyak nilai berbeda, seperti ID pelanggan, menjaga beban tetap seimbang.

Contoh 59: Server dan basis data Azure SQL

Basis data relasional terkelola dengan jaringan privat.

az sql server create --name sql-shop-dev-01 --resource-group rg-learn-dev \
  --location southeastasia --enable-public-network false --enable-ad-only-auth \
  --external-admin-principal-type User --external-admin-name [email protected]
az sql db create --resource-group rg-learn-dev --server sql-shop-dev-01 \
  --name shopdb --service-objective S0

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 60: Terhubung ke Azure SQL tanpa kata sandi

Autentikasi Entra ID, bukan kata sandi yang disimpan.

import pyodbc

conn = pyodbc.connect(
    "Driver={ODBC Driver 18 for SQL Server};"
    "Server=tcp:sql-shop-dev-01.database.windows.net,1433;"
    "Database=shopdb;Encrypt=yes;"
    "Authentication=ActiveDirectoryDefault;"
)
cursor = conn.cursor()
cursor.execute("SELECT TOP 5 name FROM sys.tables")
print([row.name for row in cursor.fetchall()])

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 61: Kueri dengan parameter

Kirim nilai sebagai parameter agar masukan tidak mengubah kueri.

import sqlite3

conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE orders (id INTEGER, customer TEXT, total REAL)")
conn.executemany("INSERT INTO orders VALUES (?, ?, ?)",
                 [(1, "ana", 120.0), (2, "ben", 75.5)])

customer = "ana' OR '1'='1"          # hostile input stays a plain value
rows = conn.execute("SELECT id, total FROM orders WHERE customer = ?", (customer,)).fetchall()
print("matches:", rows)
conn.close()

Keluaran:

matches: []

Contoh 62: Buat kontainer Cosmos DB

Basis data terdistribusi global dengan kunci partisi.

az cosmosdb create --name cosmos-shop-dev-01 --resource-group rg-learn-dev \
  --locations regionName=southeastasia failoverPriority=0
az cosmosdb sql database create --account-name cosmos-shop-dev-01 --resource-group rg-learn-dev \
  --name shop
az cosmosdb sql container create --account-name cosmos-shop-dev-01 --resource-group rg-learn-dev \
  --database-name shop --name orders --partition-key-path "/customerId"

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 63: Tulis item ke Cosmos DB

Simpan dokumen JSON di dalam kontainer.

from azure.cosmos import CosmosClient
from azure.identity import DefaultAzureCredential

client = CosmosClient("https://cosmos-shop-dev-01.documents.azure.com:443/", DefaultAzureCredential())
container = client.get_database_client("shop").get_container_client("orders")
container.upsert_item({"id": "o-1001", "customerId": "ana", "total": 120.0})

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 64: Sebarkan item dengan hash kunci partisi

Kunci yang baik membagi data merata ke seluruh partisi.

import hashlib

def partition_for(key, partitions=4):
    digest = hashlib.sha256(key.encode("utf-8")).hexdigest()
    return int(digest, 16) % partitions

counts = [0, 0, 0, 0]
for customer in ["ana", "ben", "chai", "dao", "eve", "fon", "gus", "hana"]:
    counts[partition_for(customer)] += 1
print("items per partition:", counts)

Keluaran:

items per partition: [4, 1, 1, 2]

Topik 10: Tanpa server dengan Azure Functions

Azure Functions menjalankan potongan kode kecil saat sesuatu terjadi: permintaan HTTP, pengatur waktu, atau pesan di antrean. Anda membayar per eksekusi dan tidak perlu mengelola server.

Pemicu dan binding

Pemicu memulai fungsi, misalnya permintaan HTTP atau pengatur waktu. Binding menghubungkan fungsi dengan layanan lain, misalnya menulis ke antrean, sehingga kode koneksinya lebih sedikit.

Pengatur waktu dan jadwal cron

Pemicu pengatur waktu memakai ekspresi NCRONTAB enam bidang dengan detik di depan. Ekspresi 0 */5 * * * * berjalan setiap lima menit.

Pemrosesan idempoten

Antrean bisa mengirim pesan yang sama lebih dari sekali. Catat ID yang sudah diproses dan lewati duplikatnya, sehingga menjalankan tugas dua kali tidak menagih pelanggan dua kali.

Contoh 65: Buat aplikasi fungsi

Kode tanpa server pada paket Consumption.

az storage account create --name stfuncshopdev01 --resource-group rg-learn-dev --sku Standard_LRS
az functionapp create --name func-shop-dev-01 --resource-group rg-learn-dev \
  --storage-account stfuncshopdev01 --consumption-plan-location southeastasia \
  --runtime python --runtime-version 3.12 --functions-version 4 --os-type Linux

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 66: Fungsi yang dipicu HTTP

Jalankan kode saat permintaan web masuk.

import azure.functions as func

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)

@app.route(route="hello", methods=["GET"])
def hello(req: func.HttpRequest) -> func.HttpResponse:
    name = req.params.get("name", "world")
    return func.HttpResponse(f"Hello, {name}!", status_code=200)

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 67: Fungsi pengatur waktu dengan jadwal cron

Jalankan kode setiap lima menit tanpa server.

import logging
import azure.functions as func

app = func.FunctionApp()

@app.timer_trigger(schedule="0 */5 * * * *", arg_name="timer", run_on_startup=False)
def every_five_minutes(timer: func.TimerRequest) -> None:
    logging.info("checking sensors")

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 68: Jadwal berikutnya dari ekspresi cron

Hitung kapan jadwal akan berjalan berikutnya.

def next_minutes(expression, current_minute):
    field = expression.split()[1]           # minute field, for example */5
    step = int(field.removeprefix("*/"))
    return step - (current_minute % step) if current_minute % step else step

for minute in (0, 3, 12, 14):
    print(f"at minute {minute:2d}: next run in {next_minutes('0 */5 * * * *', minute)} min")

Keluaran:

at minute  0: next run in 5 min
at minute  3: next run in 2 min
at minute 12: next run in 3 min
at minute 14: next run in 1 min

Contoh 69: Terbitkan aplikasi fungsi

Terapkan kode Python ke Azure Functions.

func azure functionapp publish func-shop-dev-01 --python

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 70: Fungsi yang dipicu antrean

Proses setiap pesan dan tulis hasilnya ke antrean lain.

import azure.functions as func

app = func.FunctionApp()

@app.queue_trigger(arg_name="msg", queue_name="jobs", connection="AzureWebJobsStorage")
@app.queue_output(arg_name="out", queue_name="done", connection="AzureWebJobsStorage")
def process(msg: func.QueueMessage, out: func.Out[str]) -> None:
    out.set(f"processed:{msg.get_body().decode('utf-8')}")

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 71: Penanganan pesan yang idempoten

Proses pesan sekali saja meski tiba dua kali.

processed_ids = set()

def handle(message):
    if message["id"] in processed_ids:
        return "skipped duplicate"
    processed_ids.add(message["id"])
    return f"processed {message['id']}"

events = [{"id": "e1"}, {"id": "e2"}, {"id": "e1"}]
for event in events:
    print(handle(event))

Keluaran:

processed e1
processed e2
skipped duplicate

Contoh 72: Referensi Key Vault di pengaturan aplikasi

Muat rahasia ke aplikasi tanpa menyalinnya.

az functionapp config appsettings set --name func-shop-dev-01 --resource-group rg-learn-dev \
  --settings "[email protected](VaultName=kv-shop-dev;SecretName=db-password)"

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 11: Jaringan: jaringan virtual, NSG, dan private endpoint

Jaringan virtual adalah jaringan privat Anda di dalam Azure. Subnet memisahkan lapisan, aturan keamanan membatasi lalu lintas, dan private endpoint menjaga layanan tetap jauh dari internet publik.

Jaringan virtual dan subnet

Pilih rentang alamat seperti 10.10.0.0/16, lalu bagi menjadi subnet untuk web dan data. Azure mencadangkan lima alamat di setiap subnet, sehingga /24 memberi 251 alamat yang dapat dipakai.

Network security group

NSG adalah daftar aturan izin dan tolak dengan prioritas. Izinkan hanya port yang Anda butuhkan, seperti 443 untuk HTTPS, dan tolak sisanya secara default.

Private endpoint dan DNS

Private endpoint memberi layanan alamat IP privat di dalam jaringan Anda. Zona DNS privat membuat namanya ter-resolve ke alamat itu, sehingga aplikasi tidak perlu diubah kodenya.

Contoh 73: Jaringan virtual dan subnet

Jaringan privat dengan subnet terpisah untuk web dan data.

az network vnet create --name vnet-shop-dev --resource-group rg-learn-dev \
  --address-prefix 10.10.0.0/16 --subnet-name snet-web --subnet-prefix 10.10.1.0/24
az network vnet subnet create --vnet-name vnet-shop-dev --resource-group rg-learn-dev \
  --name snet-data --address-prefixes 10.10.2.0/24

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 74: Aturan network security group

Izinkan HTTPS saja dari internet.

az network nsg create --name nsg-web --resource-group rg-learn-dev
az network nsg rule create --nsg-name nsg-web --resource-group rg-learn-dev \
  --name allow-https --priority 100 --direction Inbound --access Allow \
  --protocol Tcp --destination-port-ranges 443 --source-address-prefixes Internet

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 75: Private endpoint untuk penyimpanan

Akses akun penyimpanan hanya dari dalam jaringan Anda.

az network private-endpoint create --name pe-storage --resource-group rg-learn-dev \
  --vnet-name vnet-shop-dev --subnet snet-data \
  --private-connection-resource-id $(az storage account show -n stlearndev01 -g rg-learn-dev --query id -o tsv) \
  --group-id blob --connection-name conn-storage

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 76: Zona DNS privat

Selesaikan nama private endpoint di dalam jaringan virtual.

az network private-dns zone create --resource-group rg-learn-dev \
  --name privatelink.blob.core.windows.net
az network private-dns link vnet create --resource-group rg-learn-dev \
  --zone-name privatelink.blob.core.windows.net --name link-shop \
  --virtual-network vnet-shop-dev --registration-enabled false

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 77: Load balancer publik

Bagi lalu lintas masuk ke beberapa mesin virtual.

az network public-ip create --name pip-lb --resource-group rg-learn-dev --sku Standard
az network lb create --name lb-shop --resource-group rg-learn-dev --sku Standard \
  --public-ip-address pip-lb --backend-pool-name be-web
az network lb probe create --lb-name lb-shop --resource-group rg-learn-dev \
  --name probe-https --protocol Tcp --port 443

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 78: Kalkulator ukuran subnet

Hitung alamat yang bisa dipakai dalam blok CIDR.

import ipaddress

def usable_hosts(cidr):
    net = ipaddress.ip_network(cidr)
    return net.num_addresses - 5          # Azure reserves 5 addresses in every subnet

for block in ("10.10.1.0/24", "10.10.2.0/27", "10.10.0.0/16"):
    print(block, usable_hosts(block))

Keluaran:

10.10.1.0/24 251
10.10.2.0/27 27
10.10.0.0/16 65531

Topik 12: Pesan dan streaming: Service Bus dan Event Hubs

Layanan saling berkomunikasi lewat pesan. Service Bus untuk pesan bisnis yang andal, dan Event Hubs untuk aliran volume tinggi seperti telemetri.

Antrean Service Bus

Antrean menyimpan pesan sampai penerima menyelesaikannya. Selesaikan pesan hanya setelah Anda memprosesnya, sehingga jika terjadi crash akan dicoba ulang, bukan pesanan yang hilang. Pesan yang gagal terlalu sering dipindahkan ke antrean dead-letter.

Event Hubs dan partisi

Event hub membagi alirannya menjadi partisi yang dapat dibaca banyak pembaca secara paralel. Kirim peristiwa dalam batch, dan jaga setiap batch di bawah batas ukuran.

Memilih di antara keduanya

Gunakan Service Bus ketika setiap pesan penting dan harus diproses sesuai maksudnya. Gunakan Event Hubs ketika Anda mengumpulkan peristiwa dalam jumlah besar dan dapat memprosesnya berurutan di dalam partisi.

Contoh 79: Antrean Service Bus

Pesan andal antaraplikasi dengan dead-letter.

az servicebus namespace create --name sb-shop-dev --resource-group rg-learn-dev --location southeastasia --sku Standard
az servicebus queue create --namespace-name sb-shop-dev --resource-group rg-learn-dev \
  --name orders --max-delivery-count 5 --dead-lettering-on-message-expiration true

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 80: Kirim pesan Service Bus

Masukkan pesanan ke antrean dari Python.

from azure.identity import DefaultAzureCredential
from azure.servicebus import ServiceBusClient, ServiceBusMessage

with ServiceBusClient("sb-shop-dev.servicebus.windows.net", DefaultAzureCredential()) as client:
    with client.get_queue_sender("orders") as sender:
        sender.send_messages(ServiceBusMessage('{"orderId": "o-1001"}'))

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 81: Terima dan selesaikan pesan

Hapus pesan hanya setelah diproses.

from azure.identity import DefaultAzureCredential
from azure.servicebus import ServiceBusClient

with ServiceBusClient("sb-shop-dev.servicebus.windows.net", DefaultAzureCredential()) as client:
    with client.get_queue_receiver("orders", max_wait_time=5) as receiver:
        for msg in receiver:
            print(str(msg))
            receiver.complete_message(msg)     # removes it only after processing succeeded

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 82: Event Hubs untuk telemetri

Aliran yang menerima jutaan peristiwa per detik.

az eventhubs namespace create --name evhns-shop-dev --resource-group rg-learn-dev --location southeastasia --sku Standard
az eventhubs eventhub create --name telemetry --namespace-name evhns-shop-dev --resource-group rg-learn-dev \
  --partition-count 4 --message-retention 1

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 83: Kirim batch ke Event Hubs

Kelompokkan peristiwa dalam batch agar efisien.

import json
from azure.eventhub import EventData, EventHubProducerClient
from azure.identity import DefaultAzureCredential

producer = EventHubProducerClient(
    fully_qualified_namespace="evhns-shop-dev.servicebus.windows.net",
    eventhub_name="telemetry",
    credential=DefaultAzureCredential(),
)
with producer:
    batch = producer.create_batch()
    batch.add(EventData(json.dumps({"device": "sensor-7", "temp_c": 21.5})))
    producer.send_batch(batch)

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 84: Bagi pesan berdasarkan batas ukuran

Pastikan setiap batch di bawah ukuran maksimum.

def make_batches(messages, limit_bytes=60):
    batches, current, size = [], [], 0
    for msg in messages:
        n = len(msg.encode("utf-8"))
        if current and size + n > limit_bytes:
            batches.append(current)
            current, size = [], 0
        current.append(msg)
        size += n
    if current:
        batches.append(current)
    return batches

events = [f'{{"id": {i}, "temp": 21.{i}}}' for i in range(6)]
for number, batch in enumerate(make_batches(events), start=1):
    print("batch", number, len(batch), "messages")

Keluaran:

batch 1 2 messages
batch 2 2 messages
batch 3 2 messages

Topik 13: Pemantauan: Log Analytics, Application Insights, dan peringatan

Anda tidak bisa memperbaiki apa yang tidak terlihat. Azure Monitor mengumpulkan log dan metrik, Log Analytics memungkinkan Anda mengkuerinya dengan KQL, dan peringatan memberi tahu tim saat ada masalah.

Log Analytics dan KQL

Workspace Log Analytics menyimpan log dari banyak sumber daya. Kusto Query Language menyaring, meringkas, dan membuat grafiknya, misalnya menghitung kegagalan per jam.

Application Insights

Application Insights melacak permintaan, dependensi, dan peristiwa kustom dari kode Anda. Gunakan untuk menemukan panggilan mana yang lambat, bukan hanya mengetahui bahwa aplikasinya lambat.

Peringatan tanpa alarm palsu

Peringatan metrik menyala saat sebuah ukuran melewati ambang batas. Syaratkan kondisi bertahan di beberapa sampel berturut-turut, sehingga satu lonjakan tidak membangunkan insinyur yang sedang siaga.

Contoh 85: Workspace Log Analytics

Tempat terpusat untuk mengkueri log dari setiap sumber daya.

az monitor log-analytics workspace create --resource-group rg-learn-dev \
  --workspace-name log-shop-dev --location southeastasia --retention-time 30

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 86: Kueri KQL untuk kegagalan

Hitung permintaan gagal per jam dengan Kusto Query Language.

AppRequests
| where TimeGenerated > ago(24h)
| where Success == false
| summarize failures = count() by bin(TimeGenerated, 1h), ResultCode
| order by TimeGenerated desc

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 87: Pengaturan diagnostik

Kirim log dan metrik platform ke workspace.

az monitor diagnostic-settings create \
  --name diag-storage \
  --resource /subscriptions/<subscription-id>/resourceGroups/rg-learn-dev/providers/Microsoft.Storage/storageAccounts/stlearndev01 \
  --workspace log-shop-dev \
  --logs '[{"category":"StorageRead","enabled":true}]' \
  --metrics '[{"category":"Transaction","enabled":true}]'

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 88: Telemetri Application Insights

Lacak permintaan dan peristiwa kustom dari kode Python.

from opentelemetry import trace
from azure.monitor.opentelemetry import configure_azure_monitor

configure_azure_monitor(connection_string="InstrumentationKey=<key>;IngestionEndpoint=https://southeastasia-1.in.applicationinsights.azure.com/")
tracer = trace.get_tracer("shop")
with tracer.start_as_current_span("checkout") as span:
    span.set_attribute("order.total", 120.0)

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 89: Peringatan metrik saat respons lambat

Beri tahu tim siaga saat API melambat.

az monitor metrics alert create --name alert-slow-api --resource-group rg-learn-dev \
  --scopes /subscriptions/<subscription-id>/resourceGroups/rg-learn-dev/providers/Microsoft.Web/sites/app-shop-dev-01 \
  --condition "avg HttpResponseTime > 2" --window-size 5m --evaluation-frequency 1m \
  --action /subscriptions/<subscription-id>/resourceGroups/rg-learn-dev/providers/microsoft.insights/actionGroups/ag-oncall

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 90: Peringatan setelah beberapa sampel buruk

Hindari alarm palsu dengan mensyaratkan beberapa pembacaan buruk berturut-turut.

def should_alert(samples, threshold=2.0, required=3):
    streak = 0
    for value in samples:
        streak = streak + 1 if value > threshold else 0
        if streak >= required:
            return True
    return False

print(should_alert([1.0, 2.5, 2.7, 2.9, 1.1]))
print(should_alert([2.5, 1.0, 2.5, 2.5, 1.0]))

Keluaran:

True
False

Topik 14: Keamanan: Key Vault, rahasia, dan perlindungan ancaman

Rahasia harus berada di brankas, bukan di kode atau log. Key Vault menyimpannya dengan kontrol akses, dan Defender for Cloud memantau sumber daya Anda dari ancaman.

Key Vault dan akses

Key Vault menyimpan rahasia, kunci, dan sertifikat. Gunakan akses berbasis peran, beri setiap aplikasi akses baca hanya ke rahasia yang dibutuhkannya, dan catat setiap akses.

Membaca rahasia dengan aman

DefaultAzureCredential memakai managed identity di Azure dan login Anda sendiri di komputer, sehingga kode yang sama berjalan di kedua tempat. Jangan pernah mencetak rahasia atau menuliskannya ke log.

Defender for Cloud

Defender for Cloud menilai postur keamanan Anda dan menyalakan perlindungan ancaman untuk mesin virtual, penyimpanan, dan Key Vault. Tinjau rekomendasinya secara berkala.

Contoh 91: Key Vault dan rahasia

Simpan kata sandi di brankas dengan kontrol akses.

az keyvault create --name kv-shop-dev --resource-group rg-learn-dev --location southeastasia \
  --enable-rbac-authorization true
az keyvault secret set --vault-name kv-shop-dev --name db-password --value "$DB_PASSWORD"

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 92: Baca rahasia dari Python

Gunakan DefaultAzureCredential untuk mengambil rahasia.

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

client = SecretClient(vault_url="https://kv-shop-dev.vault.azure.net/", credential=DefaultAzureCredential())
password = client.get_secret("db-password").value
# use the value, never print it

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 93: Sensor rahasia dari log

Sembunyikan kata sandi dan kunci sebelum ada yang ditulis.

import re

def redact(text):
    text = re.sub(r"(password|secret|token)=\S+", r"\1=***", text, flags=re.IGNORECASE)
    text = re.sub(r"(AccountKey=)[^;\s]+", r"\1***", text)
    return text

print(redact("connecting with password=hunter2 to host"))
print(redact("AccountKey=abc123==;EndpointSuffix=core.windows.net"))

Keluaran:

connecting with password=*** to host
AccountKey=***;EndpointSuffix=core.windows.net

Contoh 94: Paket Defender for Cloud

Aktifkan perlindungan ancaman untuk VM, penyimpanan, dan Key Vault.

az security pricing create --name VirtualMachines --tier Standard
az security pricing create --name StorageAccounts --tier Standard
az security pricing create --name KeyVaults --tier Standard

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Topik 15: DevOps, biaya, dan tata kelola

Sistem produksi membutuhkan pipeline yang bisa diulang, batas pengeluaran, dan aturan yang harus dipatuhi setiap sumber daya baru. Praktik ini menjaga Azure tetap andal dan terjangkau seiring tim berkembang.

Pipeline dan rollback

Pipeline menguji setiap perubahan dan menerapkan dari cabang main. Pantau tingkat error dan latensi setelah rilis, dan kembali ke versi sebelumnya saat melewati batas Anda.

Anggaran dan perkiraan biaya

Anggaran menetapkan batas bulanan dan mengirim peringatan sebelum Anda mencapainya. Perkirakan biaya dari jam dan penyimpanan, lalu bandingkan dengan tagihan sebenarnya, dan ekspor laporan harian.

Azure Policy

Policy memeriksa sumber daya terhadap aturan, misalnya mewajibkan tag pemilik. Efek deny menghentikan pembuatan sumber daya yang tidak sesuai, sehingga standar yang disepakati ditegakkan.

Contoh 95: Pipeline Azure DevOps

Uji di setiap push dan terapkan aplikasi web dari main.

trigger:
  branches:
    include: [main]

pool:
  vmImage: ubuntu-latest

steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '3.12'
  - script: pip install -r requirements.txt && pytest
    displayName: Test
  - task: AzureWebApp@1
    inputs:
      azureSubscription: sc-shop-dev
      appName: app-shop-dev-01
      package: '$(System.DefaultWorkingDirectory)'

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 96: Anggaran bulanan

Atur batas pengeluaran dan beri peringatan sebelum tercapai.

az consumption budget create --budget-name budget-dev --amount 200 \
  --category Cost --time-grain Monthly \
  --start-date 2026-01-01 --end-date 2026-12-31 \
  --resource-group rg-learn-dev

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 97: Perkirakan tagihan bulanan

Ubah jam pemakaian dan penyimpanan menjadi perkiraan biaya.

def monthly_cost(hours_per_day, hourly_rate, storage_gb, storage_rate, days=30):
    compute = hours_per_day * days * hourly_rate
    storage = storage_gb * storage_rate
    return round(compute + storage, 2)

print(monthly_cost(10, 0.05, 120, 0.02))
print(monthly_cost(24, 0.05, 120, 0.02))

Keluaran:

17.4
38.4

Contoh 98: Ekspor data biaya

Kirim laporan biaya harian ke akun penyimpanan.

az costmanagement export create --name daily-costs \
  --scope "/subscriptions/<subscription-id>/resourceGroups/rg-learn-dev" \
  --storage-account-id /subscriptions/<subscription-id>/resourceGroups/rg-learn-dev/providers/Microsoft.Storage/storageAccounts/stlearndev01 \
  --storage-container exports --timeframe MonthToDate --recurrence Daily \
  --recurrence-period from=2026-01-01T00:00:00Z to=2026-12-31T00:00:00Z

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Contoh 99: Putuskan rollback

Gunakan tingkat error dan latensi untuk memutuskan rollback.

def should_roll_back(error_rate, previous_error_rate, latency_ms, latency_limit=800):
    if error_rate > 0.05:
        return True, "error rate above 5 percent"
    if error_rate > previous_error_rate * 2 and error_rate > 0.01:
        return True, "error rate doubled since the last release"
    if latency_ms > latency_limit:
        return True, "latency above limit"
    return False, "healthy"

print(should_roll_back(0.02, 0.01, 300))
print(should_roll_back(0.07, 0.01, 300))

Keluaran:

(False, 'healthy')
(True, 'error rate above 5 percent')

Contoh 100: Wajibkan tag dengan Azure Policy

Tolak sumber daya baru yang tidak punya tag pemilik.

az policy definition create --name require-owner-tag --display-name "Require owner tag" \
  --rules '{"if":{"field":"tags[owner]","exists":"false"},"then":{"effect":"deny"}}' --mode Indexed
az policy assignment create --name require-owner --policy require-owner-tag \
  --scope /subscriptions/<subscription-id>/resourceGroups/rg-learn-dev

*Contoh ini tidak dijalankan di sini karena membutuhkan langganan Azure atau alat Azure.*

Proyek Latihan: Aplikasi Web Aman dengan Penyimpanan dan Pemantauan

Bangun satu pengaturan kecil dan aman yang memakai gagasan dari beberapa bagian. Tulis Bicep dan skrip sendiri terlebih dahulu, lalu bandingkan dengan contohnya. Hapus grup sumber daya saat selesai agar tidak ada biaya.

1. Buat grup sumber daya dengan tag owner dan environment, lalu periksa tag yang belum ada menggunakan skrip.

2. Tulis templat Bicep untuk akun penyimpanan dengan TLS 1.2 dan tanpa akses publik ke blob, lalu lihat pratinjaunya dengan what-if sebelum deploy.

3. Buat managed identity yang ditetapkan pengguna dan beri peran Storage Blob Data Reader hanya pada akun penyimpanan itu.

4. Deploy aplikasi web yang membaca blob dengan managed identity-nya, lalu tambahkan peringatan saat waktu respons rata-rata tetap di atas dua detik.

5. Buat anggaran pada 80 persen dari batas bulanan Anda, lalu hapus grup sumber daya dan pastikan penghapusannya di portal.

Langkah berikutnya

Selanjutnya, pelajari panduan arsitektur Azure, ambil sertifikasi berbasis peran seperti AZ-900 atau AZ-104, dan latih pipeline infrastruktur dengan GitHub Actions atau Azure DevOps. Jalankan setiap perintah di langganan sandbox terlebih dahulu, dan baca dokumentasi layanan untuk versi yang Anda deploy.

Ringkasan

Azure menjadi platform profesional ketika Anda mendeskripsikannya sebagai kode, mengamankannya dengan identitas dan bukan kata sandi, memantaunya, dan mengendalikan biayanya. Melalui 100 contoh, artikel ini membahas Azure CLI, grup sumber daya dan tag, skrip, Bicep, identitas dan RBAC, mesin virtual dan App Service, kontainer dan Kubernetes, penyimpanan, basis data, Functions tanpa server, jaringan, pesan, pemantauan, Key Vault dan keamanan, serta DevOps dengan tata kelola biaya. Bangun aplikasi web aman di proyek latihan, dan ubah satu pengaturan setiap kali untuk memahami cara kerja setiap bagian.