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

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

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

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

  • كيف تبدو الحمولة JSON.
  • كيفية الاستعلام عن تغييرات الموارد من خلال Resource Graph باستخدام إما CLI أو PowerShell أو مدخل Microsoft Azure.
  • أمثلة الاستعلام وأفضل الممارسات للاستعلام عن تغييرات الموارد.
  • يستخدم تحليل التغيير وظيفة Change Actor :
    • changedBy: من بدأ تغييرا في موردك، مثل معرف التطبيق أو عنوان البريد الإلكتروني للشخص المخول.
    • clientType: العميل الذي أجرى التغيير، مثل مدخل Microsoft Azure.
    • operation: العملية التي تم استدعاؤها، مثل Microsoft.Compute/virtualmachines/write.

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

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

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

{
  "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"
    }
  }
}

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

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

جرب استعلام 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 الأمر من النتائج مرتبة للتأكد من حصولك على أحدث خمس نتائج.
  • ماذا يعني غير معروف ؟ 
    • يتم عرض غير معروف عند حدوث التغيير على عميل غير معروف. يتم التعرف على العملاء استنادا إلى عامل المستخدم ومعرف تطبيق العميل المرتبط بطلب التغيير الأصلي.
  • ماذا يعني النظام؟
    • يتم عرض النظام كقيمة changedBy عند حدوث تغيير في الخلفية لم يكن مرتبطا بأي إجراء مستخدم مباشر.

جميع التغييرات في فترة ال 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 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 

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

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

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