Google Cloud Workflows同存储桶复制对象触发404未找到异常
问题描述
我编写了一个Google Cloud Workflows工作流,用于在同一个Cloud Storage存储桶内复制文件,工作流代码如下:
main: steps: - list: call: googleapis.storage.v1.objects.list args: bucket: "**************" prefix: "xxx/extra_cost_commute.txt" result: listResult - log-files: call: sys.log args: data: ${listResult} severity: "INFO" - copy: call: googleapis.storage.v1.objects.copy args: sourceBucket: "**************" sourceObject: "xxx/extra_cost_commute.txt" destinationBucket: "**************" destinationObject: "yyy/new_extra_cost_commute.txt" result: copyResult - log-copy: call: sys.log args: data: ${copyResult} severity: "INFO"
其中list步骤可正常返回对象xxx/extra_cost_commute.txt,但copy步骤触发了404 Not found异常,错误信息如下:
HTTP server responded with error code 404 in step "copy", routine "main", line: 15 { "body": "Not Found", "code": 404, "headers": { "Alt-Svc": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000", "Cache-Control": "no-cache, no-store, max-age=0, must-revalidate", "Content-Length": "9", "Content-Type": "text/html; charset=UTF-8", "Date": "Mon, 13 May 2024 19:42:39 GMT", "Expires": "Mon, 01 Jan 1990 00:00:00 GMT", "Pragma": "no-cache", "Server": "UploadServer", "Vary": "Origin, X-Origin", "X-Guploader-Uploadid": "" }, "message": "HTTP server responded with error code 404", "tags": [ "HttpError" ] }
我使用gcloud命令通过gcr.io/google.com/cloudsdktool/google-cloud-cli:alpine镜像的batch连接器测试复制操作可正常执行,请问问题出在哪里?
问题排查与解决
- 权限差异问题:gcloud测试用的是本地身份(用户账号或指定服务账号),而Workflows运行依赖自身的服务账号。
list仅需storage.objects.list权限,但copy需要同时拥有源对象的storage.objects.get和目标路径的storage.objects.create权限。- 找到Workflows对应的服务账号,格式为
[你的项目编号]@cloudworkflows.gserviceaccount.com - 给该账号授予存储桶的
Storage Object Admin角色,或更细粒度的storage.objects.get和storage.objects.create权限
- 找到Workflows对应的服务账号,格式为
- 路径参数校验:检查
sourceBucket、sourceObject、destinationBucket的取值是否与list步骤完全一致,避免多余空格、大小写错误(对象路径区分大小写)。 - 目标路径验证:Cloud Storage没有真实目录,但若目标路径前缀从未被使用过,可能出现误判。可以先尝试将文件复制到存储桶根目录(比如
destinationObject: "new_extra_cost_commute.txt"),验证是否能成功。 - API参数格式确认:确保
googleapis.storage.v1.objects.copy的参数符合要求,比如sourceObject是完整的对象路径,没有遗漏或多余层级。
内容的提问来源于stack exchange,提问作者angelcervera
相关产品推荐
相关产品推荐

