概述
Google Cloud Functions 是一個用來建立以及連結雲端服務的無伺服器執行環境。 你可以利用 Cloud Functions 來寫簡單,單一用途的 functions, 這些 functions 被附加到雲端基礎設施以及服務的事件上。 當監聽的事件被觸發, Cloud Function 也會被觸發。 你的代碼將在一個完全自動化管理的環境中被執行。 你完全不需要提供任何的基礎設施或管理任何的伺服器。
Cloud Functions 由 Javascript 所編寫,並且執行在 Google Cloud Platform 的 Node.js 環境。 你可以讓你的 Cloud Functions 運行在任何的 Node.js 執行階段上,這不只攜帶輕便,而且更讓本地測試非常簡單。
前言
本篇主要是利用 Google 的 Qwiklab 平台學習的同時,做的一份學習筆記
為避免翻譯誤解,專業術語在本篇將不會被翻譯,保留原文
連結並且延伸雲端服務
Cloud Functions 提供一個邏輯的連結層,它可以讓你在上面寫代碼來連接並且延伸雲端服務。 監聽並且回應 Cloud Storage 的檔案上傳事件,一個紀錄改變事件,或是 Cloud Pub/Sub 的訊息觸發事件。 Cloud Functions 擴大已經存在的雲端服務,並且允許使用客制的程式邏輯來處理越來越多的使用情境。 Cloud Functions 擁有 Google Service Account credential 的存取權,因此可以無縫接軌大部分的 Google Cloud Platform 服務,像是 Datastore, Cloud Spanner, Cloud Translation API, Cloud Vision API, 以及很多很多其他的服務。 並且,很多的 Node.js client libraries 都有支援 Cloud Functions, 這更是簡化了這些服務之間的整合。
事件以及觸發 (Events and Triggers)
雲端事件是發生在雲端環境的事。 像是資料庫的資料有所改變,檔案被上傳到儲存區,或是一台新的虛擬機背建立。
不管你是否選擇回應,事件都會發生。 你可以使用 trigger 來建立對一個事件的回應。 Trigger 是一個宣告,對那些你有興趣的特定的或是一連串事件的宣告。 將一個 function 連結到 trigger 讓我們可以捕捉,並且隨著事件的發生有所動作。 更多有關建立 trigger 並且將它與 function 關聯的資訊,請參考 Events and Triggers
無伺服器
Cloud Functions 幫我們拿掉了這些工作,像是伺服器管理,軟體設置,框架更新,作業系統更新。 你只需要專注在代碼的部分,因為 Google 完全地幫你管理軟體以及基礎設施的部分。 再者,資源會隨著事件的回應自動地被提供。 這代表說,你完全不需要做任何事就可以讓一個 function 從一天幾次的調用,到一天好幾百萬次的調用。
使用情境
異步的工作量像是輕量化的 ETL, 或是雲端自動化像是應用被觸發而自動建立,不再需要獨立的伺服器以及開發者的維護。 你只要簡單的部署 Cloud Function 並且和你想要的事件做連結。
Cloud Functions 的這些細緻的,立即提供的特質讓它非常適合輕量化的 API 以及 webhooks。 再者,當你部署一個 HTTP Function,該 HTTP endpoints 將會自動地被提供,這代表你不再需要像其他服務的複雜設置。 下面的表格列出了一些額外的常用 Cloud Function 的使用情境:
使用情境 | 敘述
— |
Data Processing / ETL | 監聽並且回應 Cloud Storage 事件像是當一個檔案被建立,被改變,或是被移除了。 處理圖片,影片編譯,資料驗證及轉換,以及從 Cloud Functions 上觸發任何網路上的服務。
Webhooks | 經由簡單的 HTTP trigger, 回應那些來自第三方的事件,像是 GitHub, Slack, Stripe, 或是任何可以發 HTTP requests 的來源。
輕量化 APIs | 使用輕量化、不緊密相依、快速建立,以及立即可調整大小的邏輯來建構你的應用。 你的 functions 可以被事件驅動或者是直接通過 HTTP/S 觸發
可攜式後端 | 使用 Google 專為 App 開發者的可攜式平台, Firebase, 以及在 Cloud Functions 建構你自己的移動後端。 監聽以及回應來自於 Firebase Analytics, Realtime Database, Authentication, 以及 Storage 的事件。
IoT | 想像一個數以萬計的裝置串流資料到 Cloud Pub/Sub, 然後啟動 Cloud Functions 來處理,轉換,並且儲存資料。 Cloud Functions 讓你使用完全無伺服器的方式來做到這些事。
這個手把手的教程將會教你如何使用 Google Cloud 主控台來建立,部署,並且測試 Cloud Function
你將會做什麼?
- 建立一個 cloud function
- 部署並且測試這個 function
- 檢視紀錄
設定及要求
在你按下 Start Lab 按鈕之前
詳讀所有的教學。Labs 是有時間限制的,而且你不可以停止時間倒數。倒數計時器在你按下 Start Lab 按鈕後開始倒數,上面顯示的時間為你還能使用 Cloud 資源的時間。
Qwiklabs 的手把手環境,讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程,而不是在一個模擬或是展示的環境。我們透過提供你一個全新的、暫時的帳號密碼,在計時器歸零之前,你可以用來登入並存取 Google Cloud Platform。
你需要什麼?
要完成這個 lab ,你需要:
- 一個一般的網路瀏覽器(推薦 Chrome)
- 完成這個 lab 的時間
備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab
現在你已經開始你的 lab
, 你將會登入 Google Cloud Shell
主控台,然後開啟命令列工具
如何開始你的 lab ,然後登入 Console?
- 按下 Start Lab 按鈕。如果你需要付費,會有一個彈出視窗來讓你選擇付費的方式。在左方你會看到一個面板,上面有暫時的帳號密碼,你必須使用這些帳號密碼在此次 lab
- 複製
username
, 然後點擊Open Google Console
。 Lab 會開啟另外一個視窗,顯示選擇帳號
的頁面
tip: 開啟一個全新的視窗,然後跟原本的頁面並排
- 在
選擇帳號
頁面, 點擊Use Another Account
- 登入頁面開啟,貼上之前複製的
username
以及password
,然後貼上
重要:必須使用之前於 Connection Details 面板
取得的帳號密碼,不要使用你自己的 Qwiklabs 帳號密碼。 如果你有自己的 GCP 帳號,請不要用在這裡(避免產生費用)
- 點擊並通過接下來的頁面:
- 接受
terms
以及conditions
- 不要增加
recovery optoins
或two factor authentication
(因為這只是一個臨時帳號) - 不要註冊免費體驗
- 接受
稍待一些時候, GCP 控制台將會在這個視窗開啟。
注意:按下左上方位於Google Cloud Platform
隔壁的 Navigation menu
,你可以瀏覽選單,裡面有一系列的 GCP 產品以及服務
啟動 Google Cloud Shell
Google Cloud Shell
是載有開發工具的虛擬機器。它提供了5GB的 home 資料夾,並且運行在 Google Cloud
上。 Google Cloud Shell
讓你可以利用 command-line 存取 GCP
資源
- 在
GCP 控制台
,右上的工具列,點擊Open Cloud Shell
按鈕
- 在打開的對話框裡,按下
START CLOUD SHELL
:
你可以立即按下 START CLOUD SHELL
當對話視窗打開。
連結並提供環境會需要一點時間。當你連結成功,這代表你已成功獲得授權,且此專案已被設為你的專案ID,例如:
gcloud 是 Google Cloud Platform
的 command-line 工具,他已事先被安裝在 Cloud Shell
並且支援自動補齊
使用這個 command ,你可以列出有效帳戶名稱:
gcloud auth list |
輸出:
Credentialed accounts: |
範例輸出:
Credentialed accounts: |
你可以使用以下 command 來列出專案 ID
gcloud config list project |
輸出:
[core] |
範例輸出:
[core] |
gcloud
的完整文件可以參閱 Google Cloud gcloud Overview
建立一個 function
首先,你將會建立一個名為 helloWorld 的簡單 function。 這個 function 會寫一段訊息到 Cloud Functions 的紀錄。 它被 cloud function 事件所觸發,並且當這個 function 成功執行完成, 可以執行一個回呼函式
在本教程中, cloud function 事件會是一個 cloud pub / sub topic 事件。 Cloud Pub / Sub 是一種「發佈/訂閱 (Pub / Sub) 服務」:將訊息傳送者與訊息接收者分離的訊息傳遞服務。 若欲了解更多有關 pub / sub 的資訊,可以參考文件
執行以下指令來建立一個 cloud function:
- 在 Cloud Shell 命令列視窗中, 建立一個置放 function 代碼的資料夾
mkdir gcf_hello_world |
- 移動到
gcf_hello_world
資料夾
cd gcf_hello_world |
- 建立並且打開編輯
index.js
vim index.js |
將以下的代碼複製貼上到
index.js
/**
* Cloud Function.
*
* @param {object} event The Cloud Functions event.
* @param {function} callback The callback function.
*/
exports.helloWorld = function helloWorld (event, callback) {
console.log(`My Cloud Function: ${JSON.stringify(event.data.message)}`);
callback();
};輸入
:wq
儲存並且離開檔案
建立一個 cloud storage bucket (儲存區)
使用以下指令來為你的 function 建立一個新的 cloud 儲存區
gsutil mb -p [PROJECT_ID] gs://[BUCKET_NAME] |
- PROJECT_ID 為此教程中的 GCP Project ID, 如下圖。 如果你沒有使用 Qwiklab, 此 Project ID 為你 GCP 帳號下的 Project ID
- BUCKET_NAME 是你給予這個儲存區的名稱。 它必須是獨一無二的名字。
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。
部署你的 function
當部署一個新的 function, 你必須要指令 --trigger-topic
, --trigger-bucket
, 或 --trigger-http
。 當你更新現有的 function 時, 觸發條件不會更改, 除非你有另外指定。
在本教程中, 你將會設定 hello_world
為 --trigger-topic
- 部署這個 function, 並使用 pub / sub 為觸發事件, 名稱為 hello_world, 將以下的
[BUCKET_NAME]
替換成你的儲存區名稱
gcloud functions deploy helloWorld \ |
- 核對 function 的狀態
cloud gcloud functions describe helloWorld
狀態 ACTIVE 顯示這個 function 已經被成功部署
entryPoint: helloWorld |
每一條由這個主題發布的訊息都將觸發這個 function, 訊息內容為輸入的資料
測試進度
點擊 Check my progress 來確認目前的進度。如果你已經完成目前的進度,你將獲得一個評價分數。
測試部署上去的 function
在你部署這個 function 上去, 並且知道它的狀態是 active 之後,讓我們來測試看看這個 function 會不會再偵測到事件之後寫一段訊息到 cloud 紀錄
輸入以下指令來建立一個訊息, 測試這個 function
gcloud functions call helloWorld --data '{"message":"Hello World!"}' |
cloud 工具返回了一個此 function 的 execution ID, 這表示訊息已經被寫到紀錄了
範例輸出:
executionId: 3zmhpf7l6j5b |
檢視紀錄來確認有這個 execution ID 的訊息記錄
檢視紀錄
檢視歷史紀錄
gcloud functions logs read helloWorld |
如果 function 成功地被執行, 訊息記錄會被列出,如下:
LEVEL NAME EXECUTION_ID TIME_UTC LOG |
你的應用已經完成部署, 測試, 並且你可以檢視紀錄
測試你的理解
下面有多重選擇的問題來鞏固你對本教程概念的理解,盡你所能的回答吧:
答案: true
留言