运行 调度顶点管道时权限被拒绝

Permission denied when running scheduling Vertex Pipelines

我现在想安排一个顶点管道并从我的本地机器部署它。
我已经定义了运行良好的管道我使用以下方式部署它:create_run_from_job_spec,在 AIPlatformClient 运行 上它一次。
当尝试使用 create_schedule_from_job_spec 安排它时,我确实创建了一个 Cloud Scheduler 对象,其中包含一个指向 Cloud Function 的 http 端点。但是当调度程序运行时,由于权限被拒绝错误而失败。我使用了几个对项目具有所有者权限的服务帐户。 你知道哪里出了问题吗?

由于来自 Kubeflow 管道的 AIPlatformClient 提出弃用警告,我也想使用来自 google.cloud.aiplatform 的 PipelineJob,但我看不到任何直接的方式来安排管道执行。

我也花了大约 3 个小时来解决这个问题。就我而言,解决它的方法似乎是:

  • 禁用和重新启用云调度程序 api。我为什么这样做?应该有一个名为 service-[project-number]@gcp-sa-cloudscheduler.iam.gserviceaccount.com 的服务帐户。如果它丢失然后重新启用 API 可能会修复它
  • 对于较旧的项目,还有一个额外的步骤:https://cloud.google.com/scheduler/docs/http-target-auth#add

更简单的解释包括不执行以下某些步骤

  • 正在为调度程序作业创建服务帐户。在创建期间授予云函数调用者
  • 使用此服务帐户(请参阅下面的 create_schedule_from_job_spec)
  • 找到为您创建的(偷偷摸摸的)云函数,它将被称为 'templated_http_request-v1' 并将您的服务帐户添加为云函数调用者
response = client.create_schedule_from_job_spec(
job_spec_path=pipeline_spec,
schedule="*/15 * * * *",
time_zone="Europe/London", 
parameter_values={},
cloud_scheduler_service_account="<your-service-account>@<project_id>.iam.gserviceaccount.com"
)

如果您仍然卡住了,运行 gcloud scheduler jobs describe <pipeline-name> 也很有用,因为它确实有助于理解调度程序在做什么。您会看到 cloudfunction url、POST 有效载荷,它是一些 base64 编码的并包含管道 yaml,您会看到它使用 OIDC/service 帐户来确保安全。查看 'templated_http_request-v1' 云函数(偷偷创建的!)的代码也很有用。我能够使用从调度程序作业获得的有效负载从 POSTMAN 调用 cloudfunction。