かずきのBlog@hatena

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

Azure Functions v2 で設定情報を使う方法

local.settings.json やアプリケーション設定に設定された情報を Azure Functions v2 で使う方法をメモしておきます。

Microsoft.Extensions.Configuration を使います。 ASP.NET Core ではおなじみのやつですね。local.settings.json を使うために ExecutionContext クラスが必要っぽいのがちょっと使いにくい感じが出てますね。

コードとしては、こんな感じのが出来るといい館です。

new ConfigurationBuilder()
    .SetBasePath(context.FunctionAppDirectory) // context は ExecutionContext のインスタンス
    .AddJsonFile("local.settings.json", true)
    .AddEnvironmentVariables()
    .Build()
    .Bind("clova", Configuration); // Configuration という名前の変数に設定情報を流し込む

なので、こんな感じのクラスを作っておいて

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Configuration;

namespace ClovaLab.Configurations
{
    public static class ConfigurationManager
    {
        private static object Lock { get; } = new object();
        private static Configuration Configuration { get; set; }
        public static Configuration GetConfiguration(ExecutionContext context)
        {
            if (Configuration == null)
            {
                lock (Lock)
                {
                    if (Configuration == null)
                    {
                        Configuration = new Configuration();
                        new ConfigurationBuilder()
                            .SetBasePath(context.FunctionAppDirectory)
                            .AddJsonFile("local.settings.json", true)
                            .AddEnvironmentVariables()
                            .Build()
                            .Bind("clova", Configuration);
                    }
                }
            }

            return Configuration;
        }
    }

    public class Configuration
    {
        public bool IsSkipRequestValidation { get; set; }
    }
}

関数ではこんな感じで使います。

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using Microsoft.Extensions.Logging;
using ClovaLab.Configurations;

namespace ClovaLab
{
    public static class Lab
    {
        [FunctionName("Lab")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, 
            ExecutionContext context,
            ILogger log)
        {
            var config = ConfigurationManager.GetConfiguration(context);
            log.LogInformation(config.IsSkipRequestValidation.ToString());

            return new OkObjectResult(new object());
        }
    }
}

今回は Bind 時に clova という文字を指定しているので local.settings.json やアプリケーション設定には、こんな感じで先頭に clova: をつけます。

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet",
        "clova:IsSkipRequestValidation": true
    }
}

メモメモ。

参考元情報

blog.jongallant.com

Using strongly typed configuration in .NET Core console app – Thoughts on coding …