الحصول على تغييرات الموارد

تتغير الموارد من خلال مسار الاستخدام اليومي وإعادة التكوين وحتى إعادة التوزيع. تُجرى معظم التغييرات وفقاً للتصميم باستثناء بعض الأحيان. يمكنك:

  • ابحث عن وقت اكتشاف التغييرات على خاصية Azure Resource Manager.
  • عرض تفاصيل تغيير الخاصية.
  • الاستعلام عن التغييرات على نطاق واسع عبر الاشتراكات أو مجموعة الإدارة أو المستأجر.

ستتعرف في هذه المقالة على ما يلي:

  • كيف تبدو الحمولة JSON.
  • كيفية الاستعلام عن تغييرات الموارد من خلال Resource Graph باستخدام إما CLI أو PowerShell أو مدخل Microsoft Azure.
  • أمثلة الاستعلام وأفضل الممارسات للاستعلام عن تغييرات الموارد.

المتطلبات الأساسية

فهم خصائص حدث التغيير

عند إنشاء مورد أو تحديثه أو حذفه، يُنشأ مورد تغيير جديد (Microsoft.Resources/changes) لتوسيع المورد المعدل وتمثيل الخصائص المُجرى تغييرها. يجب أن تتوفر سجلات التغيير في أقل من خمس دقائق. يوضح المثال التالي حمولة JSON خصائص مورد التغيير:

{
  "targetResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/microsoft.compute/virtualmachines/myVM",
  "targetResourceType": "microsoft.compute/virtualmachines",
  "changeType": "Update",
  "changeAttributes": {
    "previousResourceSnapshotId": "08584889383111245807_37592049-3996-ece7-c583-3008aef9e0e1_4043682982_1712668574",
    "newResourceSnapshotId": "08584889377081305807_38788020-eeee-ffff-028f-6121bdac9cfe_4213468768_1712669177",
    "correlationId": "04ff69b3-e162-4583-9cd7-1a14a1ec2c61",
    "changedByType": "User",
    "changesCount": 2,
    "clientType": "ARM Template",
    "changedBy": "john@contoso.com",
    "operation": "microsoft.compute/virtualmachines/write",
    "timestamp": "2024-04-09T13: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"
    }
  }
}

راجع الدليل المرجعي الكامل لتغيير خصائص المورد.

تشغيل استعلام

جرب استعلام Resource Graph المستند إلى المستأجر للجدول resourcechanges . يقوم الاستعلام بإرجاع أول أحدث خمسة تغييرات لمورد Azure بوقت التغيير ونوعه، ومعرف مورد الهدف ونوعه، وتفاصيل التغيير لكل سجل تغيير على حدة.

# 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'

يمكنك تحديث هذا الاستعلام لتحديد اسم عمود أكثر سهولة في الاستخدام لخاصية الطابع الزمني .

# 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'

للحد من نتائج الاستعلام إلى أحدث التغييرات، قم بتحديث الاستعلام إلى order by خاصية changeTime المعرفة من قبل المستخدم.

# 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'

يمكنك أيضا الاستعلام حسب مجموعة الإدارة أو الاشتراك باستخدام -ManagementGroup المعلمات أو -Subscription على التوالي.

إشعار

إذا لم يرجع الاستعلام نتائج من اشتراك لديك حق الوصول إليه بالفعل، فسيتم Search-AzGraph تعيين PowerShell cmdlet افتراضيا على الاشتراكات في السياق الافتراضي.

كما يوفر مستكشف Resource Graph واجهة نظيفة لتحويل نتائج بعض الاستعلامات إلى مخطط بياني يمكن تثبيته بلوحة معلومات Azure.

تغييرات موارد الاستعلام

باستخدام Resource Graph، يمكنك الاستعلام إما عن resourcechangesresourcecontainerchangesالجداول أو أو healthresourcechanges للتصفية أو الفرز حسب أي من خصائص مورد التغيير. تقوم الأمثلة التالية بالاستعلام عن resourcechanges الجدول، ولكن يمكن أيضا تطبيقها على resourcecontainerchanges الجدول أو healthresourcechanges .

إشعار

تعرف على المزيد حول البيانات في healthresourcechangesوثائق Project Flash.

الأمثلة

قبل الاستعلام عن التغييرات وتحليلها في مواردك، راجع أفضل الممارسات التالية.

  • الاستعلام عن أحداث التغيير خلال نافذة زمنية معينة وتقييم تفاصيل التغيير.
    • يعمل هذا الاستعلام بشكل أفضل أثناء إدارة الحوادث لفهم التغييرات المحتملة ذات الصلة.
  • احتفظ بقاعدة بيانات إدارة تكوين محدثة (CMDB).
    • بدلا من تحديث جميع الموارد ومجموعات الخصائص الكاملة الخاصة بها على تردد مجدول، ستتلقى تغييراتها فقط.
  • فهم الخصائص الأخرى التي ربما تم تغييرها عندما يغير المورد "حالة التوافق".
    • يمكن أن يوفر تقييم هذه الخصائص الإضافية نتيجة معرفية عن الخصائص الأخرى التي قد تحتاج إلى إدارتها عبر تعريف نهج Azure.
  • ترتيب أوامر الاستعلام مهم. في الأمثلة التالية، order by يجب أن يأتي قبل limit الأمر .
    • يقوم order by الأمر بطلب نتائج الاستعلام حسب وقت التغيير.
    • ثم يحد limit الأمر من النتائج مرتبة للتأكد من حصولك على أحدث خمس نتائج.

جميع التغييرات في فترة ال 24 ساعة الماضية

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

الموارد المحذوفة في مجموعة موارد معينة

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

التغييرات المُجراة على قيمة خاصية معينة

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

أحدث تغييرات الموارد للموارد التي تم إنشاؤها في الأيام السبعة الأخيرة

resourcechanges
| extend targetResourceId = tostring(properties.targetResourceId), changeType = tostring(properties.changeType), changeTime = todatetime(properties.changeAttributes.timestamp)
| where changeTime > ago(7d) and changeType == "Create"
| project  targetResourceId, changeType, changeTime
| join ( Resources | extend targetResourceId=id) on targetResourceId
| order by changeTime desc
| project changeTime, changeType, id, resourceGroup, type, properties

التغييرات في حجم الجهاز الظاهري

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

عدد التغييرات حسب نوع التغيير واسم الاشتراك

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  

أحدث تغييرات الموارد للموارد التي تم إنشاؤها باستخدام علامة معينة

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

الخطوات التالية