2016-08-27 2 views
0

私は1つのBLOB、特にvhdをストレージアカウントから別のストレージアカウントにコピーしようとしています。私が書いているアプリは、両方のストレージアカウントへの所有者アクセス権を持ち、これらのストレージアカウントで他の操作を実行できます。 vhdにはリースはありません(VMに接続されていません)。私は次のコードを持っていますが、403禁止された応答を取得します。Azure異なるプレミアムストレージアカウントにBLOBをコピーする

StorageCredentials scSource = new StorageCredentials(SourceStorageName, strSourceStorageKey); 
      StorageCredentials scTarget = new StorageCredentials(TargetStorageName, strTargetStorageKey); 
      CloudStorageAccount csaSource = new CloudStorageAccount(scSource, true); 
      CloudStorageAccount csaTarget = new CloudStorageAccount(scTarget, true); 
      CloudBlobClient cbcSource = csaSource.CreateCloudBlobClient(); 
      CloudBlobClient cbcTarget = csaTarget.CreateCloudBlobClient(); 
      CloudBlobContainer bcSource = cbcSource.GetContainerReference(SourceContainer); 
      CloudBlobContainer bcTarget = cbcTarget.GetContainerReference(TargetContainer); 
      CloudBlob cbSource = bcSource.GetBlobReference(strSourceDiskName); 
      CloudBlob cbTarget = bcTarget.GetBlobReference(strTargetDiskName); 
Task<string> tskCopy = cbTarget.StartCopyAsync(cbSource.Uri); 
      while (tskCopy.Status != TaskStatus.RanToCompletion) 
      { 
       if (tskCopy.Exception != null) 
        throw tskCopy.Exception; 
       Thread.Sleep(2500); 
      } 

ない私は他のツール(クラウドベリーなど)を介して別のストレージアカウントからブロブをコピーすることですので、なぜこれが起こっていることを確認。

ありがとうございます!

+0

あなたは、ソース・コンテナのACLを確認してくださいことはできますか?ソースコンテナ内のコピー用のブロブは、公に利用可能でなければならない。 –

+0

プレミアムストレージアカウントコンテナデータは、アカウント所有者のプライベートアクセスのみに設定できます。 – Jeremy

+1

この場合、少なくとも "Read"権限を持つソースBLOB上にSAS URLを作成し、blobのURLではなくソースURLとしてSAS URLを使用する必要があります。 –

答えて

0

私を正しい方向に向けてくれたGaurav Mantriに対する誇り。共有アクセス署名を検索した後、私は具体的には、マイクロソフトhttps://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-2/

から、この記事でこのコードに出くわしました:

SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy(); 
    sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5); 
    sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24); 
    sasConstraints.Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write; 

    //Generate the shared access signature on the blob, setting the constraints directly on the signature. 
    string sasBlobToken = blob.GetSharedAccessSignature(sasConstraints); 

    //Return the URI string for the container, including the SAS token. 
    return blob.Uri + sasBlobToken; 
-1

ブロブがまだAzure Portalに仮想ディスクとして登録されているかどうか確認できますか?その場合は、ディスク参照を削除して、関連するVHDを保持して、そのBLOBのリースが解放されるようにしてください。

Azure Portalで仮想ディスク参照を削除したくない場合は、関連するblobのblobスナップショットを作成し、blobをコピーするときにそのblobソースとしてスナップショットを入力できます。

+0

VHDはVMまたはOSディスクに接続されていません。 VHDは、ARMストレージアカウント内の古典的なストレージアカウントにありません。 – Jeremy

+0

スナップショットを作成してコピーしようとしましたか? –

関連する問題