Windows Azure Web サイト: アプリケーション文字列と接続文字列の機能性
このポストは、7 月 18 日に投稿された Windows Azure Web Sites: How Application Strings and Connection Strings Work の翻訳です。
編集メモ : 今回は、Windows Azure Web サイト チームで主任プログラム マネージャー リードを務める Stefan Schackow の投稿をご紹介します。
Windows Azure Web サイトには、Web サイト関連の構成情報の一部をキー値文字列のペアとして Azure に保存する便利な機能が備えられています。この機能を利用すると、Windows Azure Web サイトの実行時にこれらの値を自動的に取得し、Web サイトで実行するコードで利用できます。一般的で簡単なキー値ペアだけでなく、接続文字列として使用されるキー値ペアも保存できます。
このキー値ペアは、バックグラウンドで Windows Azure Web サイトの構成ストアに保存されるため、ユーザーの Web アプリケーションのファイル コンテンツに保存する必要はありません。これにより、パスワード付きの SQL 接続文字列などの機密情報が web.config や php.ini などのファイルでクリアテキストとして表示されてしまうことがないため、セキュリティ面でもメリットがあります。
Windows Azure ポータルの [Configure] タブで、Web サイトに使用するキー値ペアを入力できます。このタブには、キーと関連する値を入力する場所が 2 か所あります。下のスクリーンショットがその入力画面です。
ここには、「アプリケーション設定」または「接続文字列」としてキー値ペアを入力できます。この 2 つには、1 点だけ違いがあります。接続文字列の方には小さなメタデータが含まれており、Windows Azure Web サイトに対してその文字列値がデータベース接続文字列であること示します。これは、Web サイトでダウンストリーム コードを実行するうえで、接続文字列の特定の動作に対して有効な場合があります。
キー値ペアを環境変数として取得する
開発者が Web サイトで使用するキー値ペアを入力すると、Web サイト内で実行されているコードを使用して、実行時にデータを取得できます。
Windows Azure Web サイトで、実行中の Web サイトにこれらの値を渡す場合、環境変数を使用するのが最も一般的な方法です。たとえば、上のスクリーンショットに示したデータを使用した場合、環境変数を使用してデータをダンプする ASP.NET のコード スニペットは次のようになります。
このコード スニペットのサンプル ページの出力結果は、次のとおりです。
[メモ: この記事では、SQL 接続文字列のうち公開できない部分は意図的にアスタリスクで伏せています。実行時には、サーバー名、データベース名、ユーザー名、パスワードを含む完全な接続文字列が取得されます。]
「アプリケーション設定」および「接続文字列」のどちらの場合でも、キー値ペアは環境変数として保存されるため、これらの値は、Windows Azure Web サイトでサポートされている任意の Web アプリケーション フレームワークで簡単に取得できます。PHP を使用して同一の設定を取得するコード スニペットの例を次に示します。
この記事でお見せしたこれまでの例から、それぞれのキーを参照する場合、命名規則があることに気付かれたのではないでしょうか。「アプリケーション設定」の場合、対応する環境変数の名前の前に “APPSETTING_” という文字列が付きます。
「接続文字列」の場合は、データベースの種類ごとに命名規則があり、ドロップダウン リストで指定したデータベースの種類に応じて環境変数名の前に文字列が追加されます。このサンプルでは、ドロップダウン リストで [SQL Databases] を選択しているため、構成に従って接続文字列に “SQLAZURECONNSTR_“ が使用されています。
データベースの接続文字列の全種類と、環境変数名の前に追加される文字列は以下のとおりです。
[SQL Databases] を選択した場合は、“SQLAZURECONNSTR_“
[SQL Server] を選択した場合は、“SQLCONNSTR_“
[MySQL] を選択した場合は、“MYSQLCONNSTR_“
[Custom] を選択した場合は、“CUSTOMCONNSTR_“
ASP.NET でキー値ペアを取得する
ここまでは、ポータルで入力されたキー値ペアが、環境変数によって Web アプリケーションへ適用されるまでの流れを説明しました。ASP.NET Web アプリケーションでは、同様に使用可能な、ちょっとしたランタイム マジックがあります。各種キー値の名前は、意図的に .NET 開発者に馴染みがあるものにしています。「アプリケーション設定」の場合は、.NET フレームワークの appSettings 構成に細かく対応しています。同様に、「接続文字列」の場合は、.NET フレームワークの connectionStrings コレクションに対応しています。
次に示すのは、System.Configuration 型を使用してアプリケーション設定を参照する ASP.NET のコード スニペットです。
先に示した例でポータルに入力された値が、自動的に AppSettings コレクションに組み込まれている点に注目してください。web.config ファイルの既存の値に対してアプリケーション設定が実行されると、Windows Azure Web サイトは、Web サイトに関連付けられている値を使用して、実行時にその部分を自動的に上書きします。
接続文字列もほぼ同様に機能しますが、小さな追加機能があります。先に示した例の中に、“example-config_db“ という Web サイトに関連付けられた接続文字列がありました。Web サイトの web.config ファイルが <connectionStrings /> 構成設定の同一の接続文字列を参照する場合、Windows Azure Web サイトは実行時に、接続文字列の該当部分を、ポータルで入力された値で自動的に更新します。
Windows Azure Web サイトが web.config から接続文字列の該当する名前を発見できない場合、前述のとおり、ポータルで入力された接続文字列は環境変数としてのみ使用できます。
たとえばここで、web.config のエントリを次のように仮定したとします。
Web サイトは、次のコード スニペットを使用してこの接続文字列を参照します。このとき、環境には依存しません。
このコードが開発者のローカル マシンで実行されている場合は、戻された値は web.config ファイルの値です。一方、このコードが Windows Azure Web サイトで実行されている場合は、戻された値はポータルで入力された値で上書きされます。
この機能は非常に便利です。と言うのも、アプリケーションの展開先にかかわらず、アプリケーションが使用している接続文字列情報を正しく把握することは、長い間開発者たちを悩ませてきた問題であり、この機能を使用することでこの問題を上手く解決できるからです。
コマンドラインからキー値ペアを構成する
ポータルでアプリケーション設定や接続文字列の保守を行う代わりに、PowerShell コマンドレットやクロスプラットフォームのコマンド ライン ツールでも、両方の種類のキー値ペアを取得したり更新したりすることができます。
たとえば、次の PowerShell コマンドでは、複数のアプリケーション設定のハッシュテーブルを定義し、“example-config“ という Web サイトに関連付けしつつ、Set-AzureWebsite コマンドレットで Azure に保存します。
このコード スニペットを ASP.NET で実行すると、元のアプリケーション設定の値 (“some-key-here“) が更新され、2 つめのキー値ペア (“some-other-key“) が追加されます。
サンプルの HTML 出力を見ると、次のように更新されていることがわかります。
“some-other-key“ から “a-different-value“ に更新
“some-key-here“ から “changed-this-value“ に更新
接続文字列を更新した場合も、同様の作業が行われます。ただし、PowerShell コマンドレットでは、接続文字列が ConnStringInfo オブジェクト (正確には Microsoft.WindowsAzure.Management.Utilities.Websites.Services.WebEntities.ConnStringInfo) の List<T> として内部的に処理されるため、構文が多少異なります。
次の PowerShell コマンドは、新しい接続文字列を定義して、Web サイトに関連付けられたリストに追加し、その後すべての接続文字列を Azure に保存し直します。
$cs.Type プロパティの種類を定義するうえで使用できる文字列は、“Custom“、“SQLAzure“、“SQLServer“、“MySql“ のいずれかです。
以下のコード スニペットを ASP.NET で実行すると、Web サイトの全接続文字列のリストが作成されます。
Windows Azure Web サイトで接続文字列を上書きし .NET フレームワークの接続文字列構成コレクションの値としてマテリアル化するには、接続文字列が事前に web.config で定義されている必要があるので注意してください。このサンプル Web サイトでは、web.config は次のように更新されました。
ASP.NET ページの実行時に、両方の接続文字列の値は PowerShell を介して保存された値で上書きされます (最初の接続文字列のうち公開できない部分は、意図的にアスタリスクで伏せています)。
まとめ
この記事では、構成データのシンプルなキー値ペアを Web サイトに関連付けて、実行時に環境変数として取得することがいかに簡単かをご紹介しました。この機能を活用すると、構成データを Web サイトの構成ファイルでクリアテキストとして表示することなく、安全に保存できます。また、ASP.NET を使用している場合、値を .NET の AppSettings および ConnectionStrings 構成コレクションの値として自動的にマテリアル化できる、ちょっとした「マジック」のような拡張構成機能を使用できます。
ぜひ、お試しください!