You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:36:04