Sdílet prostřednictvím


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 navržená, ale někdy to není. Můžete provádět následující akce:

  • Zjistit, kdy byly změny detekovány vlastností 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 naučíte:

  • Jak vypadá JSON datové části.
  • Dotazování změn prostředků prostřednictvím Resource Graphu pomocí rozhraní příkazového řádku, PowerShellu nebo webu Azure Portal
  • Příklady dotazů a osvědčené postupy pro dotazování změn prostředků
  • 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 volána, například Microsoft.Compute/virtualmachines/write.

Požadavky

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ásledující příklad datové části JSON ukazuje vlastnosti změny 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",
      "changeCategory": "System",
      "propertyChangeType": "Update",
      "isTruncated": "true"
    },
    "tags.key1": {
      "newValue": "NewTagValue",
      "previousValue": "null",
      "changeCategory": "User",
      "propertyChangeType": "Insert"
    }
  }
}

Podívejte se na úplnou referenční příručku pro změnu vlastností prostředku.

Spuštění dotazu

Vyzkoušejte dotaz resourcechanges Resource Graphu na základě tenanta tabulky. 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 nebo předplatného -ManagementGroup s použitím parametrů nebo -Subscription parametrů.

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 resourcechangestabulku , resourcecontainerchangesnebo healthresourcechanges na tabulku, která má filtrovat nebo řadit podle libovolné vlastnosti prostředku změny. Následující příklady se dotazuje na resourcechanges tabulku, ale můžete ji použít i u resourcecontainerchanges tabulky.healthresourcechanges

Poznámka:

Další informace o datech healthresourcechanges najdete 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.

  • 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 aktuální databázi správy konfigurace (CMDB).
    • Místo aktualizace všech prostředků a jejich úplných sad vlastností v naplánované frekvenci 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é. V následujícíchpříkladch order bylimit
    • 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ě v klientovi, 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.
  • Co znamená systém ?
    • Systém se zobrazí jako changedBy hodnota, když došlo ke změně na pozadí, která nebyla korelována s žádnou přímou akcí uživatele.

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 a 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