簡體   English   中英

每當在谷歌雲存儲上創建指定文件時,我想使用雲 function 觸發 python 腳本

[英]I want to trigger a python script using a cloud function whenever a specified file is created on the google cloud storage

一個 csv 文件每天在 0200 小時左右上傳到雲存儲,但有時由於作業失敗或系統崩潰文件上傳很晚。 所以我想創建一個雲 function,只要文件上傳到存儲,它就可以觸發我的 python bq 加載腳本。

file_name : seller_data_{date}
bucket name : sale_bucket/

該問題缺乏對所需用例以及 OP 面臨的任何問題的足夠描述。 但是,您可以根據用例選擇以下幾種可能的方法。

  1. 最簡單的方法:帶有存儲觸發器的 Cloud Functions。

每當文件上傳到您的存儲桶時,這可能是運行 Python function 的最簡單和最有效的方法。 最基本的教程就是這個

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

有一個基本的 Flask 應用程序托管在 GAE(標准或 Flex)上,有一個端點專門用於處理現有文件的檢查,下載 object,對其進行操作,然后做一些事情。

這條路由可以充當自定義的 HTTP 觸發的 function,一旦它收到請求(可能來自簡單的 curl 請求,來自瀏覽器的訪問,甚至是另一個 Pub 函數)。

一旦收到 GET(或 POST)請求,它就會將 object 下載到/tmp目錄中,對其進行處理然后執行某些操作。

與 CF 相比,GAE 的一個小好處是您可以設置至少一個實例以始終保持活動狀態,這意味着您不會遇到冷啟動,或者在工作完成之前冒着請求超時的風險。

  1. 殘酷/矯枉過正的方式:Clour Run。

與 App Engine 類似的方法,但使用 Cloud Run,您還需要使用 Dockerfile,請記住,當沒有使用時,Cloud Run 將縮減為零,以及適用於在 Cloud Run 上構建任何應用程序的其他小事.

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

對於上述所有方法,您可能想要實現的一些其他事情是相同的:

a) 下載 object 並對其進行一些處理:

您必須將其下載到/tmp目錄,因為它是 GAE 和 CF 存儲臨時文件的目錄。 Cloud Run 在這里有點不同,但我們不要深入研究它,因為它本身就是一種矯枉過正。

但是,請記住,如果您的文件很大,您可能會導致 memory 使用率很高。

完成文件后,請始終清理該目錄。 此外,在打開文件時,請始終使用with open... ,因為它還可以確保不讓文件保持打開狀態。

b) 下載bucket中最新的object:

這有點棘手,它需要一些額外的自定義代碼。 有很多方法可以實現它,但我使用的一種(始終密切關注 memory 的用法)是在創建 object 時上傳到存儲桶,我得到當前時間,使用正則表達式將其轉換為像results_22_6

現在發生的情況是,一旦我列出了其他腳本中的對象,它們就已經按升序列出了。 所以列表中的最后一個元素是最新的 object。

所以基本上我要做的是檢查我在/tmp中的文件名是否與存儲桶中object[list.length]的名稱相同。 如果是,則什么也不做,如果不是,則刪除舊的並下載存儲桶中最新的。

這可能不是最佳的,但對我來說它有點可取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM