Resource Health Alert
이전 메트릭 값을 이용한 알람 규칙을 작성했다. 이번에는 Activity log
를 이용하는 Resource Health
알람 규칙을 만든다. Part.1 에서 스크립트를 만들고 이번에는 조금만 코드를 수정하면 될 줄 작동할 것 같았지만, 명령어 구조가 많이 달랐기 때문에 이것 저것 손볼 부분이 많았다.
az monitor activity-log alert
준비 하기
https://github.com/jcy9033/azure-cli/tree/master/azureMonitor/activityLogAlert
- Script file: main.ps1
- CSV file: main.csv
참고용 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_UserResourceGroup_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
- CSV에서
;
를 기준으로 값을 구분한다. Ex) Active;Updated
Tip. InProgress 의 경우 지정이 불가능했다. 이유는 모르겠는데, 버그인 것 같다. - 첫 번째 Event Status 이후로
Event status
값이 존재할 경우and
를 추가한다. -
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
- 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 범위를 제한하기 위한 값들이다.
- Resource Type
- 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"
}