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 API 、GetContainerMetadata API、 ListContainer 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 件のコメント:
コメントを投稿