1. 概览
Google Cloud Functions 是一个事件驱动型无服务器计算平台。借助 Cloud Functions,您可以编写代码,而无需担心预配资源或扩缩以应对不断变化的要求。
以 JavaScript 编写的 Cloud Functions 函数在 Google Cloud Platform 上的 Node.js 环境中执行。您可以在任何标准 Node.js 运行时中运行 Cloud Functions 函数,以实现可移植性和本地测试。
演示
在此 Codelab 中,您将为 Node.js 创建一个 Cloud Functions 函数,用于报告指定温度是可接受的还是过热。您将使用本地机器上的 Visual Studio Code 创建、测试和调试 Cloud Functions 函数。最后,您将函数部署到 Google Cloud Platform。
学习内容
- Node.js 版 Cloud Functions 框架。
- 在本地创建和测试 HTTP Cloud Functions 函数。
- 从本地机器调试 HTTP 函数。
- 从本地机器部署 HTTP 函数。
2. 设置和要求
前提条件
- Cloud SDK
- Visual Studio Code
- Node.js 8.6.0 或更高版本(如需安装 Node.js,请使用 nvm;如需检查版本,请运行 node –version)
- 已学完“我的第一个函数:Node.js”指南
费用
虽然此 Codelab 只需要对已部署的 Cloud Functions 函数进行 1 次调用,但您仍应参考 Cloud Functions API 价格信息,了解结算方式。
虽然许多 Google API 可以免费使用,但 Google Cloud Platform(即其产品和 API)的使用不是免费的。您需要拥有有效的结算账号才能使用 Cloud Functions。请注意,某些 Google Cloud Platform (GCP) 产品提供“始终免费”层级,您必须超出此层级才能产生费用。在此 Codelab 中,每次 Cloud Functions 调用都会计入该免费层级。只要不超出每月限额,就应该不会产生任何费用。
3. 安装 Node.js 版 Cloud Functions 框架
Node.js 版 Functions 框架是一个开源 FaaS(Function as a Service,即函数即服务)框架,由 Google Cloud Functions 团队提供,可用于编写可移植的 Node.js 函数。
借助 Cloud Functions 框架,您可以编写在许多不同环境中运行的轻量级函数,这些环境包括:
- Google Cloud Functions
- 您的本地开发机器
- Cloud Run 和 Cloud Run on GKE
- 基于 Knative 的环境
创建新的 Node.js 应用。
npm init
接受默认值时,请务必使用 index.js
作为应用的入口点。
现在安装 Node.js 版 Functions 框架。
npm install @google-cloud/functions-framework
打开 package.json。验证您是否看到函数框架被列为依赖项,如以下示例所示。
"dependencies": { "@google-cloud/functions-framework": "^1.7.1" }
Cloud Functions 框架现已成功安装。现在,您可以创建 Cloud Functions 函数了。
4. 在本地创建和测试 HTTP Cloud Functions 函数
创建本地 Cloud Functions 函数
在本部分中,您将创建和测试一个响应 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 中测试函数
从现在开始,此 Codelab 使用 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 调用函数。
您可以使用下拉菜单在终端窗口之间切换。如果某个终端窗口正在提供函数,则下拉列表中会将它称为 node
。否则,它会被引用为 zsh
(或您使用的 shell)。
在第二个终端窗口中,运行以下命令,将温度载荷 50 发送到提供 validateTemperature
函数的本地服务器。
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"50"}'
您应该会收到云函数的以下响应:
Temperature OK
在第二个终端窗口中,通过发送“过高”温度载荷再次测试该函数,如下所示:
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"120"}'
您应该会收到云函数的以下响应:
Too hot
最后,通过在缺少载荷的情况下调用该函数来测试该函数。
curl -X POST http://localhost:8080
您应该会从 Cloud Functions 函数收到以下响应:
Too hot
理想情况下,如果未提供温度,该函数不应返回“太热”。您发现了代码中存在 bug。
请务必在用于提供函数的第一个终端窗口中按 Ctrl + C
停止函数运行。
5. 通过本地机器调试 HTTP 函数
在 Visual Studio Code 中打开 Command Palette。如果您使用的是 Mac,请使用 Cmd + Shift + P
。如果您使用的是 Windows,请使用 Ctrl + Shift + P.
在 Command Palette 中输入 auto attach
,然后选择列表中的顶部项目。
对于此 Codelab,请选择 Only With Flag
,如下图所示:
现在,将鼠标悬停在最右侧显示的警告图标上,重新加载您在 VS Code 中用于部署函数的终端窗口。
点击 Relaunch Terminal
。
在重新加载的终端窗口中,使用以下命令重新运行函数框架,以提供您的函数:
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 行设置断点。
断点图标应亮红色,表示调试程序可以访问这行代码。
在第二个终端窗口中,通过运行以下 curl 命令来遇到断点。
curl -X POST http://localhost:8080
您会看到第 3 行上方出现黄色突出显示。此突出显示表示此行是调试程序当前正在评估的语句。
将鼠标悬停在临时变量上以验证其内容是否为 undefined
,因为该请求未提供温度载荷。
点击“单步跳过”图标以执行下一条语句。
您会看到当前语句跳转到 if 语句的 else 部分。
对于此演示,您可以假设规范要求所有请求都发送温度读数。在极少数情况下,如果未提供温度读数,函数应抛出异常。
点击“断开连接”按钮以断开调试程序的连接。
在第一个终端窗口中,按 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 标志),以再次开始运行 Cloud Functions 函数,以免连接调试程序。
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 Functions 函数,接下来可以将其部署到 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
- 用于部署名称为validateTemperature
且入口点为validateTemperature
的 Cloud Functions 函数的 gcloud 子命令--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 Functions 函数已成功部署。
Temperature OK
7. 清理
为避免产生意外费用(例如,此 Cloud Functions 函数被意外调用的次数超过免费层级每月 Cloud Functions 函数调用次数),您可以删除 Cloud Functions 函数或删除您在第 2 步中创建的项目。
如需删除此 Cloud Functions 函数,请前往 https://console.cloud.google.com/functions/ 前往 Cloud Functions Cloud 控制台。确保您在第 2 步中创建的项目是当前选定的项目。
选择您在第 6 步中部署的 verifyTemperature 函数。然后点击“删除”。
如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果删除项目,则需要在 Cloud SDK 中更改项目。您可以通过运行 gcloud projects list 来查看所有可用项目的列表。
8. 恭喜!
恭喜您完成此 Codelab。您可以详细了解 Cloud Functions 如何支持 Node.js 运行时以及如何将本地调试用于 Cloud Functions。
所学内容
- Node.js 版 Functions 框架。
- 在本地创建和测试 HTTP Cloud Functions 函数。
- 从本地机器调试 HTTP 函数。
- 从本地机器部署 HTTP 函数。