プレビュー機能ですが、Azure Functions とかで Key Vault が凄く簡単に使えるようになってます。 今までは、少しだけとはいえプログラムに手を入れないといけなかった部分を Azure ポータルのアプリケーション設定に指定するだけでよしなにしてくれるようになっています。凄い便利。
例えば以下のような Key Vault なんて全く意識してない、単純に secret という設定を読んで返すだけの関数があったとします。
using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Microsoft.Extensions.Configuration; namespace HelloWorld { publicstaticclass HttpTrigger { [FunctionName("HttpTrigger")] publicstatic async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ExecutionContext context, ILogger log) { var config = new ConfigurationBuilder() .AddJsonFile("local.settings.json", true) .AddEnvironmentVariables() .Build(); returnnew OkObjectResult(config["secret"]); } } }
ローカルで動かすときは local.settings.json に以下のように設定足せば動きます。
{"IsEncrypted": false, "Values": {"AzureWebJobsStorage": "", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "secret": "秘密だよ" }}
ローカルで実行して URL を叩くと 秘密だよ
って返ってきます。
Azure 上にデプロイして secret を Key Vault から読むようにしてみます。Function App のプラットフォーム機能で ID を選択します。
システム割り当て済みをオンにします。
これで Azure AD に登録されます。
次に Key Vault にいきます(なかったら作る)。そしてアクセスポリシーを開いて新規追加で、先ほどの Function App を追加します。シークレットのアクセス許可で取得をつけておきます。 そして、シークレットに適当な値を設定します。
作成したシークレットの現在のバージョンを選択すると、シークレット識別子という URL がゲットできるので控えておきます。
そして Function App に secret という設定名で @Microsoft.KeyVault(SecretUri=さっきゲットしたシークレット識別子)
という値を設定します。
以上で完了です。関数を実行してみましょう。
ちゃんと Key Vault に設定した Top secret value が返って来てますね。素晴らしい。
今後
現状特定バージョンのシークレットしか取れないっぽいけど改善していくっぽい。GA が楽しみな機能ですね。