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

Azure Durable Functions中Blob复制:调用start_copy_from_url后函数结束即失败

问题解决:Azure Durable Functions中跨存储账户Blob复制函数结束后失败的问题

核心原因

跨存储账户的Blob复制是服务端异步操作,但如果复制依赖的源Blob访问凭证(如SAS URL、函数托管身份令牌)在函数执行结束后失效,或者目标存储账户没有独立访问源Blob的权限,就会导致存储服务无法继续完成复制,最终失败。

你当前的循环等待方案能生效,是因为函数进程保持运行期间,访问凭证始终有效,复制能在凭证过期前完成。

解决方案

1. 确保源Blob访问凭证有效期足够长

如果使用SAS URL作为源地址,生成SAS时设置远长于复制所需时间的过期时间(比如几小时,根据Blob大小调整),避免函数结束后SAS失效导致复制中断。

生成SAS的示例代码:

from azure.storage.blob import generate_blob_sas, BlobSasPermissions
from datetime import datetime, timedelta

sas_token = generate_blob_sas(
    account_name=source_account_name,
    container_name=source_container,
    blob_name=source_blob_name,
    account_key=source_account_key,
    permission=BlobSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=4)  # 设置4小时有效期
)
source_url = f"https://{source_account_name}.blob.core.windows.net/{source_container}/{source_blob_name}?{sas_token}"

2. 配置存储账户间的RBAC权限(推荐)

让目标存储账户拥有独立访问源存储账户Blob的权限,无需依赖函数的执行上下文:

  • 给目标存储账户的系统分配托管身份添加源存储账户的「存储Blob数据读取者」角色。
  • 启动复制时,直接使用源Blob的私有URL(无需附加SAS),目标存储服务会自动用自身身份访问源Blob,函数结束后复制仍能在后台完成。

3. 关于required_sync参数的说明

该参数仅适用于同区域、小Blob(≤256MB)的同步复制场景,跨存储账户时大概率无法触发同步复制逻辑,因此对你的问题无效。

最终代码示例(无需等待)

from azure.storage.blob import BlobClient

def main(input):
    # 初始化目标BlobClient
    target_blob_client = BlobClient.from_connection_string(
        target_connection_string,
        container_name=target_container,
        blob_name=target_blob_name
    )
    
    # 使用带长期SAS的源URL,或配置RBAC后使用源私有URL
    source_url = "<有效且长期的源Blob访问URL>"
    
    # 启动复制后直接返回,无需等待
    target_blob_client.start_copy_from_url(source_url)

内容的提问来源于stack exchange,提问作者shalevB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:05:23