Functions Worker 2.0.0 でユーザーシークレットの続き

[以前の記事](https://qiita.com/higege-amdeker/items/685bd420bd46fd6e7217)で `Microsoft.Azure.Functions.Worker 2.0.0` におけるユーザーシークレットの追加方法を紹介したのですが、最近 Azure Functions を .NET 9 で実装していたら Copilot 様が「ユーザーシークレットは既定で追加されているので」と説明してきました。おかしいなと思い調べました。

https://qiita.com/higege-amdeker/items/685bd420bd46fd6e7217

# やりたいこと

`Microsoft.Azure.Functions.Worker 2.0.0` でデバッグ実行中に追加コードなしでユーザーシークレットを使う。

# 環境

- Visual Studio Community 2022 Version 17.13.7
- Azure Functions .NET 9 Isolatad

# やりかた

`local.settings.json` で `DOTNET_ENVIRONMENT` を `Development` に設定する。

# 調査の経緯

以前は下記コードを追加することでユーザーシークレットが使えるようになりました。
```csharp
builder.Configuration.AddUserSecrets(typeof(Program).Assembly, optional: true, reloadOnChange: false);
```
複雑で覚えられません。既定でユーザーシークレットが追加されているのであれば、このコードは不要なはず。以下のプログラムでユーザーシークレットの取得を目指します。

```json:secrets.json
{
  "Message": "Hello World"
}
```
```csharp:Program.cs
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Extensions.Hosting;

var builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

string message = builder.Configuration["Message"] ?? "failed";
Console.WriteLine(message);

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

builder.Build().Run();
```

## 確認

とりあえず実行してみると……

```bash
Failed
```

ユーザーシークレットは実行環境（`EnvironmentName`）が `Development` の場合にのみ有効になるようです。
いや、デバッグ実行中は `Development` だろ、常識的に考えて……

```csharp:Proram.cs
using Microsoft.Azure.Functions.Worker.Builder;
using Microsoft.Extensions.Hosting;

FunctionsApplicationBuilder builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

// 追加
string env = builder.Environment.EnvironmentName;
Console.WriteLine(env);

string message = builder.Configuration["Message"] ?? "failed";
Console.WriteLine(message);

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

builder.Build().Run();
```

```bash
Production
Failed
```

Oh...

## 変更していく

気を取り直して変更してやりましょう。

王道としては `local.settings.json` で `AZURE_FUNCTIONS_ENVIRONMENT` を追加。

```json:local.settings.json
{
    "IsEncrypted": false,
    "Values": {
        "AZURE_FUNCTIONS_ENVIRONMENT": "Development",
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
}
```

```bash
An item with the same key has already been added. Key: AZURE_FUNCTIONS_ENVIRONMENT
```

えっ……（エラー停止）

環境変数でどうでしょう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/75f2155d-074b-4541-9f6b-319197e73341.png)

```bash
Skipping 'AZURE_FUNCTIONS_ENVIRONMENT' from local settings as it's already defined in current environment variables.
:
Production
Failed
```

もうなんでなの……

## GitHub Issues を確認

不具合のようです。

https://github.com/Azure/azure-functions-dotnet-worker/issues/2876

Issue は Closed になってますが、問題は続いているようです。
ここで紹介されていた方法は `DOTNET_ENVIRONMENT` を `Development` に設定するというもの。

```json:local.settings.json
{
    "IsEncrypted": false,
    "Values": {
        "DOTNET_ENVIRONMENT": "Development",
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
}
```

```bash
Development
Hello World
```

よっしゃ！
暫定対策感丸出しですが、ローカル環境の話なのでよしとしましょう。
不具合修正を楽しみに待っています。