Bicep を利用して Azure Arc-enabled servers を Azure Monitor Agent + VM Insights な環境に登録する

azure arc
Published: 2022-11-17

はじめに

Log Analytics Agent の廃止を踏まえて、Azure Portal をポチポチすることで Azure Monitor Agent 版の VM Insights を有効化できるようになりました。

VM Insights の設定画面

ポータルからポチポチできるのはとても便利なのですが、裏で自動的に設定が入るため何が実行されているのかいまいち分かりません。というわけで Bicep を利用して VM Insights を有効化することで、どのような設定が必要なのかを細かく確認しました。

現状

Azure Arc Private Link Scope と Azure Monitor Private Link Scope を利用して、可能な限り閉域化された環境を用意しました。この環境に存在する Azure Arc-enabled な Ubuntu20.04 の Linux サーバを Azure Monitor Agent + VM Insights な環境に登録します。

現状の構成

拡張機能のインストール

Azure Monitor Agent と VM Insights の マップ機能に必要な Dependency Agent は拡張機能としてインストールされます。したがって、次のような Bicep ファイルによって、対象サーバに対して2つの拡張機能をインストールできます。

param location string = 'japaneast'

resource ompreub02 'Microsoft.HybridCompute/machines@2022-03-10' existing = {
  name: 'ompre-ub02'
}

resource depAgenet 'Microsoft.HybridCompute/machines/extensions@2022-03-10' = {
  name: 'DependencyAgentLinux'
 parent: ompreub02
  location: location
  properties: {
    publisher: 'Microsoft.Azure.Monitoring.DependencyAgent'
    type: 'DependencyAgentLinux'
    typeHandlerVersion: '9.10'
    autoUpgradeMinorVersion: true
    settings: {
      enableAMA: 'true'
    }
  }
}

resource Ama 'Microsoft.HybridCompute/machines/extensions@2022-03-10' = {
  name: 'AzureMonitorLinuxAgent'
  parent: ompreub02
  location: location
  properties: {
    publisher: 'Microsoft.Azure.Monitor'
    type: 'AzureMonitorLinuxAgent'
    typeHandlerVersion: '1.9'
    autoUpgradeMinorVersion: true
  }
}

VM Insights 用データコレクションルールの作成

Azure Monitor Agent でデータを収集するためには、データコレクションルールが必要です。VM Insights が必要とする情報を収集するためのデータコレクションルールを作ります。データコレクションルールは OS の種類ごとに必要です。今回は Ubuntu 20.04 を利用しているので Linux 版のデータコレクションルールを作ります。また、収集したデータの保存先となる Log Analytics をこのデータコレクションルール内で指定します。

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

resource vminsightDcrLinux 'Microsoft.Insights/dataCollectionRules@2021-04-01' = {
  location: location
  name: 'lab-je-vminsight-dcrlinux'
  kind: 'Linux'
  properties: {
    dataSources: {
      performanceCounters: [
        {
          name: 'VMInsightsPerfCounters'
          streams: [
            'Microsoft-InsightsMetrics'
          ]
          samplingFrequencyInSeconds: 60
          counterSpecifiers: [
            '\\VmInsights\\DetailedMetrics'
          ]
        }
      ]
      extensions: [
        {
          streams: [
            'Microsoft-ServiceMap'
          ]
          extensionName: 'DependencyAgent'
          name: 'DependencyAgentDataSource'
        }
      ]
    }
    destinations: {
      logAnalytics: [
        {
          workspaceResourceId: logAnalytics.id
          name: 'lab-je-log'
        }
      ]
    }
    dataFlows: [
      {
        streams: [
          'Microsoft-InsightsMetrics'
        ]
        destinations: [
          'lab-je-log'
        ]
      }
      {
        streams: [
          'Microsoft-ServiceMap'
        ]
        destinations: [
          'lab-je-log'
        ]
      }
    ]
  }
}

仮想マシンとデータコレクションルールの紐づけ

データコレクションルールを作ったら、dataCollectionRuleAssociations というリソースを作成して、情報を収集したい仮想マシンとデータコレクションルールを紐づけます。紐づける仮想マシンを scope で指定するのを忘れずに。この紐づけによって、Azure Monitor Agent は VM Insights に必要な情報を Log Analytics に送信するようになります。

resource dataCollectionRuleInsight 'Microsoft.Insights/dataCollectionRules@2021-04-01' existing = {
  name: 'lab-je-vminsight-dcrlinux'
  scope: resourceGroup('labnet')
}

resource dataCollectionAssociationInsight 'Microsoft.Insights/dataCollectionRuleAssociations@2021-04-01' = {
  name: 'insight'
  scope: ompreub02
  properties: {
    dataCollectionRuleId: dataCollectionRuleInsight.id
  }
}

仮想マシンとデータコレクションエンドポイントの紐づけ

今回の環境は Azure Monitor への通信を PrivateEndpoint で閉域化しているので、同じく dataCollectionRuleAssociations というリソースを作成して、情報を収集したい仮想マシンとデータコレクションエンドポイントを紐づけます。データコレクションエンドポイントを紐づける際の dataCollectionRuleAssociations の名前は configurationAccessEndpoint にする必要があります。任意の名前だとデプロイが失敗しますのでご注意ください。この紐づけによって、Azure Monitor Agent は データコレクションエンドポイント経由で Log Analytics に情報を送信します。

resource dataCollectionEndpoint 'Microsoft.Insights/dataCollectionEndpoints@2021-04-01' existing = {
  name: 'lab-je-dcelinux'
  scope: resourceGroup('labnet')
}

resource dataCollectionAssociationEndpoint 'Microsoft.Insights/dataCollectionRuleAssociations@2021-04-01' = {
  name: 'configurationAccessEndpoint'
  scope: ompreub02
  properties: {
    dataCollectionEndpointId: dataCollectionEndpoint.id
  }
}

動作確認

最終的に次の構成になりました。赤い部分が今回の設定で追加された箇所です。

追加後の構成

Azure Arc-enabled servers の VM Insights の画面でパフォーマンスとマップを見れるようになりました。

Azure Arc-enabled servers のマップの画面

終わりに

Becep を利用して Azure を設定すると必要な設定や設定間の関連性への理解が深まります。「このサービスの設定の関連性がイマイチ良くわからないんだよなぁ」という時には Bicep を利用してみましょう。