GSP872

概览
借助 API Gateway,您可以通过设计规范且在所有服务中保持统一的 REST API,为外部访问您的服务提供安全保障 - 无论这些服务的具体实现方式如何。统一的 API 具有以下优势:
- 便于应用开发者调用您的服务。
- 您可以更改后端服务的实现方式,而不会对公共 API 造成影响。
- 您能充分利用 Google Cloud 内置的扩缩、监控及安全功能。
在本实验中,您将在 API Gateway 上部署一个 API,以保障后端服务的流量安全。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:
- “打开 Google Cloud 控制台”按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在“实验详细信息”窗格中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在“实验详细信息”窗格中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
-
点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
-
在弹出的窗口中执行以下操作:
- 继续完成 Cloud Shell 信息窗口中的设置。
- 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。
如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 ID:
gcloud config list project
输出:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需查看在 Google Cloud 中使用 gcloud
的完整文档,请参阅 gcloud CLI 概览指南。
设置区域
设置本实验的项目区域:
gcloud config set compute/region {{{project_0.default_region | "REGION"}}}
启用所需的 API
-
在 Cloud 控制台的导航菜单 (
) 中,依次点击 API 和服务 > 库。
-
在搜索栏中开始输入“api gateway”,然后选择 API Gateway API 功能块。
-
在随即显示的屏幕上,点击启用按钮。
任务 1. 部署 API 后端
API Gateway 位于已部署后端服务的前面,负责处理所有传入请求。在本实验中,API Gateway 会将传入的调用路由到名为 helloGET 的 Cloud Functions 后端,该后端包含如下所示的函数:
/**
* HTTP Cloud Function.
* This function is exported by index.js, and is executed when
* you make an HTTP request to the deployed function's endpoint.
*
* @param {Object} req Cloud Function request context.
* More info: https://expressjs.com/en/api.html#req
* @param {Object} res Cloud Function response context.
* More info: https://expressjs.com/en/api.html#res
*/
exports.helloGET = (req, res) => {
res.send('Hello World!');
};
- 在 Cloud 控制台中,克隆 Cloud Functions 示例代码库:
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
- 切换到包含 Cloud Functions 函数示例代码的目录:
cd nodejs-docs-samples/functions/helloworld/helloworldGet
- 如需部署带有 HTTP 触发器的函数,请在包含函数文件的目录中运行以下命令:
gcloud functions deploy helloGET --runtime nodejs20 --trigger-http --allow-unauthenticated --region {{{project_0.default_region | "REGION"}}}
注意:如果系统提示您授权 gcloud 命令使用您的凭证,请点击授权。Cloud Functions 函数的部署过程需要几分钟时间。请等待操作完成后再继续下一步。
警告:如果您收到 IamPermissionDeniedException 错误,请重新运行上述命令。
点击检查我的进度以验证是否完成了以下目标:
部署 API 后端
任务 2. 测试 API 后端
- 当函数部署完毕后,请记下
httpsTrigger
的网址属性值,或使用以下命令查找该属性的值:
gcloud functions describe helloGET --region {{{project_0.default_region | "REGION"}}}
输出应类似于以下网址,其中 PROJECT_ID 是您的项目对应的值。
- 将 PROJECT_ID 设置为变量:
export PROJECT_ID={{{project_0.project_id}}}
- 访问该网址以调用 Cloud Functions 函数。您应该会看到函数返回了
Hello World!
消息:
curl -v https://{{{project_0.default_region | "REGION"}}}-{{{project_0.project_id | "PROJECT_ID"}}}.cloudfunctions.net/helloGET
点击检查我的进度以验证是否完成了以下目标:
测试 API 后端
创建 API 定义
API Gateway 通过 API 定义将调用路由到后端服务。您可以使用包含专用注解的 OpenAPI 规范来定义期望的 API Gateway 行为。本快速入门的 OpenAPI 规范包含针对 Cloud Functions 函数后端的路由指令:
- 在 Cloud Shell 中,返回到您的主目录:
cd ~
- 创建名为
openapi2-functions.yaml
的新文件:
touch openapi2-functions.yaml
- 复制下面显示的 OpenAPI 规范内容并粘贴到新创建的文件中:
# openapi2-functions.yaml
swagger: '2.0'
info:
title: API_ID description
description: Sample API on API Gateway with a Google Cloud Functions backend
version: 1.0.0
schemes:
- https
produces:
- application/json
paths:
/hello:
get:
summary: Greet a user
operationId: hello
x-google-backend:
address: https://{{{project_0.default_region | "REGION"}}}-{{{project_0.project_id | "PROJECT_ID"}}}.cloudfunctions.net/helloGET
responses:
'200':
description: A successful response
schema:
type: string
- 设置以下环境变量:
export API_ID="hello-world-$(cat /dev/urandom | tr -dc 'a-z' | fold -w ${1:-8} | head -n 1)"
- 运行以下命令,在 OpenAPI 规范文件中替换上一步设置的变量:
sed -i "s/API_ID/${API_ID}/g" openapi2-functions.yaml
sed -i "s/PROJECT_ID/$PROJECT_ID/g" openapi2-functions.yaml
任务 3. 创建网关
现在,您可以在 API Gateway 上创建和部署网关了。
-
在顶部的搜索栏中,输入 API Gateway,然后从显示的选项中选择该服务。
-
点击创建网关。接下来,在 API 部分:
- 确保将选择 API 下拉菜单设置为创建新的 API。
- 在显示名称字段中,输入
Hello World API
。
-
运行以下命令再次获取 API ID,并在 API ID 字段中输入该 ID:
export API_ID="hello-world-$(cat /dev/urandom | tr -dc 'a-z' | fold -w ${1:-8} | head -n 1)"
echo $API_ID
- 在 API 配置部分:
- 确保将选择配置下拉菜单设置为创建新的 API 配置。
- 执行以下操作,以上传之前创建的
openapi2-functions.yaml
文件。
- 在 Cloud Shell 中,运行以下命令:
cloudshell download $HOME/openapi2-functions.yaml
- 点击下载。
注意:文件 openapi2-functions.yaml
现已下载到您的本地机器。
- 选择浏览,然后从浏览器的下载位置选择该文件:
- 在显示名称字段中输入
Hello World Config
。
- 确保将选择服务账号下拉菜单设置为 Compute Engine 默认服务账号。
- 在网关详情部分:
- 在显示名称字段中,输入
Hello Gateway
。
- 将位置下拉菜单设置为 。
- 点击创建网关。
注意:创建网关操作需要几分钟(约 10 分钟)才能完成。如需查看创建和部署过程的状态,您可以点击主导航栏中的“通知”图标以显示状态通知,如下图所示。请确保图标状态旁边有绿色对勾标记,然后再继续操作。
点击检查我的进度以验证是否完成了以下目标:
创建网关
测试您的 API 部署
现在,您可以使用部署网关时生成的网址向您的 API 发送请求。
- 在 Cloud Shell 中,输入以下命令以获取 API Gateway 托管的新建 API 的
GATEWAY_URL
:
export GATEWAY_URL=$(gcloud api-gateway gateways describe hello-gateway --location {{{project_0.default_region | "REGION"}}} --format json | jq -r .defaultHostname)
- 运行以下命令,确保设置了 GATEWAY_URL 环境变量:
echo $GATEWAY_URL
如果未设置,则表示您需要等待更长时间才能完成 API 网关的部署。
- 运行以下 curl 命令,并验证返回的响应是否为
Hello World!
:
curl -s -w "\n" https://$GATEWAY_URL/hello
任务 4. 使用 API 密钥保障访问安全
如需保障您 API 后端的访问安全,可以生成一个与您项目关联的 API 密钥,并授权该密钥拥有调用您 API 的权限。如需创建 API 密钥,您必须执行以下操作:
- 在 Cloud 控制台中,依次点击 API 和服务 > 凭证。
- 选择创建凭证,然后从下拉菜单中选择 API 密钥。API 密钥已创建对话框中会显示您新建的密钥。

点击检查我的进度以验证是否完成了以下目标:
使用 API 密钥保障访问安全
-
从对话框中复制 API 密钥,然后点击关闭。
-
运行以下命令,将 API 密钥值存储在 Cloud Shell 中:
export API_KEY=REPLACE_WITH_COPIED_API_KEY
接下来,为您的服务启用 API 密钥支持。
- 在 Cloud Shell 中,使用以下命令获取您刚才创建的
托管式服务
的名称:
MANAGED_SERVICE=$(gcloud api-gateway apis list --format json | jq -r .[0].managedService | cut -d'/' -f6)
echo $MANAGED_SERVICE
- 然后,使用您刚才创建的 API 的
托管式服务
名称,运行以下命令来为该服务启用 API 密钥支持:
gcloud services enable $MANAGED_SERVICE
修改 OpenAPI 规范以利用 API 密钥安全机制
在此部分,您需要修改已部署 API 的 API 配置,以对所有流量强制实施 API 密钥验证安全政策。
- 在以如下方式创建的新文件
openapi2-functions2.yaml
中,添加 security
类型和 securityDefinitions
部分:
touch openapi2-functions2.yaml
- 复制下面显示的 OpenAPI 规范内容并粘贴到新创建的文件中:
# openapi2-functions.yaml
swagger: '2.0'
info:
title: API_ID description
description: Sample API on API Gateway with a Google Cloud Functions backend
version: 1.0.0
schemes:
- https
produces:
- application/json
paths:
/hello:
get:
summary: Greet a user
operationId: hello
x-google-backend:
address: https://{{{project_0.default_region | "REGION"}}}-{{{project_0.project_id | "PROJECT_ID"}}}.cloudfunctions.net/helloGET
security:
- api_key: []
responses:
'200':
description: A successful response
schema:
type: string
securityDefinitions:
api_key:
type: "apiKey"
name: "key"
in: "query"
- 运行以下命令,在 OpenAPI 规范文件中替换上一步设置的变量:
sed -i "s/API_ID/${API_ID}/g" openapi2-functions2.yaml
sed -i "s/PROJECT_ID/$PROJECT_ID/g" openapi2-functions2.yaml
- 下载更新后的 API 规范文件,您将在下一步中使用该文件来更新网关配置:
cloudshell download $HOME/openapi2-functions2.yaml
- 点击下载。
任务 5. 创建新 API 配置并将其部署到现有网关
- 在 Cloud 控制台中打开 API Gateway 页面。(点击导航菜单 > API Gateway。)
- 从列表中选择您的 API 以查看详细信息。
- 选择网关标签页。
- 从可用网关列表中选择
Hello Gateway
。
- 点击“网关”页面顶部的
修改
。
- 在 API 配置下,将下拉菜单的值更改为
创建新的 API 配置
。
- 点击上传 API 规范输入框中的浏览,然后选择
openapi2-functions2.yaml
文件。
- 在显示名称字段中输入
Hello Config
。
- 在选择服务账号下拉菜单中,选择
Qwiklabs User Service Account
。
- 点击更新。
注意:更新网关操作可能需要几分钟才能完成。如需查看创建和部署过程的状态,您可以点击主导航栏中的“通知”图标以显示状态通知,如下图所示。请确保图标状态旁边有绿色对勾标记,然后再继续操作。
点击检查我的进度以验证是否完成了以下目标:
创建新 API 配置并将其部署到现有网关
任务 6. 使用 API 密钥测试调用
- 运行以下命令,使用 API 密钥进行测试:
export GATEWAY_URL=$(gcloud api-gateway gateways describe hello-gateway --location {{{project_0.default_region | "REGION"}}} --format json | jq -r .defaultHostname)
curl -sL $GATEWAY_URL/hello
由于 curl
调用中未提供 API 密钥,因此您应该会看到类似以下错误的响应:
UNAUTHENTICATED:Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API.
- 结合
key
查询参数运行以下 curl 命令,并使用之前创建的 API 密钥来调用 API:
curl -sL -w "\n" $GATEWAY_URL/hello?key=$API_KEY
如果您未设置 API_KEY
环境变量,可以从左侧菜单中依次点击 API 和服务 > 凭证,获取 API 密钥。该密钥将显示在 API 密钥部分。
现在,API 返回的响应应该是 Hello World!
。
注意:您可能需要运行此命令多次才能获得所需的结果。
点击检查我的进度以验证是否完成了以下目标:
使用 API 密钥测试调用
恭喜!
您已成功通过 API Gateway 保护 API 后端。现在,您可以着手生成其他 API 密钥,来对新的 API 客户端进行初始配置。
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
本手册的最后更新时间:2024 年 10 月 9 日
本实验的最后测试时间:2024 年 10 月 9 日
版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。