排查 Dataflow 权限问题

本页面介绍如何调查和解决 Dataflow 权限的问题。

要成功运行 Dataflow 作业,您的用户账号和 Dataflow 服务账号必须具有对资源的必要访问权限。如需查看所需角色的列表以及授予这些角色的步骤,请参阅 Dataflow 安全性和权限页面上的 Google Cloud 上的流水线的安全性和权限

此外,当 Apache Beam 流水线访问 Google Cloud 资源时,您的 Dataflow 项目的工作器服务账号需要这些资源的访问权限。 如需查看工作器服务账号可能需要的角色列表,请参阅角色分配示例

如果缺少运行作业所需的一个或多个角色,作业日志或工作器日志中可能会出现错误。如需了解如何在作业失败时查找错误,请参阅查找有关流水线故障的信息

如需解决权限问题,您需要了解缺少哪些权限以及哪个账号需要该权限。如需了解缺少哪些权限,请查看错误消息中列出的权限,并找到包含该权限的角色。您通常(但并不总是)需要将相关角色分配给 Dataflow 工作器服务账号

如需添加权限,您的用户账号需要获得管理访问权限的权限。有关详情,请参阅管理对服务账号的访问权限管理对其他资源的访问权限

用户没有项目的写入权限

尝试运行 Dataflow 作业时,作业失败,并且您会看到类似于以下内容的错误:

PERMISSION_DENIED: (Could not create workflow; user does not have write access to project: $PROJECT_ID Causes: (...): Permission 'dataflow.jobs.create' denied on project: '$PROJECT_ID'

如果您的用户账号没有 roles/dataflow.developer 角色,就会出现此错误。

如需解决此问题,请向您的用户账号授予 roles/dataflow.developer 角色。此外,请确保您的用户账号具有 roles/iam.serviceAccountUser 角色。如需了解详情,请参阅 Identity and Access Management 文档中的授予单个角色

用户没有足够的项目权限

尝试取消 Dataflow 作业时,您看到类似于以下内容的错误:

Could not cancel workflow; user does not have sufficient permissions on project:PROJECT_ID, or the job does not exist in the project. Causes: (...): Permission 'dataflow.jobs.cancel' denied on project: 'PROJECT_ID' Please ensure you have permission to access the job

尝试排空或更新作业时,可能会出现类似的错误。

发生此错误是由以下某种原因造成的:

  • 您的用户账号没有 roles/dataflow.developer 角色。如需解决此问题,请向您的用户账号授予 roles/dataflow.developer 角色。此外,请确保您的用户账号具有 roles/iam.serviceAccountUser 角色。如需了解详情,请参阅 Identity and Access Management 文档中的授予单个角色
  • 作业 ID 不正确。它可能包含拼写错误,或者您可能使用作业名称而不是作业 ID 来取消作业

工作器服务账号的权限验证失败

尝试运行 Dataflow 作业时,您看到类似于以下内容的错误:

Workflow failed. Causes: Permissions verification for controller service account failed. All permissions in IAM role roles/dataflow.worker should be granted to controller service account PROJECT_NUMBER-compute@developer.gserviceaccount.com.

当工作器服务账号没有 roles/dataflow.worker 角色时,会发生此错误。

如需解决此问题,请向工作器服务账号授予 roles/dataflow.worker 角色。 如需了解详情,请参阅 Identity and Access Management 文档中的授予单个角色

流水线验证失败

在新的 Dataflow 作业启动之前,Dataflow 会对流水线执行验证检查。当验证检查发现流水线存在问题时,为了节省时间和计算资源,Dataflow 会使作业提交提前失败。在作业日志中,Dataflow 包含日志消息,其中包含验证发现结果和解决问题的说明。

当流水线验证检查发现权限问题时,您可能会在作业日志中看到以下错误:

[The preflight pipeline validation failed for job JOB_ID.] Missing permissions
PERMISSION when accessing RESOURCE_PATH as Dataflow worker service account WORKER_SERVICE_ACCOUNT.

如果缺少多个资源的权限,则作业日志包含多条权限错误消息。

在尝试重新提交 Dataflow 作业之前,请先解决权限问题。以下资源提供了有关修改角色和权限的信息。

如果要覆盖流水线验证并启动存在验证错误的作业,请使用以下流水线选项:

--experiment=enable_ppv_effect=false

刷新凭据时出现问题

尝试运行 Dataflow 作业时,您看到类似于以下内容的错误:

Workflow failed. Causes: There was a problem refreshing your credentials.
Please check: 1. The Dataflow API is enabled for your project.
2. Make sure both the Dataflow service account and the controller service account have sufficient permissions.
If you are not specifying a controller service account, ensure the default Compute Engine service account PROJECT_NUMBER-compute@developer.gserviceaccount.com exists and has sufficient permissions.
If you have deleted the default Compute Engine service account, you must specify a controller service account

当工作器服务账号没有 roles/dataflow.worker 角色或未启用 Dataflow API 时,会发生此错误。

首先验证工作器服务账号具有 roles/dataflow.worker 角色。如果需要,请将 roles/dataflow.worker 授予工作器服务账号。 如需了解详情,请参阅 Identity and Access Management 文档中的授予单个角色

如需启用 Dataflow API,请参阅在 Google Cloud 项目中启用 API

需要“compute.subnetworks.get”权限

尝试在共享 VPC 网络上运行 Dataflow 作业时,您会看到类似于以下内容之一的错误:

Required 'compute.subnetworks.get' permission for 'projects/project-id/regions/region/subnetworks/subnet-name' HTTP Code: 403
Required 'compute.subnetworks.use' permission for 'projects/project-id/regions/region/subnetworks/subnet-name' HTTP Code: 403

您可以使用共享 VPC 将宿主项目 VPC 网络中的子网导出到同一组织中的其他服务项目。 这些服务项目中的实例可以在该宿主项目的共享子网中进行网络连接。如需了解详情,请参阅共享 VPC 概览

如需解决此问题,请首先验证服务项目已关联到宿主项目。如需了解详情,请参阅“预配共享 VPC”页面中的关联服务项目

接下来,将以下角色授予宿主项目的 Compute Engine 服务账号、服务项目的 Dataflow 工作器服务账号以及用于提交作业的服务账号:

如需了解详情,请参阅 Identity and Access Management 文档中的为共享 VPC 指定子网参数的指南授予单个角色

Dataflow Runner 无权访问存储桶

当您尝试列出 Cloud Storage 存储桶中的对象,Dataflow 作业失败,并且您看到类似于以下内容的错误:

"dataflow-runner@project-id.iam.gserviceaccount.com" does not have `storage.objects.list` access to the Google Cloud Storage Bucket

当工作器服务账号没有 roles/storage.objectViewer 角色时,会发生此错误。

如需解决此问题,请向您的用户账号授予 roles/storage.objectViewer 角色。如需了解详情,请参阅 Identity and Access Management 文档中的授予单个角色

对资源的 Cloud KMS 密钥权限被拒绝

当您使用客户管理的加密密钥并尝试创建 Dataflow 作业时,作业失败,并且您看到类似于以下内容的错误:

Cloud KMS key permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource
'projects/project-id/locations/location/keyRings/keyRingName/cryptoKeys/keyname' (or it may not exist). cannot be validated.
Please confirm the full key path is used (starts with projects) and that there are no typos.

当工作器服务账号和 Dataflow 服务账号没有 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色时,会发生此错误。

要解决此问题,请将 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色授予工作器服务账号和 Dataflow 服务账号。如需了解详情,请参阅“使用客户管理的加密密钥”页面中的授予 Encrypter/Decrypter 权限

对资源的权限被拒绝

尝试创建流水线时,流水线会失败并显示以下错误:

Permission 'datapipelines.pipelines.create' denied on resource '//datapipelines.googleapis.com/projects/PROJECT_ID/locations/REGION' (or it may not exist).

如果项目的工作器服务账号无权访问与流水线关联的文件和其他资源,则会出现此错误。

如需解决此问题,请将以下角色分配给工作器服务账号:

  • roles/dataflow.admin
  • roles/dataflow.worker

如需了解详情,请参阅“Dataflow 安全性和权限”中的工作器服务账号

工作流失败

当您使用客户管理的加密密钥并尝试创建 Dataflow 作业时,作业失败并显示以下错误:

Workflow failed

出现此错误的原因如下:

  • 密钥和 Dataflow 作业不在同一区域,或者使用了多区域密钥。不支持全球密钥和多区域密钥。您的 CMEK 区域和 Dataflow 作业的区域必须相同。
  • 未正确指定密钥名称。键可能不存在,或者名称可能存在拼写错误。

Cloud KMS 密钥无法保护此作业的资源

当您运行 Dataflow 作业并尝试启用客户管理的加密密钥时,作业失败,并且您看到类似于以下内容的错误:

Cloud KMS key can't protect resources for this job. Please make sure the KMS key's region matches the Dataflow region

出现此错误的原因如下:

  • 密钥和 Dataflow 作业不在同一区域,或者使用了多区域密钥。不支持全球密钥和多区域密钥。您的 CMEK 区域和 Dataflow 作业的区域必须相同。
  • 未正确指定 dataflowKMSKey 参数。

纵向自动扩缩功能不起作用

使用纵向自动扩缩时,作业未纵向自动扩缩,并且作业日志中显示以下错误:

{"level":"error","ts":1708815877.1246133,"caller":"exporter/exporter.go:232","msg":"failed to get response from UAS: %v","error":"rpc error: code = PermissionDenied desc = The caller does not have permission","stacktrace":"google3/autoscaler/vitor/external/go/exporter/exporter.receiver\n\tautoscaler/vitor/external/go/exporter/exporter.go:232"}

如果工作器服务账号没有 Dataflow Worker (roles/dataflow.worker) 角色,则会发生此错误。

如需解决此问题,请向工作器服务账号授予 roles/dataflow.worker 角色。 如需了解详情,请参阅 Identity and Access Management 文档中的授予单个角色

如果您要为工作器服务账号使用自定义角色,请向自定义角色添加以下权限:

  • autoscaling.sites.readRecommendations
  • autoscaling.sites.writeMetrics
  • autoscaling.sites.writeState