かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Azure App Service で Azure Key Vault がめちゃ簡単に使えるようになりました(プレビュー)

プレビュー機能ですが、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
{
    public static class HttpTrigger
    {
        [FunctionName("HttpTrigger")]
        public static 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();
            return new OkObjectResult(config["secret"]);
        }
    }
}

ローカルで動かすときは local.settings.json に以下のように設定足せば動きます。

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet",
        "secret": "秘密だよ"
    }
}

ローカルで実行して URL を叩くと 秘密だよ って返ってきます。

Azure 上にデプロイして secret を Key Vault から読むようにしてみます。Function App のプラットフォーム機能で ID を選択します。

f:id:okazuki:20181213113739j:plain

システム割り当て済みをオンにします。

f:id:okazuki:20181213113827p:plain

これで Azure AD に登録されます。

次に Key Vault にいきます(なかったら作る)。そしてアクセスポリシーを開いて新規追加で、先ほどの Function App を追加します。シークレットのアクセス許可で取得をつけておきます。 そして、シークレットに適当な値を設定します。

f:id:okazuki:20181213114058p:plain

作成したシークレットの現在のバージョンを選択すると、シークレット識別子という URL がゲットできるので控えておきます。

f:id:okazuki:20181213114228p:plain

そして Function App に secret という設定名で @Microsoft.KeyVault(SecretUri=さっきゲットしたシークレット識別子) という値を設定します。

以上で完了です。関数を実行してみましょう。

f:id:okazuki:20181213122737p:plain

ちゃんと Key Vault に設定した Top secret value が返って来てますね。素晴らしい。

今後

現状特定バージョンのシークレットしか取れないっぽいけど改善していくっぽい。GA が楽しみな機能ですね。