2016-08-27 2 views
0

하나의 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); 
      } 

내가 다른 도구 (등 클라우드 베리)를 통해 다른 하나 개의 스토리지 계정에서 BLOB를 복사 할 수이기 때문에 이런 일이 왜 확실하지.

감사합니다.

+0

당신이 소스 컨테이너의 ACL을 확인하시기 바랍니다 수 : 공유 액세스 서명을 찾고 후 나는 마이크로 소프트 https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-2/

에서이 문서 구체적으로이 코드에왔다? 소스 컨테이너에 복사하기위한 blob은 공개적으로 사용할 수 있어야합니다. –

+0

프리미엄 스토리지 계정 컨테이너 데이터는 계정 소유자의 비공개 액세스로만 설정할 수 있습니다. – Jeremy

+1

이 경우 최소한 "Read"권한을 가진 원본 BLOB에 SAS URL을 생성하고 blob의 URL 대신 소스 URL로 사용해야합니다. –

답변

0

Gaurav Mantri에게 올바른 방향으로 나를 가리키는 찬사.

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

blob이 Azure Portal에 여전히 가상 디스크로 등록되어 있는지 확인할 수 있습니까? 그렇다면 디스크 참조를 제거하고 해당 VHD를 유지하여 해당 BLOB의 임대가 해제되도록하십시오.

Azure Portal에서 가상 디스크 참조를 제거하지 않으려는 경우 연결된 blob에 대한 blob 스냅 샷을 만들고 blob을 복사 할 때 blob 소스로 스냅 샷을 입력 할 수 있습니다.

+0

VHD가 VM 또는 OS 디스크에 연결되어 있지 않습니다. VHD가 ARM 저장소 계정에있는 고전적인 저장소 계정에 없습니다. – Jeremy

+0

스냅 샷을 만들고 복사하려고 시도 했습니까? –

관련 문제