Может ли gsutil rsync для приложения с разрешением только на загрузку файлов? (ResumableUploadAbortException: нет доступа к storage.objects.delete) - PullRequest
0 голосов
/ 15 января 2019

Я использовал gsutil rsync без -d аргумента, даже без какого-либо аргумента, но я все еще получил ResumableUploadAbortException: 403 abc@xyz.iam.gserviceaccount.com does not have storage.objects.delete access.

Я хочу создать приложение только для загрузки файлов в облачное хранилище Google, используя gsutil rsync из Google Compute Engine.

Я добавил разрешение на чтение и перечисление, потому что я не хочу, чтобы приложение могло удалять какие-либо файлы из корзины, поэтому я не дал разрешения на storage.objects.delete.

Есть ли какой-либо параметр для использования команды gsutil rsync без необходимости доступа для удаления файла? Я хочу использовать rsync, потому что мне нужно передавать гигабайты файлов.

спасибо.

[EDIT] добавить дополнительную информацию и отладить:

Я хочу добавить дополнительную информацию, это приложение работает как cron, загружает временную метку сгенерированного имени файла, поэтому оно будет отличаться при каждом запуске.

Процесс загрузки действительно работал, файл загружен в корзину, но я все равно получил 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

1 Ответ

0 голосов
/ 16 января 2019

Если бы мне пришлось угадывать, вы пытаетесь перезаписать существующий объект. Это удалит существующий объект, заменив его другим объектом с тем же именем.

Одной из альтернатив может быть gsutil cp -n, которая не будет перезаписывать существующие файлы в месте назначения. Но если вы хотите иметь возможность перезаписывать объекты, вам нужно разрешение на удаление.

Edit:

Как уже упоминалось в комментариях ниже, это также может происходить в результате включения параллельных составных загрузок (в момент, когда gsutil пытается удалить объекты компонента). Это поведение можно отключить, установив parallel_composite_upload_threshold=0 в файле boto или встроенный в команду, например, gsutil -o "GSUtil:parallel_composite_upload_threshold=0" ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...