理系学生日記

おまえはいつまで学生気分なのか

Application Insightsをフロントエンドで使うときInstrumentation keyとどう向き合うか

AzureにはApplication InsightsというAPMがあります。

Application Insights は Azure Monitor の機能であり、開発者や DevOps プロフェッショナル向けの拡張可能なアプリケーション パフォーマンス管理 (APM) サービスです。

Application Insights とは何か?

Application Insightsを用いることでログの集約やエンドポイント毎の応答時間やエラー率、セッション数等を管理でき、以下のようなダッシュボードも構築できます。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/overview-dashboard より

Application Insightsは一般にはSDKを経由して利用する形式であり、JavaScriptにも対応しています。 これを利用すると、フロントエンドアプリで出力するログ、あるいは収集したいメトリクスをApplication Insightsで集中管理可能となります。 つまり、普通はブラウザに出力されるようなconsole.logをApplication Insightsに送信できるわけですね。

JavaScriptにApplication Insightsを組み込むためのサンプルコードを、Web ページ向けの Application Insightsから引用します。

import { ApplicationInsights } from '@microsoft/applicationinsights-web'

const appInsights = new ApplicationInsights({ config: {
  instrumentationKey: 'YOUR_INSTRUMENTATION_KEY_GOES_HERE'
  /* ...Other Configuration Options... */
} });
appInsights.loadAppInsights();
appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview

このように、組み込みにはinstrumentationKeyという、Application Insightsを作成したときに発行されるAPIKeyのようなものが必要になります。 JavaScriptでのフロントエンドアプリケーションに上記のようなコードが埋め込まれるということは、 第三者にinstrumentationKeyが漏出するということです。これは問題にならないのでしょうか?

多少リスクはある

Alternative way to protect your Application Insights Instrumentation Key”in JavaScriptに回答がありました。 回答者は、Microsoftのエンジニアです。

おおよそ読み取ったのは以下。

  • JavaScriptに対するモニタリングサービスはいずれにせよ同種の問題を抱えている
  • このキーが漏出した際、そのキーを使う第三者に可能なのは「書き込み」のみであり、(適切な設定をすれば)ログやメトリクスは参照できない。第三者に書き込まれたデータとそれ以外のデータを見分けられるようにする必要はある

もちろん、InstrumentationKey(IKey)が悪用された結果として大量のテレメトリがApplication Insightsに書き込まれ、課金額が大きくなるというのはあり得ます。 防止方法として、プロキシサーバを立て、プロキシサーバ側で何らかのアクセス制限を行った後でIKeyを付与しApplication Insightsに送るという方法が紹介されています。