問題
開発環境でAzureのリソースを使う時、多くの場合リソースの秘密鍵やデータベースのコネクションストリングなどが必要になります。最も一般的な、そして最もやってはいけないやり方が、コードに秘密情報をハードコードして、なおかつレポジトリにプッシュしてしまうことです。これはおそらくほとんど人に経験があって、なおかつ今もやっているかもしれないNOTベストプラクティスです。
ただしこの問題はUserSecretという仕組みを使うことでおおよそ解決できます。幸い、Visual StudioでASP.NET Coreプロジェクトを作成するとデフォルトでVisual Studio に統合された感じで利用できる便利な仕組みなので、ASP.NET Coreプロジェクトを開発してるなら迷わずすぐに使うべきです。

対照的に、コンソールアプリケーションでは今のところVisual Studioに統合された形式ではサポートされていません。代わりに手動でプロジェクトの設定を変更する必要があります。
このブログエントリの目的はコンソールアプリケーションでUserSecretを使えるように設定したサンプルをシェアすることです。
解決
コンソールアプリケーションでUserSecretを使えるように、必要なNuGetパッケージも指定済みのテンプレートプロジェクトをGithubにアップしました。
このプロジェクトでは、AzureのCosmosDBなどのリソースで必要になるリソースURLと秘密鍵を、プロジェクトとは別のローカルストレージににsecrets.jsonとして保存されている情報を自動的にコンフィギュレーションとしてワーカークラスにDIされるようにしています。
コンソールアプリケーションプロジェクトで User Secrets を使えるようにする
これはすでにサンプルのプロジェクトで設定されていまが、解説しておきます。
- 新規でGuidの値を生成し、.csprojに下のように設定します。
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<UserSecretsId>YOURNEWGUID</UserSecretsId>
</PropertyGroup>
ローカルのsecrets.json ファイルの作り方
dotnet
コマンドラインツールを使って作成します。例えば、このプロジェクトではAzureのCosmosデータベースをリソースとして利用するので、リソースのURLと秘密鍵をシークレットとして保存します。このシークレットは%APPDATA%フォルダー下に、上のGuid値を使って保存されます。
- CMDもしくはPowerShellコンソールを管理者権限で実行
-
dotnet user-secrets set DocumentDbUrl "https://YOURACCOUNTNAME.documents.azure.com:443/"
を実行 -
dotnet user-secrets set DocumentDbPrimaryKey "YOURPRIMARYKEYd9OA=="
を実行 - テキストエディターを使って
%APPDATA%Roaming\Microsoft\UserSecrets\YOURNEWGUID\secrets.json
を開く - secrets.jsonの内容を以下のように変更する(MyWorkerSettingsはサンプルプロジェクトでクラスとして定義されています。)
{
"MyWorkerSettings":
{
"DocumentDbUrl": "https://YOURACCOUNTNAME.documents.azure.com:443/",
"DocumentDbPrimaryKey": "YOURPRIMARYKEYd9OA=="
}
}
これでサンプルコードを実行すると、指定した秘密のデータがコンソールアプリケーションでも安全に使えるようになります。
注意
このやり方はあくまでもレポジトリに誤って秘密情報をPushしたりしないようにするのには有効ですが、秘密情報そのものは開発マシーンに暗号化されずに保存されています。マシンレベルでの機密情報管理でのベストプラクティスを続けて適用することが重要です。