Azure JS SDK无法复制归档层Blob,如何生成热/冷层新副本
解决方案
归档层Blob属于离线存储介质,不支持直接同步复制,普通异步复制逻辑也无法直接读取归档层内容,必须在触发复制时显式指定解冻相关参数,即可在不修改源Blob访问层级的前提下,直接生成指定访问层级的目标Blob。
修改后的可运行代码:
const { BlobServiceClient,generateBlobSASQueryParameters, BlobSASPermissions, AccessTier, RehydratePriority } = require("@azure/storage-blob"); export default async (req, res) => { if (req.method === 'POST') { const connectionString = 'DefaultEndpointsProtocol=...' const containerName = 'container'; const srcFile='filename' // 源归档Blob名称 const targetFile = 'targetFileName' // 目标Blob名称 const targetTier = AccessTier.Cool // 目标访问层级,可替换为AccessTier.Hot const rehydratePriority = RehydratePriority.Standard // 解冻优先级,可替换为RehydratePriority.High async function getSignedUrl(blobClient, options={}){ options.permissions = options.permissions || "racwd" const expiry = 3600 * 24; // 延长SAS有效期至24小时,适配长时复制场景 const startsOn = new Date(); const expiresOn = new Date(new Date().valueOf() + expiry * 1000); const token = await generateBlobSASQueryParameters( { containerName: blobClient.containerName, blobName: blobClient.name, permissions: BlobSASPermissions.parse(options.permissions), startsOn, expiresOn, }, blobClient.credential, ); return `${blobClient.url}?${token.toString()}`; } try { const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString); const containerClient = blobServiceClient.getContainerClient(containerName); const sourceBlobClient = containerClient.getBlockBlobClient(srcFile); const targetBlobClient = containerClient.getBlockBlobClient(targetFile); const url = await getSignedUrl(sourceBlobClient); // 传入归档复制专用参数触发异步任务 const poller = await targetBlobClient.beginCopyFromURL(url, { accessTier: targetTier, rehydratePriority: rehydratePriority }); // 等待复制任务执行完成 const result = await poller.pollUntilDone(); console.log('复制完成', result) res.status(200).json({ success: true, result }) } catch (e) { console.error('操作失败', e); res.status(500).json({ success: false, error: e.message }) } } } export const config = { api: { bodyParser: { sizeLimit: '1gb', }, }, }
核心修改说明
- 替换同步复制方法为异步复制,新增两个专属配置参数:
accessTier:指定目标Blob的最终访问层级,支持Hot、Cool两种可选值rehydratePriority:指定解冻优先级,Standard优先级任务通常15小时内完成,High优先级任务通常1小时内完成,优先级越高对应费用越高
- 延长SAS有效期至24小时,避免长时复制过程中SAS鉴权过期导致任务失败
- 全程不会修改源Blob的任何属性,源Blob始终保持归档层级不变
注意事项
- 该操作会产生归档数据读取费用,计费规则与单独解冻归档Blob一致
- 复制任务完成前不要修改源Blob内容,否则会导致任务执行失败
内容的提问来源于stack exchange,提问作者Andres R
相关产品推荐
相关产品推荐

