使用 Visual Studio Code 搭配 Cloud Functions for Node.js 進行本機開發

使用 Visual Studio Code 搭配 Cloud Functions for Node.js 進行本機開發

程式碼研究室簡介

subject上次更新時間:1月 28, 2022
account_circle作者:Google 員工

1. 總覽

Google Cloud Functions 是事件導向的無伺服器運算平台,您可以使用 Cloud Functions 編寫程式碼,不必擔心佈建資源或調整資源調度,以因應變更的需求。

以 JavaScript 編寫的 Cloud Functions 會在 Google Cloud Platform 的 Node.js 環境中執行。您可以在任何標準 Node.js 執行階段中執行 Cloud 函式,以便實現可攜性和本機測試。

操作說明

在這個程式碼研究室中,您將為 Node.js 建立 Cloud Function,用於回報指定溫度是否可接受或過熱。您將在本機電腦上使用 Visual Studio Code 建立、測試及偵錯 Cloud Function。最後,您會將函式部署至 Google Cloud Platform。

課程內容

  • 適用於 Node.js 的 Functions Framework。
  • 在本機建立及測試 HTTP Cloud 函式。
  • 從本機電腦偵錯 HTTP 函式。
  • 從本機電腦部署 HTTP 函式。

2. 設定和需求

必要條件

費用

雖然本程式碼研究室只需要呼叫 1 次已部署的 Cloud Function,但您仍應參考 Cloud Functions API 定價資訊,瞭解計費作業方式。

雖然許多 Google API 可免費使用,但 Google Cloud Platform (即其產品和 API) 並非免費。您必須具備有效的帳單帳戶,才能使用 Cloud Functions。請注意,某些 Google Cloud Platform (GCP) 產品提供「一律免費」級別,您必須超過這個級別才會產生帳單費用。為了配合程式碼研究室的目的,每個 Cloud Functions 叫用都會計入免費方案的配額。只要總額度 (每月內) 不超過上限,就不會產生任何費用。

3. 安裝 Node.js 適用的 Functions Framework

Node.js 專用 Functions Framework 是 Google Cloud Functions 團隊推出的開放原始碼 FaaS (函式即服務) 架構,可用於編寫可攜式 Node.js 函式。

Functions Framework 可讓您編寫簡易函式,並在許多不同環境中執行,包括:

  • Google Cloud Functions
  • 您的本機開發電腦
  • Cloud Run 和 Cloud Run on GKE
  • 以 Knative 為基礎的環境

建立新的 node.js 應用程式。

npm init

接受預設值時,請務必使用 index.js 做為應用程式的進入點。

接著安裝 Node.js 適用的 Functions Framework。

npm install @google-cloud/functions-framework

開啟 package.json。確認函式架構是否列為依附元件,如以下範例所示。

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

Functions Framework 現已安裝完成。您現在可以建立 Cloud 函式了。

4. 在本機建立及測試 HTTP Cloud 函式

建立本機 Cloud 函式

在本節中,您將建立並測試回應 HTTP 要求的 HTTP 函式。

在 package.json 檔案所在的目錄中,建立名為 index.js 的新檔案。

新增下列程式碼:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

您現在可以測試函式了。

在 Visual Studio Code 中測試函式

從這裡開始,本程式碼研究室會使用 Visual Studio Code 中的 整合式終端機

在 Visual Studio Code 中開啟終端機視窗。

執行下列指令:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

這個指令會啟動本機伺服器,讓伺服器在收到 HTTP 要求時,可以呼叫 validateTemperature 函式。

您應該會在終端機視窗中看到下列輸出內容:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

按一下「終端機」視窗窗格中的 New Terminal 加號圖示,即可在 VS Code 中建立第二個終端機視窗。您將切換這兩個終端機視窗:第一個用於提供函式,第二個用於使用 curl 呼叫函式。

bceb65f366d837ae.png

您可以使用下拉式選單切換終端機視窗。如果終端機視窗目前提供函式,下拉式清單會將其稱為 node。否則,系統會將其參照至 zsh (或您使用的 shell)。

在第二個終端機視窗中,執行下列指令,將溫度酬載 50 傳送至提供 validateTemperature 函式的本機伺服器。

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

您應該會收到 Cloud Function 的以下回應:

Temperature OK

在第二個終端機視窗中,傳送「過高」溫度酬載,如以下所示,再次測試函式:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

您應該會收到 Cloud Function 的以下回應:

Too hot

最後,請使用缺少酬載的函式呼叫函式,以便測試函式。

curl -X POST http://localhost:8080

您應該會收到 Cloud Function 的以下回應:

Too hot

理想情況下,如果未提供溫度,函式不應傳回「too hot」(過熱)。您發現程式碼中有錯誤。

請務必在提供函式的第一個終端機視窗中按下 Ctrl + C,停止函式執行。

5. 從本機電腦偵錯 HTTP 函式

在 Visual Studio Code 中開啟指令區塊面板。如果您使用的是 Mac,請使用 Cmd + Shift + P。如果您使用的是 Windows,請使用 Ctrl + Shift + P.

在指令區塊面板中輸入 auto attach,然後選取清單頂端的項目。

601e542b4ec9f6f9.png

在本程式碼研究室中,請選擇 Only With Flag,如下圖所示:

b9e6b762d150e62b.png

接著,將滑鼠游標懸停在右側的警告圖示上,重新載入您在 VS Code 中用於提供函式的終端機視窗。

按一下「Relaunch Terminal」。

37b61e3fb546fc76.png

在重新載入的終端機視窗中,使用下列指令重新執行函式架構,以便提供函式:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

其中 --inspect 標記會告訴 Node.js 聆聽偵錯用戶端。詳情請參閱 Node 的偵錯說明文件

請注意,您使用的是 node_modules/.bin/functions-framework,而不是 node_modules/@google-cloud/functions-framework。您必須使用 /node_modules/.bin 中的自動符號連結可執行檔,才能使用檢查模式。

這次,VS Code 中應該會顯示橘色的狀態列,表示偵錯工具已附加。

按一下行號左側的邊界內,即可在第 3 行設定中斷點。

2fbb4d5916e1dbfa.png

中斷點圖示應會亮起亮眼的紅色,表示偵錯工具可存取這行程式碼。

846e6c5993cc87f9.png

在第二個終端機視窗中,執行下列 curl 指令,觸發中斷點。

curl -X POST http://localhost:8080 

您會看到第 3 行上方出現黃色醒目顯示。這項醒目顯示功能表示這個程式碼行是偵錯工具目前正在評估的陳述式。

206c7ed1eb189e90.png

將滑鼠游標懸停在 temp 變數上,確認其內容為 undefined,因為要求未提供溫度酬載。

97979025f4bf2842.png

按一下「step-over」圖示,執行下一個陳述式。

您會看到目前的陳述式會跳到 if 陳述式的 else 部分。

cf0e8ce7e0388f98.png

在這個示範中,您可以假設規格要求所有要求都傳送溫度讀數。如果不提供溫度讀數,函式應擲回例外狀況。

按一下「Disconnect」(中斷連線) 按鈕,即可中斷偵錯工具的連線。

1070d059775ad769.png

在第一個終端機視窗中,按下 Ctrl + C 停止提供函式。

更新函式,新增 if 陳述式,以便在 temperature 未定義時擲回例外狀況,如下所示:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

在第一個終端機視窗中,執行下列不含 –inspect 標記的指令,再次開始執行雲端函式,以免附加偵錯工具。

node node_modules/@google-cloud/functions-framework --target=validateTemperature

在第二個終端機視窗中執行下列指令,確認是否擲回例外狀況:

curl -X POST http://localhost:8080 

您應該會看到要求傳回的以下輸出內容:

Temperature is undefined

您也會在第一個終端機視窗中看到函式記錄的錯誤。

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

您現在可以在第一個終端機視窗中按下 Ctrl + C 鍵,停止執行函式。

6. 從本機電腦將 HTTP 函式部署至 Google Cloud

在本機電腦上建立、測試及偵錯 Cloud Function 後,即可將其部署至 Google Cloud。

執行下列指令,確認您在本機使用的是步驟 2 中建立的專案:

gcloud config get-value project

如果您在步驟 2 中指定的專案不是有效的設定,請執行下列指令:

gcloud config set project <project-name-created-step-2>

在任何終端機視窗中執行下列指令:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

其中參數的說明如下:

  • deploy validateTemperature:gcloud 子命令,用於部署名稱為 validateTemperature 的 Cloud Function,其進入點名稱為 validateTemperature
  • --trigger-http - 觸發事件類型
  • --runtime nodejs12:這個函式的指定執行階段
  • --allow-unauthenticated:允許公開存取權呼叫函式

系統會提示您啟用 Cloud Functions API。輸入 y 即可啟用 API。

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

部署完成後,輸出內容會顯示以下內容:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

在終端機視窗中,使用 curl 呼叫這個公開端點。

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

並驗證是否收到適當的回應,確認 Cloud 函式已成功部署。

Temperature OK

7. 清除所用資源

為避免產生意外費用 (例如,這個 Cloud 函式不小心叫用次數超過 免費方案的 Cloud 函式叫用次數配額),您可以刪除 Cloud 函式,或是刪除在步驟 2 中建立的專案。

如要刪除 Cloud 函式,請前往 Cloud 函式 Cloud 控制台 (網址:https://console.cloud.google.com/functions/)。請確認目前選取的專案是您在步驟 2 中建立的專案。

選取您在步驟 6 中部署的 validateTemperature 函式。然後按一下「刪除」。

4dada486485a935a.png

如果您選擇刪除整個專案,可以前往 https://console.cloud.google.com/cloud-resource-manager,選取您在步驟 2 中建立的專案,然後選擇「Delete」(刪除)。如果您刪除專案,就必須在 Cloud SDK 中變更專案。您可以執行 gcloud projects list 查看所有可用專案的清單。

8. 恭喜!

恭喜您完成程式碼研究室!您可以進一步瞭解 Cloud Functions 如何支援 Node.js 執行階段,以及 如何在本機上對 Cloud Functions 進行偵錯

涵蓋內容

  • 適用於 Node.js 的 Functions Framework。
  • 在本機建立及測試 HTTP Cloud 函式。
  • 從本機電腦偵錯 HTTP 函式。
  • 從本機電腦部署 HTTP 函式。