Azureの小ネタ (改)

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

Shared Access Signature その2 Write編

こんばんわ、statemachineです。なんとか週一程度の更新は続けていきたいものですが、いかがお過ごしでしょうか。今回も、前回に引き続きShared Access Signatureの続きです。

前回は、どのような場面でSASを使うのかについて言及しませんでしたが、それは私が業務アプリ屋さんでなく、あんまり思い浮かばなかったからです。1つのケースとしては、Azure上で生成したファイルなどをBlobに格納し、一定期間アクセス権を与える、みたいな感じでしょうか。

さて前回はRead Onlyだったので、今回はSASでWriteしてみたいと思います。論よりコードということで、以下。

砂漠の画像をアップロードしたのち、30秒後にチューリップ画像に差し替えるサンプルです。ちょっとマッチポンプ気味なサンプルですが、前半は開発ストレージながらちゃんとしたアカウントを使ってUpload。後半は、SASを元にBlobClientを作成し、上書きUploadしてます。
他にも色々書き方があると思うのと、コンテナレベルでWrite権あたえられるのか否かは、ちょっと不明。

void Main()
{
    // 開発ストレージアカウント
    var account = CloudStorageAccount.DevelopmentStorageAccount;

    // 画像
    var tulips = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
        "Tulips.jpg");
    var desert = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
        "Desert.jpg");
    
    var blobClient = account.CreateCloudBlobClient();
    var container = blobClient.GetContainerReference("pictures");
    var blob = container.GetBlobReference("Desert.jpg");
    blob.UploadFile(desert);
    
    // 砂漠の画像にWrite権を付与
    var sas = blob.GetSharedAccessSignature(new SharedAccessPolicy()
    {
       Permissions=SharedAccessPermissions.Read | SharedAccessPermissions.Write ,
       SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(5)
    });
    
    Console.WriteLine (blob.Uri.AbsoluteUri + sas);
    Thread.Sleep(TimeSpan.FromSeconds(30));

    //------------------------------------------------------------

    // SASを使ってBlobクライアントを作成。
    // 本環境の場合は、xxx.blob.core.windows.net とか指定する。
    var sasCreds = new StorageCredentialsSharedAccessSignature(sas);
    var sasBlobClient = new CloudBlobClient("http://127.0.0.1:10000/devstoreaccount1", sasCreds);
    var sasBlob = sasBlobClient.GetBlobReference("pictures/Desert.jpg");

    // 砂漠の画像をチューリップに更新
    sasBlob.UploadFile(tulips);
    Console.WriteLine ("Done");
}

前半部の30秒間のスリープ時にアクセスすると砂漠画像。


プログラムが終了後に、リロードするとチューリップ画像に入れ替わっているはずです。

では。