google-cloud-platform - gsutil rsync 是否可以用于仅允许上传文件的应用程序?(ResumableUploadAbortException:没有 storage.objects.delete 访问权限)
问题描述
我已经使用了gsutil rsync
没有-d
参数,即使没有任何参数,但我仍然得到ResumableUploadAbortException: 403 abc@xyz.iam.gserviceaccount.com does not have storage.objects.delete access
.
我想使用gsutil rsync
谷歌计算引擎创建一个仅用于将文件上传到谷歌云存储的应用程序。
我添加了读取和列出权限,因为我不希望应用程序能够删除存储桶中的任何文件,所以我没有授予storage.objects.delete
.
是否有任何参数可以使用该gsutil rsync
命令而无需授予删除文件的权限?我想使用rsync
,因为我必须传输千兆字节的文件。
谢谢你。
[编辑]添加附加信息和调试:
我想添加其他信息,这个应用程序作为 cron 运行,上传时间戳生成的文件名,所以每次执行时都会有所不同。
上传过程确实有效,文件上传到了bucket,但ResumableUploadAbortException
最后我还是得到了。
所以我运行gsutil -D rsync
调试:
DEBUG: Exception stack trace:
Traceback (most recent call last):
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/__main__.py", line 590, in _RunNamedCommandAndHandleExceptions
user_project=user_project)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/command_runner.py", line 372, in RunNamedCommand
return_code = command_inst.RunCommand()
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/commands/rsync.py", line 1546, in RunCommand
fail_on_error=True, seek_ahead_iterator=seek_ahead_iterator)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/command.py", line 1420, in Apply
arg_checker, should_return_results, fail_on_error)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/command.py", line 1491, in _SequentialApply
worker_thread.PerformTask(task, self)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/command.py", line 2157, in PerformTask
results = task.func(cls, task.args, thread_state=self.thread_gsutil_api)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/commands/rsync.py", line 1337, in _RsyncFunc
gzip_exts=cls.gzip_exts, preserve_posix=cls.preserve_posix_attrs)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/utils/copy_helper.py", line 3520, in PerformCopy
allow_splitting=allow_splitting, gzip_encoded=gzip_encoded)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/utils/copy_helper.py", line 2026, in _UploadFileToObject
parallel_composite_upload, logger)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/utils/copy_helper.py", line 1877, in _DelegateUploadFileToObject
elapsed_time, uploaded_object = upload_delegate()
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/utils/copy_helper.py", line 2015, in CallResumableUpload
is_component=is_component, gzip_encoded=gzip_encoded_file)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/utils/copy_helper.py", line 1687, in _UploadFileToObjectResumable
progress_callback=progress_callback, gzip_encoded=gzip_encoded)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/cloud_api_delegator.py", line 315, in UploadObjectResumable
gzip_encoded=gzip_encoded)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 1415, in UploadObjectResumable
gzip_encoded=gzip_encoded)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 1242, in _UploadObject
additional_headers, progress_callback, gzip_encoded)
File "/usr/lib64/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 1371, in _PerformResumableUpload
raise resumable_ex
ResumableUploadAbortException: ResumableUploadAbortException: 403 abc@xyz.iam.gserviceaccount.com does not have storage.objects.delete access to bucket/filename
解决方案
如果我不得不猜测,您正在尝试覆盖现有对象。这将删除现有对象,将其替换为另一个同名对象。
一种替代方法可能是gsutil cp -n
,它不会覆盖目标位置的现有文件。但是,如果您希望能够覆盖对象,则需要删除权限。
编辑:
As mentioned in the comments below, this can also happen as the result of parallel composite uploads being enabled (at the point where gsutil attempts to delete the component objects). This behavior can be disabled by setting parallel_composite_upload_threshold=0
in your boto file, or inline in the command, e.g. gsutil -o "GSUtil:parallel_composite_upload_threshold=0" ...
.
推荐阅读
- python - 如果表 beautifulsoup 和 pandas 中不存在类,则停止抓取 url
- c# - Twilio 5x C# 库 - 在阅读消息时收集数字
- java - 字母变化,我做错了什么?
- javascript - 向下滚动时使导航菜单更改颜色
- heroku - 在heroku上运行的graphql操场表现得很奇怪
- php - Woocommerce 使用 localhost base_url 时得到 401,但使用公共 ip 时成功
- nuxt.js - 如何将 polyfill 添加到 nuxt 2.0?
- database - 如何使用 DB2 SQL 将 DECFLOAT 更改为 INT?
- google-cloud-platform - 如何使用 Google Cloud 功能获取文件内容并将文件移动到不同的 Google Cloud Storage
- python - 相当于允许加权的 numpy.linalg.lstsq