如何让Cloud Run Job自行停止?执行删除操作遇NOT_FOUND错误
问题分析与修复
错误核心原因
你碰到的NOT_FOUND错误本质是混淆了Cloud Run Job的定义模板和运行中的执行实例:
process.env.CLOUD_RUN_EXECUTION是当前正在运行的Job执行实例ID,不是Job本身的名称deleteJobAPI的作用是删除Job的永久定义模板,而非停止正在运行的单次执行实例,用执行ID调用这个接口自然找不到对应资源
修正后的代码
要停止当前运行的Job执行,需使用cancelJobExecution方法,并构造正确的执行实例资源名称:
const endJob = async () => { try { const runClient = new JobsClient({ projectId: getProjectId(), credentials: { client_email: env.gcloudClientEmail, private_key: env.gcloudPrivateKey, }, }); const executionId = process.env.CLOUD_RUN_EXECUTION; console.log(`Cancelling job execution ${executionId}`); // 构造执行实例的完整资源路径 const executionName = `projects/${getProjectId()}/locations/europe-west1/jobExecutions/${executionId}`; // 调用取消执行的API const [operation] = await runClient.cancelJobExecution({ name: executionName }); const [response] = await operation.promise(); console.log(`Job execution cancelled: ${response.name}`); } catch (e) { console.error('Failed to cancel job execution'); console.error(e); } };
额外注意事项
- 确保服务账号拥有
roles/run.admin权限,或更精细的run.jobExecutions.cancel权限 - 确认
europe-west1是你的Job实际部署的区域,需与环境变量中的区域保持一致 - 若确实需要删除Job定义而非停止执行,才使用
deleteJob,此时传入的是Job的名称(而非执行ID)
内容的提问来源于stack exchange,提问作者Oliver Dixon
相关产品推荐
相关产品推荐

