Bicepで作成したAzure FunctionsとApplication Insightsをリンクする方法

はじめに

こんにちは!重要な機能開発を任されて最近まで業務で手一杯だったなーがです。今回はBicepで作成したAzure FunctionsとApplication Insightsをリンクする方法について解説します。

Azure Functionsをデプロイした際、Azure PortalのFunctionsの画面から直接ログを確認したいというニーズは多いかと思います。しかし、Bicepでそれぞれを個別にデプロイしただけでは、Azure FunctionsのポータルからApplication Insightsのログを直接参照することができず、一手間かかってしまいます。

今回の設定を行うことで、Azure Functionsの管理画面からシームレスにログの確認ができるようになります。

課題:Azure FunctionsからApplication Insightsのログを直接確認できない

BicepでAzure FunctionsとApplication Insightsをデプロイしただけでは、Portal上のFunctionsのメニューからログを確認しようとしても、関連付けがされていないため、以下のように表示されてしまいます。この状態では、Application Insightsのリソースを直接開いてログを確認する必要があり、少し不便です。

解決方法

この問題は、Azure Functionsのアプリケーション設定に、Application Insightsの接続文字列を追加することで解決します。

具体的には、Azure FunctionsリソースのsiteConfig.appSettingsAPPLICATIONINSIGHTS_CONNECTION_STRINGという名前のプロパティを追加し、その値としてApplication Insightsリソースのproperties.ConnectionStringを指定します。

公式ドキュメントによると、APPINSIGHTS_INSTRUMENTATIONKEYまたはAPPLICATIONINSIGHTS_CONNECTION_STRINGのいずれかを設定することで連携できます。しかし、APPINSIGHTS_INSTRUMENTATIONKEYは2025年3月31日にサポートが終了しているため、今後はAPPLICATIONINSIGHTS_CONNECTION_STRINGの使用が推奨されます。

参照

resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
  name: 'application-insights'
  location: location
  kind: 'web'
  ~~ 省略 ~~
  }
}

resource funcApp 'Microsoft.Web/sites@2023-12-01' = {
	name: 'func-app'
  ~~ 省略 ~~
  properties: {
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsights.properties.ConnectionString
        }
      ]
    }
  }
}

この設定をデプロイ後、Azure Portalで確認すると、Azure FunctionsがApplication Insightsに正しく接続されていることが分かります。

これにより、Azure Functionsの「ログ」メニューから直接クエリを実行して、Application Insightsに送信されたログを確認できるようになります。

補足:hidden-link タグについて

Function AppとApplication Insightsを関連付けると、Azureの内部ではtagsプロパティにhidden-linkという特殊なタグが作成されます。これは、Azure PortalなどのUI上でリソース間の関連付けを表現するために使用されるものです。

APPLICATIONINSIGHTS_CONNECTION_STRINGをアプリケーション設定に追加するだけで、通常はこのhidden-linkタグがAzureによって自動的に作成・管理されます。そのため、Bicepテンプレートで明示的にhidden-linkタグを記述する必要は基本的にありません。

このタグを手動で管理することは、サブスクリプションIDやリソースグループ名などをBicepファイルに含める必要があり、テンプレートの複雑性を増す要因にもなります。

そのため、推奨される方法はAPPLICATIONINSIGHTS_CONNECTION_STRINGの設定に任せて、hidden-linkの自動作成を利用することです。

参照:In bicep, how to property and securly set `hidden-link` in tags?

応用:複数のAzure Functionsを1つのApplication Insightsに紐付ける

複数のAzure Functionsのログを、1つのApplication Insightsでまとめて管理することも可能です。その場合も設定は同様で、各Azure FunctionsのappSettingsに、共通のApplication Insightsの接続文字列を追加するだけです。

resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
  name: 'application-insights'
  location: location
  kind: 'web'
  ~~ 省略 ~~
  }
}

resource funcApp1 'Microsoft.Web/sites@2023-12-01' = {
	name: 'func-app-1'
  ~~ 省略 ~~
  properties: {
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsights.properties.ConnectionString
        }
      ]
    }
  }
}
    
resource funcApp2 'Microsoft.Web/sites@2023-12-01' = {
	name: 'func-app-2'
  ~~ 省略 ~~
  properties: {
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsights.properties.ConnectionString
        }
      ]
    }
  }
}

ログの識別性を高める

複数のFunctionsからログを集約すると、どのログがどのFunction Appから出力されたものか区別がつきにくくなる場合があります。

その際は、環境変数WEBSITE_CLOUD_ROLENAMEを設定することで、Application Insights上のログに表示されるクラウドロール名(cloud_RoleName)を任意の名前に変更できます。これにより、ログの発生源を容易に特定できるようになります。

参照:クラウド ロール名を設定する

resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
  name: 'application-insights'
  location: location
  kind: 'web'
  ~~ 省略 ~~
  }
}

resource funcApp1 'Microsoft.Web/sites@2023-12-01' = {
	name: 'func-app-1'
  ~~ 省略 ~~
  properties: {
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsights.properties.ConnectionString
        }
        {
          name: 'WEBSITE_CLOUD_ROLENAME'
          value: 'function-application-1'
        }
      ]
    }
  }
}

resource funcApp2 'Microsoft.Web/sites@2023-12-01' = {
	name: 'func-app-2'
  ~~ 省略 ~~
  properties: {
    siteConfig: {
      appSettings: [
        {
          name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
          value: applicationInsights.properties.ConnectionString
        }
        {
          name: 'WEBSITE_CLOUD_ROLENAME'
          value: 'function-application-2'
        }
      ]
    }
  }
}

WEBSITE_CLOUD_ROLENAMEを指定しない場合、cloud_RoleNameにはAzure Functionsのリソース名(この例では func-app-1, func-app-2)が自動的に使用されます。

おわりに

今回は、Bicepを利用してAzure FunctionsとApplication Insightsを連携させる方法についてご紹介しました。APPLICATIONINSIGHTS_CONNECTION_STRINGを設定するという簡単な手順で、開発や運用の効率を大きく向上させることができます。Bicepを利用してAzure FunctionsとApplication Insightsでリソースを管理する際には、ぜひこの設定を活用してみてください。

今回作成したリソースはこちら

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です