如何解决跨存储帐户复制 blob 的 NodeJS Azure 函数
我有一个带有容器的私人存储帐户。当我将 blob 上传到容器时,我会使用 Event Grid 触发一个“BlobCreated”事件,然后该事件被一个函数拾取。
该函数的目的是将源 blob 复制到另一个“备份”存储帐户。
我正在使用新的 @azure/storage-blob 和 @azure/identity NodeJS 包。
const {BlobServiceClient} = require('@azure/storage-blob');
const {ManagedIdentityCredential} = require('@azure/identity');
我创建了源和目标 Blob 和容器客户端,然后创建了目标容器。这一切都很好:
const sourceBlobServiceClient = new BlobServiceClient(
`https://${sourceAccountName}.blob.core.windows.net`,new ManagedIdentityCredential()
);
const destBlobServiceClient = new BlobServiceClient(
`https://${destinationAccountName}.blob.core.windows.net`,new ManagedIdentityCredential()
);
const sourceContainer = sourceBlobServiceClient.getContainerClient(containerName);
const destContainer = destBlobServiceClient.getContainerClient(containerName);
await destContainer.createIfNotExists();
然后我获取源和目标 blob 客户端并启动复制:
const sourceBlob = sourceContainer.getBlobClient(blobName);
const destBlob = destContainer.getBlobClient(sourceBlob.name);
const response = await destBlob.beginCopyFromURL(sourceBlob.url);
sourceBlob.url 属性正确,并且 blob 存在于源目录中,但 beginCopyFromURL 语句失败:
结果:FailureException:RestError:指定的资源不存在。
我已在我的函数应用上启用 ManagedIdentity,并在源和目标存储帐户上为其指定所有者和存储 Blob 数据所有者。 beginCopyFromURL 似乎不是使用身份进行身份验证,而是尝试以公开方式访问源 blob。
我是否遗漏了什么,或者也许有更好的方法使用 Node 跨存储帐户进行复制?
谢谢
解决方法
好像是认证问题,可以尝试使用StorageSharedKeyCredential进行认证。
const sourceCert = new StorageSharedKeyCredential(sourceAccountName,sourceAccountKey)
const sourceBlobServiceClient = new BlobServiceClient(
`https://${sourceAccountName}.blob.core.windows.net`,sourceCert
);
const destinationCert = new StorageSharedKeyCredential(destinationAccountName,destinationAccountKey)
const destBlobServiceClient = new BlobServiceClient(
`https://${destinationAccountName}.blob.core.windows.net`,destinationCert
);
const sourceContainer = sourceBlobServiceClient.getContainerClient(containerName);
const destContainer = destBlobServiceClient.getContainerClient(containerName);
await destContainer.createIfNotExists();
const sourceBlob = sourceContainer.getBlobClient(blobName);
const destBlob = destContainer.getBlobClient(sourceBlob.name);
const response = await destBlob.beginCopyFromURL(sourceBlob.url);
,
我在 Github 上提出了这个问题,结果证明这是故意的。
从 URL 复制 Blob 操作的源可以是任何 Azure 存储帐户中的任何已提交块 Blob,该帐户可以是公共的,也可以是使用共享访问签名授权的。 源 blob 的最大长度可达 256 MiB。 https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url
如果源 Blob 位于另一个帐户下,则应将 SAS 附加到源 URL。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。