Azure CLI: Azure Monitor Alert 일괄 생성 스크립트 Part.2 az monitor activity-log alert

Resource Health Alert

이전 메트릭 값을 이용한 알람 규칙을 작성했다. 이번에는 Activity log 를 이용하는 Resource Health 알람 규칙을 만든다. Part.1 에서 스크립트를 만들고 이번에는 조금만 코드를 수정하면 될 줄 작동할 것 같았지만, 명령어 구조가 많이 달랐기 때문에 이것 저것 손볼 부분이 많았다.

Resource health 알람 규칙 – Azure Portal

az monitor activity-log alert

준비 하기

https://github.com/jcy9033/azure-cli/tree/master/azureMonitor/activityLogAlert

  • Script file: main.ps1
  • CSV file: main.csv
Git hub 링크

참고용 Azure CLI 명령어

Microsoft Learn Documentation: https://learn.microsoft.com/en-us/cli/azure/monitor/activity-log/alert?view=azure-cli-latest

az monitor activity-log alert create

az monitor activity-log alert create --activity-log-alert-name
                                     --resource-group
                                     [--action-group]
                                     [--all-of]
                                     [--condition]
                                     [--description]
                                     [--disable {0, 1, f, false, n, no, t, true, y, yes}]
                                     [--scope]
                                     [--tags]
                                     [--webhook-properties]

CSV 구성 소개

Tip. 각 컬럼 값의 상세 설명은 Part.1 에서 설명함

  • AlertRuleName
  • Subscription
  • ResourceGroup
  • Subscription_User
  • ResourceGroup_User
  • ResourceName
  • EventStatus: *Activity-log alert 에서 사용하는 값
  • CurrentResourceStatus: *Activity-log alert 에서 사용하는 값
  • PreviousResourceStatus: *Activity-log alert 에서 사용하는 값
  • ReasonType: *Activity-log alert 에서 사용하는 값
  • ActionGroupName_1

Event Status

Tip. 기본값으로 Select all 이 설정된다.

이 값의 요구사항은 Active 만 지정할 것.

Current Resource Status

Tip. 기본값으로 Select all 이 설정된다.

이 값의 요구사항은 Degraded, Unavailable 만 지정할 것

Previous Resource Status

Tip. 기본값으로 Select all 이 설정된다.

Reason Type

Tip. 기본값으로 Select all 이 설정된다.

Script 구성 소개

Metric alert 스크립트와 공통 부분은 Skip

Create activity log alert

Activity-log 알람 규칙에 있어서 중요한 부분은 --condition 을 지정하는 방식이다.

Tip. –condition 이후의 값은 모두 String 으로 지정할 필요가 있다. 파워쉘에서 직접 명령어를 실행할 때와 결과가 달라서 시행착오가 많았던 부분.

  #----------------------------------------- Create activity log alert
  
  az monitor activity-log alert create --name $_.AlertRuleName --resource-group $_.ResourceGroup  `
    $ActionParams `
    --condition "category=ResourceHealth and $currentResourceConditionString and $eventConditionString and resourceType=$ResourceType and resourceId=$ResourceId"`
}

Event status conditions

  1. CSV에서 ; 를 기준으로 값을 구분한다. Ex) Active;Updated
    Tip. InProgress 의 경우 지정이 불가능했다. 이유는 모르겠는데, 버그인 것 같다.
  2. 첫 번째 Event Status 이후로 Event status 값이 존재할 경우 and 를 추가한다.
  3. eventStatus 가 공백일 때까지 Event status 값을 추가한다.
  #----------------------------------------- Event status conditions

  $eventStatusString = $_.EventStatus
  $eventStatuses = $eventStatusString -split ';'
  
  # Initialize the condition array
  $eventConditionArray = @()

  foreach ($eventStatus in $eventStatuses) {
    if ($eventStatus -ne "") {
      $eventConditionArray += "status=$eventStatus"
    }
  }

  # Join the condition array with ' and '
  $eventConditionString = $eventConditionArray -join " and "

  Write-Host "---> Event status: $eventConditionString"

Current resource status conditions

  1. Event Status 와 동일하게 값을 String으로 정렬한다.
    Tip. properties.currentHealthStatus로 입력해야 설정이 가능하다.
  #----------------------------------------- Current resource status conditions

  # The input string of current resource statuses
  $currentResourceStatus = $_.CurrentResourceStatus

  # Split the string into an array by ';'
  $currentResourceStatuses = $currentResourceStatus -split ';'

  # Initialize the condition array
  $currentResourceConditionArray = @()

  foreach ($status in $currentResourceStatuses) {
    if ($status -ne "") {
      $currentResourceConditionArray += "properties.currentHealthStatus=$status"
    }
  }

  # Join the condition array with ' and '
  $currentResourceConditionString = $currentResourceConditionArray -join " and "

  # Output the condition string
  Write-Host "---> Current resource status: $currentResourceConditionString"

Resource parameters

명령어 실행에 필요한 값을 추출한다. *Scope 범위를 제한하기 위한 값들이다.

  1. Resource Type
  2. Resource ID
    #----------------------------------------- Resource parameters

  $ResourceName = $_.ResourceName

  $ResourceType = (az resource list --query "[?name=='$ResourceName'].type" --output tsv).Trim()

  Write-Host "---> Resource type: $ResourceType"

  $ResourceId = (az resource list --query "[?name=='$ResourceName'].id" --output tsv).Trim()

  Write-Host "---> Resource scope: $ResourceId"

Script 실행 결과

PS C:\Users\cchi9\OneDrive\Vscode\azure-cli\azureMonitor\activityLogAlert> .\main.ps1
---> Already on the target subscription: Azure subscription 2
---> ActionGroupName_1 is set to: ag-1
---> ActionGroupName_2 is set to: ag-2
---> No more action groups to process for this object.
---> Event status: status=Active
---> Current resource status: properties.currentHealthStatus=Unavailable and properties.currentHealthStatus=Degraded
---> Resource type: Microsoft.Compute/virtualMachines
---> Resource scope: /subscriptions/0b5f5005-c30c-4a28-89c1-9457d0cd5e0f/resourceGroups/system-1/providers/Microsoft.Compute/virtualMachines/AZRWIN-1
{
  "actions": {
    "actionGroups": [
      {
        "actionGroupId": "/subscriptions/611a7ed8-17fa-480a-901d-d7084803c376/resourceGroups/core-1/providers/microsoft.insights/actiongroups/ag-1",
        "webhookProperties": {}
      },
      {
        "actionGroupId": "/subscriptions/611a7ed8-17fa-480a-901d-d7084803c376/resourceGroups/core-1/providers/microsoft.insights/actiongroups/ag-2",
        "webhookProperties": {}
      }
    ]
  },
  "condition": {
    "allOf": [
      {
        "equals": "ResourceHealth",
        "field": "category"
      },
      {
        "equals": "Unavailable",
        "field": "properties.currentHealthStatus"
      },
      {
        "equals": "Degraded",
        "field": "properties.currentHealthStatus"
      },
      {
        "equals": "Active",
        "field": "status"
      },
      {
        "equals": "Microsoft.Compute/virtualMachines",
        "field": "resourceType"
      },
      {
        "equals": "/subscriptions/0b5f5005-c30c-4a28-89c1-9457d0cd5e0f/resourceGroups/system-1/providers/Microsoft.Compute/virtualMachines/AZRWIN-1",
        "field": "resourceId"
      }
    ]
  },
  "enabled": true,
  "id": "/subscriptions/0b5f5005-c30c-4a28-89c1-9457d0cd5e0f/resourceGroups/system-1/providers/Microsoft.Insights/activityLogAlerts/test-1",
  "location": "Global",
  "name": "test-1",
  "resourceGroup": "system-1",
  "scopes": [
    "/subscriptions/0b5f5005-c30c-4a28-89c1-9457d0cd5e0f"
  ],
  "type": "Microsoft.Insights/ActivityLogAlerts"
}