用于计时器触发器 blob 归档的 Azure Functions "The operation has timed out."

Azure Functions "The operation has timed out." for timer trigger blob archival

我有一个 Python Azure Functions 计时器触发器,每天 运行 一次,并将文件从通用 v2 热存储容器归档到通用 v2 冷存储容器。我正在使用 Linux 消费计划。代码如下所示:

container = ContainerClient.from_connection_string(conn_str=hot_conn_str, 
                                                   container_name=hot_container_name)
blob_list = container.list_blobs(name_starts_with = hot_data_dir)
files = []
for blob in blob_list:
    files.append(blob.name) 
for file in files:
    blob_from = BlobClient.from_connection_string(conn_str=hot_conn_str, 
                                             container_name=hot_container_name, 
                                             blob_name=file)
    data = blob_from.download_blob()
    blob_to = BlobClient.from_connection_string(conn_str=cold_conn_str, 
                                             container_name=cold_container_name, 
                                             blob_name=f'archive/{file}')
    try:                                         
        blob_to.upload_blob(data.readall())
    except ResourceExistsError:
        logging.debug(f'file already exists: {file}')
    except ResourceNotFoundError:
        logging.debug(f'file does not exist: {file}')
    container.delete_blob(blob=file)

在过去的几个月里,这对我一直有效,没有任何问题,但在过去的两天里,我在存档过程中看到了这个错误:
The operation has timed out.
除此之外没有其他有意义的错误消息。如果我通过 UI 手动调用该函数,它将成功归档其余文件。 blob 的大小从几 KB 到大约 5 MB 不等,超时错误似乎发生在 2-3 MB 的文件上。一次只有一个调用 运行ning,所以我认为我没有超过消费计划中的 1.5GB 内存限制(我过去曾从内存问题中看到 python exited with code 137) .为什么我已经完美运行了几个月突然出现这个错误?
更新
我想我会尝试使用此处找到的方法进行归档,这样我就不必将 blob 内容存储在 Python 的内存中:https://www.europeclouds.com/blog/moving-files-between-storage-accounts-with-azure-functions-and-event-grid

只是总结一下评论中的解决方案,供其他社区参考:

如评论中所述,OP 使用 start_copy_from_url() 方法来实现与解决方法相同的要求。

start_copy_from_url()可以直接将文件从原始blob处理成目标blob,比使用data = blob_from.download_blob()临时存储文件然后上传data到目标blob要快得多。