You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python API client更新Google Cloud Storage传输任务?遇404错误

问题:更新GCS传输任务状态时触发404 NotFound错误

尝试使用Python客户端storage_transfer_v1将Google Cloud Storage传输任务的状态更新为ENABLED,但收到错误:

NotFound: 404 Requested entity was not found.

已确认任务存在,因为可以通过get_transfer_job方法正常获取该任务。

原代码

client_transfer = storage_transfer_v1.StorageTransferServiceClient()

# Construct the job_name in the required format

# Get the existing transfer job
transfer_job = client_transfer.get_transfer_job(request=storage_transfer_v1.GetTransferJobRequest(
    job_name=transfer_job.name,
    project_id=transfer_job.project_id))

# Update the status
transfer_job.status = storage_transfer_v1.TransferJob.Status.ENABLED

# Define the fields to update
update_mask = FieldMask()
update_mask.paths.append("status")

# Create the request object for update
update_request = storage_transfer_v1.UpdateTransferJobRequest(
    job_name=transfer_job.name,
    transfer_job=transfer_job,
    update_transfer_job_field_mask=update_mask
)

# Update the transfer job
updated_job = client_transfer.update_transfer_job(request=update_request)

解决方案

核心问题分析

UpdateTransferJobRequest不需要单独传入job_name参数,因为transfer_job对象本身已经包含了完整的资源名称(格式为projects/{project_id}/transferJobs/{job_id})。同时传入job_name和transfer_job会导致服务端解析冲突,进而触发404错误。另外需要确保FieldMask正确导入。

修正后的代码

from google.protobuf.field_mask_pb2 import FieldMask
import storage_transfer_v1

client_transfer = storage_transfer_v1.StorageTransferServiceClient()

# 假设此处已正确构造transfer_job的完整名称,例如:
# transfer_job_name = "projects/your-project-id/transferJobs/your-job-id"
# transfer_job = client_transfer.get_transfer_job(request=storage_transfer_v1.GetTransferJobRequest(job_name=transfer_job_name))

# 获取现有传输任务
transfer_job = client_transfer.get_transfer_job(
    request=storage_transfer_v1.GetTransferJobRequest(
        job_name=transfer_job.name
    )
)

# 更新任务状态
transfer_job.status = storage_transfer_v1.TransferJob.Status.ENABLED

# 定义需要更新的字段
update_mask = FieldMask(paths=["status"])

# 构造更新请求(无需单独传入job_name)
update_request = storage_transfer_v1.UpdateTransferJobRequest(
    transfer_job=transfer_job,
    update_transfer_job_field_mask=update_mask
)

# 执行更新操作
updated_job = client_transfer.update_transfer_job(request=update_request)

额外注意事项

  • 确保transfer_job.name是完整的资源名称,格式为projects/{project-id}/transferJobs/{job-id},不能仅传入任务ID。
  • 确认客户端使用的账号拥有roles/storageTransfer.admin或足够的权限来修改传输任务。

内容的提问来源于stack exchange,提问作者Straight Coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:01:00