Azure Functions の環境変数から値を取得する方法


TL;DR

ConfigurationManager を利用した方法では値を取得できなくなっていたため, Environment を利用した。

はじめに

Azure Functions 開発をしている際に環境変数を利用することは多くあると思います。
その取得方法については ConfigurationManager クラスをオススメするものが日本語・英語の記事を問わずほとんどだと思います。
しかし, 今回 v3 で開発をし始めてみるとうまく取得できなかったため, 初心に戻って Microsoft Docs を参考に開発をしたらすんなりできたので, それの備忘録となります。

方法

事前条件

以下のような環境変数設定がされている前提で話を進めていきます。

json
{
  "IsEncrypted": false,
  "Values": {
    "SAMPLE_VALUE": "This is Sample Value"
  },
  "ConnectionStrings": {
    "DB_CONNECTION_STRING": {
      "ConnectionString": "This is Connection string",
      "ProviderName": "System.Data.SqlClient"
    }
  }
}

Values: 環境変数の取得

環境変数の取得はとてもシンプルで, Environment.GetEnvironmentVariable(string, EnvironmentVariableTarget) にキーを渡してあげるだけで簡単に取得できます。

sample.cs
namespace Sample
{
    public static class SampleFunction
    {
        [FunctionName("sample")]
        public static async Task<IActionResult> Run (
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
            ILogger log )
        {
            var x = Environment.GetEnvironmentVariable("SAMPLE_VALUE", EnvironmentVariableTarget.Process);
            return new OkObjectResult($"### { x }");
        }
    }
}

上記の Functions を起動し, ブラウザでアクセスすると以下のような出力がされると思います。

ConnectionStrings: 接続文字列の取得

では, 接続文字列の場合はどのように取得するのでしょうか?
これも非常にシンプルに解決でき, キーの前に ConnectionStrings: というプレフィクスを付けてあげるだけで取得できます。

sample.cs
namespace Sample
{
    public static class SampleFunction
    {
        [FunctionName("sample")]
        public static async Task<IActionResult> Run (
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
            ILogger log )
        {
            var x = Environment.GetEnvironmentVariable("ConnectionStrings:DB_CONNECTION_STRING", EnvironmentVariableTarget.Process);
            return new OkObjectResult($"### { x }");
        }
    }
}

上記の Functions を起動し, ブラウザでアクセスすると以下のような出力がされると思います。

おわりに

2020/07/20 現在の公式ドキュメントでは Environment.GetEnvironmentVariable(string, EnvironmentVariableTarget) を利用するように勧めているので, 素直にこれに従っておくのが良いでしょう。