Bicep을 사용하여 모니터링 리소스 만들기

Azure에는 애플리케이션 및 서비스를 모니터링할 수 있는 포괄적인 도구 모음이 있습니다. Bicep을 사용하여 프로그래밍 방식으로 모니터링 리소스를 만들어 Azure 인프라를 프로비저닝할 때 규칙, 진단 설정 및 경고 생성을 자동화할 수 있습니다.

Azure Portal 내에서 경고 규칙, 진단 설정 및 대시보드를 설정하는 데 사용할 수 있는 도구가 있다는 점을 고려할 때 모니터링 구성을 Bicep 코드로 가져오는 것은 드문 것처럼 보일 수 있습니다.

그러나 경고 및 진단 설정은 기본적으로 다른 인프라 리소스와 동일합니다. Bicep 코드에 포함하면 다른 Azure 리소스와 마찬가지로 경고 리소스를 배포하고 테스트할 수 있습니다.

Git 또는 다른 버전 제어 도구를 사용하여 Bicep 파일을 관리하는 경우 경고가 설정 및 구성된 방법을 확인할 수 있도록 모니터링 구성 기록을 사용할 수도 있습니다.

Log Analytics 및 Application Insights 작업 영역

Microsoft.OperationalInsights/workspaces 리소스 종류로 Log Analytics 작업 영역을 만들고 Microsoft.Insights/components 형식으로 Application Insights 작업 영역을 만들 수 있습니다. 이러한 두 구성 요소는 모두 리소스 그룹에 배포됩니다.

진단 설정

진단 설정을 사용하면 로그 및 메트릭을 Log Analytics 및 Azure Storage를 비롯한 여러 대상으로 내보내도록 Azure Monitor를 구성할 수 있습니다.

Bicep에서 진단 설정을 만들 때 이 리소스는 다른 리소스에 적용된다는 것을 의미하는 확장 리소스임을 기억하세요. 리소스 종류 Microsoft.Insights/diagnosticSettings를 사용하여 Bicep에서 진단 설정을 만들 수 있습니다.

Bicep에서 진단 설정을 만들 때 진단 설정의 범위를 적용해야 합니다. 진단 설정은 관리, 구독 또는 리소스 그룹 수준에서 적용할 수 있습니다. 이 리소스의 범위 속성을 사용하여 이 리소스의 범위를 설정합니다.

다음 예제를 참조하세요.

param location string = resourceGroup().location
param appPlanName string = '${uniqueString(resourceGroup().id)}asp'
param logAnalyticsWorkspace string = '${uniqueString(resourceGroup().id)}la'

var appPlanSkuName = 'S1'

resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' existing = {
  name: logAnalyticsWorkspace
}

resource appServicePlan 'Microsoft.Web/serverfarms@2021-03-01' = {
  name: appPlanName
  location: location
  sku: {
    name: appPlanSkuName
    capacity: 1
  } 
}

resource diagnosticLogs 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: appServicePlan.name
  scope: appServicePlan
  properties: {
    workspaceId: logAnalytics.id
    logs: [
      {
        category: 'AllMetrics'
        enabled: true
        retentionPolicy: {
          days: 30
          enabled: true 
        }
      }
    ]
  }
}

앞의 예제에서는 App Service 계획에 대한 진단 설정을 만들고 해당 진단을 Log Analytics로 보냅니다. scope 속성을 사용하여 App Service 계획을 진단 설정의 범위로 정의하고, workspaceId 속성을 사용하여 진단 로그를 보낼 Log Analytics 작업 영역을 정의할 수 있습니다. 진단 설정을 Event Hubs 및 Azure Storage 계정으로 내보낼 수도 있습니다.

로그 형식은 리소스마다 다르므로 내보내려는 로그가 사용 중인 리소스에 적용할 수 있는지 확인합니다.

활동 로그 진단 설정

Bicep을 사용하여 Azure 활동 로그를 내보내도록 진단 설정을 구성하려면 구독 범위에 진단 설정 리소스를 배포합니다.

다음 예제에서는 여러 활동 로그 유형을 Log Analytics 작업 영역으로 내보내는 방법을 보여 줍니다.

targetScope = 'subscription'

param logAnalyticsWorkspaceId string

var activityLogDiagnosticSettingsName = 'export-activity-log'

resource subscriptionActivityLog 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: activityLogDiagnosticSettingsName
  properties: {
    workspaceId: logAnalyticsWorkspaceId
    logs: [
      {
        category: 'Administrative'
        enabled: true
      }
      {
        category: 'Security'
        enabled: true
      }
      {
        category: 'ServiceHealth'
        enabled: true
      }
      {
        category: 'Alert'
        enabled: true
      }
      {
        category: 'Recommendation'
        enabled: true
      }
      {
        category: 'Policy'
        enabled: true
      }
      {
        category: 'Autoscale'
        enabled: true
      }
      {
        category: 'ResourceHealth'
        enabled: true
      }
    ]
  }
}

경고

경고는 Azure Monitor 내에서 데이터를 모니터링하여 Azure 인프라 및 애플리케이션 내에서 문제가 발견되면 사전에 알립니다. Bicep 코드 내에서 모니터링 및 경고 구성을 구성하면 Azure에서 프로비저닝하는 인프라와 함께 이러한 경고 만들기를 자동화할 수 있습니다.

Azure에서 경고가 작동하는 방식에 대한 자세한 내용은 Microsoft Azure의 경고 개요를 참조하세요.

다음 섹션에서는 Bicep 코드를 사용하여 다양한 유형의 경고를 구성하는 방법을 보여 줍니다.

작업 그룹

경고가 트리거될 때 알림을 받으려면 작업 그룹을 만들어야 합니다. 작업 그룹은 Azure 구독 소유자가 정의한 알림 우선 설정 컬렉션입니다. 작업 그룹은 경고가 트리거되었음을 사용자에게 알리거나 경고에 대한 자동화된 응답을 트리거하는 데 사용됩니다.

Bicep에서 작업 그룹을 만들려면 Microsoft.Insights/actionGroups 형식을 사용하면 됩니다. 예를 들어 다음과 같습니다.

param actionGroupName string = 'On-Call Team'
param location string = resourceGroup().location

var actionGroupEmail = 'oncallteam@contoso.com'

resource supportTeamActionGroup 'Microsoft.Insights/actionGroups@2023-01-01' = {
  name: actionGroupName
  location: location
  properties: {
    enabled: true
    groupShortName: actionGroupName
    emailReceivers: [
      {
        name: actionGroupName
        emailAddress: actionGroupEmail
        useCommonAlertSchema: true
      }
    ]
  }
}

앞의 예제에서는 메일 주소로 경고를 보내는 작업 그룹을 만들지만 Event Hubs, Azure Functions, Logic Apps 등에 경고를 보내는 작업 그룹을 정의할 수도 있습니다.

경고 처리 규칙

경고 처리 규칙(이전에는 작업 규칙이라고 함)을 사용하면 발생한 경고에 처리를 적용할 수 있습니다. Microsoft.AlertsManagement/actionRules 형식을 사용하여 Bicep에서 경고 처리 규칙을 만들 수 있습니다.

각 경고 처리 규칙에는 하나 이상의 특정 리소스, 특정 리소스 그룹 또는 전체 Azure 구독 목록이 될 수 있는 범위가 있습니다. Bicep에서 경고 처리 규칙을 정의할 때 경고 처리 규칙에 대한 해당 리소스를 대상으로 하는 범위 속성의 리소스 ID 목록을 정의합니다.

param alertRuleName string = 'AlertRuleName'
param actionGroupName string = 'On-Call Team'
param location string = resourceGroup().location

resource actionGroup 'Microsoft.Insights/actionGroups@2021-09-01' existing = {
  name: actionGroupName
}

resource alertProcessingRule 'Microsoft.AlertsManagement/actionRules@2021-08-08' = {
  name: alertRuleName
  location: location
  properties: {
    actions: [
      {
        actionType: 'AddActionGroups'
        actionGroupIds: [
          actionGroup.id
        ]
      }
    ]
    conditions: [
      {
        field: 'MonitorService'
        operator: 'Equals'
        values: [
          'Azure Backup'
        ]
      }
    ]
    enabled: true
    scopes: [
      subscription().id
    ]
  }
}

앞의 예제에서 Azure Backup Vault에 대한 MonitorService 경고 처리 규칙이 정의되어 기존 작업 그룹에 적용됩니다. 이 규칙은 작업 그룹에 대한 경고를 트리거합니다.

로그 경고 규칙

로그 경고는 Log Analytics 쿼리를 자동으로 실행합니다. 정의하는 간격으로 리소스 로그를 평가하는 데 사용되는 쿼리는 결과가 지정한 일부 조건을 충족하는지 확인한 다음 경고를 발생합니다.

Microsoft.Insights/scheduledQueryRules 형식을 사용하여 Bicep에서 로그 경고 규칙을 만들 수 있습니다.

메트릭 경고 규칙

메트릭 경고는 메트릭 중 하나가 정의된 임계값을 초과할 때 알립니다. Microsoft.Insights/metricAlerts 형식을 사용하여 Bicep 코드에서 메트릭 경고 규칙을 정의할 수 있습니다.

활동 로그 경고

Azure 활동 로그는 구독 수준에서 이벤트에 대한 인사이트를 제공하는 Azure의 플랫폼 로그입니다. 여기에는 Azure에서 리소스가 수정된 시간 등의 정보가 포함됩니다.

활동 로그 경고는 경고에 지정된 조건과 일치하는 새 활동 로그 이벤트가 발생할 때 활성화되는 경고입니다.

Microsoft.Insights/activityLogAlerts 형식 내에서 scope 속성을 사용하여 특정 리소스 또는 리소스 목록에 대한 활동 로그 경고를 만들 수 있습니다(리소스 ID를 접두사로 사용).

condition 속성 내에서 경고 규칙 조건을 정의한 다음 actionGroup 배열을 사용하여 이러한 경고를 트리거하도록 경고 그룹을 구성합니다. 여기에서 요구 사항에 따라 활동 로그 경고를 보내는 단일 또는 여러 작업 그룹을 전달할 수 있습니다.

param activityLogAlertName string = '${uniqueString(resourceGroup().id)}-alert'
param actionGroupName string = 'adminactiongroup'

resource actionGroup 'Microsoft.Insights/actionGroups@2021-09-01' existing = {
  name: actionGroupName
}

resource activityLogAlert 'Microsoft.Insights/activityLogAlerts@2020-10-01' = {
  name: activityLogAlertName
  location: 'Global'
  properties: {
    condition: {
      allOf: [
        {
          field: 'category'
          equals: 'Administrative'
        }
        {
          field: 'operationName'
          equals: 'Microsoft.Resources/deployments/write'
        }
        {
          field: 'resourceType'
          equals: 'Microsoft.Resources/deployments'
        }
      ]
    }
    actions: {
      actionGroups: [
        {
          actionGroupId: actionGroup.id
        }
      ]
    }
    scopes: [
      subscription().id
    ]
  }
}

리소스 상태 경고

Azure Resource Health는 Azure 리소스의 현재 및 과거 상태에 대한 정보를 알려줍니다. Bicep을 사용하여 리소스 상태 경고를 만들면 이러한 경고를 대량으로 만들고 사용자 지정할 수 있습니다.

Bicep에서 Microsoft.Insights/activityLogAlerts 형식으로 리소스 상태 경고를 만들 수 있습니다.

리소스 상태 경고는 구독, 리소스 그룹 또는 개별 리소스 수준에서 이벤트를 모니터링하도록 구성할 수 있습니다.

서비스 상태 경고를 보고하는 리소스 상태 경고를 만드는 다음 예제를 고려해 보세요. 경고는 구독 수준에서 적용되고(scope 속성 사용) 기존 작업 그룹에 경고를 보냅니다.

param activityLogAlertName string = uniqueString(resourceGroup().id)
param actionGroupName string = 'oncallactiongroup'

resource actionGroup 'Microsoft.Insights/actionGroups@2021-09-01' existing = {
  name: actionGroupName
}

resource resourceHealthAlert 'Microsoft.Insights/activityLogAlerts@2020-10-01' = {
  name: activityLogAlertName
  location: 'global'
  properties: {
    condition: {
      allOf: [
        {
          field: 'category'
          equals: 'ServiceHealth'
        }
      ]
    }
    scopes: [
      subscription().id
    ]
    actions: {
      actionGroups: [
        {
          actionGroupId: actionGroup.id
        }
      ]
    }
  }
}

스마트 감지 경고

스마트 검색을 사용하면 웹 애플리케이션의 잠재적인 성능 문제와 오류 이상을 경고할 수 있습니다. Microsoft.AlertsManagement/smartDetectorAlertRules 형식을 사용하여 Bicep에서 스마트 검색 경고를 만들 수 있습니다.

대시보드

Bicep에서 Microsoft.Portal/dashboards 리소스 종류를 사용하여 포털 대시보드를 만들 수 있습니다.

코드를 사용하여 대시보드 만들기에 대한 자세한 내용은 Azure 대시보드를 프로그래밍 방식으로 만들기를 참조하세요.

자동 크기 조정 규칙

자동 크기 조정 설정을 만들려면 Microsoft.Insights/autoscaleSettings 리소스 종류를 사용하여 정의합니다

자동 크기 조정 설정을 적용하려는 리소스를 대상으로 지정하려면 설정을 추가해야 하는 리소스의 대상 리소스 식별자를 제공해야 합니다.

이 예제에서는 10분 동안의 평균 CPU 백분율을 기준으로 App Service 계획의 스케일 아웃 조건입니다. App Service 계획이 10분 동안 평균 CPU 사용량의 70%를 초과하는 경우 자동 크기 조정 엔진은 하나의 인스턴스를 추가하여 계획을 확장합니다.

param location string = resourceGroup().location
param appPlanName string = '${uniqueString(resourceGroup().id)}asp'

var appPlanSkuName = 'S1'

resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: appPlanName
  location: location
  properties: {}
  sku: {
    name: appPlanSkuName
    capacity: 1
  }
}

resource scaleOutRule 'Microsoft.Insights/autoscalesettings@2022-10-01' = {
  name: appServicePlan.name
  location: location
  properties: {
    enabled: true
    profiles: [
      {
        name: 'Scale out condition'
        capacity: {
          maximum: '3'
          default: '1'
          minimum: '1'
        }
        rules: [
          {
            scaleAction: {
              type: 'ChangeCount'
              direction: 'Increase'
              cooldown: 'PT5M'
              value: '1'
            }
            metricTrigger: {
              metricName: 'CpuPercentage'
              operator: 'GreaterThan'
              timeAggregation: 'Average'
              threshold: 70
              metricResourceUri: appServicePlan.id
              timeWindow: 'PT10M'
              timeGrain: 'PT1M'
              statistic: 'Average'
            }
          }
        ]
      }
    ]
    targetResourceUri: appServicePlan.id
  }
}

참고 항목

자동 크기 조정 규칙을 정의할 때는 플래핑과 같은 자동 크기 조정을 시도할 때 발생하는 문제를 방지하기 위해 모범 사례를 염두에 두어야 합니다. 자세한 내용은 자동 크기 조정에 대한 모범 사례에 대한 다음 설명서를 참조하세요.