Azure Functions の分離ワーカー モデルでユーザー シークレットを使う方法
Azure Functions の分離ワーカーモードを使って、ユーザーシークレットを読み込む方法を紹介します。
個人的にはローカル開発時には自動的に読み込んでおいてほしいのですが、デフォルトでは読み込んでくれませんでした。
でもローカル開発中の構成情報置き場としては便利なので使う方法をメモしておきます。
ユーザーシークレットの設定方法
Azure Functions の Program.cs
で AddUserSecrets
メソッドを呼ぶだけです。
分離ワーカー モデルには少し古い .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 年の最終日でした。
Discussion