使用Python API客户端库创建/获取Cloud Run Job报404错误
问题原因
你的报错和权限没有关系,核心问题出在Cloud Run v1 API的调用规则上:
- Cloud Run v1 API的全局端点(默认的
run.googleapis.com)仅支持跨区域的资源列举(list)操作,会返回项目下所有区域的作业,这也是你调用list接口能正常拿到my-job的原因。 - 所有单资源操作(get/create/update/delete)都必须调用对应区域的专属端点,且资源路径必须携带区域标识,你之前的路径
namespaces/my-project/jobs/my-job缺少区域段,全局端点无法定位到具体区域的资源,就会返回404。
修复方法
- 先确认你创建
my-job时使用的区域,执行以下gcloud命令可直接查询所有作业对应的区域:
gcloud beta run jobs list --format="value(metadata.name, metadata.location)"
- 初始化API客户端时,显式指定对应区域的API端点,同时修正资源路径格式,正确的资源路径格式为
namespaces/{项目ID}/locations/{区域}/jobs/{作业名}。
以区域us-central1为例,get接口的正确调用代码如下:
import googleapiclient.discovery # 替换为你实际使用的区域 region = "us-central1" endpoint = f"https://{region}-run.googleapis.com" with googleapiclient.discovery.build( "run", "v1", client_options={"api_endpoint": endpoint} ) as client: # get调用 get_req = client.namespaces().jobs().get( name=f"namespaces/my-project/locations/{region}/jobs/my-job" ) print(get_req.execute())
- 创建作业的代码同步修正parent参数,同样携带区域路径:
import googleapiclient.discovery region = "us-central1" endpoint = f"https://{region}-run.googleapis.com" with googleapiclient.discovery.build( "run", "v1", client_options={"api_endpoint": endpoint} ) as client: create_req = client.namespaces().jobs().create( parent=f"namespaces/my-project/locations/{region}", body={ "metadata": {"name": "my-job2"}, "spec": { "template": { "spec": { "template": { "spec": { "containers": [ {"image": "us-docker.pkg.dev/cloudrun/container/job:latest"} ] } } } } } } ) print(create_req.execute())
注:gcloud CLI会自动读取你本地配置的默认区域,自动路由到对应区域端点、拼接正确的资源路径,所以你用gcloud创建作业时不会触发这个问题。
内容的提问来源于stack exchange,提问作者daphshez
相关产品推荐
相关产品推荐

