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