使用 Google Cloud 控制台保护服务的流量

本页面介绍如何在 API Gateway 上部署 API 以保护流向后端服务的流量。

请按照以下步骤部署新的 API,以使用 Google Cloud 控制台访问 Cloud Run 函数上的后端服务。本快速入门还介绍了如何使用 API 密钥保护您的后端免遭未经授权的访问。

准备工作

  1. 在 Google Cloud 控制台中,转到 API Gateway 页面,然后选择或创建 Google Cloud 项目。

    转到“API Gateway”页面

  2. API Gateway 要求您启用以下 Google 服务:

    名称 标题
    apigateway.googleapis.com API Gateway API
    servicemanagement.googleapis.com Service Management API
    servicecontrol.googleapis.com Service Control API

    如果您之前没有为所选项目启用这些服务,则系统会提示您执行此操作。

  3. 确认您的项目已启用结算功能。

    了解如何启用结算功能

部署 API 后端

API Gateway 位于已部署的后端服务前面,并处理所有传入请求。在本快速入门中,API Gateway 将传入的调用路由到名为 helloGET 的 Cloud Run 函数后端,其中包含如下所示的函数:

/**
 * 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!');
};

按照快速入门:使用 Google Cloud CLI 中的步骤下载示例 Cloud Run 函数代码并部署 Cloud Run 函数后端服务。

创建 API 定义

API Gateway 使用 API 定义将调用路由到后端服务。您可以使用包含专用注释的 OpenAPI 规范来定义所需的 API Gateway 行为。OpenAPI 规范包含到 Cloud Run 函数后端的路由说明:

# openapi2-functions.yaml
swagger: '2.0'
info:
  title: API_ID optional-string
  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://us-central1-PROJECT_ID.cloudfunctions.net/helloGET
      responses:
        '200':
          description: A successful response
          schema:
            type: string

要使用上面显示的 OpenAPI 规范来定义 API,请执行以下操作:

  1. 通过命令行创建名为 openapi2-functions.yaml 的新文件。

  2. 复制上面显示的 OpenAPI 规范的内容并粘贴到新创建的文件中。

  3. 按如下方式修改该文件:

    1. title 字段中,将 API_ID 替换为您的 API 名称(将在下一步中创建),并将 optional-string 替换为您选择的简要说明。在创建授予对此 API 访问权限的 API 密钥时,会用到此字段的值。请参阅 API ID 要求,了解 API ID 命名准则。
    2. address 字段中,将 PROJECT_ID 替换为您的 Google Cloud 项目的名称。

创建网关

现在,您可以在 API Gateway 上创建和部署网关了。

  1. 在 Google Cloud 控制台中打开“API Gateway”页面。

    转到“API Gateway”页面

  2. 点击创建网关

  3. API 部分:

    1. 您可以选择创建新的 API,也可以从选择 API 下拉列表中选择现有 API。在本教程中,选择创建新的 API
    2. 为 API 输入显示名称
    3. 为 API 输入 API ID
    4. (可选)使用键/值格式向 API 添加标签。如需添加多个标签,请点击添加标签并输入其他值。
  4. API 配置部分中:

    1. 您可以选择创建新的 API 配置,也可以从选择配置下拉列表中选择现有 API 配置。在本教程中,请选择创建新的 API 配置
    2. 使用文件浏览器上传用于定义 API 的 openapi2-functions.yaml
    3. 为 API 配置输入显示名称。
    4. 从下拉列表中选择服务账号。您选择的服务账号将用作 API Gateway 的身份。

    5. (可选)使用键/值格式向 API 配置添加标签。 如需添加多个标签,请点击添加标签并输入其他值。

  5. 网关详情部分:

    1. 为网关输入显示名称。网关的网址会自动生成。
    2. 从下拉菜单中选择网关的位置。
    3. (可选)使用键/值格式向网关添加标签。如需添加多个标签,请点击添加标签并输入其他值。
  6. 点击创建网关

这将在新创建的网关上部署 API 配置。在网关上部署 API 配置定义了 API 客户端可用于访问 API 的外部网址。

操作可能需要几分钟时间才能完成。如需查看创建和部署过程的状态,您可以点击主导航栏中的通知图标以显示状态通知,如下图所示:

“通知”面板

成功完成后,您可以在网关着陆页上查看有关网关的详细信息。

转到“网关”页面

记下网关网址。此名称用于在下一步中测试您的部署。

测试您的 API 部署

现在,您可以使用部署网关时生成的网址向 API 发送请求。

在浏览器中,输入以下网址,其中:

  • GATEWAY_URL 指定您部署的网关网址。
  • hello 是 API 配置中指定的路径。
https://GATEWAY_URL/hello

例如:

https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev/hello

此时浏览器中应显示消息 Hello World!

您已成功创建和部署 API Gateway!

使用 API 密钥保护访问

要保护对 API 后端的访问,您可以生成与项目关联的 API 密钥,并授予该密钥调用您的 API 的权限。如需了解详情,请参阅使用 API 密钥限制 API 访问权限

如果您没有与本快速入门中使用的 Google Cloud 项目关联的 API 密钥,则可以按照创建 API 密钥中的步骤添加一个。

如需使用 API 密钥保护对网关的访问,请执行以下操作:

  1. 为您的服务启用 API 密钥支持:
    1. 在 Google Cloud 控制台中,前往 API 和服务 >媒体库
    2. 在搜索栏中输入您刚刚创建的 API 的代管式服务名称。 您可以在 API 着陆页上的 API 的代管式服务列中找到此值。 例如:
      my-api-123abc456def1.apigateway.my-project.cloud.goog
    3. 在您的服务着陆页上,点击启用
  2. 修改用于创建 API 配置的 OpenAPI 规范,以包括对所有流量强制执行 API 密钥验证安全政策的说明。 添加 security 类型和 securityDefinitions,如下所示:
        # openapi2-functions.yaml
        swagger: '2.0'
        info:
          title: API_ID optional-string
          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://us-central1.PROJECT_ID.cloudfunctions.net/helloGET
              security:
              - api_key: []
              responses:
                '200':
                  description: A successful response
                  schema:
                    type: string
        securityDefinitions:
          # This section configures basic authentication with an API key.
          api_key:
            type: "apiKey"
            name: "key"
            in: "query"
    securityDefinition 将 API 配置为要求请求访问规范中定义的所有路径时作为名为 key 的查询参数传递的 API 密钥。
  3. 创建新的 API 配置并将其部署到现有网关:
    1. 转到“网关”着陆页。

      转到“网关”页面

    2. 从列表中选择您的网关以查看详细信息。
    3. 点击修改以打开网关配置窗格。
    4. API 配置部分中,执行以下操作:
      1. 从提供的下拉菜单中选择创建新的 API 配置
      2. 使用文件浏览器上传修改后的 OpenAPI 规范。
      3. 输入新 API 配置的显示名。
      4. 从下拉列表中选择服务账号。您选择的服务账号将用作 API Gateway 的身份。
      5. (可选)使用键/值格式向 API 配置添加标签。 如需添加多个标签,请点击添加标签并输入其他值。
    5. 点击更新

测试您的 API 密钥

创建和部署修改后的 API 后,尝试向其发出请求。

在浏览器中,输入以下网址,其中:

  • GATEWAY_URL 指定您部署的网关网址。
  • hello 是 API 配置中指定的路径。
https://GATEWAY_URL/hello

例如:

https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev/hello

这会导致以下错误:

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.

现在,在浏览器中,输入以下网址,其中:

  • GATEWAY_URL 指定您部署的网关网址。
  • hello 是 API 配置中指定的路径。
  • API_KEY 指定您在使用 API 密钥保护访问中创建的 API 密钥。
https://GATEWAY_URL/hello?key=API_KEY

现在,您应该会在浏览器中看到 Hello World!

恭喜!您已成功使用 API Gateway 保护 API 后端。现在,您可以通过生成其他 API 密钥来开始初始配置新的 API 客户端。

跟踪 API 活动

  1. API Gateway 页面上查看 API 的活动图表, Google Cloud 控制台。点击您的 API 以在概览页面上查看其活动图表。请求可能要过一些时间才能反映在图表中。

  2. 日志浏览器页面上查看 API 的请求日志。指向 日志浏览器页面位于 Google Cloud 控制台。

    转到“API Gateway”页面

    进入“API Gateway”页面后:

    1. 选择要查看的 API。
    2. 点击详情标签页。
    3. 点击日志下的链接。

清理

为避免系统因本快速入门中使用的资源向您的 Google Cloud 账号收取费用,您可以执行以下操作:

或者,您还可以删除本教程中使用的 Google Cloud 项目。

后续步骤