ストレージアカウントを越えたAzure Blobのコピー

ストレージアカウントを跨いだAzure Blobのコピーは可能です。
順を追って見ていきたいと思います。

まずは、転送元ブロブへの参照と共有アクセス署名を取得する必要があります。
共有アクセス署名を取得する際には、アクセス権限と有効期間を指定します。
10分でも大抵は問題ありませんが、大量のファイルを同時にコピーしたり、大容量のファイルをコピーする場合には、十分なテストを行った上で決定しましょう。

// 転送元ストレージクライアント取得
CloudStorageAccount storageAccountSrc = 
    new CloudStorageAccount(new StorageCredentials(storageAccountNameSrc, storageAccountKeySrc), true);
CloudBlobClient clientSrc = storageAccountSrc.CreateCloudBlobClient();

// 転送元ブロブ取得
ICloudBlob blobSrc = clientSrc.GetBlobReferenceFromServer(new Uri(urlSrc));
// 転送元ブロブの共有アクセス署名の取得
string sasSrc = blobSrc.GetSharedAccessSignature(
    new SharedAccessBlobPolicy() { 
        Permissions = SharedAccessBlobPermissions.Read, 
        SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10) });

次に転送先のブロブへの参照を取得します。

// 転送先ストレージクライアント取得
CloudStorageAccount storageAccountDst = 
    new CloudStorageAccount(new StorageCredentials(storageAccountNameDst, storageAccountKeyDst), true);
CloudBlobClient clientDst = storageAccountDst.CreateCloudBlobClient();

// 転送先ブロブ取得
CloudBlockBlob blobDst = clientDst.GetBlobReferenceFromServer(new Uri(urlDst));

コピー命令の起点は転送先になります。転送元のアカウント情報がなくなるため、ここで共有アクセス署名が必要になります。
転送元ブロブのURLに共有アクセス署名を付加します。

また、コピーは非同期で行われるため、コピーが終わったことを確認するためにポーリングを行っています。
FetchAttributes()を実行した後で、CopyState.Statusを確認するとPendingやSuccessなどのコピー状況が取得できます。

// コピー実行
blobDst.StartCopyFromBlob(new Uri(blobSrc.Uri + sasSrc), null, null);
while (true)
{
    blobDst.FetchAttributes();
    if (blobDst.CopyState.Status == CopyStatus.Success)
    {
        break;
    }
    System.Threading.Thread.Sleep(500);
}

最後にコピー先のブロブにContentTypeを設定しています。
コピーによってコピー元の内容が反映されるので、通常は不要ですが、このようにプロパティを変更したい場合は、本サンプルのように完了を待ち合わせる必要があります。
もし、Pending状態のブロブに変更を加えようとすると、「競合(409)」エラーになってしまいます。

// Content-Type設定
blobDst.Properties.ContentType = "images/jpeg";
blobDst.SetProperties();

コピー処理の命令は内部的には一旦キューに格納されてから実行されていきます。
そのため、Pendingが長時間続く場合があります。
ほとんどの場合は数秒で実行されますが、時々200秒程度待たされることもありました。

非常に便利な機能ですが、いくつかの特性を理解した上で利用する必要があります。


This entry was posted in 未分類 and tagged , . Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>