如何解决Azure Function Blob触发器触发Stream Too Long错误问题
Azure Blob触发型Function处理大文件报错解决方案
错误根因
你遇到的两类报错本质都和Azure Function Python运行时的Blob输入绑定默认行为有关:
- 退出码137是Linux系统下进程因内存占用过高被OOM Killer强制终止的信号
Stream was too long是Python运行时默认加载全量Blob内容到内存触发的流长度限制
注意:哪怕你代码里没有读取Blob流的逻辑,只要你把触发参数声明为func.InputStream类型,Function运行时在调用你的代码前就会自动把整个Blob的全量内容加载到内存中,所以才会出现仅打印日志也报错的情况,该问题和实例SKU规格无直接关联。
解决方案
第一步:修改Blob触发绑定配置,避免自动加载Blob内容
不要将触发参数声明为func.InputStream,改为仅接收Blob的名称字符串,运行时只会传递Blob的元数据信息,不会预加载Blob内容,从根源避免内存溢出。
参考function.json配置:{ "scriptFile": "__init__.py", "bindings": [ { "name": "blob_name", "type": "blobTrigger", "direction": "in", "path": "需监听的容器名称/{blob_name}", "connection": "Azure Storage连接字符串对应的配置项名称" } ] }第二步:使用对应SDK实现流式同步
分别调用Azure Blob Storage SDK和GCP Cloud Storage SDK,采用分片流式传输的方式完成同步,全程不将全量文件加载到内存,内存占用可以稳定控制在分片大小的量级。
参考Python实现代码:import logging import os import azure.functions as func from azure.storage.blob import BlobServiceClient from google.cloud import storage def main(blob_name: str): logging.info(f"触发新Blob同步,名称:{blob_name}") # 从应用配置读取连接信息,不要硬编码 az_conn_str = os.environ["AZURE_STORAGE_CONN_STR"] gcs_bucket_name = os.environ["GCS_BUCKET_NAME"] az_container_name = os.environ["AZURE_CONTAINER_NAME"] # 初始化Azure Blob客户端 az_blob_service = BlobServiceClient.from_connection_string(az_conn_str) blob_client = az_blob_service.get_blob_client(container=az_container_name, blob=blob_name) # 初始化GCS客户端 gcs_client = storage.Client() gcs_bucket = gcs_client.bucket(gcs_bucket_name) gcs_blob = gcs_bucket.blob(blob_name) # 流式分片上传,内存占用仅和分片大小相关 with blob_client.download_blob() as az_stream: gcs_blob.upload_from_file(az_stream, chunksize=10*1024*1024) # 分片大小可按需调整,此处为10MB logging.info(f"Blob {blob_name} 同步完成")第三步:调整Function运行配置适配大文件场景
- 若使用弹性Premium/专用宿主计划,可将函数超时时间调整到最长60分钟(消费计划默认最长5分钟,最大支持10分钟),避免大文件传输过程中被强制中断
- 适当调高函数实例的内存配置,建议2G以上,避免峰值传输时内存不足
内容的提问来源于stack exchange,提问作者Adeyemi Adebayo
相关产品推荐
相关产品推荐

