横井 羽衣子 (よこい ういこ)
SQL Developer Support Engineer
皆さんごきげんよう。今日は、みんな大好き Windows Azure で、Web ロールで特定のバージョンの (Guest OS に入ってるより新しいバージョンなど) SQL Server Native Client を常に使えるようにしたいときにはどうしたらいいか?というお話しをご紹介します。
PHP などで、ODBC 接続を使いたいシナリオがあります。こんな時、SQL Server Native Client を使って接続します。Windows Azure SQL Database のポータルで接続文字列をコピーするときも、いろいろ選べますが、SQL Server Native Client が文字列に入っています。しかし、オンプレミスの OS 上で動作するアプリケーションと異なり、Windows Azure であることを考慮したポイントがあります。今日はそれらの注意点などを踏まえながら、SQL Server Native Client を使えるようにする方法を見ていきましょう。
最初に : Windows Azure のロールとゲスト OS の関係
Visual Studio で Web ロールを作って配置すると、リモートデスクトップもできてしまいます。でも、Visual Studio では、プロジェクトを作るだけで、OS の設定とかしてませんよね?では、Windows Azure 上に構成された Web ロールは、どのように動くのでしょうか。
これらのプログラムは、実はマイクロソフトが管理しているゲスト OS のイメージ上で動作します。基本的に、概念としてはアプリケーションを利用する側は、ゲスト OS の構成を考慮する必要はなく、マイクロソフトにお任せ、ということになり、定期的にメンテナンスなどが行われる過程において、OS のリプレースが発生します。イメージ的には、「まっさらな」状態に戻ってしまうのです。これはすなわち、デバッグ用に提供されたリモート デスクトップなどを利用して、モジュールを構成していても、永続性は完全に保証されないということを意味します。(※)これは、Windows Azure の PaaS としての設計上、想定された動作となります。
図 : SQL Server Native Client がメンテナンスに伴うリプレースのためバージョンが戻っちゃって Windows Azure SQL Database に接続できない。この例では、接続可能な最低限のバージョンである 10.50.2500より古い 10.00.2531 が使われている。(ダイアログはイメージです。また、上記はあくまでもイメージをつかむための図です。正確な構成図などはMSDN などをご覧くださいませ。)
では、こうした状況に対し、常に自アプリケーションが依存するモジュールを使用できるようにするためにはどのようにすればよいのでしょうか。
その手段として、「スタートアップ タスク」が存在します。スタートアップ タスクによって、プロジェクト中にて依存関係を持つモジュールを構成してあげればよいのです。これにより、リプレースによって OS が某アニメの女子のように "n 人目" になっても、変わらずモジュールを使い続けることができるのです。次項では、スタートアップ タスクの構成手順についてご案内します。
(※) 仮想環境を構築するハイパーバイザー上に存在している間は再起動で変更されることはありませんが、OSの更新のタイミングで固定イメージにリプレースされることがあります。リプレースされると、新しいイメージの OS に入れ替わるため、リモートデスクトップなどで構成した一時的な情報は更新前の OS のイメージとともに削除されます。
Note : リモート デスクトップ経由での構成についての注意 |
リモート デスクトップ経由での構成は、デバッグ用途であり、運用を焦点に置いたアプリケーションの追加などは想定していないことに留意頂く必要があります。こうした注意点については、下記ドキュメントをご参照ください。 OS のアップグレード処理について リモート デスクトップを利用したデバッグ |
図 : スタートアップタスクでリプレース後もプロジェクト中にて依存関係を持つモジュールを構成するように設定してあげればいつでも使いたいバージョンが使用可能!
スタートアップ タスクを利用して SQL Server Native Client を構成する
Guest OS には、SQL Server 2008 Native Client が既にインストールされていますが、接続先が Windows Azure SQL Database の場合、バージョンが古いものとなるため、新しいバージョン (SQL Server Native Client 10 のバージョン 10.50.2500以上または SQL Server Native Client 11.0) を使っていただく必要があります。
1. 以下のサイトから、新しいバージョンの Native Client を開発マシン上にダウンロードしてください。
Microsoft SQL Server 2008 R2 SP2 Feature Pack (Feature Pack は、サービス パックごとに用意されます。2013/07 現在の最新は SP2 です。)
http://www.microsoft.com/ja-jp/download/details.aspx?id=30440
Microsoft SQL Server 2012 Feature Pack※ SQL Server Native Client 11.0
http://www.microsoft.com/ja-jp/download/details.aspx?id=29065
※ 何れのリンクにおいても、x64 版の sqlncli.msiをダウンロードします。
ダウンロード時の注意
(b) [ダウンロードするプログラムを選んでください。] という画面に遷移しますので、sqlncli_<プラットフォーム名>.msi のチェック ボックスをオンにして、ボタンを押します。チェックボックスは複数チェックできます。
(c) お使いのブラウザにて、ダウンロードが開始されます。ブラウザの設定に合わせ、ダウンロードをお願いします。
接続文字列を書き換える : SQL Server Native Client 11 を使う場合
Windows Azure SQL Database 管理ポータルから接続文字列をコピーしてきて使う場合は、SQL Server Native Client 11 の場合、ODBC 接続において Driver 指定を、{SQL Server Native Client 10.0} → {SQL Server Native Client 11.0} に書き換える必要があります。
図 : 管理ポータルから得られる接続文字列
2. エディタで startup.cmdというファイルを作成し、内部に以下の記述を追加します。
このコマンドは、sqlncli.msiパッケージをサイレントモードでインストールするコマンドです。 なお、ファイルを保存する際には、UTF-8 等の Unicode 形式ではなく、ANSI 形式で保存してください。
msiexec.exe /i sqlncli.msi /passive /qn IACCEPTSQLNCLILICENSETERMS=YES /l*v C:\sqlncli.log
3. ご利用いただいて��る Web Role プロジェクトを Visual Studio で開きます。
4. ソリューション エクスプローラ内の Web Role のプロジェクトを右クリックし、[追加] → [既存の項目] を選択します。以下のファイルを追加してください。
- sqlncli.msi
- startup.cmd
5. ソリューション エクスプローラ上で sqlncli.msi を右クリックし、プロパティを表示し、プロパティ画面の [出力ディレクトリにコピー] 個所で [新しい場合はコピーする] を選択ください。
6. startup.cmd についても、項目 5 と同様に [新しい場合はコピーする] を選択ください。
この処理を実施いただくことで、sqlncli.msi と startup.cmd が出力されるパッケージに追加が行われます。
7. 今度は、ソリューション エクスプローラ内のクラウドプロジェクト側 (VS2010 では地球儀のアイコン / VS2012 では雲のアイコン) で、ServiceDefinition.csdef をダブルクリックして開きます。
XML が表示されるので、<WebRole> タグの中に、以下のタグを追加します。
<Startup> |
例) サービス名 WindowsAzure_2013_01 の場合。全文貼り付けせず、適宜参考にして<Startup> – </Startup>までを張り付けてください。
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WindowsAzure_2013_01" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-10.1.8">
<WebRole name="WebRole1" vmsize="Small">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
<Import moduleName="RemoteAccess" />
<Import moduleName="RemoteForwarder" />
</Imports>
<Startup>
<Task commandLine="startup.cmd" executionContext="elevated" taskType="simple" />
</Startup>
</WebRole>
</ServiceDefinition>
これで、ロールの初期化時に、指定したコマンドが実行されるようになります。
Note : うまく配置が進まない時は |
スタートアップ タスクが失敗し、再試行を繰り返し続けている場合があります。taskType が simple の場合は、スタートアップ タスク実行中はシステムが待機状態になりますので、その場合は、taskType を simple から background に変更してみてください。 background の場合は、非同期に実行されるため、システムが止まることはありません。 また、リモート デスクトップに入ることが出来るようであれば、上記 2. 項で /l*v オプションで指定したログ (2. の例では、C:\sqlncli.log) を確認し、インストールに成功しているか見てみます。 成功している場合は、再度 taskType を simple に戻します。
なおインストーラは、失敗した場合も成功時も必ずログを残しますので、ログが出力されていない場合はスタートアップ タスクでインストーラが動作していない可能性があります。 |
8. 以上の設定をしたのちに、実際に Windows Azure 環境にパッケージをアップロードください。
その後、リモートデスクトップで接続を行い、以下のフォルダの sqlncli1n.dll(n はバージョン) が新しいモジュールに更新されれば構成は成功したことになります。
例) SQL Server Native Client 11.0 の場合 – sqlncli11.dll
(64 bit) D:\Windows\System32\sqlncli11.dll
(32 bit) D:\Windows\SysWOW64\sqlncli11.dll
参考文書
How to Define Startup Tasks for a Role
http://msdn.microsoft.com/en-us/library/windowsazure/gg456327.aspx
WebRole Schema
→ “Task Element” の項をご参照ください。
http://msdn.microsoft.com/en-us/library/windowsazure/gg557553.aspx#Startup
おまけ : リモートデスクトップに入るのって、どうするの?(VS2012 編)
0. Windows Azure サービスプロジェクトを Visual Studio で作成し、ロールを追加してプロジェクトが開いたら、ソリューション エクスプローラを下にスクロールし、Windows Azure プロジェクトを右クリックし、[リモート デスクトップの構成(R)] を選択します。
- [すべてのロールの接続を有効にする] チェックボックスをオンにして、ユーザ証明書を指定します。
※ ユーザ証明書がない場合ダイアログの "Windows Azure ポータル" と青色になっているところをクリックすると、ポータルにジャンプしそこで証明書がダウンロードされ始めます。ダウンロードしたら、ダイアログのドロップダウン リスト右の[表示...] ボタンを押し、ダウンロードした証明書を選択すると、ドロップダウンリストに表示されるようになりますので選択します。
- リモート デスクトップに接続するアカウント名とパスワードを入力し、[OK] を押します。
1. Visual Studio 上の、[サーバー エクスプローラ] で、[Windows Azure で計算] を展開します。
2. 配置したロール名が展開されるのでさらに展開します。
3. "インスタンス n" (n は数字) を右クリックして、[リモート デスクトップで接続] を選択します。
例)
Windows Azure で計算
+ <プロジェクト名>
+ WebRole1
- インスタンス0 ← ここを右クリック
4. リモートデスクトップ接続のダイアログが現れます。前の項の手順の 0 で指定したユーザでログインします。
/////////////////////////////
いかがでしたでしょうか。是非、スタートアップ タスク、使ってみてください。
それでは皆さんごきげんよう。