御成門プログラマーの技術日記

Microsoft AzureやAngularなどの技術情報を発信します。

Azure App Service 環境変数のKey Vault 参照の値が更新されない現象の改善策

Azure App Service、Azure Functions、Azure Logic Apps ではアプリにKey Vault 参照することで、アプリのマネージドIDを使ってKey Vault から直接値を取得することができます。
learn.microsoft.com

今回は本機能を利用した際に発生した「参照設定後にAzure KeyVault のシークレットの値を変更、バージョンを変えた場合にアプリ側で変更が適用されない問題」について調べてみました。

Azure App Service に設定した Azure Key Vaultの変更が反映されない問題

詳しくは割愛しますが、Azure App Serviceなどのサービスでは環境変数に下記のようにKey Vault 参照を設定することができます。

環境変数に下記のように設定することでシークレットが参照できます。
@Microsoft.KeyVault(SecretUri=https://<それぞれのKeyVaultのURL>.azure.net/secrets/<Secret名>)
もしくはバージョン指定も可能
@Microsoft.KeyVault(SecretUri=https://<それぞれのKeyVaultのURL>.azure.net/secrets/<Secret名>/<バージョンGUID>)

こんな形に値が取得可能です。
上がアプリから直接した今回のパターン。下は参考用にAPIのSDKから直接Key Vault の値を取得したものです。

ここでKey Vault のシークレットを更新すると、アプリ参照している方はシークレットの値が更新されない現象が発生。

一応この状態で下記の内容を試してみましたが改善せず。

  • 数10分後に再度取得してみる
  • App Service 再起動
  • App Service 停止→開始

これが発生する場合、更新したシークレットの値が反映されないままになりアプリ障害の原因になる可能性もありますね。

環境変数参照によるSecretの変更を即時反映する方法

  • (推奨)Key Vault のAPIエンドポイントにリフレッシュ要求をする
  • 環境変数の名前を何か変更する
  • 環境変数の値を何か変更する
  • 当該変数以外の環境変数を追加、もしくは変更する
  • Key Vault のバージョン指定を利用し、バージョンを変更する
  • 24時間放置する

上記方法で解決します。

公式でも当該現象について言及があります。
Key Vault 参照をアプリ設定として使用する - Azure App Service | Microsoft Learn

参照内にシークレットのバージョンが指定されていない場合、アプリではキー コンテナーに存在する最新バージョンが使用されます。 ローテーションなど、新しいバージョンが利用可能になると、アプリは自動的に更新され、24 時間以内に最新バージョンの使用が開始されます。

遅延は、App Service によって Key Vault 参照の値がキャッシュされ、24 時間ごとに参照されるためです。 アプリの構成を変更すると、アプリが再起動され、参照されているすべてのシークレットが直ちに再フェッチされます。

アプリの Key Vault 参照を強制的に解決するには、API エンドポイントに対して認証済みの POST 要求をhttps://management.azure.com/[Resource ID]/config/configreferences/appsettings/refresh?api-version=2022-03-01 します。

とのことで公式回答としてはリフレッシュ用のAzure Key Vault APIを叩くのが正解のようでした。
おそらくAzure App Configurationでも同じ現象発生するのではないかと思いますが、同じ解決方法が適用できると思います。