Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Blobのパーミッションについて

Queueネタが尽きてきそうなので、今回はBlobのパーミッション(アクセス権)に
ついてです。Blobのパーミッションには、以下の3つがあります。

  1. BlobContainerPublicAccessType.Off
    パブリックアクセス不可。
  2. BlobContainerPublicAccessType.Container
    コンテナレベルで、パブリックアクセス。
  3. BlobContainerPublicAccessType.Blob
    Blobのみパブリックアクセス

URL http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storageclient.blobcontainerpublicaccesstype.aspx

1.はアクセス不可なので説明不要です。2,3の違いが微妙ですが、
要はコンテナでListBlobできるか否かの違いです。

例によってLINQPadサンプル。
前半は、コンテナを作成し、Off/Container/Blob の各パーミッションを与え、
それらにチューリップ画像をUploadします。
後半は、アカウント所有者でないCloudBlobClientを作成して、ListBlobさせてみます。

void Main()
{
    var account = CloudStorageAccount.DevelopmentStorageAccount;
    var blobClient = account.CreateCloudBlobClient();
    var jpeg = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "Tulips.jpg");
    
    int i = 0;
    foreach(var atype in Enum.GetValues(typeof(BlobContainerPublicAccessType)))
    {
        var container = blobClient.GetContainerReference("accesstype-" + atype.ToString().ToLower());
        container.CreateIfNotExist();
        var blob = container.GetBlobReference("Tulips.jpg");
        blob.UploadFile(jpeg);

        var p = container.GetPermissions();
        // p.PublicAccess = BlobContainerPublicAccessType.Container; 普通は←とか指定します。
        p.PublicAccess  = (BlobContainerPublicAccessType)atype;

        // SetPermission しないと反映されません。RESTですから。
        container.SetPermissions(p);
    }

    i = 0;
    // アカウント所有者でないBlobClientの作成
    var anotherBlobClient = new CloudBlobClient("http://127.0.0.1:10000/devstoreaccount1/");
    foreach(var atype in Enum.GetValues(typeof(BlobContainerPublicAccessType)))
    {
        Console.WriteLine (" -- AccessType" + atype + " -----");
        var container = anotherBlobClient.GetContainerReference("accesstype-" + atype.ToString().ToLower());
        try {
            foreach(var blob in container.ListBlobs())
            {
                Console.WriteLine (blob.Uri.AbsoluteUri);
            }
        }
        catch(Exception e) 
        {
            e.Dump();
        }
        Console.WriteLine ();
    }
}


実行結果。
AccessTypeがOff/Blobの場合は、ListBlobに失敗して例外がでますが、
Containerの場合は成功します。

他にもブラウザで、


http://127.0.0.1:10000/devstoreaccount1/accesstype-container?restype=container&comp=list

とやることで、ListBlob相当のことができます。

<?xml version="1.0" encoding="utf-8" ?> 
<EnumerationResults ContainerName="http://127.0.0.1:10000/devstoreaccount1/accesstype-container">
<Blobs>
  <Blob>
    <Name>Tulips.jpg</Name> 
    <Url>http://127.0.0.1:10000/devstoreaccount1/accesstype-container/Tulips.jpg</Url> 
      <Properties>
      <Last-Modified>Wed, 21 Jul 2010 11:11:44 GMT</Last-Modified> 
      <Etag>0x8CCF6DCA36A0670</Etag> 
      <Content-Length>620888</Content-Length> 
      <Content-Type>application/octet-stream</Content-Type> 
      <Content-Encoding /> 
      <Content-Language /> 
      <Content-MD5 /> 
      <Cache-Control /> 
      <BlobType>BlockBlob</BlobType> 
      <LeaseStatus>unlocked</LeaseStatus> 
    </Properties>
  </Blob>
</Blobs>
<NextMarker /> 
</EnumerationResults>

Windows Azureの小ネタなんですが、ちと大きくなってしまいました。