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テーブル・ストレージ開発]」を参照してほしい