normalian blog

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

Windows Azureストレージ・サービスの命名規則を調べてみた

福井さんのブログ「[Memo]VS2010 RCのAzure開発で "One of the request inputs is out of range" 例外が発生」で、Windows Azureストレージ・サービスの命名規則が話題になっていた。私自身も命名規則ではまった事が有ったので、これを機会に調べてみた。

結論から言うと、テーブルストレージ、ブロブストレージ、キューストレージは全て命名規則が異なっていた。なんでこんな状態になったのかは分からないが、実際にアプリケーションを作る人間側には結構つらい。Windows Azureを学習する人のため、自分のため、命名規則をまとめてみた。
私としてのお勧めなストレージネーミングルールは「全て小文字の英字(最初の文字以外は数字もあり)でネーミングする」だ。

サンプルアプリケーション

折角なので命名規則検証用のアプリケーションを作成した。宜しければ「Skydrive StorageNamingCloudService.zip」より取得して、実際に動作確認してはいかがだろうかブロブストレージ、キューストレージのMetadataについてはサボっているので、興味のある方は拡張しても良いだろう)。アプリケーション内のaspxファイルに、「使用できる名前」と「使用できない名前」のサンプルを記述しているので、是非一度起動して頂きたい。

各ストレージについての動作検証結果

動作検証結果を以下にまとめる*1が、発生する例外がストレージ毎に異なる。特に、ブロブストレージでのブロブ作成時・書き込み時に例外が発生しないにも関わらず、ブロブへの書き込みが失敗していた(命名規則が正しい状態で、ページブロブの書き込み時に例外発生した場合もある)。

調査対象 命名規則に違反した場合の動作
テーブルストレージ ArgumentExceptionが発生
ブロブストレージ(コンテナ) StorageClientExceptionが発生
ブロブストレージ(ブロブ 何事も起きない(ストレージにも書きこまれない)
キューストレージ StorageClientExceptionが発生

全然違う…。というか、テーブルストレージだけが特殊なんだろうか。
ついでに、ブロブ作成時の動作に若干自信が無い…。間違ってたら突っ込んで頂きたい。

テーブルストレージの命名規則

詳細な情報はMSDNサイトである「Understanding the Table Service Data Model」に記載されているが、大凡を抜粋すると以下になる。

  • テーブル名
    • テーブル名は英数字のみを利用できる
    • テーブル名は数字で始まってはいけない
    • テーブル名は英文字の大文字と小文字を区別しない
    • テーブル名は3文字以上、63文字以下

実は、「テーブルストレージだけは命名規則で大文字を禁止されていない」のである。これは大いなる罠だ…。

ブロブストレージの命名規則

詳細な情報はMSDNサイトである「Naming Containers, Blobs, and Metadata」に記載されているが、大凡を抜粋すると以下になる。

  • コンテナ名(有効なDNS名である必要がある)
    • コンテナ名は英数字のどちらかで始まる必要があり、英数字と"-";を利用できる
    • コンテナ名の最初と最後は英数字でなければならない("-"ダッシュはコンテナ名の最初と最後に使ってはならない)
    • コンテナ名の文字列は、全て小文字でなければならない
    • コンテナ名は3文字以上、63文字以下
  • ブロブ
    • 任意の文字を組み合わせられるが、URLとして解決できるように適切なエスケープ処理を行う必要がある
    • ブロブ名が"."で終わるものや、"/"が前にある物は無効である

コンテナ名とブロブ名で異なるのである*2。しかも、たちの悪い事にブロブ名が不正な場合、例外が発生せずに処理が素通りした挙句にストレージにデータが書き込まれていなかった。なんというハマりどころ…orz

キューストレージの命名規則

詳細な情報はMSDNサイトである「Naming Queues and Metadata」に記載されているが、大凡を抜粋すると以下になる。

  • キュー名
    • キュー名は英数字のどちらかで始まる必要があり、英数字と"-"を利用できる
    • キュー名の最初の文字と最後の文字は英数字でなければならない。"-"は最初の文字と、最後の文字にしてはならない
    • キュー名は小文字でなければならない
    • キュー名は3文字以上、63文字以下

キューストレージが一番ハマりどころが少ない予感がする。まぁ、大文字禁止なのはブロブストレージと変わらず…。

*1:Development Storageと本番環境で動作検証をしたが差異はなかった

*2:コンテナとブロブの関係については「[http://www.atmarkit.co.jp/fdotnet/dnfuture/winazurestorage_01/winazurestorage_01_02.html:title=Windows Azureストレージ開発入門(前編) − 初めてのWindows Azureテーブル・ストレージ開発]」を参照してほしい