📚

Azure Functions の分離ワーカー モデルでユーザー シークレットを使う方法

に公開

Azure Functions の分離ワーカーモードを使って、ユーザーシークレットを読み込む方法を紹介します。
個人的にはローカル開発時には自動的に読み込んでおいてほしいのですが、デフォルトでは読み込んでくれませんでした。

でもローカル開発中の構成情報置き場としては便利なので使う方法をメモしておきます。

ユーザーシークレットの設定方法

Azure Functions の Program.csAddUserSecrets メソッドを呼ぶだけです。
分離ワーカー モデルには少し古い .NET のお作法に従った IHostBuilder を使った書き方と最近の書き方の IHostApplicationBuilder を使った 2 つの方法があるので、それぞれの方法を書いておきます。

IHostApplicationBuilder を使った方法

新規作成した状態の Program.cs に対して開発環境の場合のみ AddUserSecrets を呼び出すようにします。以下のようなコードになります。

using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

var builder = FunctionsApplication.CreateBuilder(args);
// これを追加
if (builder.Environment.IsDevelopment())
{
    builder.Configuration.AddUserSecrets<Program>();
}

builder.ConfigureFunctionsWebApplication();

// Application Insights isn't enabled by default. See https://aka.ms/AAt8mw4.
// builder.Services
//     .AddApplicationInsightsTelemetryWorkerService()
//     .ConfigureFunctionsApplicationInsights();

builder.Build().Run();

IHostBuilder を使った方法

IHostBuilder を使ったプロジェクト テンプレートが手元では無いので、過去のコードから部分的に切り取ってきました。HostBuilder のメソッドチェーンに対して ConfigureHostConfiguration を追加して、AddUserSecrets を呼び出すようにします。コメントにも書いていますが、開発環境の判定方法がわからなかったので、良い方法があれば教えてください。

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureHostConfiguration(builder =>
    {
        // 本当は開発環境のみでUserSecretsを使いたいが、簡単に開発環境だと知る方法がわからないので妥協…
        builder.AddUserSecrets<Program>();
    })
    // 以下略

AddUserSecrets メソッドのコードを見たところ、本番環境でこのコードが動いても最終的には何もしないのですが、余計なチェック ロジックなどは走ってしまうため気持ち的には避けたいです。ただ、あっても問題ないので気にしない方がいいかもしれません。

まとめ

分離ワーカープロセスのドキュメントにはデフォルトで読み込まれる構成情報の一覧とかが書かれていないので、試してみて確認するしかないことがボチボチあります。ドキュメントが丁寧になってほしいなと思う 2024 年の最終日でした。

Microsoft (有志)

Discussion