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

 

DBへの接続文字列やパスワードとなどの重要なデータは、安全な場所で管理しておく必要があります。

よく見かけるサンプルソースなどでは「appsettings.json」に定義しているケースがありますが、あまりよろしくないように思われます。

Azure App Serviceでは環境変数を利用することで、これらの値を安全に管理することができます。

 ー 開発環境 ー 

Visual Studio 2019
.NET Core 3.1

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

ローカル環境では「secrets.json」というJSON形式のファイルを使って管理することができます。

 

 

ソリューションエクスプローラからプロジェクトを右クリックし、メニューから「ユーザー シークレットの管理(G)」をクリックすると「secrets.json」ファイルが開きます。

 

以下の例では「Secrets.json」に「TestID」と「TestSecret」という変数を定義してみました。

{
  "TestID": "12345",
  "TestSecret": "9876543210"
}

「secrets.json」ファイルは「C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\UserSecrets\[シークレットID]\secrets.json」のような場所へ保存されます。

 

プロジェクトのフォルダとは別の場所に保管されるので誤ってGitHubへアップしてしまうといったミスは起きないでしょう。

Azure環境での環境変数

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

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

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

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

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

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

 

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

Visual Studioから設定する

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

 

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

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

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

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

IConfigurationから取得する

以下の例では Startup クラスで値を取得しています。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace WebApplication1
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            var testId = Configuration["TestID"];
            var testSecret = Configuration["TestSecret"];

            services.AddControllersWithViews();
        }


              :
              :
    }
}

以下の例はMVCモデルのControllerクラスで値を取得しています。

DI(Dependency injection)の仕組みを使って、コンストラクタで「IConfiguration」オブジェクトを受け取るように改良しています。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        private readonly IConfiguration _configuration;                                       //追加
        private readonly ILogger<HomeController> _logger;

        public HomeController(IConfiguration configuration, ILogger<HomeController> logger)   //パラメータを追加
        {
            _configuration = configuration;                                                   //追加
            _logger = logger;
        }

        public IActionResult Index()
        {
            var testId = _configuration["TestID"];                                            //環境変数を取得
            var testSecret = _configuration["TestSecret"];                                    //環境変数を取得
            return View();
        }

          :
          :
    }
}