概要
Azure FunctionsからKey Valultの値を取得する方法として、Functionsのアプリ設定(環境変数)を使う方法があります。コード上では取得先を意識せずに、環境変数として取得できます。ローカルのデバッグ実行ではlocal.settings.jsonから値を取得し、Azure上ではアプリ設定を介してKey Vaultの値を取得する、という使い分けをコードを変更せずに実現できて便利です。
しかしこの構成で、Key Vaultの値を変更しても、Functionsでは古い値が取得されてしまうという問題が起きました。アプリ設定ではバージョンを指定せずに取得しているため最新の値になるはずですが、上手く行きません。この問題を解決しました。
最初に結論まとめ
Azureポータルで、Functionsの対象のアプリ設定(環境変数)を変更して保存、元に戻して保存。これでKey Vaultの変更が反映されます。
Functionsの再起動で解決するという情報も有ったのですが、私の場合は再起動しても反映されませんでした。
詳しく
背景
普段Windowsアプリをメインに作っていますが、Azureにチャレンジ中です。すると、基本的なところで次々と躓きます。基本的すぎて意外と情報が見つからなかったりするので、躓いたところと解決策を、この記事のように1つずつ書いていこうと思います。
アプリ設定でのKey Vaultの取得
FunctionsとKey Vaultは作成済みとして、その後の手順を説明します。全て、Azureポータルを使っています。
作成したFunctionsを開き、設定→環境変数→アプリ設定を開くと、登録済みの環境変数が表示されます。ここで環境変数を追加します。
任意のキーに対して、Key Vaultの特定の値を取得するように値を設定します。例えば次のような感じです。
- キー:
ApiKey
- 値:
@Microsoft.KeyVault(VaultName=testkeyvault;SecretName=ApiKey)
VaultNameとSecretNameには、Key Vaultに存在する名前を指定します。書き方は複数あるので、詳しくは次の公式ドキュメントを見ると良いです。
これを追加したら、「アプリ設定」を「適用」すれば完了です。追加しただけだとまだ反映されていないので、注意してください。(最初ここを見落としていて取得できずに困りました)
このように設定するだけで、Azureに発行したFunctions上では Environment.GetEnvironmentVariable("ApiKey")
で値を取得できます。
ここまでは問題が無かったのですが・・・Key Vaultの値を変更した時、問題が起きました。
Key Vaultを変更しても反映されない
Key Vaultの値を変更(新バージョンを追加)しましたが、Functionsを実行しても古い値が取得されます。
FunctionsのコードにKey Vaultから直接取得する処理を追加したところ、そちらは最新の値が取れます。つまり、Functionsのアプリ設定側に問題が有りそうです。
公式ドキュメントを見ると、アプリ設定は最大24時間キャッシュされるという情報があったため、キャッシュが疑えます。Functionsを再起動してみました。が、結果は変わりません。
反映された方法
Functionsの設定→環境変数→アプリ設定を開いて、該当の設定を一度別の設定へ変更して、反映。また同じ設定を元に戻して、反映。これで、最新の値が取れるようになりました。
まとめ
Functionsのアプリ設定(環境変数)を通してKey Vaultの値を取得する方法は便利ですが、キャッシュが有る点に注意です。
今回試した時は、Functionsを再起動するだけではキャッシュが破棄されず、アプリ設定を変更・上書きしてようやくキャッシュが破棄されました。Azure上でしか起きないので意外と追求が難しく、引っかかりやすい気がします。こういう余計なところで時間を無駄にしないように、この情報が役に立ったら嬉しいです。