しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET 4.7.1 の Configuration Builder を使って Docker での運用を楽にしたい

最近は ASP.NET に Docker での運用を意識した機能が入り始めていて、早く Server Core の Docker Image が 1GB ぐらいにならないかと思い続ける日々です。

とはいえ、現時点でも Server Core を使った ASP.NET の Dockernize は十分に可能なので、Configuration Builder を試しておくことにします。

Configuration Builder 関連のライブラリは NuGet で配布されていますが、.NET Framework 4.7.1 がターゲットになっていないと当然ながら使えないので、少しだけ注意が必要です。

NuGet Gallery | Packages matching Microsoft.Configuration.ConfigurationBuilders

用意されているパッケージは以下の 4 種類です。個人的に使いそうなのは Environment Variables ぐらいかなと思いますが、Azure KeyVault は高セキュリティが求められる部分で便利かもしれません。

  • Json
  • User Secret
  • Environment Variables
  • Azure KeyVault

何はともあれ、こういった各ソースからのデータをいい感じに ASP.NET アプリケーションから統一された方法で扱えるようになるのは、Docker 関係なく便利ですね。

この辺りの設計は Azure App Service と ASP.NET Core を意識して作られているように思います。昔やったようにリフレクションで ConfigurationManager を弄るよりも圧倒的に安心感があります。

とりあえず実際に分かりやすい環境変数を使ってみることにします。Docker では設定値を環境変数経由で渡すことが非常に多いので、一番使う機会が多いパッケージだと思っています。

パッケージをインストールしたら最低限の設定が追加されるので、多少カスタマイズしておきました。Builder は複数設定できるので、App Settings と Connection Strings に対しても適用できます。

<configuration>
  <configSections>
    <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
  </configSections>
  <configBuilders>
    <builders>
      <add name="AppSetting" mode="Strict" prefix="APPSETTING_" stripPrefix="true" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment, Version=1.0.0.0, Culture=neutral" />
      <add name="ConnectionString" mode="Strict" prefix="CONNSTRING_" stripPrefix="true" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment, Version=1.0.0.0, Culture=neutral" />
    </builders>
  </configBuilders>
  <appSettings configBuilders="AppSetting">
    <add key="CUSTOM_VALUE" value="1" />
  </appSettings>
  <connectionStrings configBuilders="ConnectionString">
    <add name="DefaultSqlConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=SampleDB;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

App Settings と Connection Strings に対して Configuration Builder を使うように設定しました。

とりあえずローカルの Docker でテストしておきたいので、docker-compose.yml を開いてオーバーライドしたい名前と値で環境変数を追加しておきます。この辺りの使い方は App Service っぽさがあります。

version: '3'

services:
  webapplication1:
    image: webapplication1
    build:
      context: .\WebApplication1
      dockerfile: Dockerfile
    environment:
      - APPSETTING_CUSTOM_VALUE=10
      - CONNSTRING_DefaultSqlConnection=Data Source=sample.database.windows.net; Initial Catalog=AzureDB; User Id=hoge; Password=hogehoge

実行すると、環境変数で設定した値でオーバーライドされていることが分かります。良い感じですね。

f:id:shiba-yan:20171227230311p:plain

折角なので AKS 上に構築した Windows Containers の環境にデプロイして、ちゃんと反映されるかも確認したかったのですが、手持ちの AKS クラスターの調子が悪くてデプロイ出来なかったので諦めました。

最新の Visual Studio 2017 を使うと ASP.NET アプリケーションの Docker Image をコンテナーレジストリにデプロイすることが可能となってます。これは便利。

f:id:shiba-yan:20171227231234p:plain

Docker Image を環境ごとにビルドするとか非効率かつ不安定なことをしたくないので、Docker を使って ASP.NET アプリケーションを運用する場合には必須の機能ですね。

実際に Docker Hub にデプロイしてみましたが、あっさりと終ったので特に書くこともありません。

f:id:shiba-yan:20171227234327p:plain

本当なら ACI にでもサクッとデプロイしようかと思っていましたが、プロジェクトのデフォルトだと Windows Server Version 1709 ベースだったので、実行環境が非常に限られてしまうのが難点です。

来年こそは ASP.NET アプリケーションを Dockernize する仕事をやってみたいですね。