しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Application Insights の Azure AD 認証 / Managed Identity 対応を試した

久し振りに Application Insights SDK for .NET のリリースノートを眺めていたら Azure AD 認証に対応したと記載があり、興味を持ったので設定と動作を試しておきました。

これまで InstrumentationKey があればテレメトリを送信出来ていましたが、Azure AD 認証を有効化すると RBAC での許可をアプリケーション単位で付けないと送信できなくなります。

現在 Azure AD 認証は Public Preview として公開されていて制約も多いので、ドキュメントにはしっかりと目を通しておきましょう。最新の SDK でしか利用できないのと、App Service や Azure Functions に組み込まれている方法の場合は利用できません。手動での SDK インストールが必要です。

ダウンタイム無しで Azure AD 認証に切り替える場合は、以下の手順で行う必要があります。

  1. Application Insights SDK を v2.18.0 以上に更新
  2. Azure AD 認証を利用するように設定 (Token Credential / Managed Identity / RBAC など)
  3. アプリケーションをデプロイ
  4. Application Insights 側で Local Authentication を無効化

ASP.NET Core の場合は以下の SDK をインストールすれば、Azure AD 認証に対応した v2.18.0 が入ります。

追加で Managed Identity を使うために必要な Azure.Identity もインストールしておきます。既にインストールされている場合も最近では多くなっているかと思います。

これで Application Insights SDK で Azure AD 認証を有効に出来るようになりました。Azure AD 認証を使ったとしても InstrumentationKey は必要になるので、これまで通り接続文字列を設定しましょう。

ドキュメントでは以下のように InstrumentationKey が全て 0 になっていますが、このままだと動作しないので注意してください。Azure Portal から接続文字列をコピーしてください。

{
  "ApplicationInsights": {
    "ConnectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://xxxx.applicationinsights.azure.com/"
  }
}

後はコード側で Azure AD 認証を使うように設定すれば完了です。新しく SetAzureTokenCredential メソッドが追加されているので、一般的には DefaultAzureCredential を渡せばよいです。

以下のようにコードの修正は非常に少なく済んでいます。接続文字列で指定出来れば更に便利でした。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<TelemetryConfiguration>(config =>
    {
        config.SetAzureTokenCredential(new DefaultAzureCredential());
    });

    services.AddApplicationInsightsTelemetry();

    services.AddControllersWithViews();
}

次は Managed Identity を有効化済みの App Service に RBAC で必要なロールを割り当てていきます。新しく Monitoring Metrics Publisher というロールが増えているので、これを割り当てるだけで終わります。

ローカルから使う機会はほぼ無いと思いますが、Azure サービス認証で設定しているユーザーに対しても RBAC でロールを割り当てれば、Managed Identity 以外からでもテレメトリを送信できます。

これでアプリケーションをデプロイすれば、Azure AD 認証付きでテレメトリが送信されるようになります。

最後に Application Insights のローカル認証を無効化して、Azure AD 認証を必須にして確認します。設定は Workspace と同様に Properties の中にあるので少しわかりにくいです。

突然ローカル認証という言葉が出てきましたが、これまでの InstrumentationKey だけを使った方法のことを指しています。選択すると以下のように無効化するための画面が表示されます。

ここで無効化すれば Azure AD 認証が付いていないとエラーになるようになります。この際のエラーは .NET の場合は EventSource で書き出されるのでキャプチャするのが若干面倒です。なので Live Metrics が送信されているかで確認するのが一番早いです。

無効化した状態で RBAC でロールを削除すれば、少し後にテレメトリが送信されなくなることまで確認しました。例によって RBAC 設定には少しタイムラグが発生するので、焦って弄らないようにしたいです。