ASP.NET Coreで開発を行うとき設定情報の格納方法に色々考察してみたので記事にします。
ここでは主にUserSecretsを利用して開発を行った場合、Azureにデプロイした時にAppSettingsに設定してある情報をどう取得すればいいのかについての考察になります。
※本記事は2017年5月29日の情報となります。
※本記事ではASP.NET Core 1.1を利用しています。
UserSecretsの利用
ASP.NET Coreで開発を行う時に、例えばDBの接続文字列やOAuthでTwitter連携用のTwitterIdとTwitterSecretKey等の情報をどこに保存するかで悩むと思います。AppSettings.jsonに書けばいいじゃんと思いますがGitHubなりの公開リポジトリを利用する場合はセキュリティ上の観点から推奨できません。AppSettings.jsonをGitIgnoreしてもいいんですが、log設定等の情報も記載しますので一概にIgnoreしきれないのでやきもきします。
そんな時に利用するのがUserSecrets機能です。UserSecrets機能はASP.NET Core 1.0から追加され、Visual Studio 2015から利用できるようになったみたいです。UserSecrets機能は設定情報を開発マシンに保存する仕組みです。
Visual StudioでASP.NET Coreのプロジェクトを右クリックするとsecret.jsonが開きます。こちらにjson形式で情報を記載しておけば開発機のユーザーローカルのフォルダに保存されます。
UserSecretsの情報は各OS毎に下記のように保存されます。
- Windows : %APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json
- Linux : ~/.microsoft/usersecrets/<userSecretsId>/secrets.json
- Mac : ~/.microsoft/usersecrets/<userSecretsId>/secrets.json
ソース側で利用する場合はStartup.csのコンストラクタに下記のソースを追加します。プロジェクト作成時に認証ありで作成した場合はすでに記載がありますが認証なしで作成した場合は実装する必要があります。env.IsDevelopment()は現在の環境を確認し開発環境であればUserSecretsの処理を通します。
if (env.IsDevelopment()) { builder.AddUserSecrets<Startup>(); }
ちなみに現在の環境を設定しているのはプロジェクトのプロパティにあるデバッグ設定です。こちらの環境変数にあるASPNETCORE_ENVIROMENTで現在の環境の値を設定しています。ここの値をDevelopment、Staging、Productionに変更することで実行環境を変えることが可能です。この設定かなり大切なので覚えておいて損はないです。
環境変数はIHositngEnviromentで取得でき各環境ごとの確認用メソッドがあるので利用すると便利です。
環境 | 確認メソッド | 環境値 |
開発環境 | IsDevelopment() | Development |
ステージング環境 | IsStaging() | Staging |
本番環境 | IsProduction() | Production |
環境によって処理を変えたい場合はASPNETCORE_ENVIROMENTを利用して処理を分けるといいともいます。Azure側のAppSettings上でもKeyをASPNETCORE_ENVIROMENTにして値をDevelopment、Staging、Productionの何れかにすればその値で処理を分岐することが可能です。デプロイメントスロットを分けている場合はASPNETCORE_ENVIROMENTの設定を行ってStagingなのかProductionなのかを明示的に示唆するようした方が運用時に判断しやすくなると思います。
ソース上でUserSecretsの情報を取得する方法は下記のとおりです。IConfigurationRootのプロパティを実装してコンストラクタで登録しプロパティにKeyを渡すことで値を取得することできるようになります。
// startupのコンストラクタに追加 Configuration = builder.Build();
private IConfigurationRoot Configuration { get; }
string setting = Configuration.GetSection("Authentication").GetValue<string>("Key"); もしくは string setting = Configuration["Authentication:Key:embed:cite];
UserSecretsとAppSettingsの情報の取得方法は同じです。但し優先順位がありローカルで開発している場合はUserSecrets がAppSettings.jsonより優先されます。取得方法は一緒で処理的な問題がなければローカルではUserSecretsをメインにすえて利用するようにしましょう。
簡単ですがUserSecretsの利用方法については以上です。
Azureにデプロイした時の対応について
UserSecretsの利用について記載して来ましたがUserSecretsはローカルの開発環境に設定が保存されるためAzure(WebApps)にデプロイしたときは設定情報が取得できずにエラーになります。この場合はAzureのAppSettingsにもUserSecretsと同じ設定をしておく必要があります。
AzureのAppSettingsから値を取得する方法は先にも書いたとおりUserSecretsと同じでなので記載方法が間違っていなければ基本的に問題はないと思います。
これでASP.NET Coreの開発がより楽になると思います。
コメント