しばやん雑記

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

Azure Cosmos DB SDK for .NET を使うと再起動後に常に HTTP Faulted エラーが出るのを回避する

App Service 上に C# と Cosmos DB を使って作ったアプリケーションをデプロイすることは非常に多いと思います。アプリケーションを暫く運用した後に Application Insights を確認すると、以下のような HTTP リクエストが常に Faulted エラーになっていることが確認されます。

このような HTTP リクエストのエラーが発生すると、Application Insights にアラートを設定している場合には発火してしまうことがありますので、発生しないようにする必要があります。

このエラーは以下の URL へのアクセス時に発生していて、俗にいう Instance Metadata Service のエンドポイントです。このホスト名は App Service 内部に存在しないため常にエラーになるという流れです。

http://169.254.169.254/metadata/instance?api-version=2020-06-01

この IMDS へのアクセスは Cosmos DB SDK for .NET が内部で行うため、Cosmos DB SDK を使っている限り常に発生します。Azure VM の場合は IMDS が存在しているのでエラーにはなりませんが、App Service のように IMDS が存在しないサービスでは必ずエラーになります。

アクセスが行われるタイミングは CosmosClient の初期化時になるので発生頻度は少ないのですがノイズになるため、SDK のバージョン v3.42.0 で IMDS へのアクセスを無効化するオプションが追加されました。

リリースノートには VM Metadata と書かれていますが、これが IMDS のことを指しています。VM Metadata はマシン名やリージョンを取得するために使っていて、それはテレメトリに付与するために使われているようですが、正直この情報にそこまでの重要度は無いという認識です。

4568 VM Metadata API: Adds an option to disable VM metadata API call

Release 3.42.0 · Azure/azure-cosmos-dotnet-v3 · GitHub

App Service などでは前述した通りノイズにしかならないため、以下のように COSMOS_DISABLE_IMDS_ACCESS 設定を環境変数に追加して無効化するのが無難です。この設定の値を true にすると IMDS へのアクセスが完全に行われなくなります。

実際に IMDS を無効化する設定を App Service に追加して、暫く動かした後の Application Insights でのエラー集計結果が以下になります。前半の方でランダムに発生していた HTTP Faulted エラーが完全に発生しなくなっていることが確認出来ます。

Application Insights の Failures ページは基本的に常にクリーンな状態を保つのがベストなので、ノイズとなるようなリクエストがあれば都度対応するのが重要となります。回避不能だった IMDS のエラーを消せるようになったのは嬉しいですね。