先日のTech・Ed Japan 2010 のBoFでも少し話題に挙がった Windows Azure ではロケールと時刻が違うから注意しような話ですが、わざわざ日本語環境で作るからそんな話になるのかと思い、ちょっくら Windows Azure 本番環境?っぽい構成で作ってみました。(あくまで「ぽい」です)
今回気にしてるのは以下の2点です。
- 時刻
- ロケール
上記を中心に Windows Azure と揃うような環境に仕上げてみたいと思います。
1. OSのセットアップ
OSは Windows Server 2008 R2 Standard Editon x64 英語版を利用します。
セットアップは普通に。(あとで気づきましたがここで時刻をUTCにしとけばよかった)
次に時刻の設定を変更します。
UTCにします。
2. 役割等の追加
Development Fabric が動作するように役割を追加します。
Application Server と Web Server (IIS) を追加します。
.NET Framework 3.5.1 と Web Server (IIS) Support をチェック。
Static ContentやASP.NET、CGIをチェック
インストール完了後、OSを再起動したりします。
3. Hotfixの適用
Windows Server 2008 R2 では得に必須のHotfixはなさそうなのですが、Windows Update をかけておきます。
Optional に .NET Framework 4 があるのでついでにインストールしておきます。
4. SQL Server 2008 R2 Express x64 (英語版) のインストール
既定値で良いのでサクサク入れていきます。
インストールが完了したらOS再起動しておきます。
5. Windows Azure SDK のインストール
SDKは先日公開されたばかりの1.2.1をインストールしたいと思います。
ダウンロードしてきてウィザードに従い(Nextボタンクリックするだけですが)サクサクとインストールします。
※今回の環境ではもちろんx64版をインストールします。
さて、これで環境の準備は整いました。
6. 動作確認用のWebアプリケーションの用意
テスト用のアプリケーションはサーバー上で環境変数、現在時刻等が取得できればなんでもよかったので、Web RoleにてASP.NET MVCを選択しました。
既定のビューの Index.aspx を以下のようにしました。
(中略)
<asp:Content ID=”Content2″ ContentPlaceHolderID=”MainContent” runat=”server”>
<h2>Environment</h2>
<p>
<table>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
<tr>
<td>System.DateTime.UtcNow</td>
<td><%= System.DateTime.UtcNow.ToString() %></td>
</tr>
<tr>
<td>System.DateTime.Now</td>
<td><%= System.DateTime.Now.ToString() %></td>
</tr>
<tr>
<td>System.Globalization.CultureInfo.CurrentCulture.Name</td>
<td><%= System.Globalization.CultureInfo.CurrentCulture.Name %></td>
</tr>
<tr><td colspan=”2″><b>System.Environment.GetEnvironmentVariables</b></td></tr>
<% foreach (System.Collections.DictionaryEntry v in System.Environment.GetEnvironmentVariables())
{ %>
<tr>
<td> <%= Html.Encode(v.Key.ToString()) %></td>
<td> <%= Html.Encode(v.Value.ToString()) %></td>
</tr>
<% }%>
</table>
</p>
</asp:Content>
(以下略)
後はビルドして完了です。
一応、Windows Azure 上にも展開しておきます。
くぅ、最新の1.6がまだ利用できなかった…
配置先ですが、今回は Anywhere US にしました。
7. 動作結果
さて、実際に動かしてみましょうか。
まずは普通の開発環境PC ( Windows 7 / 日本語) の場合
現在時刻とUTCの時刻がずれてますね。ロケールもja-JPです。
では、 Windows Azure 上で動作させたらどうでしょう?
現在時刻とUTCは一致してますね。ロケールはen-USです。
さて、今回作った環境上では…
お、一緒っぽい。
ということでロケールと時刻の設定だけ併せてあげればそれっぽくなった気がします。
まとめ
ということで、開発環境の言語設定、時刻設定をen-USでUTCにしてあげるとなんとなく Windows Azure で稼働させた環境にそろうことがわかりました。
普段からこの環境でテストすることで、 Windows Azure に展開してから動作がおかしい、データが変になるといった問題が予防できるかと思います。
また自身の開発PCでやるのではなく、こういった開発検証サーバーを用意することで普段の業務は日本圏でストレスなくできるかと思います。
まぁ、最初から結果が分かってたような気もしますが。。。
合ってるんかなこれ。
おまけ
今回の検証環境には Visual Studio をインストールしていません。 Windows Azure SDK だけで動作させてますが、コマンド叩けばブツさえあればちゃんと Development Fabric で動作させることが可能です。
参考までに記載しておきます。
スタートメニューの Windows Azure SDK の中に Windows Azure SDK Command Prompt がありますので、そちらを起動します。
起動後、配置するアプリケーションのフォルダまで移動し、CSRunコマンドで Development Fabric に配置します。
C:\Program Files\Windows Azure SDK\v1.2>cd C:\temp\EnvironmentCheck\EnvironmentCheck\bin\Debug
C:\temp\EnvironmentCheck\EnvironmentCheck\bin\Debug>csrun EnvironmentCheck.csx ServiceConfiguration.cscfg /lau
nchbrowser
Windows(R) Azure(TM) Desktop Execution Tool version 1.2.0.0
for Microsoft(R) .NET Framework 3.5
Copyright (c) Microsoft Corporation. All rights reserved.
Using session id 1
Created deployment(4)
Started deployment(4)
Deployment input endpoint HttpIn of role MvcWebRole1 at http://127.0.0.1:81/
CSRunコマンドに引数としてサービスディレクトリ(通常 .csxが付いたフォルダ)、サービスコンフィグファイル (.csfgファイル)を渡します。
コマンドが正常に完了すれば Development Fabric 上で稼働していことが確認できます。
簡単ですね。
コマンドで配置できるということは、この環境をテストサーバーとして、TFSを利用して自動配置と Windows Azure に似せた環境で自動テスト等も出来そうですね。