다음을 통해 공유


Resource Manager 템플릿을 사용하여 리소스 상태 경고 구성

이 문서에서는 Azure Resource Manager 템플릿 및 Azure PowerShell을 사용하여 프로그래밍 방식으로 Resource Health 활동 로그 경고를 만드는 방법을 보여 줍니다.

Azure Resource Health는 Azure 리소스의 현재 및 과거 상태에 대한 정보를 알려줍니다. Azure Resource Health 경고는 이러한 리소스의 상태가 변경되면 거의 실시간으로 알려줍니다. Resource Health 경고를 프로그래밍 방식으로 만들면 사용자가 경고를 대량으로 생성하고 사용자 지정할 수 있습니다.

참고 항목

Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

필수 조건

이 페이지의 지침을 따르려면 몇 가지를 미리 설정해야 합니다.

  1. Azure PowerShell 모듈을 설치합니다.
  2. 알림하도록 구성된 작업 그룹을 만들거나 다시 사용합니다.

지침

  1. PowerShell을 사용하여 계정을 사용하여 Azure에 로그인하고 상호 작용할 구독을 선택합니다.

    Login-AzAccount
    Select-AzSubscription -Subscription <subscriptionId>
    

    참고 항목

    Get-AzSubscription을 사용하면 액세스 권한이 있는 구독을 나열할 수 있습니다.

  2. 작업 그룹에 대한 전체 Azure Resource Manager ID를 찾아 저장합니다.

    (Get-AzActionGroup -ResourceGroupName <resourceGroup> -Name <actionGroup>).Id
    
  3. Resource Health 경고에 대한 Resource Manager 템플릿을 만들고 resourcehealthalert.json 저장합니다. Resource Health 경고에 대한 Resource Manager 템플릿 옵션을 참조 하세요.

  4. 이 템플릿을 사용하여 새 Azure Resource Manager 배포를 만듭니다.

    New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName <resourceGroup> -TemplateFile <path\to\resourcehealthalert.json>
    
  5. 앞에서 복사한 경고 이름 및 작업 그룹 리소스 ID를 입력하라는 메시지가 표시됩니다.

    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 :
    

이 프로세스를 완전히 자동화하려는 경우 5단계에서 값을 묻는 메시지를 표시하지 않도록 Resource Manager 템플릿을 편집하기만 하면 됩니다.

Resource Health 경고를 위한 Resource Manager 템플릿 옵션

이러한 기본 템플릿을 Resource Health 경고를 작성하는 시작점으로 사용할 수 있습니다. 이 템플릿은 기록된 대로 작동하며 구독의 모든 리소스에서 새로 활성화된 모든 리소스 상태 이벤트에 대한 경고를 수신하도록 등록합니다.

참고 항목

이 문서의 맨 아래에는 이 템플릿에 비해 Resource Health 경고의 신호 대 노이즈 비율을 높여야 하는 더 복잡한 경고 템플릿도 포함되어 있습니다.

{
  "$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')]"
            }
          ]
        }
      }
    }
  ]
}

하지만 이와 같이 광범위한 경고는 일반적으로 권장되지 않습니다. 다음 섹션에서는 이 경고의 범위를 축소하여 관심 있는 이벤트에 초점을 맞추는 방법을 알아봅니다.

경고 범위 조정

Resource Health 경고는 세 가지 다른 범위에서 이벤트를 모니터링하도록 구성할 수 있습니다.

  • 구독 수준
  • 리소스 그룹 수준
  • 리소스 수준

경고 템플릿은 구독 수준에서 구성되지만 특정 리소스 또는 특정 리소스 그룹 내의 리소스에 대해서만 알리도록 경고를 구성하려면 이 템플릿scopes 섹션을 수정하기만 하면 됩니다.

리소스 그룹 수준 범위에 대한 범위 섹션은 다음과 같아야 합니다.

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

리소스 수준 범위에 대한 범위 섹션은 다음과 같아야 합니다.

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

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

참고 항목

Azure Portal로 이동하여 Azure 리소스를 볼 때 URL을 확인하여 이 문자열을 가져올 수 있습니다.

경고를 표시하는 리소스 유형 조정

구독 또는 리소스 그룹 수준의 경고에는 여러 종류의 리소스가 있을 수 있습니다. 리소스 유형의 특정 하위 집합에서만 경고를 보내도록 제한하려는 경우, 템플릿의 condition 섹션에서 다음과 같이 정의할 수 있습니다.

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

여기서 우리는 anyOf 래퍼를 사용하여 리소스 상태 경고가 지정된 조건 중 하나와 일치하도록 허용하여 특정 리소스 유형을 대상으로 하는 경고를 허용합니다.

경고를 표시하는 Resource Health 이벤트 조정

리소스에 상태 이벤트가 발생하는 경우 상태 이벤트의 상태를 나타내는 일련의 단계(Active, In Progress, UpdatedResolved)를 거칠 수 있습니다.

리소스 상태가 비정상이 되는 경우에만 알림을 받으려는 경우에는 statusActive인 경우에만 알리도록 경고를 구성할 수 있습니다. 하지만 다른 단계에서도 알림을 받으려면 다음과 같이 세부 정보를 추가할 수 있습니다.

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

상태 이벤트의 4단계 모두에 대해 알림을 받으려면 이 조건을 모두 함께 제거할 수 있으며 경고는 속성에 관계없이 status 사용자에게 알릴 수 있습니다.

참고 항목

각 ‘anyOf’ 섹션에는 하나의 필드 형식 값만 포함되어야 합니다.

"알 수 없음" 이벤트를 방지하기 위해 Resource Health 경고 조정

Azure Resource Health는 테스트 실행기를 사용하여 지속적으로 모니터링하여 리소스의 최신 상태를 보고할 수 있습니다. 보고된 관련 상태는 다음과 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일 수 있습니다. 예를 들어 업데이트된 이벤트가 발생하면 마지막 보고서 이후 리소스의 상태가 변경되지 않은 것일 수 있으며, 더 많은 이벤트 정보만 사용할 수 있습니다(예: 원인). 따라서 이 예제에서 절을 사용하면 값과 properties.previousHealthStatus 값이 null로 설정되므로 일부 경고가 properties.currentHealthStatus 트리거되지 않을 수 있습니다.

사용자가 시작한 이벤트를 방지하도록 경고 조정

Resource Health 이벤트는 플랫폼이 시작한 이벤트와 사용자가 시작한 이벤트에 의해 트리거될 수 있습니다. 상태 이벤트가 Azure 플랫폼에서 발생한 경우에만 알림을 보내는 것이 합리적일 수 있습니다.

이러한 종류의 이벤트만 필터링하도록 경고를 구성하기는 쉽습니다.

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

일부 이벤트에서는 원인 필드가 null일 수 있습니다. 즉, 상태 전환이 수행되고(예: 사용할 수 없음) 알림 지연을 방지하기 위해 이벤트가 즉시 기록됩니다. 따라서 이 예제에서 절을 사용하면 속성 값이 null로 설정되므로 경고가 properties.cause 트리거되지 않을 수 있습니다.

완전한 Resource Health 경고 템플릿

다음은 신호 대 노이즈 비율을 최대화하기 위해 이전 섹션에서 설명한 조정을 사용하여 구성된 샘플 템플릿입니다. 위에서 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')]"
                        }
                    ]
                }
            }
        }
    ]
}

그러나 어떤 구성이 효과적인지 가장 잘 알고 있으므로 이 설명서에서 가르쳐 준 도구를 사용하여 사용자 지정을 수행합니다.

다음 단계

Resource Health에 대해 알아봅니다.

Service Health 경고 만들기: