Queueネタが尽きてきそうなので、今回はBlobのパーミッション(アクセス権)に
ついてです。Blobのパーミッションには、以下の3つがあります。
- BlobContainerPublicAccessType.Off
パブリックアクセス不可。 - BlobContainerPublicAccessType.Container
コンテナレベルで、パブリックアクセス。 - BlobContainerPublicAccessType.Blob
Blobのみパブリックアクセス
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の小ネタなんですが、ちと大きくなってしまいました。