1

私はこのアプローチを使用してファイルを暗号化し、それらを Azure ブロック BLOB に格納しています。暗号化された BLOB を別の BLOB ストレージ アカウントにコピーし、その過程で暗号化を解除したいと考えています。Azure 内で完全に非同期的に実行され、転送中にローカル コンピューターを介して BLOB の内容をダウンロードしない "BLOB のコピー" 操作を実行できることはわかっています。これはCloudBlockBlob.StartCopyメソッドによって達成されると思います。しかし、暗号化されたファイルでそれを行い、他のストレージ アカウントへの転送中に復号化することは可能ですか?

上記のリンクをたどると、私のコードは次のようになります。blob.OpenRead動作しますがblob2.StartCopy動作しません。

BlobEncryptionPolicy policy = new BlobEncryptionPolicy(null, cloudResolver);
BlobRequestOptions options = new BlobRequestOptions() { EncryptionPolicy = policy };
CloudBlockBlob blob = container.GetBlockBlobReference("MyFile.txt");
//var blobStream = blob.OpenRead(null, options); //this works

CloudBlockBlob blob2 = container2.GetBlockBlobReference("MyFile2.txt");
blob2.StartCopy(blob, null, null, options, null); //this fails with: The remote server returned an error: (404) Not Found.
4

1 に答える 1

6

答えは、暗号化はストレージ クライアント ライブラリで行われるため、BLOB を新しいストレージ アカウントにコピーしても暗号化されたままになるということです。

コードが失敗する理由は、ソース BLOB がPrivateコンテナー内にあるためです。クロスアカウント コピーを機能させるには、ソース BLOB がパブリックにアクセス可能である必要があります。同じストレージ アカウント内で、プライベート コンテナーから BLOB をコピーできます。私の知る限り、エラーは暗号化とは何の関係もありません。

できることは、ソース BLOB に SAS URL を作成し、次のStartCopyメソッドのオーバーライドを使用することです。

public string StartCopy(
    Uri source,
    AccessCondition sourceAccessCondition = null,
    AccessCondition destAccessCondition = null,
    BlobRequestOptions options = null,
    OperationContext operationContext = null
)

これを行うサンプルコードは次のとおりです。

    private static void StartCopyAcrossAccount()
    {
        var sourceAccount = new CloudStorageAccount(new StorageCredentials("source-account-name", "source-account-key"), true);
        var sourceContainer = sourceAccount.CreateCloudBlobClient().GetContainerReference("source-container");
        var sourceBlob = sourceContainer.GetBlockBlobReference("blob-name");
        var sourceBlobSas = sourceBlob.GetSharedAccessSignature(new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy()
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
                Permissions = Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read
            });
        var sourceBlobSasUrl = sourceBlob.Uri.AbsoluteUri + sourceBlobSas;

        var targetAccount = new CloudStorageAccount(new StorageCredentials("target-account-name", "target-account-key"), true);
        var targetContainer = targetAccount.CreateCloudBlobClient().GetContainerReference("target-container");
        var targetBlob = targetContainer.GetBlockBlobReference("blob-name");

        var copyId = targetBlob.StartCopy(new Uri(sourceBlobSasUrl), null, null);
    }
于 2016-02-17T04:21:42.337 に答える