R - Как скопировать и вставить файлы из одного места в другое в пределах корзины s3 (используя aws .s3)? - PullRequest
1 голос
/ 10 января 2020

Я хочу скопировать файл из одного каталога в другой в том же сегменте S3, используя пакет aws.s3 в R. Я пробовал следующий код, но он выдает ошибку.

library(aws.s3)
Sys.setenv(AWS_ACCESS_KEY_ID = Sys.getenv('AWS_KEY'),
           AWS_SECRET_ACCESS_KEY = Sys.getenv('AWS_SECRET'),
           AWS_DEFAULT_REGION = "us-west-2")

old_path <- 's3://bucket_name/some_folder/filename.avro'
new_path <- paste0(strsplit(old_path, 'bucket_name')[[1]][1],
                   'bucket_name/old_data',
                   strsplit(old_path, 'bucket_name')[[1]][2])

copy_object(from_object = old_path,
            to_object = new_path,
            from_bucket = 'bucket_name',
            to_bucket = 'bucket_name')

Вот ошибка -

- Error in parse_aws_s3_response(r, Sig, verbose = verbose) : 
  Not Found (HTTP 404)`.

Я могу запускать команды типа bucket_exists, что означает, что я могу подключиться к AWS.

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Ключи объекта в S3 не начинаются с начального / (это root сегмента, а не первый символ ключа объекта), но многие библиотеки неверно позволяют запустить ключ объекта с символом / и все работает, как вы ожидаете, с вызовами типа GetObject. Это прискорбно, но в настоящее время он укоренился во многих местах (включая, по крайней мере, некоторые из официальных SDK), поэтому его трудно восстановить, не вызывая распространенных проблем.

Но ... из-за способа API PUT + Copy S3 работает на проводе, библиотеки, которые «помогают» вам, молча проглатывая неправильный начальный символ / из ключа объекта в большинстве операций (например, GetObject), могут не работать с теми же ошибочными магиями c в операциях CopyObject и потерпит неудачу, если вы передадите ключ объекта, начинающийся с /. Когда это происходит, виноваты авторы библиотеки, а не служба S3.

Убедитесь, что old_path не не начинается с операции / и copy_object() должен работать как положено. Существует важное различие между выполнением этого и выполнением того, что вы делаете - copy_object() следует использовать внутреннюю операцию копирования S3, которая позволяет избежать загрузки и повторной загрузки, при этом вся операция фактически происходит внутри S3.

0 голосов
/ 10 января 2020

Так что метод copy_object по какой-то причине не работает, но я смог заставить следующий код сделать то же самое -

put_object(get_object(old_path, 'bucket_name'), new_path, 'bucket_name')

И затем, если вы хотите удалить старый файл -

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