建立與使用Azure Functions

Azure Functions 是微軟所提供的雲端 Server-less 服務,可讓開發人員在 Azure 上撰寫簡短的程式碼(functions)。以便於來執行例行性的工作,例如:

  • 固定時間執行特定動作。
  • 每當OOO發生的時候,執行XXX動作。

Azure Functions 之所以稱為 server-less functions,意思是,可讓您在不需要額外建置、管理伺服器或底層架構的情況下,直接執行程式碼(functions)。您只需要專注於寫出正確的程式碼,Azure 會負責在背景中執行,同時讓您透過 azure portal 來管理和備份程式碼。

舉例來說

舉例來說,過去我曾幫用戶建立一個解決方案,每當用戶把圖檔或影片上傳到 azure blob(儲存體)之後,就自動呼叫Azure cognitive services,辨識影像圖片中的人臉,並且將結果紀錄在資料庫中,以便於後續可以關鍵字搜尋。

這整個機制,我們就可以透過 Azure Functions 來完成。

底下這個MS官方的影片,很清楚地介紹使用Azure function的好處:

你可以把 Azure Functions 想像成,有人幫你建立好了伺服器、網站、準備好了SDK、runtime,然後你只需要把執行特定功能的 WebAPI/Web Services程式碼寫好放上去,就可以開始運行了。

撰寫方式

具體 Azure Functions 支援的語言包含:

  • C#
  • Java/JavaScript
  • Python
  • TypeScript
  • PowerShell Script
  • …越來越多…

開發人員可以透過 Azure Portal來撰寫,或是透過開發工具(像是Visual Studio, VS Code)撰寫完之後,佈署上雲端來執行。

在雲端建立第一個Function

要使用 Azure Function,得先建立 Function App服務,中文版稱為"函數應用程式"。

您可參考底下影片建立一個 Function App:

接著,透過 azure portal ,你可以直接建立一個 Function 並且在其中撰寫程式碼。底下這段影片,展示如何建立一個Function App,並且監聽 azure storage中的 blob container,若其中有檔案上傳,則取得檔案名稱,填入queue:

影片13秒的地方,你會看到連結 blob trigger,意味著,可以透過blob檔案上傳,觸發這個function,這是input binding。

影片42秒,你看到的是我們透過binding,連結一個已經建立好的名為container1的容器,當用戶把檔案上傳到這個容器中,就會觸發funcion。

59秒處,是建立這個容器的storage account連結。
1’42秒開始,是建立輸出的queue,當用戶有檔案上傳,該function就會寫入一則記錄到queue當中。

1:35秒處,請注意建立的queue名稱,該名稱必須和待會綁定於azure function中的名稱相同。

最後, 2:14秒開始,則是撰寫該function的程式碼,請看程式碼本身,你會發現blob和queue相關資訊,都會從function 參數傳入,然後我們可以透過程式碼來控制其中的互動(底下的例子是把上傳的檔案名稱寫入queue):

public static void Run(Stream myBlob, string name, ICollector<string> outputQueueItem, ILogger log)
{
  log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
  outputQueueItem.Add("Name passed to the function: " + name);
}

實務上當然不是那麼簡單,這只是一個範例,看起來無用,但這個範例,展示了 Azure Function 可以連結到外部的 blob, queue…等儲存體,而不需要額外撰寫程式碼去維護連線。

本質上這是一個binding(繫結、綁定)機制,透過input binding與output binding就可以讓azure function以設定的方式,來連結外部資源,或是被特定事件(例如檔案上傳到blob)來觸發。

影片的3:11秒開始,則是展示上傳檔案後,會成功的有log,並且在queue當中留下一筆紀錄。

總的來說,使用azure function 帶來很多好處:

  1. 無須額外撰寫程式碼管理外部資源的連線,便於維護或管理。
  2. 透過binding設定即可將外部資訊以參入方式注入函式中,便於程式碼撰寫。
  3. 無須管理伺服器本身的架構或是runtime、SDK,這些都由雲端服務廠商來負責維護,開發人員可以專注在function 的開發上。

留言

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

使用Semantic Kernel 建立自然語言請假系統

精彩(且驚人)的Semantic Kernel入門範例

在 LINE Bot 開發中使用Semantic Kernel建立自然語言請假系統

專業的價值...