Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

Azure App ServiceのKey Vault参照機能を試してみた

こんにちは。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 への認証を経てシークレットを参照します。
例えばこのチュートリアルが参考になります。

docs.microsoft.com

今回試した Key Vault 参照はクライアントライブラリを使用する必要なく、 Key Vault シークレットの参照情報を App Service のアプリケーション設定に設定することで、環境変数としてシークレット値を取得できるようになるというものです。
C# でいえば System.Environment.GetEnvironmentVariable メソッドでシークレット値を取得できるということです。

むちゃくちゃ便利そうですね。では手順をおさらいします。

App Service のマネージドIDを有効にする

App Service が Key Vault にアクセスできるようにするために、App Service のマネージドID(システム割り当てID)を有効にします。
有効後、オブジェクトIDが表示されるためコピーして控えておきます。

docs.microsoft.com

Key Vault のシークレット識別子を取得する

Key Vault にシークレットを登録すると識別子というものができあがります。
Key Vaultリソース、シークレット、シークレット値のバージョンが含まれており、シークレット値を一意に表す識別子です。これをコピーして控えておきます。

Key Vault のアクセスポリシーを設定する

Key Vault のアクセスポリシーの設定画面にて、先程コピーした App Service のオブジェクトIDに対して、シークレットの取得権限を付与します。
これで特定の App Service がシークレットを参照できるようになります。

App Service に Key Vault 参照を設定する

アプリケーション設定に次の形式で Key Vault 参照を定義して保存します。

  1. @Microsoft.KeyVault(SecretUri={シークレット識別子})
  2. @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日以内に最新化されるとのことです。
更新したシークレットを即座に反映したい場合は、アプリケーション設定を更新する必要があるとのことです。

docs.microsoft.com


アプリケーション側では Key Vault を意識することなく、安全にシークレットを管理できる構成にすることができたので、ぜひ使っていきたい機能ですね。

www.alterbooth.com

www.alterbooth.com

cloudpointer.tech