こんにちは。MLBお兄さんこと松村です。 MLB もキャンプとエキシビジョンゲームが始まりましたね。 Baseball is back!!
さて、先日こちらの勉強会に参加しました。
katte.connpass.com
この勉強会では Azure Key Vault がテーマでした。
そのなかで、 Azure App Service から Azure Key Vault を参照する機能が紹介されました。実は初めてその機能を知ったので試してみました。
docs.microsoft.com
Azure Key Vault とは、パスワードや接続文字列などの秘匿情報(=シークレット)を安全に管理することができるサービスです。
通常、アプリケーションが Azure Key Vault に保管されているシークレットを参照する場合は、クライアントライブラリを使用して Azure Key Vault への認証を経てシークレットを参照します。
例えばこのチュートリアルが参考になります。
今回試した Key Vault 参照はクライアントライブラリを使用する必要なく、 Key Vault シークレットの参照情報を App Service のアプリケーション設定に設定することで、環境変数としてシークレット値を取得できるようになるというものです。
C# でいえば System.Environment.GetEnvironmentVariable
メソッドでシークレット値を取得できるということです。
むちゃくちゃ便利そうですね。では手順をおさらいします。
App Service のマネージドIDを有効にする
App Service が Key Vault にアクセスできるようにするために、App Service のマネージドID(システム割り当てID)を有効にします。
有効後、オブジェクトIDが表示されるためコピーして控えておきます。
Key Vault のシークレット識別子を取得する
Key Vault にシークレットを登録すると識別子というものができあがります。
Key Vaultリソース、シークレット、シークレット値のバージョンが含まれており、シークレット値を一意に表す識別子です。これをコピーして控えておきます。
Key Vault のアクセスポリシーを設定する
Key Vault のアクセスポリシーの設定画面にて、先程コピーした App Service のオブジェクトIDに対して、シークレットの取得権限を付与します。
これで特定の App Service がシークレットを参照できるようになります。
App Service に Key Vault 参照を設定する
アプリケーション設定に次の形式で Key Vault 参照を定義して保存します。
@Microsoft.KeyVault(SecretUri={シークレット識別子})
@Microsoft.KeyVault(VaultName={Key Vaultの名前};SecretName={シークレットの名前};SecretVersion={シークレットのバージョン})
正しく Key Vault を参照できると、該当の設定項目に「Resolved」と表示されます。
逆に、設定に不備があり Key Vault にアクセスできない状態だと「AccessToKeyVaultDenied」と表示されるので、間違いには気付きやすいと思います。
コードをデプロイする
環境変数でシークレットを取得するコードを App Service にデプロイします。今回は例として ASP.NET Core Web API でこんなコードにしました。
[ApiController] [Route("[controller]")] public class ValueController : ControllerBase { [HttpGet] public IActionResult Get() { return Ok(new { social_name = Environment.GetEnvironmentVariable("MY_SOCIAL_NAME") }); } }
すると、きちんと環境変数としてシークレット値を取得できることを確認できました。
$ curl https://app-keyvault-reference.azurewebsites.net/value {"social_name":"tsubakimoto_s"}
バージョンの扱い
@Microsoft.KeyVault
にシークレットのバージョンを指定すれば、該当バージョンの値を取得します。
バージョンを省略すれば最新バージョンのシークレット値を取得することになります。ただし、アプリケーション設定に定義したあとでシークレットが更新された場合は注意が必要です。
アプリケーション設定を更新しなければ、当面は一つ前のバージョンのシークレット値のままとなり、1日以内に最新化されるとのことです。
更新したシークレットを即座に反映したい場合は、アプリケーション設定を更新する必要があるとのことです。
アプリケーション側では Key Vault を意識することなく、安全にシークレットを管理できる構成にすることができたので、ぜひ使っていきたい機能ですね。