问题排查

API not enabled or service account deleted 错误

调用 Cloud Life Sciences API 时,您可能会遇到以下一种或两种错误:

  • API not enabled or service account deleted
  • checking service account permission: Account deleted: PROJECT_ID

如需解决这些问题,请按顺序完成以下步骤:

  1. 确保已启用 Cloud Life Sciences API 和 Compute Engine API
  2. 确保已正确配置 Cloud Life Sciences Service Agent 服务帐号
  3. 确保已正确配置 Compute Engine 默认服务帐号

启用 Cloud Life Sciences API 和 Compute Engine API

确保 Google Cloud 项目中启用了 Cloud Life Sciences API 和 Compute Engine API:

  1. 启用 Cloud Life Sciences API:

    启用 Cloud Life Sciences API

  2. 启用 Compute Engine API:

    启用 Compute Engine API

如果您遇到权限错误,表明您无权为项目启用 Google Cloud API,请参阅启用和停用 API,了解如何启用 Google Cloud API。

缺少 Cloud Life Sciences 服务帐号或 Cloud Life Sciences Service Agent 角色

当您在一个 Google Cloud 项目中首次运行流水线时,系统会自动创建 Cloud Life Sciences Service Agent 服务帐号(使用 gcloud 工具,或 RPC 和 REST API)。Cloud Life Sciences Service AgentGoogle 管理的服务帐号。您无法完全删除该服务帐号,但在某些情况下,该服务帐号可能不会显示在 Identity and Access Management 页面中,且您可能会遇到 Cloud Life Sciences API 问题。

为使 Cloud Life Sciences API 正常运行并完成在 Compute Engine 虚拟机上运行流水线之类的任务,Cloud Life Sciences Service Agent 服务帐号必须存在且必须具有 Life Sciences Service Agent IAM 角色。

如果遇到以下任何问题,您可以重新创建 Cloud Life Sciences Service Agent 服务帐号或向其授予 Life Service Agent IAM 角色:

  • 无法在 Identity and Access Management 页面找到 Cloud Life Sciences Service Agent 服务帐号。
  • 可以找到 Cloud Life Sciences Service Agent 服务帐号,但它不具有 Life Sciences Service Agent 角色。

借助 gcloud 命令行工具并使用 Cloud Life Sciences Service Agent 服务帐号的标识符(格式为 service-PROJECT_NUMBER@gcp-sa-lifesciences.iam.gserviceaccount),将 lifesciences.serviceAgent 角色添加到该服务帐号中。

如需重新创建该服务帐号或向其授予 Life Sciences Service Agent IAM 角色,请运行 gcloud projects add-iam-policy-binding 命令。如需查找 PROJECT_IDPROJECT_NUMBER,请参阅识别项目

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-lifesciences.iam.gserviceaccount.com \
    --role=roles/lifesciences.serviceAgent

如果请求成功,命令提示符将显示类似于以下示例的消息:

Updated IAM policy for project [PROJECT_ID].
bindings:
...
- members:
  - serviceAccount:service-PROJECT_NUMBER@gcp-sa-lifesciences.iam.gserviceaccount.com
  role: roles/lifesciences.serviceAgent
...
etag: VALUE
version: VALUE

再次返回 Identity and Access Management,并验证以下各点:

  • 成员列包含一个格式为 service-PROJECT_NUMBER@gcp-sa-lifesciences.iam.gserviceaccount 的服务帐号标识符。
  • 成员列的上述标识符所在的同一行中,名称列包含的值是 Cloud Life Sciences Service Agent
  • 成员列的上述标识符所在的同一行中,角色列包含的值是 Life Sciences Service Agent

缺少 Compute Engine 默认服务帐号

新创建的 Google Cloud 项目附带 Compute Engine 默认服务帐号,该帐号采用如下电子邮件地址形式:

PROJECT_NUMBER-compute@developer.gserviceaccount.com

该服务帐号必须位于您的 Google Cloud 项目中,否则 Cloud Life Sciences API 将无法在 Compute Engine 虚拟机上运行流水线。如果从项目中删除该服务帐号,那么所有依赖该服务帐号凭据的应用都会运行失败。如果您不小心删除了 Compute Engine 默认服务帐号,可以尝试在 30 天内恢复该帐号。如需了解详情,请参阅恢复删除的服务帐号

无法向 Cloud Life Sciences API 进行身份验证

如果借助将服务帐号用作凭据(例如,不是将 gcloud auth application-default login 用作凭据)的 Cloud Life Sciences API 来运行流水线,请确保该服务帐号具有以下角色:

  • roles/lifesciences.workflowsRunner
  • roles/iam.serviceAccountUser

如需将上述角色添加到您的服务帐号,请使用 Google Cloud Console 或 gcloud 命令行工具完成以下步骤:

控制台

  1. 确保您已启用 Cloud Life Sciences API
  2. 在 Google Cloud Console 中的 IAM 页面上,找到您的服务帐号。
  3. 在与服务帐号匹配的继承列中,点击铅笔图标。修改权限窗格随即会打开。
  4. 点击添加另一角色,然后搜索 Life Sciences Workflows RunnerService Account User 角色。
  5. 选择相应角色,然后点击保存。随后,lifesciences.workflowsRunneriam.serviceAccountUser 角色将添加到该服务帐号中。

gcloud

如需添加服务帐号权限,请运行 gcloud projects add-iam-policy-binding 命令。如需查找 PROJECT_IDPROJECT_NUMBER,请参阅识别项目

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:service-PROJECT_NUMBER@SERVICE_ACCOUNT_ID.iam.gserviceaccount.com \
    --role=roles/lifesciences.workflowsRunner
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:service-PROJECT_NUMBER@SERVICE_ACCOUNT_ID.iam.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

无法使用应用默认凭据进行身份验证

调用 Cloud Life Sciences API 时,您可能会收到一条错误消息,表明您的“应用默认凭据”不可用。

请参阅为服务器到服务器的应用设置身份验证,了解如何配置应用默认凭据或如何将身份验证凭据手动传递到应用或命令。

错误代码

Cloud Life Sciences API 可能返回以下错误代码:

RESOURCE EXHAUSTED (8)

代码:8

状态RESOURCE_EXHAUSTED

类别:用户错误

说明:某项资源已用尽。这可能表示您的应用已用尽项目级层 Admin API 配额。

建议执行的操作重试操作

FAILED_PRECONDITION (9)

代码:9

状态FAILED_PRECONDITION

类别:用户错误

完整错误Execution failed: while running "[USER_COMMAND_LINE]": unexpected exit status [NUMBER] was not ignored

说明:操作被拒绝,因为某项用户操作返回了非零的退出状态。界面将显示该操作的标准错误输出代码段,可供您诊断问题。如需从 Compute Engine 虚拟机 (VM) 上传完整日志,请在发出流水线请求时使用 ALWAYS_RUN 操作,如下所示:

{
  "commands": [
    "-c",
    "gsutil -q cp /google/logs/output gs://CLOUD_STORAGE_BUCKET/output"
  ],
  "entrypoint": "bash",
  "flags": [ "ALWAYS_RUN" ],
  "imageUri": "gcr.io/cloud-genomics-pipelines/io"
}

建议执行的操作:在解决问题之前,请勿重试。

ABORTED (10)

代码:10

状态ABORTED

类别:系统错误

完整错误The assigned worker has failed to complete the operation

说明:操作已中止,因为运行流水线的 Compute Engine 虚拟机发生故障,原因可能是它已被抢占,无法在终止前报告自己的状态。

建议执行的操作重试操作。如果错误再次出现,则可能存在会导致 Compute Engine 虚拟机出现故障的问题,例如使用了过多的资源。请查看 Cloud Logging 中的 Compute Engine 日志,以了解更多信息。

13

代码:13

完整错误Execution failed: generic::internal: action INDEX: waiting for container: container is still running, possibly due to low system resources

说明:操作的容器可能内存不足。

推荐措施:使用较大的机器类型重试流水线。

UNAVAILABLE (14)

代码:14

状态UNAVAILABLE

类别:系统错误

完整错误Execution failed: worker was terminated

说明:运行流水线的 Compute Engine 虚拟机已被抢占。

建议执行的操作重试操作

遇到错误后重试

流水线可能会发生故障并返回一个错误代码。之所以发生故障,可能是因为出现了与流水线工作无关的问题,在大多数情况下,您应该重试流水线操作。如果您使用了费用更低但更容易发生中断的抢占式虚拟机,那么流水线就特别容易发生故障。Cloud Life Sciences API 无法自动重试流水线操作,因为并非所有流水线都具有幂等性。

错误代码部分所述,当您遇到以下任一错误代码时,通常建议您重试:

  • RESOURCE EXHAUSTED (8)
  • ABORTED (10)
  • UNAVAILABLE (14)

启用 Cloud Monitoring

您可以在流水线上启用 Cloud Monitoring,以监控用于运行流水线的工作器虚拟机的运行状况和资源使用情况。不过,启用 Monitoring 可能会产生额外的费用。如需启用 Monitoring,请在发出流水线请求时在 VirtualMachine 对象上指定 enableStackdriverMonitoring 标志。

流水线的磁盘空间不足

如果流水线的磁盘空间不足,无法提取 Docker 映像,或者它需要更多磁盘空间才能记录或执行任务,您可以选择执行以下任一操作:

  • 在发出流水线请求时,使用 VirtualMachine 对象中的 bootDiskSizeGb 标志增加启动磁盘大小。
  • 挂接一个单独的磁盘,并在发出流水线请求时将其添加到 Action 对象内的 Mount 对象中。

遇到配额延迟

如果 Google Cloud 项目的 Compute Engine 配额已用尽,则 Cloud Life Sciences API 将不会分配虚拟机。所有进一步分配尝试都会延迟,以便现有流水线有时间完成。如果这种延迟持续发生,您可以申请提升配额

流水线停止

如果流水线因无法与 Cloud Life Sciences API 服务通信而停止并重复分配和释放虚拟机,则问题可能在于虚拟机的 default 网络已删除,并且 Network 对象中未指定其他网络。

如需解决此问题,您可以:

  • Network 对象中指定网络

取消或删除虚拟机

您应该取消与不需要的工作器虚拟机关联的操作,而不是删除这些虚拟机。如果删除虚拟机,则流水线会慢慢出现故障;如果该虚拟机正在启动,GCP 可能会分配一个新的虚拟机。