参照するサービスの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クラス」を使うようです
コメントをお書きください