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 で診断設定を作成する場合、このリソースは拡張リソースであり、つまり、別のリソースに適用されることに注意してください。 Bicep で診断設定を作成するには、リソースの種類 Microsoft.Insights/diagnosticSettings を使用します。

Bicep で診断設定を作成する場合は、診断設定のスコープを適用する必要があります。 この診断設定は、管理、サブスクリプション、またはリソース グループのレベルで適用できます。 このリソースの scope プロパティを使用して、このリソースのスコープを設定します

次に例を示します。

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 などにアラートを送信するアクション グループを定義することもできます。

アラート処理ルール

アラート処理ルール (以前はアクション ルールと呼ばれていました) を使用すると、発生したアラートに処理を適用できます。 Bicep で種類 Microsoft.AlertsManagement/actionRules を使用してアラート処理ルールを作成できます。

各アラート処理ルールにはスコープがあります。これは、1 つ以上の特定のリソース、特定のリソース グループ、または Azure サブスクリプション全体の一覧にすることができます。 Bicep でアラート処理ルールを定義する場合は、アラート処理ルールのリソースを対象とする scope プロパティでリソース 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 コンテナーの MonitorService アラート処理ルールが定義されます。これは既存のアクション グループに適用されます。 このルールは、アクション グループに対するアラートをトリガーします。

ログ アラート ルール

ログ アラートでは、Log Analytics クエリが自動的に実行されます。 定義した間隔でリソース ログを評価するのに使用されるクエリは、結果が指定の条件を満たしているかどうかを判別してから、アラートを発生させます。

種類 Microsoft.Insights/scheduledQueryRules を使用して、Bicep でログ アラート ルールを作成できます。

メトリック アラート ルール

メトリック アラートは、メトリックのいずれかが指定のしきい値を超えたときに通知します。 種類 Microsoft.Insights/metricAlerts を使用して、Bicep コードでメトリック アラート ルールを定義できます。

アクティビティ ログ アラート

Azure アクティビティ ログは、Azure のプラットフォーム ログであり、サブスクリプション レベルのイベントの分析情報をもたらします。 これには、Azure のリソースが変更されたときなどの情報が含まれます。

アクティビティ ログ アラートは、アラートで指定した条件に一致するアクティビティ ログ イベントが新たに発生したときにアクティブになるアラートです。

種類 Microsoft.Insights/activityLogAlerts 内で scope プロパティを使用すると、リソース ID をプレフィックスとして使用して、特定のリソースまたはリソースの一覧でアクティビティ ログ アラートを作成できます。

condition プロパティ内でアラート ルールの条件を定義してから、actionGroup 配列を使用してこれらのアラートをトリガーするようにアラート グループを構成します。 ここでは、要件に応じて、アクティビティ ログ アラートを送信する先の 1 つまたは複数のアクション グループを渡すことができます。

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
        }
      ]
    }
  }
}

スマート検出アラート

スマート検出アラートにより、Web アプリケーションの潜在的なパフォーマンスの問題や失敗の異常に関する警告を受け取ることができます。 種類 Microsoft.AlertsManagement/smartDetectorAlertRules を使用して Bicep でスマート検出アラートを作成できます。

ダッシュボード

Bicep で、リソースの種類 Microsoft.Portal/dashboards を使用してポータル ダッシュボードを作成できます。

コードを使用したダッシュボードの作成について詳しくは、「プログラムによる Azure ダッシュボードの作成」をご覧ください。

自動スケール ルール

自動スケール設定を作成するには、リソースの種類 Microsoft.Insights/autoscaleSettings を使用して定義します。

自動スケール設定を適用するリソースをターゲットにするには、設定を追加する先のリソースのターゲット リソース識別子を指定する必要があります。

この例では、10 分間の平均 CPU 使用率に基づくApp Service プランの "スケールアウト" 条件です。 App Service プランが 10 分間で平均 CPU 消費量の 70% を超えた場合、自動スケール エンジンは 1 つのインスタンスを追加してプランをスケールアウトします。

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
  }
}

注意

自動スケール ルールを定義するときは、フラッピングなど、自動スケールを試みる際の問題を回避するためのベスト プラクティスに留意してください。 詳細については、自動スケールのベスト プラクティスに関する次のドキュメントを参照してください。