【问题标题】:How to copy whole Container from one Azure Blob Service to another with Azure Client Library v12如何使用 Azure 客户端库 v12 将整个容器从一个 Azure Blob 服务复制到另一个
【发布时间】:2021-07-04 10:18:52
【问题描述】:

我正在尝试编程 Azure 工具,特别是尝试将容器从一个 Azure Blob 存储帐户复制/克隆/移动到另一个帐户。尽管在其文档中使用客户端库的 v12.x(至少到目前为止),但我没有看到一个好的方法。

例如:

BlobStorage1
|-- SomeContrainer
    |-- blob1
    |-- blob2
    |-- blob3

BlobStorage2
|-- SomeOtherContrainer
    |-- otherBlob

我想以编程方式将 SomeContainer 及其所有 blob 移动到 BlobStorage2。

到目前为止我所尝试的:

文档阅读/咨询:

这似乎没有显示如何从 account1 pushed 转到 account2。您可以从 account2 下拉到 account one,但这与我所追求的相反。

代码尝试:

var localContainer = blobServiceClient.GetBlobContainerClient(localContainerName);
var blobs = localContainer.GetBlobs();

var remoteClient = new BlobServiceClient(remoteConnectionString);
var remoteContainer = remoteClient.GetBlobContainerClient(localContainerName);

foreach(var blob in blobs)
{
    Console.WriteLine($"copying blob: {blob.Name}");
    var sourceBlob = localContainer.GetBlobClient(blob.Name);
    var remoteBlobClient = remoteContainer.GetBlobClient(blob.Name);
    await remoteBlobClient.StartCopyFromUriAsync(sourceBlob.Uri);
}

这里的问题是我可以从远程复制到本地(通过连接字符串),或者在同一个帐户中复制,因为 URI 非常相似,但不能从我使用的帐户复制到单独的存储帐户。使用客户端库 (v12.x) 将 blob(或容器整体销售,如果可能)从一个帐户复制到另一个帐户的推荐方法是什么?

【问题讨论】:

  • 为什么不使用azcopy
  • @GauravMantri 因为我想要您可以从客户端库中获得的额外控制。
  • 明白。无论您是在同一帐户内还是在两个帐户之间复制 blob,代码都不应更改。在帐户之间复制时,您在执行上述代码时是否遇到任何错误?
  • 那么 URI 不正确,因为它是我要复制的 blob。您能否提供一个在答案中获取正确 URI 的示例?我还需要为远程 blob(尚不存在)创建一个 BlobClient 对吗?

标签: c# azure-blob-storage


【解决方案1】:

请尝试以下代码:

    static async Task CopyContainersAcrossAccounts()
    {
        var sourceAccountName = "source-account";
        var sourceAccountKey = "source-account-key";
        var targetAccountName = "target-account";
        var targetAccountKey = "target-account-key";
        Azure.Storage.StorageSharedKeyCredential sourceCredential = new Azure.Storage.StorageSharedKeyCredential(sourceAccountName, sourceAccountKey);
        Azure.Storage.StorageSharedKeyCredential targetCredential = new Azure.Storage.StorageSharedKeyCredential(targetAccountName, targetAccountKey);
        var sourceConnectionString = $"DefaultEndpointsProtocol=https;AccountName={sourceAccountName};AccountKey={sourceAccountKey};EndpointSuffix=core.windows.net;";
        var sourceContainer = "source-container-name";
        var targetConnectionString = $"DefaultEndpointsProtocol=https;AccountName={targetAccountName};AccountKey={targetAccountKey};EndpointSuffix=core.windows.net;";
        var targetContainer = "target-container-name";
        var sourceBlobContainerClient = new Azure.Storage.Blobs.BlobContainerClient(sourceConnectionString, sourceContainer);
        
        var targetBlobContainerClient = new Azure.Storage.Blobs.BlobContainerClient(targetConnectionString, targetContainer);
        var sourceBlobs = sourceBlobContainerClient.GetBlobs();
        foreach (var blob in sourceBlobs)
        {
            //Get shared access signature with "Read" permission in case source container is a private container.
            Azure.Storage.Sas.BlobSasBuilder blobSasBuilder = new Azure.Storage.Sas.BlobSasBuilder()
            {
                BlobContainerName = sourceContainer,
                BlobName = blob.Name,
                ExpiresOn = DateTime.UtcNow.AddHours(1)
            };
            blobSasBuilder.SetPermissions(Azure.Storage.Sas.BlobSasPermissions.Read);
            var sasToken = blobSasBuilder.ToSasQueryParameters(sourceCredential).ToString();
            var sourceBlobClient = sourceBlobContainerClient.GetBlobClient(blob.Name);
            var targetBlobClient = targetBlobContainerClient.GetBlobClient(blob.Name);
            var sourceBlobUri = new Uri($"{sourceBlobClient.Uri.AbsoluteUri}?{sasToken}");
            await targetBlobClient.StartCopyFromUriAsync(sourceBlobUri);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2021-06-27
    • 2021-10-10
    • 2020-01-27
    • 2015-10-22
    • 2022-12-21
    • 2017-09-10
    相关资源
    最近更新 更多