[Azure] 使用Azure Functions與 Blob 儲存體做自動定時資料擷取

利用Azure Functions 無伺服器的特性,我們可以使用熟悉的語言,快速打造一個輕量型的函式服務。近來剛好手邊有個需求需要收集大量的數據,就很適合使用 Azure Functions 來完成。

這個需求是這樣的,因為某些原因我需要收集空氣品質指標的數據,而空氣品質指標的數據在政府的open data裡是有提供的,更新頻率是每小時一次,目前有提供 JSON、CSV、XLSX等格式可以下載使用,因此我需要每個小時去收集資料,當然我可以用人工方式,每個小時連上去 open data 去手動下載,只不過這樣有點瞎就是了,比較Smart的方式是,寫一隻程式可以每個小時自動去下載資料,然後把檔案存起來。

基於這樣的想法,Azure Functions 可以說是我的首選,原因很簡單,我只需要專心把下載檔案這件事的程式寫好,完全不用管如何部署,也不用管如何定時去觸發它,就可以很快速的完成我想要做的事,此外下載的檔案在這裡我同樣選擇使用 Azure Blob 儲存體來儲存,屆時我就可以從 Azure Blob 儲存體拿到一段時間後所收集起來的資料量了。

如何做

首先使用Visual Studio 2017建立Azure Functions專案

由於我的需求是每個小時要觸發一次,所以選擇的是 Timer 觸發

修改參數為每小時自動執行一次

接著使用WebClient做網路資料的下載,這裡我建立了另一個名為 SaveToBlob private的函式,作用是把資料存到 Azure Blog 

要把資料存進 Azure Blob 儲存體中,我們得先到 Azure 的管理平台建立儲存帳戶

建立儲存帳戶後,當然你還得建立容器,在這裡我建立一個名為 airaqidata 的容器

此外在存取金鑰裡有二項資料是我們在程式裡會用到的,一個是key,另一個是連接字串

SaveToBlob 的程式碼也很簡單,主要是透過連接字串建立帳戶連線,接著建立 Blob儲存體 的 Client物件,然後指定要使用的容器,最後透過UploadFromStreamAsync把檔案儲存進去

完成後就是把 Azure Functions 發佈到 Azure 雲端上,發行完成之後,我們可以到 Azure管理平台中,做手動觸發測試,並且可以直接在線上看到執行的即時Log資訊

確定檔案有沒有被儲入 Azure Blob 中,同樣到 Azure管理平台中,進入 Azure Blob儲存體就可以直接查看

結論

藉由事件驅動的需求,Azure Functions 可以讓我們專注在程式碼的撰寫,無須建立相關執行環境,以這個例子來說,傳統做法我可能得建立一個windows Schedule或是常駐一個執行程式利用Timer,但透過 Azure Functions 可以發現過程中,我完全不用去管這些,只管把邏輯寫好發佈至Azure上就可以,此外搭配 Azure Blob 儲存體,我也不需要再大費週張的建立資料庫或是掛載網路磁碟。

如果你還沒接觸過 Azure Functions 那麼我會建議你試看看!!

 

 

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18