Bagikan melalui


Mendapatkan perubahan sumber daya

Sumber daya berubah melalui penggunaan harian, konfigurasi ulang, dan bahkan penyebaran ulang. Sebagian besar perubahan adalah berdasarkan desain, tetapi kadang-kadang tidak. Anda dapat:

  • Temukan kapan perubahan terdeteksi pada properti Azure Resource Manager.
  • Lihat detail perubahan properti.
  • Perubahan kueri dalam skala besar di seluruh langganan, grup manajemen, atau penyewa Anda.

Dalam artikel ini, Anda belajar tentang:

  • Seperti apa payload JSON.
  • Cara mengkueri perubahan sumber daya melalui Resource Graph menggunakan CLI, PowerShell, atau portal Azure.
  • Contoh kueri dan praktik terbaik untuk mengkueri perubahan sumber daya.
  • Analisis perubahan menggunakan fungsionalitas Ubah Aktor :
    • changedBy: Siapa yang memulai perubahan pada sumber daya Anda, seperti ID aplikasi atau alamat email orang yang berwenang.
    • clientType: Klien mana yang membuat perubahan, seperti portal Azure.
    • operation: Operasi mana yang dipanggil, seperti Microsoft.Compute/virtualmachines/write.

Prasyarat

  • Untuk mengaktifkan Azure PowerShell untuk mengkueri Azure Resource Graph, tambahkan modul.
  • Untuk mengaktifkan Azure CLI untuk mengkueri Azure Resource Graph, tambahkan ekstensi.

Memahami properti peristiwa perubahan

Saat sumber daya dibuat, diperbarui, atau dihapus, sumber daya perubahan baru (Microsoft.Resources/changes) dibuat untuk memperluas sumber daya yang dimodifikasi dan mewakili properti yang diubah. Rekaman perubahan harus tersedia dalam waktu kurang dari lima menit. Contoh payload JSON berikut menunjukkan properti sumber daya perubahan:

{
  "targetResourceId": "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myResourceGroup/providers/microsoft.compute/virtualmachines/myVM",
  "targetResourceType": "microsoft.compute/virtualmachines",
  "changeType": "Update",
  "changeAttributes": {
    "previousResourceSnapshotId": "11111111111111111111_22222222-3333-aaaa-bbbb-444444444444_5555555555_6666666666",
    "newResourceSnapshotId": "33333333333333333333_44444444-5555-ffff-gggg-666666666666_7777777777_8888888888",
    "correlationId": "11111111-1111-1111-1111-111111111111",
    "changedByType": "User",
    "changesCount": 2,
    "clientType": "Azure Portal",
    "changedBy": "john@contoso.com",
    "operation": "microsoft.compute/virtualmachines/write",
    "timestamp": "2024-06-12T13:26:17.347+00:00"
  },
  "changes": {
    "properties.provisioningState": {
      "newValue": "Succeeded",
      "previousValue": "Updating",
      "changeCategory": "System",
      "propertyChangeType": "Update",
      "isTruncated": "true"
    },
    "tags.key1": {
      "newValue": "NewTagValue",
      "previousValue": "null",
      "changeCategory": "User",
      "propertyChangeType": "Insert"
    }
  }
}

Lihat panduan referensi lengkap untuk mengubah properti sumber daya.

Menjalankan kueri

Cobalah kueri Resource Graph berbasis penyewa dari resourcechanges tabel. Kueri menampilkan lima perubahan sumber daya Azure terbaru dengan waktu perubahan, jenis perubahan, ID sumber daya target, jenis sumber daya target, dan detail perubahan dari setiap data perubahan.

# Login first with az login if not using Cloud Shell

# Run Azure Resource Graph query
az graph query -q 'resourcechanges | project properties.changeAttributes.timestamp, properties.changeType, properties.targetResourceId, properties.targetResourceType, properties.changes | limit 5'

Anda dapat memperbarui kueri ini untuk menentukan nama kolom yang lebih mudah digunakan untuk properti tanda waktu.

# Run Azure Resource Graph query with 'extend'
az graph query -q 'resourcechanges | extend changeTime=todatetime(properties.changeAttributes.timestamp) | project changeTime, properties.changeType, properties.targetResourceId, properties.targetResourceType, properties.changes | limit 5'

Untuk membatasi hasil kueri ke perubahan terbaru, perbarui kueri ke order by properti yang ditentukan changeTime pengguna.

# Run Azure Resource Graph query with 'order by'
az graph query -q 'resourcechanges | extend changeTime=todatetime(properties.changeAttributes.timestamp) | project changeTime, properties.changeType, properties.targetResourceId, properties.targetResourceType, properties.changes | order by changeTime desc | limit 5'

Anda juga dapat mengkueri menurut grup manajemen atau langganan dengan -ManagementGroup parameter atau -Subscription .

Catatan

Jika kueri tidak mengembalikan hasil dari langganan yang sudah Anda akses, maka Search-AzGraph cmdlet PowerShell default ke langganan dalam konteks default.

Resource Graph Explorer juga menyediakan antarmuka yang bersih untuk mengubah hasil beberapa kueri menjadi bagan yang dapat disematkan ke dasbor Azure.

Perubahan sumber daya kueri

Dengan Resource Graph, Anda bisa mengkueri resourcechangestabel , , resourcecontainerchangesatau healthresourcechanges untuk memfilter atau mengurutkan menurut salah satu properti sumber daya perubahan. Contoh berikut mengkueri resourcechanges tabel, tetapi juga dapat diterapkan ke resourcecontainerchanges tabel atau healthresourcechanges .

Catatan

Pelajari selengkapnya tentang healthresourcechanges data dalam dokumentasi Project Flash.

Contoh

Sebelum mengkueri dan menganalisis perubahan dalam sumber daya Anda, tinjau praktik terbaik berikut.

  • Buat kueri untuk aktivitas perubahan selama jendela waktu tertentu dan evaluasi detail perubahan.
    • Kueri ini berfungsi paling baik selama manajemen insiden untuk memahami perubahan yang berpotensi terkait.
  • Pertahankan Database Manajemen Konfigurasi (CMDB) terbaru.
    • Alih-alih me-refresh semua sumber daya dan kumpulan properti lengkapnya pada frekuensi terjadwal, Anda hanya menerima perubahannya.
  • Pahami properti lain mana yang diubah saat sumber daya mengubah status kepatuhan.
    • Evaluasi properti tambahan ini dapat memberikan wawasan tentang properti lain yang mungkin perlu dikelola melalui definisi Azure Policy.
  • Urutan perintah kueri penting. Dalam contoh berikut, order by harus datang sebelum limit perintah.
    • Perintah order by mengurutkan hasil kueri berdasarkan waktu perubahan.
    • limit Perintah kemudian membatasi hasil yang diurutkan untuk memastikan bahwa Anda mendapatkan lima hasil terbaru.
  • Apa artinya Tidak Diketahui ? 
    • Tidak diketahui ditampilkan ketika perubahan terjadi pada klien yang tidak dikenali. Klien dikenali berdasarkan agen pengguna dan ID aplikasi klien yang terkait dengan permintaan perubahan asli.
  • Apa artinya Sistem ?
    • Sistem ditampilkan sebagai changedBy nilai ketika perubahan latar belakang terjadi yang tidak berkorelasi dengan tindakan pengguna langsung apa pun.

Semua perubahan dalam periode 24 jam terakhir

resourcechanges
| extend changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId),
changeType = tostring(properties.changeType), correlationId = properties.changeAttributes.correlationId, 
changedProperties = properties.changes, changeCount = properties.changeAttributes.changesCount
| where changeTime > ago(1d)
| order by changeTime desc
| project changeTime, targetResourceId, changeType, correlationId, changeCount, changedProperties

Sumber daya yang dihapus dalam grup sumber daya tertentu

resourcechanges
| where resourceGroup == "myResourceGroup"
| extend changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId),
  changeType = tostring(properties.changeType), correlationId = properties.changeAttributes.correlationId
| where changeType == "Delete"
| order by changeTime desc
| project changeTime, resourceGroup, targetResourceId, changeType, correlationId

Perubahan pada nilai properti tertentu

resourcechanges
| extend provisioningStateChange = properties.changes["properties.provisioningState"], changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType)
| where isnotempty(provisioningStateChange)and provisioningStateChange.newValue == "Succeeded"
| order by changeTime desc
| project changeTime, targetResourceId, changeType, provisioningStateChange.previousValue, provisioningStateChange.newValue

Perubahan dalam tujuh hari terakhir oleh siapa dan klien mana dan diurutkan berdasarkan hitungan

resourcechanges 
| extend changeTime = todatetime(properties.changeAttributes.timestamp), 
  targetResourceId = tostring(properties.targetResourceId), 
  changeType = tostring(properties.changeType), changedBy = tostring(properties.changeAttributes.changedBy), 
  changedByType = properties.changeAttributes.changedByType, 
  clientType = tostring(properties.changeAttributes.clientType) 
| where changeTime > ago(7d) 
| project changeType, changedBy, changedByType, clientType 
| summarize count() by changedBy, changeType, clientType 
| order by count_ desc 

Perubahan ukuran komputer virtual

resourcechanges
| extend vmSize = properties.changes["properties.hardwareProfile.vmSize"], changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType) 
| where isnotempty(vmSize) 
| order by changeTime desc 
| project changeTime, targetResourceId, changeType, properties.changes, previousSize = vmSize.previousValue, newSize = vmSize.newValue

Jumlah perubahan menurut jenis perubahan dan nama langganan

resourcechanges  
| extend changeType = tostring(properties.changeType), changeTime = todatetime(properties.changeAttributes.timestamp), targetResourceType=tostring(properties.targetResourceType)  
| summarize count() by changeType, subscriptionId 
| join (resourcecontainers | where type=='microsoft.resources/subscriptions' | project SubscriptionName=name, subscriptionId) on subscriptionId 
| project-away subscriptionId, subscriptionId1
| order by count_ desc  

Perubahan sumber daya terbaru untuk sumber daya yang dibuat dengan tag tertentu

resourcechanges 
|extend targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType), createTime = todatetime(properties.changeAttributes.timestamp) 
| where createTime > ago(7d) and changeType == "Create" or changeType == "Update" or changeType == "Delete"
| project  targetResourceId, changeType, createTime 
| join ( resources | extend targetResourceId=id) on targetResourceId
| where tags ['Environment'] =~ 'prod' 
| order by createTime desc 
| project createTime, id, resourceGroup, type

Langkah berikutnya