如何用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
相关产品推荐
相关产品推荐

