Získání změn prostředků

Prostředky se mění v průběhu denního používání, rekonfigurace a dokonce i opětovného nasazení. Většina změn je záměrná, ale někdy tomu tak není. Můžete:

  • Zjistěte, kdy byly zjištěny změny ve vlastnosti Azure Resource Manageru.
  • Umožňuje zobrazit podrobnosti o změně vlastnosti.
  • Dotazování změn ve velkém měřítku napříč předplatnými, skupinou pro správu nebo tenantem

V tomto článku se dozvíte:

  • Jak vypadá JSON zatížení.
  • Jak dotazovat změny prostředků pomocí Resource Graph s využitím CLI, PowerShellu nebo portálu Azure.
  • Příklady dotazů a osvědčené postupy pro dotazování na změny v prostředcích.
  • Analýza změn používá funkci objektu Change Actor :
    • changedBy: Kdo inicioval změnu ve vašem prostředku, například ID aplikace nebo e-mailovou adresu autorizované osoby.
    • clientType: Který klient provedl změnu, jako je Azure Portal.
    • operation: Která operace byla použita, jako například Microsoft.Compute/virtualmachines/write. Pole operation v prostředku představují změnu dat a označují oprávnění řízení přístupu založená na rolích v Azure, která se používají k zahájení změny.

Prerequisites

Vysvětlení vlastností událostí změn

Když se prostředek vytvoří, aktualizuje nebo odstraní, vytvoří se nový prostředek změny (Microsoft.Resources/changes), který rozšíří upravený prostředek a představuje změněné vlastnosti. Záznamy změn by měly být dostupné za méně než pět minut. Některé podrobnosti o změnách se můžou zobrazit před ostatními. Následující příklad datové části JSON ukazuje změnu vlastností prostředku:

{
  "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",
      "isTruncated": "true"
    },
    "tags.key1": {
      "newValue": "NewTagValue",
      "previousValue": "null",
    }
  }
}

Podívejte se na úplnou referenční příručku jak změnit vlastnosti zdroje.

Pole operation v prostředku představují změnu dat a označují oprávnění řízení přístupu založená na rolích v Azure, která se používají k zahájení změny. Toto pole vždy nepopisuje skutečnou operaci, ale spíše oprávnění (autorizační akci), která byla použita. Například Microsoft.Compute/virtualmachines/write odpovídá oprávnění pro operaci PUT/providers/Microsoft.Compute/virtualmachines.

Pro pochopení typu změny zachycené v prostředku (tj. vytvoření, odstranění, aktualizace) doporučujeme použít pole changeType místo pole operation, které představuje oprávnění řízení přístupu na základě role v Azure použitá k zahájení změny.

Pokud je typ klienta známý, zobrazí se clientType v poli název klienta, například Azure Portal. Pokud je klient zadán, ale není znám, zobrazí se v poli ID klientské aplikace.

Poznámka

Snímky v současnosti nejsou podporovány pro odstraněné zdroje. Pro záznamy s changeType: Delete je changesCount zobrazeno jako 0, protože zdroj jako takový je smazán a žádné vlastnosti nezůstanou. Pro záznamy s changeType: Vytvořit se changesCount také zobrazí jako 0, protože každá vlastnost prostředku je během vytváření prostředku změněna a protokolování každé změny by způsobilo příliš mnoho šumu.

Při zavedení nových vlastností se nezobrazí jako změny. K tomu může dojít například v případě, že nová verze rozhraní API zavádí nové vlastnosti. Podobně pokud se do značek přidají nové klíče bez jakýchkoli hodnot, tyto změny se nezobrazí.

Spusť dotaz

Vyzkoušejte dotaz Resource Graphu založený na nájemci v tabulce resourcechanges. Dotaz vrátí prvních pět posledních změn prostředků Azure s časem změny, typem změn, ID cílového prostředku, typem cílového prostředku a podrobnostmi o změnách jednotlivých záznamů změn.

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

Tento dotaz můžete aktualizovat tak, aby pro vlastnost časového razítka zadal uživatelsky přívětivější název sloupce.

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

Pokud chcete omezit výsledky dotazu na nejnovější změny, aktualizujte dotaz na order by vlastnost definovanou changeTime uživatelem.

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

Dotaz můžete také provést podle skupiny pro správu s parametrem -ManagementGroup nebo podle předplatného s parametrem -Subscription.

Poznámka

Pokud dotaz nevrací výsledky z předplatného, ke které už máte přístup, Search-AzGraph rutina PowerShellu se ve výchozím kontextu nastaví na předplatná.

Resource Graph Explorer také poskytuje čisté rozhraní pro převod výsledků některých dotazů na graf, který je možné připnout na řídicí panel Azure.

Dotazování změn prostředků

Pomocí Resource Graphu se můžete dotazovat buď na tabulky resourcechanges, resourcecontainerchanges, nebo healthresourcechanges a filtrovat či řadit podle libovolné vlastnosti zdroje změn. Následující příklady se dotazují na resourcechanges tabulku, ale mohou být také použity pro resourcecontainerchanges nebo healthresourcechanges tabulku.

Poznámka

Další informace o datech healthresourcechangesnajdete v dokumentaci k Projectu Flash.

Příklady

Před dotazováním a analýzou změn ve vašich prostředcích si projděte následující osvědčené postupy a definice.

  • Zadejte dotaz na události změn během určitého časového období a vyhodnoťte podrobnosti o změnách.
    • Tento dotaz funguje nejlépe během správy incidentů, aby porozuměl potenciálně souvisejícím změnám.
  • Udržujte databázi správy konfigurace (CMDB) aktuální.
    • Místo aktualizace všech prostředků a jejich úplných sad vlastností v pravidelných intervalech obdržíte pouze jejich změny.
  • Zjistěte, které další vlastnosti se změnily, když prostředek změní stav dodržování předpisů.
    • Vyhodnocení těchto dodatečných vlastností může poskytnout přehled o dalších vlastnostech, které může být potřeba spravovat prostřednictvím definice služby Azure Policy.
  • Pořadí příkazů dotazu je důležité. Ve následujících příkladech musí order by přijít před příkazem limit.
    • Příkaz order by vyřídí výsledky dotazu podle času změny.
    • Příkaz limit pak omezí seřazené výsledky, aby se zajistilo, že získáte pět nejnovějších výsledků.
  • Co znamená Neznámý ? 
    • "Neznámý" se zobrazí, když došlo ke změně u klienta, který není rozpoznán. Klienti se rozpoznají na základě uživatelského agenta a ID klientské aplikace přidružené k původní žádosti o změnu. V tomto případě se informace o identitě nebo klientovi vyskytovaly, ale neodpovídají žádnému známému klientovi.
    • Jako hodnota clientType může být zobrazena "neznámá".
  • Co znamená nezadaná hodnota? 
    • Pokud nebyla pro změnu k dispozici žádná identita nebo informace o klientovi, zobrazí se "Není zadáno". Událost oznámení nepřenesla žádné changedBy, ID klientské aplikace ani informace o uživatelském agentu a systémová metadata prostředku také neobsahovala hodnotu pro lastModifiedBy nebo createdBy.
    • Pro hodnoty changedBy, changedByType, clientType a operation lze zobrazit "nezadané".
  • Co znamená systém ?
    • "Systém" se zobrazí, když došlo ke změně platformy na pozadí, která nebyla korelována s žádnou přímou akcí uživatele.
    • "Systém" se dá zobrazit pro hodnoty changedBy a changedByType.

Všechny změny za posledních 24 hodin

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

Prostředky odstraněné v konkrétní skupině prostředků

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

Změny konkrétní hodnoty vlastnosti

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

Změny za posledních 7 dnů podle toho, kdo je který klient, a seřazené podle počtu

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 

Změny velikosti virtuálního počítače

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

Počet změn podle typu změny a názvu předplatného

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  

Nejnovější změny prostředků pro prostředky vytvořené s určitou značkou

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

Další kroky