使用连接字符串跨容器复制Azure Blob时认证失败求助
问题分析与解决方案
为什么连接字符串不足以完成认证?
start_copy_from_url是Azure存储的服务器端复制操作:调用该方法时,是让Azure存储服务直接从源Blob的URL拉取数据并复制到目标Blob。这个过程中,存储服务不会使用客户端BlobServiceClient的连接字符串凭证去访问源Blob——它仅依赖你提供的源URL本身包含的认证信息。
如果源URL仅为blob_client.url(不带SAS或其他认证参数),存储服务访问源Blob时没有权限凭证,就会返回401 NoAuthenticationInformation错误。而添加SAS Token后,源URL包含了临时权限凭证,存储服务就能正常访问源Blob完成复制。
仅使用连接字符串完成复制的两种方案
方案1:源与目标Blob在同一存储账户
若源和目标属于同一个存储账户,无需提供完整源URL,直接使用存储账户内的相对路径即可。此时Azure存储服务会通过账户内部权限验证,无需额外认证信息:
# 假设已通过连接字符串创建目标BlobClient(target_blob_client) source_container_name = "blbcon-common-customer-documents" source_blob_name = "你的源Blob名称" # 使用账户内相对路径作为源 source_path = f"/{source_container_name}/{source_blob_name}" target_blob_client.start_copy_from_url(source_path)
方案2:源与目标Blob在不同存储账户
若源和目标属于不同存储账户,可通过连接字符串自动生成临时SAS Token(无需手动配置环境变量中的SAS):
from azure.storage.blob import BlobSasPermissions, generate_blob_sas from datetime import datetime, timedelta import os # 用连接字符串创建源BlobClient source_connection_string = os.getenv("SOURCE_STORAGE_CONNECTION_STRING") source_blob_client = BlobClient.from_connection_string( conn_str=source_connection_string, container_name="blbcon-common-customer-documents", blob_name="你的源Blob名称" ) # 生成临时SAS Token(仅授予读取权限,有效期1小时) sas_token = generate_blob_sas( account_name=source_blob_client.account_name, container_name=source_blob_client.container_name, blob_name=source_blob_client.blob_name, account_key=source_blob_client.credential.account_key, permission=BlobSasPermissions(read=True), expiry=datetime.utcnow() + timedelta(hours=1) ) # 拼接带SAS的源URL source_url_with_sas = f"{source_blob_client.url}?{sas_token}" # 发起复制操作 target_blob_client.start_copy_from_url(source_url_with_sas)
该方案中,SAS Token由连接字符串中的账户密钥自动生成,无需手动维护外部凭证,满足你不想部署时使用手动配置SAS的需求。
内容的提问来源于stack exchange,提问作者Siri Mudunuri
相关产品推荐
相关产品推荐

