我希望调度一个顶点管道,并从我的本地机器部署它。
我已经定义了我的管道运行良好,我部署它使用:create_run_from_job_spec
,在AIPlatformClient上运行它一次。
当尝试用create_schedule_from_job_spec
调度它时,我确实有一个云调度对象创建得很好,有一个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/服务帐户以确保安全性。查看'templated_http_request-v1'云函数(偷偷创建的!)的代码也很有用。我能够使用从调度器作业获得的有效负载从POSTMAN调用cloudfunction。