2011年5月26日木曜日

Azure Storage REST API サンプル ~コンテナ関係~

Windows Azure Storage Services REST API という形で提供されている、REST 形式にて利用するストレージ関係のAPIの中で、コンテナ周りの API をアクティビティ化してみました。その際に色々分かったところもあるので、メモとして残しておきます。

コンテナ関係のAPI

List Containers 現在のコンテナ一覧を取得する
Create Container コンテナを新規に作成する
Delete Container コンテナを削除する
Get Container Properties コンテナの情報を取得する
Get Container ACL コンテナのアクセス制限を設定する
Set Container ACL コンテナのアクセス制限を取得する
Get Container Metadata コンテナにメタデータを取得する
Set Container Metadata コンテナにメタデータを設定する

カテゴライズした場合、もう一つ List Blobs という API もあるのですが、個人的にこれはBlob操作系と思っているので別の機会にします。

今回は全部で8つありますので結構なソース量になりました。そのため一式を SkyDrive 上にアップロードしてありますので、整理していない汚いソースですがそちらも参考にしてください。基本的な構造は今までと同様に、ベースとなる基底クラスを用意し各アクティビティはそれを継承、部分的にオーバーライドしている形となっています。

例えば CreateConteiner API 用のアクティビティは次のように実装しました。

   1: Imports System.Activities
   2: Imports System.ComponentModel
   3:  
   4: Public Class CreateAzureContainerActivity
   5:     Inherits AzureStorageActivityBase
   6:  
   7:     <Category("コンテナ設定")>
   8:     <DisplayName("コンテナのセキュリティ")>
   9:     Public Property AccessMode As String
  10:  
  11:     Public Sub New()
  12:         Me.DisplayName = "Azure ストレージコンテナの作成"
  13:     End Sub
  14:  
  15:     Protected Overrides Sub AddRequestHeader(wq As System.Net.WebRequest)
  16:         wq.ContentLength = 0
  17:         If Me.AccessMode IsNot Nothing Then
  18:             Select Case Me.AccessMode.ToLower
  19:                 Case "container" : wq.Headers.Add("x-ms-blob-public-access", "container")
  20:                 Case "blob" : wq.Headers.Add("x-ms-blob-public-access", "blob")
  21:                 Case Else
  22:             End Select
  23:         End If
  24:         MyBase.AddRequestHeader(wq)
  25:     End Sub
  26:  
  27: End Class

本当であれば、CreateContainer API では同時にコンテナのメタデータも設定できるのですが、今のところそこは割愛していますw 実際に行うのであれば、SetContainerMetadata API 用のアクティビティを見てもらえれば、方法は分かると思います。

CreateContainer でストレージの基点となるコンテナを作成するのですが、ここで注意点があります。

  • コンテナのアクセスモードはコンテナの ACL 設定でも指定可能
  • REST API のリクエストヘッダに ContentLength = 0 の指定が必須

他 Set~ 系 API も同様なのですが、API の挙動として「指定した値で設定値を書き換える」というのがあります。「指定した設定値を追加する」のではなく「書き換える」ので、例えばメタデータの場合、全てのメタデータ設定を指定しなければ削除されることになります。もしストレージ管理を独自に行う場合は上記挙動がありますので、先に設定を取得しその結果に追記または削除、を行う必要があります。

その挙動がありますので、SetContainerACL API のアクティビティサンプルでは下記ロジックのように実装していますが、これは「現在の設定を置き換える」ように動作しますので注意してください。


   1: Imports System.ComponentModel
   2:  
   3: Public Class SetAzureContainerACLActivity
   4:     Inherits AzureStorageActivityBase
   5:  
   6:     <CategoryAttribute("ポリシー")>
   7:     <DisplayName("ポリシー名称")>
   8:     Public Property PolicyName As String
   9:     <CategoryAttribute("ポリシー")>
  10:     <DisplayName("適用開始する日時")>
  11:     Public Property StartDatetime As DateTime
  12:     <CategoryAttribute("ポリシー")>
  13:     <DisplayName("適用終了する日時")>
  14:     Public Property EndDatetime As DateTime
  15:     <CategoryAttribute("ポリシー")>
  16:     <DisplayName("設定する権限")>
  17:     Public Property Permissions As String
  18:  
  19:     Public Sub New()
  20:         Me.DisplayName = "Azure ストレージコンテナのACL設定"
  21:     End Sub
  22:  
  23:     Protected Overrides Sub SetHttpMethod(wq As System.Net.WebRequest)
  24:         wq.Method = "PUT"
  25:     End Sub
  26:  
  27:     Protected Overrides Function CreateApiPath() As System.Uri
  28:         Return New Uri(String.Format(STORAGE_API_PATH, Me.Account, Me.ResourceName) + "?restype=container&comp=acl")
  29:     End Function
  30:  
  31:     Protected Overrides Function CreateBodyMessage(adminAccount As String, resName As String) As String
  32:         Dim result = "<?xml version=""1.0"" encoding=""utf-8""?>"
  33:         If Me.PolicyName.Trim = "" Then
  34:             result += "<SignedIdentifiers />"
  35:             Return result
  36:         End If
  37:  
  38:         result += "<SignedIdentifiers>"
  39:         result += "<SignedIdentifier>"
  40:  
  41:         result += "<Id>" + Me.PolicyName.Trim + "</Id>"
  42:  
  43:         result += "<AccessPolicy>"
  44:         result += "<Start>" +
  45:                       Me.StartDatetime.ToUniversalTime.ToString("yyyy-MM-dd") + "T" +
  46:                       Me.StartDatetime.ToUniversalTime.ToString("HH:mm:ss") + "Z" +
  47:                       "</Start>"
  48:         result += "<Expiry>" +
  49:                       Me.EndDatetime.ToUniversalTime.ToString("yyyy-MM-dd") + "T" +
  50:                       Me.EndDatetime.ToUniversalTime.ToString("HH:mm:ss") + "Z" +
  51:                       "</Expiry>"
  52:         result += "<Permission>" + Me.Permissions.ToLowerInvariant + "</Permission>"
  53:         result += "</AccessPolicy>"
  54:  
  55:         result += "</SignedIdentifier>"
  56:         result += "</SignedIdentifiers>"
  57:  
  58:         Return result
  59:     End Function
  60:  
  61: End Class

ここで話に出た ACL というのは、コンテナに対してアクセス制限を行うための設定です。「パブリックにアクセスできる」「プライベートとして隠す」という大元の設定以外にも、「特定期間は読取のみ可能」「特定期間は読み書き可能」という制限を行う事が出来ます。

この「特定期間」というものがアクセス制御の設定にはついて回ります。大元の設定では不要ですが、細かい設定を行う場合には「開始日時」「終了日時」の指定が必須です。大元の設定はリクエストヘッダに含ませる形になりますが、細かい設定はリクエストの本文として送信する必要があります。

もう一つサンプルとして、メタデータ設定アクティビティのコードを記載します。


   1: Imports System.ComponentModel
   2:  
   3: Public Class SetAzureContainerMetadataActivity
   4:     Inherits AzureStorageActivityBase
   5:  
   6:     <Category("メタデータ")>
   7:     <DisplayName("メタデータ種類名")>
   8:     Public Property MetadataName As String
   9:     <Category("メタデータ")>
  10:     <DisplayName("メタデータ値")>
  11:     Public Property MetadataValue As String
  12:  
  13:     Public Sub New()
  14:         Me.DisplayName = "Azure ストレージコンテナのメタデータ設定"
  15:     End Sub
  16:  
  17:     Protected Overrides Sub SetHttpMethod(wq As System.Net.WebRequest)
  18:         wq.Method = "PUT"
  19:     End Sub
  20:  
  21:     Protected Overrides Function CreateApiPath() As System.Uri
  22:         Return New Uri(String.Format(STORAGE_API_PATH, Me.Account, Me.ResourceName) +
  23:                               "?restype=container&comp=metadata")
  24:     End Function
  25:  
  26:     Protected Overrides Sub AddRequestHeader(wq As System.Net.WebRequest)
  27:         wq.ContentLength = 0
  28:         If Me.MetadataName.Trim <> "" Then
  29:             wq.Headers.Add("x-ms-meta-" + Me.MetadataName, Web.HttpUtility.UrlEncode(Me.MetadataValue))
  30:         End If
  31:         MyBase.AddRequestHeader(wq)
  32:     End Sub
  33:  
  34: End Class

コンテナのメタデータは、リクエストヘッダに含ませる形で指定を行います。

  • メタデータとして設定できる量は 8kb までという制限がある
  • 複数項目の設定が可能
  • リクエストヘッダに含むので UrlEncode した形で設定

という部分に注意すれば、後はそれほど問題はないかと思います。ここで設定したコンテナのメタデータは、GetContainerProperties APIGetContainerMetadata APIListContainer API にて取得が行えます。

ついでなのでコンテナの削除も記載しておきます。


   1: Public Class DeleteAzureContainerActivity
   2:     Inherits AzureStorageActivityBase
   3:  
   4:     Public Sub New()
   5:         Me.DisplayName = "Azure ストレージコンテナの削除"
   6:     End Sub
   7:  
   8:     Protected Overrides Sub SetHttpMethod(wq As System.Net.WebRequest)
   9:         wq.Method = "DELETE"
  10:     End Sub
  11:  
  12: End Class

見てもらうとわかると思いますが、DELETEメソッドでコンテナを呼び出すと削除できます。一番簡単ですね。

これらの REST API を利用する事でコンテナの作成から削除までを行う事が出来ます。

0 件のコメント:

コメントを投稿