normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azureを使うときに気をつける6個のポイント

最近はWindows Azureをちょこちょこ使ってるのですが、漸く少しはノウハウが溜まってきたので備忘録として色々と書いておこうかと。Azureを弄った感想としては、アークウェイの森屋さんの仰る通りで「自分を責めない」でしょうか…。まだまだAzureではハマりどころが多そうです。

まずはサンプルと日本語の解説書をゲットしろ!!

以下の二つを一通り眺める事は必須です。Windows Azureを弄りたかったら、まずはガタガタ言わないで、以下の資料を通読する事。

Windows Azure学習用の資料・サンプル・動画等々が盛りだくさんで含まれてます。有志によって日本語化もされていますので、まずは是非ダウンロードして勉強しましょう。

  • .NET 開発テクノロジ入門

日本人の.NETTERでこの本を知らなかったらモグリでしょう。.NET技術について幅広く網羅してますが、Windows Azureについても記述されてますので、数少ない日本語本として是非手に取ってみては如何でしょう。

Azure ポータルサイトでアプリを実行する際に、アプリがInitializingの場合は触るな!!

Azureポータルサイトで自分のアプリを実行する際には以下のステップを踏みます。

  1. プロジェクトファイルをパッケージしたファイル作成(自分で開発)
  2. ポータルサイトにアクセスして、アプリのデプロイ
  3. デプロイしたアプリを起動

ポータルサイトにデプロイしたアプリを起動した場合、以下の様にAzureが頑張ってアプリを初期化しまが、初期化処理には結構時間がかかります(3〜4分くらい?)。メッセージとしては以下を参照。

Azureがアプリ初期化している段階では、ブラウザからアクセスしてもアプリは動作していません。Azureがアプリを初期化してる間は何もせずに、大人しくメッセージがStartedに代わるまでは全裸待機しましょう。

Azure StorageにアクセスするAPIが無いと泣くな!!

そう、Wokerロール・Webロールプロジェクト作成時に自動的に参照される「Microsoft.ServiceHosting.ServiceRuntime」アセンブリにはAzure StorageにアクセスするAPIが無かったりします。でも、実はちゃんとAPIが用意されてるんですよ。
Windows Azure SDKインストール時に追加されるsample.zipの中身に入ってます。場所としては、「C:\Program Files\Windows Azure SDK\v1.0\sample.zip」辺りに入ってます。zipの中身から「StorageClient\Lib」以下を引っこ抜いて、自分のAzureプロジェクトから参照しましょう。

下手にローカルストレージにアクセスせずに、本番ストレージに繋いで使え!!

デバッグ時はローカルストレージに…」等と思っている方が多いと思いますが、最初から本番環境に繋いでいた方が楽です。その心は、ローカルストレージ実行時には毎度毎度以下の要領でドライブをマウントしないといけない点です*1

MountDrive -ServiceUrl "http://127.0.0.1:10000" -DriveName "Blob" -ProviderName "BlobDrive"
MountDrive -ServiceUrl "http://127.0.0.1:10001" -DriveName "Queue" -ProviderName "QueueDrive"

OS再起動時に毎度上記のコマンドを打ち込むのは面倒なので、Azureプロジェクトの設定ファイル「ServiceConfiguration.cscfg」を、以下の記述を参考にして変更しておきましょう。

<?xml version="1.0"?>
<ServiceConfiguration serviceName="NormalianService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="Gottani_WebRole">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="BlobStorageEndpoint" value="http://<自分のアカウント名>.blob.core.windows.net/" />
      <Setting name="QueueStorageEndpoint" value="http://<自分のアカウント名>.queue.core.windows.net/" />
      <Setting name="TableStorageEndpoint" value="http://<自分のアカウント名>.table.core.windows.net/" />
      <Setting name="AccountName" value="<自分のアカウント名>" />
      <Setting name="AccountSharedKey" value="<ポータルサイトで表示されるシェアードキー>" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

Storageの制御には Azrue Storage Exploreを使え!!

しばらくサンプルプログラム作って遊んだりしてると、Storegeに余計なデータが溜まってきます。しかし、デフォルトではAzure Storageのビュアーなんぞは存在しないので、CodePlexで公開されているAzure Storage Exploreを使ってローカル・ポータルサイト両方のAzureStorageを制御しましょう。
以下が動作イメージですが、結構便利。

StorageClientの使用時には注意しろ!!

上記で紹介したStorageClientですが、実は原因不明な例外吐いたりします。ストレージに対してアクセスを行った際に、以下のスタックトレースを吐く”事が有る”ので気をつけましょう。たまに発生する例外ですが、今のところ大筋で動作に問題無し。この例外が発生した場合は「ああ、またAzureからエラーが出たか」程度の認識でスルーしましょう。

[WebException: リモート サーバーがエラーを返しました: (403) 使用不可能]
   System.Net.HttpWebRequest.GetResponse() +1126
   Microsoft.Samples.ServiceHosting.StorageClient.BlobContainerRest.UploadData(BlobProperties blobProperties, Stream stream, Int64 length, Boolean overwrite, String eTag, NameValueCollection nvc) in RestBlobStorage.cs:890

[StorageClientException: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.]
   Microsoft.Samples.ServiceHosting.StorageClient.BlobContainerRest.UploadData(BlobProperties blobProperties, Stream stream, Int64 length, Boolean overwrite, String eTag, NameValueCollection nvc) in RestBlobStorage.cs:955
   Microsoft.Samples.ServiceHosting.StorageClient.<>c__DisplayClass27.<PutBlobImpl>b__26() in RestBlobStorage.cs:863
   Microsoft.Samples.ServiceHosting.StorageClient.RetryPolicies.NoRetry(Action action) in BlobStorage.cs:220
   Microsoft.Samples.ServiceHosting.StorageClient.BlobContainerRest.PutBlobImpl(BlobProperties blobProperties, Stream stream, Boolean overwrite, String eTag) in RestBlobStorage.cs:859
   Microsoft.Samples.ServiceHosting.StorageClient.BlobContainerRest.CreateBlob(BlobProperties blobProperties, BlobContents blobContents, Boolean overwrite) in RestBlobStorage.cs:593
   WebRole1.GarallyApp.UpLoad.Button1_Click(Object sender, EventArgs e) in UpLoad.aspx.cs:49
   System.EventHandler.Invoke(Object sender, EventArgs e) +0
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +115
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +140
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +29
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2981

*1:詳しくはsample.zip\CloudDrive\scripts\MountDrive.ps1を参照して下さい