共用方式為


使用 Resource Manager 範本設定資源健康狀態警示

本文說明如何使用 Azure Resource Manager 範本和 Azure PowerShell,以程式設計方式建立 資源健康狀態 活動記錄警示。

Azure 資源健康狀態會隨時通知您 Azure 資源目前和過去的健康狀態。 Azure 資源健康狀態警示會在這些資源的健康狀態變更時,以近乎即時的方式通知您。 以程式設計方式建立資源健康狀態警示,讓使用者能夠建立並自訂大量警示。

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 若要開始使用,請參閱安裝 Azure PowerShell (部分機器翻譯)。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

必要條件

若要遵循此頁面上的指示,您必須事先設定一些事項:

  1. 安裝 Azure PowerShell 模組
  2. 建立或重複使用設定為通知您的動作群組

指示

  1. 使用 PowerShell 使用您的帳戶登入 Azure,然後選取您想要與其互動的訂用帳戶。

    Login-AzAccount
    Select-AzSubscription -Subscription <subscriptionId>
    

    注意

    您可以使用 Get-AzSubscription 來列出您有權存取的訂用帳戶。

  2. 尋找並儲存動作群組的完整 Azure Resource Manager 識別符。

    (Get-AzActionGroup -ResourceGroupName <resourceGroup> -Name <actionGroup>).Id
    
  3. 建立 Resource Manager 範本,並將 資源健康狀態 警示的範本儲存為resourcehealthalert.json,請參閱 資源健康狀態 警示的 Resource Manager 範本選項。

  4. 使用此範本建立新的 Azure Resource Manager 部署。

    New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName <resourceGroup> -TemplateFile <path\to\resourcehealthalert.json>
    
  5. 系統會提示您輸入稍早複製的 [警示名稱] 和 [動作群組資源識別符]:

    Supply values for the following parameters:
    (Type !? for Help.)
    activityLogAlertName: <Alert Name>
    actionGroupResourceId: /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/microsoft.insights/actionGroups/<actionGroup>
    
  6. 如果一切順利運作,您會在PowerShell中取得確認。

    DeploymentName          : ExampleDeployment
    ResourceGroupName       : <resourceGroup>
    ProvisioningState       : Succeeded
    Timestamp               : 11/8/2017 2:32:00 AM
    Mode                    : Incremental
    TemplateLink            :
    Parameters              :
                            Name                     Type       Value
                            ===============          =========  ==========
                            activityLogAlertName     String     <Alert Name>
                            activityLogAlertEnabled  Bool       True
                            actionGroupResourceId    String     /...
    
    Outputs                 :
    DeploymentDebugLogLevel :
    

如果您打算完全自動化此程式,只需要編輯 Resource Manager 範本,才能在步驟 5 中提示值。

用於資源健康狀態警示的 Resource Manager 範本選項

您可以使用這個基底範本,做為建立資源健康狀態警示的起點。 此範本的運作方式是撰寫的,並註冊您,以接收訂用帳戶中所有資源中所有新啟動之資源健康情況事件的警示。

注意

我們也會在本文底部提供一個更複雜的警示範本,相較於此範本,該範本應該會提高資源健康狀態警示的訊號雜訊比率。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "activityLogAlertName": {
      "type": "string",
      "metadata": {
        "description": "Unique name (within the Resource Group) for the Activity log alert."
      }
    },
    "actionGroupResourceId": {
      "type": "string",
      "metadata": {
        "description": "Resource Id for the Action group."
      }
    }
  },
  "resources": [   
    {
      "type": "Microsoft.Insights/activityLogAlerts",
      "apiVersion": "2017-04-01",
      "name": "[parameters('activityLogAlertName')]",      
      "location": "Global",
      "properties": {
        "enabled": true,
        "scopes": [
            "[subscription().id]"
        ],        
        "condition": {
          "allOf": [
            {
              "field": "category",
              "equals": "ResourceHealth"
            },
            {
              "field": "status",
              "equals": "Active"
            }
          ]
        },
        "actions": {
          "actionGroups":
          [
            {
              "actionGroupId": "[parameters('actionGroupResourceId')]"
            }
          ]
        }
      }
    }
  ]
}

不過,通常不建議使用與此類似的廣泛警示。 在下一節中,您將瞭解如何縮小此警示的範圍,以專注於我們關心的事件。

調整警示範圍

資源健康狀態警示可設定來監視三個不同範圍的事件:

  • 訂用帳戶層級
  • 資源群組層級
  • 資源層級

警示範本是在訂用帳戶層級設定,但如果您想要設定警示,只通知您特定資源群組中的特定資源或資源,則只需要修改scopes此範本中的區段。

如果是資源群組層級範圍,scopes 區段應該看起來如下:

"scopes": [
    "/subscriptions/<subscription id>/resourcegroups/<resource group>"
],

此外,如果是資源層級範圍,則 scope 區段應該看起來如下:

"scopes": [
    "/subscriptions/<subscription id>/resourcegroups/<resource group>/providers/<resource>"
],

例如:"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/myRG/providers/microsoft.compute/virtualmachines/myVm"

注意

您可以移至 Azure 入口網站,並在檢視 Azure 資源以取得此字串時查看 URL。

調整要警示您的資源類型

位於訂用帳戶或資源群組層級的警示可能具有不同種類的資源。 如果您想要將警示限制為只來自特定子集的資源類型,您可以在範本的 condition 區段中定義該情況,如下:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "resourceType",
                    "equals": "MICROSOFT.COMPUTE/VIRTUALMACHINES",
                    "containsAny": null
                },
                {
                    "field": "resourceType",
                    "equals": "MICROSOFT.STORAGE/STORAGEACCOUNTS",
                    "containsAny": null
                },
                ...
            ]
        }
    ]
},

我們在這裡使用 anyOf 包裝函式,讓資源健康情況警示能夠符合我們所指定的任何一個條件,從而允許用於目標為特定資源類型的警示。

調整要警示您的資源健康狀態事件

當資源經歷健康情況事件時,它們會經過一系列代表健康情況事件狀態的階段:ActiveIn ProgressUpdatedResolved

您可能只想在資源變為狀況不良時收到通知,在此情況下,您希望將警示設定為只有在 statusActive 時才進行通知。 但是,如果您也想要在其他階段收到通知,您可以新增如下的詳細資料:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "status",
                    "equals": "Active"
                },
                {
                    "field": "status",
                    "equals": "In Progress"
                },
                {
                    "field": "status",
                    "equals": "Resolved"
                },
                {
                    "field": "status",
                    "equals": "Updated"
                }
            ]
        }
    ]
}

如果您想要收到健康情況事件所有四個階段的通知,您可以一起移除此條件,而且警示會通知您,而不論 屬性為何 status

注意

每個 "anyOf" 區段應該只包含一個欄位類型值。

調整資源健康狀態警示以避免「未知」事件

Azure 資源健康狀態 可以使用測試執行器來持續監視資源的最新健康情況。 相關的報告健康狀態為: AvailableUnavailableDegraded。 不過,在執行器和 Azure 資源無法通訊的情況下, Unknown 資源會報告健康情況狀態,並被視為「作用中」健康情況事件。

不過,當資源報告 Unknown時,其健康情況狀態可能自上次正確報告后尚未變更。 如果您想要排除事件上的 Unknown 警示,您可以在範本中指定該邏輯:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Available",
                    "containsAny": null
                },
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Unavailable",
                    "containsAny": null
                },
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Degraded",
                    "containsAny": null
                }
            ]
        },
        {
            "anyOf": [
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Available",
                    "containsAny": null
                },
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Unavailable",
                    "containsAny": null
                },
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Degraded",
                    "containsAny": null
                }
            ]
        },
    ]
},

在此範例中,我們只會在目前和先前的健康狀態沒有 Unknown的事件上通知。 如果您的警示會直接傳送到您的行動電話或電子郵件,則此變更可能是很有用的新增項目。

在某些事件中,和 previousHealthStatus 屬性有可能currentHealthStatus為 Null。 例如,當發生 Updated 事件時,資源的健康情況狀態可能自上次報告後尚未變更,只有更多事件資訊可用(例如,原因)。 因此,在此範例中使用 子句可能會導致某些警示未觸發,因為 properties.currentHealthStatusproperties.previousHealthStatus 值會設定為 null。

調整警示以避免使用者起始的事件

資源健康狀態事件可以透過平台初始化和使用者初始化的事件來觸發。 只有健康情況事件是由 Azure 平台所導致時才傳送通知,這或許是可行的。

您可以輕鬆地將警示設定為只篩選這些種類的事件:

"condition": {
    "allOf": [
        ...,
        {
            "field": "properties.cause",
            "equals": "PlatformInitiated",
            "containsAny": null
        }
    ]
}

在某些事件中,原因欄位可能是 Null。 也就是說,會進行健康情況轉換(例如,可供無法使用),並立即記錄事件,以防止通知延遲。 因此,在此範例中使用 子句可能會導致警示未觸發,因為 properties.cause 屬性值會設定為 null。

完整資源健康狀態警示範本

以下是使用上一節所述的調整來設定的範例範本,以將訊號與雜訊比率最大化。 請記住上述注意事項, currentHealthStatus其中、 previousHealthStatus和 會導致屬性值在某些事件中可能是 Null。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "activityLogAlertName": {
            "type": "string",
            "metadata": {
                "description": "Unique name (within the Resource Group) for the Activity log alert."
            }
        },
        "actionGroupResourceId": {
            "type": "string",
            "metadata": {
                "description": "Resource Id for the Action group."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Insights/activityLogAlerts",
            "apiVersion": "2017-04-01",
            "name": "[parameters('activityLogAlertName')]",
            "location": "Global",
            "properties": {
                "enabled": true,
                "scopes": [
                    "[subscription().id]"
                ],
                "condition": {
                    "allOf": [
                        {
                            "field": "category",
                            "equals": "ResourceHealth",
                            "containsAny": null
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Available",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Unavailable",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Degraded",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Available",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Unavailable",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Degraded",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.cause",
                                    "equals": "PlatformInitiated",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "status",
                                    "equals": "Active",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "Resolved",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "In Progress",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "Updated",
                                    "containsAny": null
                                }
                            ]
                        }
                    ]
                },
                "actions": {
                    "actionGroups": [
                        {
                            "actionGroupId": "[parameters('actionGroupResourceId')]"
                        }
                    ]
                }
            }
        }
    ]
}

不過,您最好知道哪些組態對您有效,因此請使用本檔中教導您的工具來進行自己的自定義。

下一步

深入了解資源健康狀態:

建立服務健康狀態警示: