C# - Azure Functionsで環境変数を利用する

参照するサービスのURLやDBへの接続文字列など環境ごとに変更したい値はソースコードの外に定義しておきたいものです。

Azure Functionsでは環境変数にこれらの値を設定することで、ソースコードとは別に管理できます。

 ー 開発環境 ー 

Visual Studio 2019
.NET Core 3.1


ローカルテスト環境での環境変数

ローカル環境では「local.settings.json」というJSON形式のファイルを使って環境変数を定義します。

Visual StudioでAzure Finctionsのプロジェクトを作成すると、以下のような「local.settings.json」が作られます。

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

独自の環境変数を追加するには「Values」へキーと値を追加します。

DBへの接続文字列を追加するには「ConnectionStrings」を作成してキーと値を追加します。

以下の例では環境変数「TEST_APPLICTION_SETTIGS」と

接続文字列「TEST_CONNECTION_STRING」を定義しています。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "TEST_APPLICTION_SETTIGS": "Test ApplicationSettings"
  },
  "ConnectionStrings": {
    "TEST_CONNECTION_STRING": "Test ConnectionString"
  }
}

Azure環境での環境変数

Azure FunctionsアプリをAzureへデプロイした環境では「local.settings.json」を参照できません。
Azureサーバーに改めて環境変数を定義する必要があります。

Azureポータルサイトから設定する

環境変数はAzureのポータルサイトから設定できます。

ポータルサイトを開き、関数アプリから設定したいアプリを選択します。

メニューから「構成」を選択すると「アプリケーション設定」と「接続文字列」の設定が行えます。

環境変数を追加するには「新しいアプリケーション設定」を
DBへの接続文字列を追加するには「新しい接続文字列」をクリックして名前と値を入力します。

 

最後に「保存」をクリックすれば設定は完了です。

Visual Studioから設定する

Azureポータルサイトを開かなくてもVisual Studioから設定することも可能です。

(設定できるのは環境変数のみで接続文字列はできないみたいです)

 

メニューから「ビルド(B)」→「発行(H)」を選択して公開画面を表示します。
ホスティング欄にある「…」ボタンをクリックして「Azure App Serviceの設定を管理する」を選択しましょう。

                     ↓
local.settings.jsonに記述した内容がリストアップされます。
ローカル欄にはlocal.settings.jsonに指定した値が入っているはずです。
リモート欄にAzureサーバー環境で利用する値を入力して「OK」をクリックしましょう。


アプリケーションから環境変数を取得する

アプリケーションから環境変数の値を取得する方法は以下の通りです。

Environmentクラスを使って取得する

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace AzureFunctionTest
{
    public static class HttpTriggerTestFunction
    {
        [FunctionName("HttpTriggerTestFunction")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var appSettingsValue = System.Environment.GetEnvironmentVariable("TEST_APPLICTION_SETTIGS");
            string responseMessage = "TEST_APPLICTION_SETTIGS=" + appSettingsValue;
            return new OkObjectResult(responseMessage);
        }
    }
}

Environment.GetEnvironmentVariableメソッドを使えば簡単に値が取得できます。(17行目)

ただしこの方法では接続文字列を取得することはできません。

接続文字列を利用する場合は下記のやり方の方がよいでしょう。

ConfigurationBuilderクラスを使って取得する

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;

namespace AzureFunctionTest
{
    public static class HttpTriggerTestFunction
    {
        [FunctionName("HttpTriggerTestFunction")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var builder = new ConfigurationBuilder()
                        .AddJsonFile("local.settings.json", true)
                        .AddEnvironmentVariables();
            var configuration = builder.Build();

            var appSettingsValue = configuration["TEST_APPLICTION_SETTIGS"];
            var connectionString = configuration.GetConnectionString("TEST_CONNECTION_STRING");

            string responseMessage = "TEST_APPLICTION_SETTIGS=" + appSettingsValue + "\n" +
                                     "TEST_CONNECTION_STRING=" + connectionString;
            return new OkObjectResult(responseMessage);
        }
    }
}

 

※.NET Coreでは「Microsoft.Extensions.Configuration.ConfigurationBuilderクラス」を使いますが

 .NET Frameworkでは「System.Configuration.ConfigurationManagerクラス」を使うようです