かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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 …