问题排查

本页介绍了如何解决在使用 Workflows。

如需了解详情,请参阅监控调试工作流。

部署错误

部署工作流后,Workflows 会检查源代码是否正确无误,并符合语言语法。 如果发现错误,Workflows 会返回该错误。最常见的部署错误类型包括:

  • 引用未定义的变量、步骤或子工作流
  • 语法不正确
    • 缩进不正确
    • {}"-: 缺失或无关紧要

例如,以下源代码抛出部署错误,因为返回语句引用了未定义的变量 varC

- step1:
    assign:
    - varA: "Hello"
    - varB: "World"
- step2:
    return: ${varC + varB}

此错误源代码将用于以下 Google Cloud 控制台和 gcloud CLI 示例。

控制台

发生部署错误时,Workflows 会显示该错误 修改工作流程页面上横幅中显示的消息: 部署错误 错误消息会标记源代码中的问题,并指明来源 错误:

Could not deploy workflow: failed to build: error in step step2: error
evaluating return value: symbol 'varC' is neither a variable nor a
sub-workflow name (Code: 3)

gcloud

运行 gcloud workflows deploy 命令时,如果部署失败,Workflows 会向命令行返回错误消息。错误消息会标记源代码中的问题,尽可能指定错误来源:

ERROR: (gcloud.workflows.deploy) [INVALID_ARGUMENT] failed to build:
error in step step2: error evaluating return value: symbol 'varC' is neither
a variable nor a sub-workflow name

如需解决此问题,请修改工作流的源代码。在这种情况下,请参阅 varA 而不是 varC

HTTP 403 服务账号权限错误

当 HTTP 服务器响应错误代码 403 时,您的工作流执行会失败。例如:

Permission 'iam.serviceaccounts.actAs' denied on service
account PROJECT_NUMBER-compute@developer.gserviceaccount.com (or it may not exist).

SERVICE_ACCOUNT does not have storage.objects.create access to the Google Cloud
Storage object. Permission 'storage.objects.create' denied on resource (or it may not exist).

每个工作流都与 创建工作流。要解决此问题,您必须授予该服务 一个或多个 IAM 角色包含 管理工作流所需的权限。例如,如果您希望让工作流将日志发送到 Cloud Logging,请确保已向执行工作流的服务账号授予了包含 logging.logEntries.create 权限的角色。如需了解详情,请参阅 授予工作流访问 Google Cloud 资源的权限

HTTP 429 Too many requests 错误

可以同时运行的有效工作流执行的数量上限。此配额用尽后, 已停用执行积压,或者如果积压执行的配额为 达到此上限,所有新的执行作业都会失败并显示 HTTP 429 Too many requests 状态 代码。

通过执行积压,您可以将并发执行 执行配额。默认情况下,系统会为所有请求(包括由 Cloud Tasks 触发的请求)启用执行回传,但以下请求除外:

  • 使用 executions.runexecutions.create 连接器,则执行积压默认处于停用状态。您可以通过将执行的 disableConcurrencyQuotaOverflowBuffering 字段明确设置为 false 来进行配置。
  • 对于由 Pub/Sub 触发的执行,执行积压 已停用且无法配置。

如需了解详情,请参阅管理执行回推

您还可以 启用 Cloud Tasks 队列以执行子工作流 以您定义的速率运行,并获得更高的执行速率;在本例中 您可能需要 停用执行积压功能

跨项目服务账号权限错误

如果您在尝试使用PERMISSION_DENIED 跨项目服务账号来部署工作流,请确保 未强制执行 iam.disableCrossProjectServiceAccountUsage 布尔值限制条件 且您已正确设置服务账号。对于 请参阅使用跨项目服务部署工作流 账号

资源名称必须符合 RFC 1123

当 HTTP 服务器返回错误代码时,您的工作流执行会失败 共 400 页。例如:

"description": "must conform to RFC 1123: only lowercase, digits, hyphens,
and periods are allowed, must begin and end with letter or digit, and less
than 64 characters."

如需解决此问题,请确保您的资源名称遵循 DNS 标签 中定义的标准 RFC 1123 以及 分配变量时,您要将 strings表达式正确。

例如,您不能分配如下所示的变量:- string: hello-${world}。 请改为执行以下操作:

YAML

  - assign_vars:
      assign:
          - string: "hello"
          - string: ${string+" "+"world"}

JSON

  [
    {
      "assign_vars": {
        "assign": [
          {
            "string": "hello"
          },
          {
            "string": "${string+" "+"world"}"
          },
        ]
      }
    }
  ]

包含英文冒号的表达式

在 YAML 中,当英文冒号被解读为定义某个映射时,包含英文冒号的表达式可能会导致意外行为。虽然可以部署和执行工作流,但输出不会按预期。

如果使用 Google Cloud 控制台创建工作流,则无法使用该工作流 并在 Google Cloud 控制台中直观呈现,而您可能会收到 警告:

工作流创建警告

要解决此问题,您可以使用英文单引号将 YAML 表达式括起来:

推荐: '${"a: " +string(a)}'

不推荐: ${"a: " +string(a)}

使用非字母数字字符映射键

访问包含非字母数字字符(例如 "special!key": value 中的感叹号)的地图键时,您必须将键名称括在引号中。如果密钥名称未用引号括起来,则无法部署工作流。例如,如果您尝试部署以下源代码,系统会抛出 token recognition error

- init:
    assign:
    - var:
        key:
            "special!key": bar
- returnOutput:
    return: '${"foo" + var.key[special!key]}'

如需解决此问题,请改用以下代码返回输出:

'${"foo" + var.key["special!key"]}'

列表中的多个表达式

在列表中使用多个表达式(如以下迭代范围示例)不符合 YAML 规范:

[${rangeStart}, ${rangeEnd}])

您可以通过执行以下任一操作来解决此问题:

  • 将列表放入表达式中:

    ${[rangeStart, rangeEnd]}

  • 将每个表达式括在单引号中:

    ['${rangeStart}', '${rangeEnd}']

结果便会如预期所示,是一个包含两个值的列表。

客户管理的加密密钥 (CMEK)

搭配 Cloud KMS 使用 Workflows。下表介绍了不同的问题 解决方法。

问题 说明
权限 cloudkms.cryptoKeyVersions.useToEncrypt 被拒 提供的 Cloud KMS 密钥不存在,或者权限未正确配置。

解决方案:

密钥版本未启用 提供的 Cloud KMS 密钥版本已停用。

解决方案:重新启用 Cloud KMS 密钥版本

密钥环区域与要保护的资源不匹配 提供的 KMS 密钥环区域与 工作流。

解决方案:使用受保护的 Cloud KMS 密钥环 工作流。(请注意,它们可以位于不同的 projects.)如需了解详情,请参阅 Cloud KMS 位置Workflows 位置

已超出 Cloud KMS 配额限制 您已达到 Cloud KMS 请求配额上限。

解决方案:限制 Cloud KMS 调用或 提高配额上限。如需了解详情,请参阅 Cloud KMS 配额

使用 Cloud Run 连接器时未找到请求的实体

当 HTTP 服务器返回错误代码时,您的工作流执行会失败 在使用连接器方法时为 404googleapis.run.v1.namespaces.jobs.create

此方法要求您指定 HTTP 端点的位置。对于 例如 us-central1asia-southeast1。如果您不指定位置 使用全球端点 https://run.googleapis.com;不过,这个位置 仅支持 list 方法。

如需解决此问题,请务必在调用连接器时指定 location 参数。如需了解 Cloud Run Admin API 位置选项,请参阅服务端点

资源限制

如果您遇到资源限制ResourceLimitErrorMemoryLimitExceededErrorResultSizeLimitExceededError 等错误,可以通过清除变量来释放内存。例如,您可能想释放 步骤。或者,您可能接到了并不关心的通话结果, 可以完全忽略这些结果。

YAML 缩进

YAML 缩进有意义,并且每个缩进级别应至少包含两个空格。 缩进量不足可能会导致错误,新层级中至少应包含两个空格 上一行中文本的开头

例如,以下代码错误地指定了一个包含 stepNamecall 项的地图的列表项:

- stepName:
  call: sys.log

相反,您应将后续行缩进两个空格,以便将 call 嵌套在 stepName 中:

- stepName:
    call: sys.log

请确保使用空格而不是 Tab 字符来缩进行。

后续步骤