我正在编写一个脚本,将Blob从一个Azure Blob存储容器复制到另一个;可能在不同的存储帐户中。我是如何做到这一点的要点如下:
const sourceBlobClient = BlobServiceClient.fromConnectionString(sourceConnectionString);
const sourceContainer = sourceBlobClient.getContainerClient(sourceContainerName);
const targetBlobClient = BlobServiceClient.fromConnectionString(targetConnectionString);
const targetContainer = targetBlobClient.getContainerClient(targetContainerName);
const blobName = 'something';
const sourceBlobClient = sourceContainer.getBlobClient(blobName);
const targetBlobClient = targetContainer.getBlobClient(sourceBlobClient.name);
const copyResponse = await targetBlobClient.beginCopyFromURL(sourceBlobClient.url);
// Wait on copyResponse
当在本地测试并在具有相同存储帐户的Docker Azurite容器中的两个Azure容器之间复制时,它工作正常。
但实际上,源和目标将位于不同存储帐户的不同计算机上。当我运行相同的代码(将源的连接字符串替换为远程机器)时,我得到一个错误(粘贴很长消息的最后一部分):
details: {
errorCode: 'BlobNotFound',
connection: 'keep-alive',
'content-type': 'application/xml',
date: '<. . .>',
'keep-alive': 'timeout=5',
server: 'Azurite-Blob/3.23.0',
'transfer-encoding': 'chunked',
'x-ms-request-id': '<. . .>',
message: 'The specified blob does not exist.\n' +
'RequestId:<. . .>\n' +
'Time:<. . .>',
code: 'BlobNotFound'
}
blob明确存在于远程源中(其名称是从对listBlobsFlat
的调用中提取的)。
我不确定这是什么原因。docs seem to suggest that copying between accounts is now possible(此文本在beginCopyFromURL
文档中重复):
在2012-02-12及更高版本中,复制Blob操作的源可以是任何Azure存储帐户中的已提交Blob。
我是不是误解了文件?还有什么事吗?
1条答案
按热度按时间r55awzrz1#
要跨存储帐户复制blob,源blob必须可公开访问。请为源blob创建至少具有“读取”权限的SAS URL,并使用该URL进行复制。