しばやん雑記

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

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 というロールが増えているので、これを割り当てるだけで終わります。

f:id:shiba-yan:20210829191756p:plain

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

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

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

f:id:shiba-yan:20210829191822p:plain

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

f:id:shiba-yan:20210829191805p:plain

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

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