新しもの好きプログラマの耳より情報ブログ

仕事でもあるプログラミングについて役に立ちそうな情報を発信していこうというブログです。役に立たなそうな情報はfacebookで。

Azure Functionsのアプリ設定を使ったKey Vault取得で、変更が反映されない場合の解決方法

概要

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の特定の値を取得するように値を設定します。例えば次のような感じです。

  1. キー: ApiKey
  2. 値: @Microsoft.KeyVault(VaultName=testkeyvault;SecretName=ApiKey)

VaultNameとSecretNameには、Key Vaultに存在する名前を指定します。書き方は複数あるので、詳しくは次の公式ドキュメントを見ると良いです。

learn.microsoft.com

これを追加したら、「アプリ設定」を「適用」すれば完了です。追加しただけだとまだ反映されていないので、注意してください。(最初ここを見落としていて取得できずに困りました)

このように設定するだけで、Azureに発行したFunctions上では Environment.GetEnvironmentVariable("ApiKey") で値を取得できます。

ここまでは問題が無かったのですが・・・Key Vaultの値を変更した時、問題が起きました。

Key Vaultを変更しても反映されない

Key Vaultの値を変更(新バージョンを追加)しましたが、Functionsを実行しても古い値が取得されます。

FunctionsのコードにKey Vaultから直接取得する処理を追加したところ、そちらは最新の値が取れます。つまり、Functionsのアプリ設定側に問題が有りそうです。

公式ドキュメントを見ると、アプリ設定は最大24時間キャッシュされるという情報があったため、キャッシュが疑えます。Functionsを再起動してみました。が、結果は変わりません。

反映された方法

Functionsの設定→環境変数→アプリ設定を開いて、該当の設定を一度別の設定へ変更して、反映。また同じ設定を元に戻して、反映。これで、最新の値が取れるようになりました。

まとめ

Functionsのアプリ設定(環境変数)を通してKey Vaultの値を取得する方法は便利ですが、キャッシュが有る点に注意です。

今回試した時は、Functionsを再起動するだけではキャッシュが破棄されず、アプリ設定を変更・上書きしてようやくキャッシュが破棄されました。Azure上でしか起きないので意外と追求が難しく、引っかかりやすい気がします。こういう余計なところで時間を無駄にしないように、この情報が役に立ったら嬉しいです。