从 Workflows 调用 Google Cloud 服务(例如 Cloud Run functions 或 Cloud Run)是通过 HTTP 请求完成的。最常见的 HTTP 请求方法具有调用快捷方式(例如 http.get 和 http.post),但您可以通过将 call 字段设置为 http.request 并使用 method 字段指定请求类型来发出任何类型的 HTTP 请求。如需了解详情,请参阅发出 HTTP 请求。
如需发送经过身份验证的请求,请执行以下操作:
您的工作流必须与具有一个或多个包含所需权限的 Identity and Access Management (IAM) 角色的服务账号相关联。
您必须向工作流定义明确添加身份验证信息。默认情况下,出于安全原因,HTTP 请求不包含身份或访问令牌。
如需了解详情,请参阅向工作流授予访问 Google Cloud 资源的权限。
何时调用服务
如何知道何时使用 Workflows 语法在 YAML 或 JSON 中创建步骤,或者何时创建服务(例如 Cloud Run 服务或 Cloud Run 函数)以改为执行工作?
使用 Workflows 从工作流本身调用服务并处理结果,以及执行发出 HTTP 调用等简单任务。工作流可以调用服务、解析响应以及为其他连接的服务构建输入。调用服务可以避免产生额外调用、额外依赖项和调用服务的服务复杂性。
创建服务来完成任何对 Workflows 来说过于复杂的工作;例如,实现 Workflows 表达式及其标准库不支持的可重用业务逻辑、复杂计算或转换。与使用 YAML 或 JSON 和 Workflows 语法相比,在代码中实现复杂情况通常更容易。
请求超时和载荷限制
通过 HTTP 调用 Cloud Run 服务或 Cloud Run 函数时,请注意,Workflows 中的同步 HTTP 请求(http.get、http.post、http.request)默认超时时间为 5 分钟(300 秒),支持的最长超时时间为 30 分钟(1,800 秒),并且允许的最大响应大小为 2 MB(如果存储在变量中,则受 512 KB 变量内存限制)。
虽然 Cloud Run 服务和 Cloud Run functions(第 2 代)支持长达 60 分钟的请求超时,但 Workflows 中的任何同步 http.* 步骤都会在配置的超时(最长 30 分钟)后超时,并显示 TimeoutError。对于运行时间超过 30 分钟或返回大型载荷的工作负载,请使用 Cloud Run 作业或回调端点。如需比较限制和推荐模式,请参阅在服务之间调整超时和载荷大小。
调用受限于内部入站流量的服务
Workflows 可以调用同一个 Google Cloud 项目或 VPC Service Controls 边界中入站流量受限于内部流量的 Cloud Run functions 或 Cloud Run 服务。使用此配置时,您的服务无法通过互联网访问,但可以通过 Workflows 访问。
如需应用这些限制,您必须调整服务或函数的入站流量设置。请注意,Cloud Run 服务必须通过其 run.app 网址访问,而不是通过自定义网域访问。如需了解详情,请参阅限制网络入站流量(适用于 Cloud Run 和 Cloud Run functions 第 2 代)和配置网络设置(第 1 代)(适用于 Cloud Run functions 第 1 代)。您的工作流无需进行其他更改。
使用具有所需权限的服务账号
向其他 Google Cloud 服务发出请求时,您的工作流必须与具有访问所请求资源的正确权限的服务账号相关联。如需了解哪些服务账号与现有工作流相关联,请参阅验证工作流的关联服务账号。
设置服务账号时,您需要将请求身份与您希望其访问的资源相关联,即让请求身份成为资源的主账号,然后为其分配适当的角色。该角色可定义身份在资源上下文中具有的权限。
例如,如需将接收 Cloud Run functions 函数(第 1 代)配置为接受来自特定调用函数或服务的请求,您需要将调用方的服务账号添加为接收函数的主账号,并向该主账号授予 Cloud Functions Invoker (roles/cloudfunctions.invoker) 角色。同样,如需为 Cloud Run 服务或 Cloud Run functions(第 2 代)设置服务账号,您需要向该服务账号授予 Cloud Run Invoker (roles/run.invoker) 角色。如需了解详情,请参阅使用 IAM 进行访问权限控制或 Cloud Run 身份验证概览。
调用 Cloud Run functions
在 Cloud Run functions 中,您可以通过管理底层 Cloud Run 服务来获取调用权限。如果您的工作流调用的是 Cloud Run functions 服务,则无需向调用方的服务账号授予 Cloud Functions Invoker (roles/cloudfunctions.invoker) 角色。您必须改为授予 Cloud Run Invoker (roles/run.invoker) 角色。
如需了解详情,请参阅比较 Cloud Run functions。
向工作流添加身份验证信息
向 Cloud Run functions 或 Cloud Run 发出请求时,请使用 OIDC 进行身份验证。
如需使用 OIDC 发出 HTTP 请求,请在指定网址后,将 auth 部分添加到工作流定义的 args 部分。在此示例中,系统会发送请求来调用 Cloud Run 函数:
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 受众群体 (OIDC_AUDIENCE)。默认情况下,它设置为与 url 相同的值;但是,如果 url 包含服务或函数的根网址之外的其他路径段,请将 audience 设置为根网址(例如 https://us-central1-project.cloudfunctions.net/functionA)。
指定回答数据的媒体类型
如果响应的 Content-Type 标头指定了 application/json 媒体类型,则存储在变量中的 JSON 响应会自动转换为可访问的映射。
如有必要,请修改正在调用的 API,以便为 Content-Type 响应标头指定 application/json 媒体类型。否则,您可以使用 json.decode 和 text.encode 函数将响应正文转换为映射。例如:
json.decode(text.encode(RESPONSE_FROM_API))
如需了解详情,请参阅访问保存在变量中的 HTTP 响应数据。
执行 Cloud Run 作业
与 Cloud Run 服务不同,Cloud Run 作业不会监听或传送 HTTP 请求。如需从工作流执行 Cloud Run 作业,请使用 Cloud Run Admin API 连接器。如果作业需要超过 30 分钟才能完成,请在连接器调用中同时配置作业的任务超时(默认为 10 分钟,最长可配置为 168 小时或 7 天)和 connector_params.timeout(默认为 1,800 秒,最长可设置为 31,536,000 秒或 1 年)。
如需查看执行 Cloud Run 作业以处理作为环境变量传递到该作业的数据的端到端示例,请参阅使用 Workflows 执行 Cloud Run 作业。
如需查看执行 Cloud Run 作业以处理存储在 Cloud Storage 存储桶中的数据,从而允许您使用客户管理的加密密钥 (CMEK) 来加密数据的端到端示例,请参阅执行 Cloud Run 作业以处理 Cloud Storage 中的事件数据。