首页 > 解决方案 > 每当在谷歌云存储上创建指定文件时,我想使用云函数触发 python 脚本

问题描述

每天大约 0200 时将一个 csv 文件上传到云存储,但有时由于作业失败或系统崩溃文件上传发生得很晚。所以我想创建一个云函数,只要文件上传到存储,就可以触发我的 python bq 加载脚本。

file_name : seller_data_{date}
bucket name : sale_bucket/

标签: pythongoogle-cloud-functionsgoogle-cloud-storage

解决方案


该问题缺乏对所需用例以及 OP 面临的任何问题的足够描述。但是,您可以根据用例选择以下几种可能的方法。

  1. 最简单的方法:带有存储触发器的 Cloud Functions。

每当文件上传到您的存储桶时,这可能是运行 Python 函数的最简单和最有效的方式。最基本的教程就是这个

  1. 困难的方法:App Engine 有一些技巧。

有一个基本的 Flask 应用程序托管在 GAE(标准或 Flex)上,有一个端点专门用于处理现有文件的检查、下载对象、操作它然后做一些事情。

这个路由可以作为一个自定义的 HTTP 触发函数,一旦它收到一个请求(可能来自一个简单的 curl 请求、来自浏览器的访问、PubSub 事件,甚至是另一个 Cloud Function)。

一旦它收到一个 GET(或 POST)请求,它就会将对象下载到/tmp目录中,处理它然后做一些事情。

与 CF 相比,GAE 的一个小好处是您可以设置至少一个实例以始终保持活动状态,这意味着您不会遇到冷启动,或者在工作完成之前冒着请求超时的风险。

  1. 残酷/矫枉过正的方式:Clour Run。

与 App Engine 类似的方法,但使用 Cloud Run,您还需要使用 Dockerfile,请记住,当没有使用时,Cloud Run 将缩减到零,以及适用于在 Cloud Run 上构建任何应用程序的其他小事.

#######################################

对于上述所有方法,您可能想要实现的一些其他事情是相同的:

a) 下载对象并对其进行一些处理:

您必须将其下载到该/tmp目录,因为它是 GAE 和 CF 存储临时文件的目录。Cloud Run 在这里有点不同,但我们不要深入研究它,因为它本身就是一种矫枉过正。

但是,请记住,如果您的文件很大,则可能会导致高内存使用。

完成文件后,请始终清理该目录。此外,在打开文件时始终使用with open ...,因为它还会确保不保持文件打开。

b) 下载存储桶中的最新对象:

这有点棘手,它需要一些额外的自定义代码。有很多方法可以实现它,但我使用的一种(总是密切关注内存使用情况)是在创建我上传到存储桶的对象时,我得到当前时间,使用正则表达式将其转换为某种东西像results_22_6

现在发生的情况是,一旦我列出了其他脚本中的对象,它们就已经按升序列出了。所以列表中的最后一个元素是最新的对象。

所以基本上我要做的是检查我拥有的文件名是否与存储桶中/tmp的名称相同。object[list.length]如果是,则什么也不做,如果不是,则删除旧的并下载存储桶中最新的。

这可能不是最佳的,但对我来说它有点可取。


推荐阅读