💬

Azure App Service のアプリケーション設定でオブジェクトや配列を設定する方法

2023/08/28に公開

Azure App Service でアプリケーションの環境変数に値を設定するためのアプリケーション設定では、環境変数なので基本的にはキーと値のペアになります。そのためオブジェクトや配列にマッピングしたいようなケースではちょっと特殊な方法で設定が必要になります。毎回忘れるのでメモしておこうと思います。

オブジェクトの設定方法

オブジェクトのプロパティを指定する場合は以下のようにアンダースコア2個 (__) で区切ります。

例えばこんなクラスにマッピングする場合は:

class MyOptions
{
    public required string MyValue { get; set; }
}

任意のキー__MyValue のようなキーを設定することで IConfiguration から MyOptions に流し込めます。

例えば、以下のように MyKey という名前のセクションを MyOptions に紐づける場合のコードの時にはアプリケーション設定に MyKey__MyValue というキーで値を設定します。

using Microsoft.Extensions.Options;

var builder = WebApplication.CreateBuilder(args);
builder.Services
    .Configure<MyOptions>(builder.Configuration.GetSection("MyKey"))
    .AddOptions();

var app = builder.Build();

app.MapGet("/", (IOptions<MyOptions> options) => options.Value.MyValue);

app.Run();

class MyOptions
{
    public required string MyValue { get; set; }
}

アプリケーション設定の高度な編集画面からは以下のように設定します。

[
  省略…,
  {
    "name": "MyKey__MyValue",
    "value": "Hello from application settings",
    "slotSetting": false
  },
  省略…
]

MyValue プロパティ以外もある場合は、設定したいプロパティの数だけこのようなキーを設定します。例えば TestValue というようなプロパティもある場合は以下のようになります。

[
  省略…,
  {
    "name": "MyKey__MyValue",
    "value": "Hello from application settings",
    "slotSetting": false
  },
  {
    "name": "MyKey__TestValue",
    "value": "xxxxxxx",
    "slotSetting": false
  },
  省略…
]

配列の設定方法

次は以下のような配列のケースを考えてみます。

class MyOptions
{
    // 配列!
    public required string[] MyValues { get; set; }
}

この場合は 任意のキー__MyValues__0 のようにインデックスを指定します。2要素目の場合は 任意のキー__MyValues__1 というようになります。
アプリケーション設定の高度な編集で設定する場合の json は以下のようになります。

[
  省略…
  {
    "name": "MyKey__MyValues__0",
    "value": "1st item",
    "slotSetting": false
  },
  {
    "name": "MyKey__MyValues__1",
    "value": "2nd item",
    "slotSetting": false
  },
  {
    "name": "MyKey__MyValues__2",
    "value": "3rd item",
    "slotSetting": false
  },
  省略…
]

このように設定すると以下のようなアプリケーションで読み取ることが出来ます。

using Microsoft.Extensions.Options;

var builder = WebApplication.CreateBuilder(args);
builder.Services
    .Configure<MyOptions>(builder.Configuration.GetSection("MyKey"))
    .AddOptions();

var app = builder.Build();

app.MapGet("/", (IOptions<MyOptions> options) => string.Join(", ", options.Value.MyValues));

app.Run();

class MyOptions
{
    // 配列!
    public required string[] MyValues { get; set; }
}

このアプリケーションを、先ほどの値をアプリケーション設定に指定した App Service にデプロイして URL を開くと以下のような結果が表示されます。

1st item, 2nd item, 3rd item

まとめ

ということでオブジェクトを設定するときは __ で区切る。配列の時はインデックスの数字を指定するというところがポイントでした。
ネストした場合も __ で区切って MyKey__Prop1__Hogehoge__0__Fugafuga というように指定することでネストしたオブジェクトのプロパティに値を設定することが出来ます。
ちょっとめんどくさいですが、まぁ何回も指定するものではないので良いでしょう。

参考情報

https://learn.microsoft.com/ja-jp/azure/app-service/configure-language-dotnetcore?pivots=platform-linux

https://stackoverflow.com/questions/34063167/using-an-array-in-azure-web-app-settings

Microsoft (有志)

Discussion