Help us understand the problem. What is going on with this article?

デプロイ時にWeb.configに値を設定する Parameters.xml の話

More than 5 years have passed since last update.

背景

ASP.NET で作ったサイトを Web Deploy パッケージを作成し、
バッチファイルによる展開をしている環境で、発行(デプロイ)時に値を設定したくなることがあると思います。

特によくあるのが次の2つのケースです

  • パスワードを含むデータベース接続文字列・マシン鍵などはソースコード管理に入れたくない
  • 一時的にIPアドレス制限をかけたい

この時役に立つ方法が
Web 配置パッケージで Web 配置パラメーターを使用する
です。

環境によって異なる値を設定する2つの方法

ビルド時に設定する Web.*.config

VisualStudio2013で ASP.NET MVC プロジェクトを作成すると
Web.config と一緒に Web.Debug.config , Web.Release.config の2つのファイルが生成されます。
どちらも Web.config に対する値変更を指示する XSLT ファイルです。

  • Web.Debug.config は Debugビルドの時にのみ適用される
  • Web.Release.config は Releaseビルドの時にのみ適用される

本番環境用のデータベース接続文字列を Web.Release.config に記述すれば、
環境による違いを吸収して自動化することができます。

デプロイ時に設定する SetParameters.xml

Web Deploy パッケージの作成をすると、5つのファイルが生成されます。

QS_20141204-110346.png

このうち SetParameters.xml にある値がデプロイ時に上書きされます。

すなわちここにパスワードを記述すれば、
本番環境のデプロイ担当者だけが、パスワードにアクセス可能で、
ビルド環境を触る開発者やソースコードリポジトリにパスワードを曝さなくて済むようになりました。
イヤッホウ!

aspnetParametersXml.png

Parameters.xml でデプロイ時に設定する対象を追加する

接続文字列についてはVisualStudioが自動的に判定して設定可能にしてくれますが、
それ以外の値を設定可能にするには Parameters.xml を ASP.NET プロジェクトの最上位フォルダ(Web.configの隣)に配置します。

例えば ipSecurity を Web.config に記述したとして、その allowUnlisted 属性の値を変更したいのであれば、
以下のようになります。

Web.configの一部
<?xml version="1.0" encoding="utf-8"?>
<configuration>
......
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
        <add ipAddress="127.0.0.1" allowed="true" />
      </ipSecurity>
    </security>
  </system.webServer>
......
Parameters.xml
<?xml version="1.0" encoding="utf-8"?>
<parameters>
  <parameter name="/configuration/system.webServer/security/ipSecurity/allowUnlisted" description="IPアドレス制限">
    <parameterEntry kind="XmlFile"
                    defaultValue="false"
    scope="\\Web.config$"
    match="/configuration/system.webServer/security/ipSecurity/@allowUnlisted" />
  </parameter>
</parameters>

ここで、WebDeplay パッケージの作成をすると、 Setparameters.xml に行が増えます

QS_20141204-113615.png

WebDeploy パッケージのバッチファイルを利用してデプロイ実行すると

QS_20141204-113704.png

IISアプリケーションとして展開された先の Web.config の値が書き換わりました!

QS_20141204-113734.png

最後に

この機能については、日本語の記事に全く当たらず、
pubxml ファイルに何か書けばいけるのではないか?など長らく悩んだ過去がありました。

CI、自動ビルドの結果を WebDeployパッケージの形で管理しているような環境であれば
役に立つのではないかと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away