【问题标题】:Azure Functions "The operation has timed out." for timer trigger blob archivalAzure Functions“操作已超时。”用于定时器触发 blob 归档
【发布时间】:2021-03-02 03:28:08
【问题描述】:

我有一个 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 的文件上。一次只运行一个调用,所以我认为我没有超过消耗计划的 1.5GB 内存限制(我过去曾从内存问题中看到 python exited with code 137)。几个月来一直完美运行,为什么我突然收到此错误?
更新
我想我将尝试使用此处找到的方法进行存档,这样我就不必在 Python 中将 blob 内容存储在内存中:https://www.europeclouds.com/blog/moving-files-between-storage-accounts-with-azure-functions-and-event-grid

【问题讨论】:

  • 设置函数超时时间如何?
  • 这几天你的函数配置有什么变化吗?
  • 函数超时已设置为 10 分钟,操作超时发生在大约 5 分钟后。 @Hury Shen,不,我没有进行任何配置更改。
  • 请问您最近是否在同一个函数应用中添加了新功能(例如http触发功能或新的定时器触发功能)?
  • @Hury Shen,暂无新增功能

标签: azure azure-functions azure-blob-storage azure-triggers


【解决方案1】:

简单总结一下来自 cmets 的解决方案,供其他社区参考:

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

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

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2021-03-26
    • 2018-10-03
    • 2020-05-07
    • 2017-10-26
    • 2021-02-08
    • 1970-01-01
    • 2017-04-21
    • 2017-07-20
    相关资源
    最近更新 更多