调用 Cloud Functions 或 Cloud Run

从工作流调用 Google Cloud 服务(例如 Cloud Functions 或 Cloud Run)是通过 HTTP 请求完成的。最常见的 HTTP 请求方法具有调用快捷方式(例如 http.gethttp.post),但您可以发出任何类型的 HTTP 请求,方法是将 call 字段设置为 http.request 并使用 method 字段指定请求类型。如需了解详情,请参阅发出 HTTP 请求

如需发送经过身份验证的请求,请执行以下操作:

  • 您的工作流必须与具有一个或多个包含所需权限的 Identity and Access Management (IAM) 角色的服务账号相关联。

  • 您必须向工作流定义明确添加身份验证信息。默认情况下,出于安全原因,HTTP 请求不包含身份或访问令牌。

如需了解详情,请参阅授予工作流访问 Google Cloud 资源的权限

何时调用服务

如何知道何时使用 Workflows 语法在 YAML 或 JSON 中创建步骤,或者何时创建服务(例如 Cloud Run 服务或 Cloud Functions 函数)以改为执行工作?

使用 Workflows 从工作流本身调用服务并处理结果,以及执行发出 HTTP 调用等简单任务。工作流可以调用服务、解析响应以及为其他连接的服务构建输入。调用服务可以避免产生额外调用、额外依赖项和调用服务的服务复杂性。

创建服务来完成任何对 Workflows 来说过于复杂的工作;例如,实现 Workflows 表达式及其标准库不支持的可重用业务逻辑、复杂计算或转换。与使用 YAML 或 JSON 和 Workflows 语法相比,在代码中实现复杂情况通常更容易。

调用受限于内部入站流量的服务

Workflows 可以调用同一个 Google Cloud 项目中入站流量受限于内部流量的 Cloud Functions 或 Cloud Run 服务。使用此配置时,您的服务无法通过互联网访问,但可以通过 Workflows 访问。

如需应用这些限制,您必须调整服务或函数的入站流量设置。请注意,Cloud Run 服务必须通过其 run.app 网址访问,而不是通过自定义网域访问。如需了解详情,请参阅限制入站流量(适用于 Cloud Run)和配置网络设置(适用于 Cloud Functions)。您的工作流无需进行其他更改。

使用具有所需权限的服务账号

向其他 Google Cloud 服务发出请求时,您的工作流必须与具有正确权限能够访问所请求资源的服务账号相关联。如需了解与现有工作流关联的服务账号,请参阅验证工作流的关联服务账号

设置服务账号时,将请求身份与您要授予访问权限的资源相关联(将请求身份设为资源的主账号),然后为其分配适当的角色。该角色可定义身份在资源上下文中具有的权限。

例如,如需将接收 Cloud Functions 配置为接受来自特定调用函数或服务的请求,您需要将调用者的服务账号添加为接收函数的主账号,并向该主账号授予 Cloud Functions Invoker (roles/cloudfunctions.invoker) 角色。同样,如需为 Cloud Run 设置服务账号,请向该服务账号授予 Cloud Run Invoker (roles/run.invoker) 角色。如需了解详情,请参阅 Cloud Functions 的身份验证信息Cloud Run 身份验证概览

调用 Cloud Functions (第 2 代)

在 Cloud Functions (第 2 代)中,可通过管理底层 Cloud Run 服务来获得调用权限。如果您的工作流正在调用 Cloud Function(第 2 代)服务,则无需向调用方的服务帐号授予 Cloud Functions Invoker (roles/cloudfunctions.invoker) 角色。您必须授予 Cloud Run Invoker (roles/run.invoker) 角色。

如需了解详情,请参阅 Cloud Functions 版本比较

向工作流添加身份验证信息

向 Cloud Functions 或 Cloud Run 发出请求时,请使用 OIDC 进行身份验证。

如需使用 OIDC 发出 HTTP 请求,请在指定网址后,将 auth 部分添加到工作流定义的 args 部分。在此示例中,系统将发送调用 Cloud Functions 函数的请求:

YAML

  - step_A:
      call: http.get
      args:
          url: https://us-central1-project.cloudfunctions.net/functionA
          query:
              firstNumber: 4
              secondNumber: 6
              operation: sum
          auth:
              type: OIDC
              audience: OIDC_AUDIENCE
    

JSON

    [
      {
        "step_A": {
          "call": "http.get",
          "args": {
            "url": "https://us-central1-project.cloudfunctions.net/functionA",
            "query": {
              "firstNumber": 4,
              "secondNumber": 6,
              "operation": "sum"
            },
            "auth": {
              "type": "OIDC",
              "audience": "OIDC_AUDIENCE"
            }
          }
        }
      }
    ]
      
audience 参数可用于为令牌指定 OIDC 目标设备。默认情况下,它设置为与 url 相同的值:但是,它应该设置为服务的根网址。例如:https://region-project.cloudfunctions.net/hello_world

指定响应数据的媒体类型

如果响应的 Content-Type 标头指定 application/json 媒体类型,则存储在变量中的 JSON 响应会自动转换为可访问的映射。

如有必要,请修改为 Content-Type 响应标头指定 application/json 媒体类型而调用的 API。否则,您可以使用 json.decodetext.encode 函数将响应正文转换为映射。例如:

json.decode(text.encode(RESPONSE_FROM_API))

如需了解详情,请参阅访问保存在变量中的 HTTP 响应数据

执行 Cloud Run 作业

与 Cloud Run 服务不同,Cloud Run 作业不会监听或处理 HTTP 请求。如需通过工作流执行 Cloud Run 作业,请使用 Cloud Run Admin API 连接器

如需查看执行 Cloud Run 作业以处理作为环境变量传递到该作业的数据的端到端示例,请参阅使用 Workflows 执行 Cloud Run 作业

如需查看执行 Cloud Run 作业(该作业可处理存储在 Cloud Storage 存储桶中的数据,让您能够使用客户管理的加密密钥 (CMEK) 加密数据)的端到端示例,请参阅执行处理 Cloud Storage 中的事件数据的 Cloud Run 作业

后续步骤