BOTO S3 возвращает NoSuchKey при попытке скопировать существующий ключ - PullRequest
4 голосов
/ 21 апреля 2011

Я создал ключ на S3.

mykey.exists() возвращает true

mykey.get_contents_to_filename() создает файл, который является правильным

Но:

mykey.copy('bucket', '/backup/file')

возвращает: NoSuchKey The Specified key does not exist. Key = mykey

Похоже, я использую boto 2.0b4 Если ключ существует, почему я получаю ошибку NoSuchKey?Чего мне не хватает?

edit: изменить обратную косую черту в имени ключа на ту, которую я на самом деле использую

Ответы [ 2 ]

1 голос
/ 25 июня 2012

У меня есть теория, что поскольку amazon s3 в конечном итоге непротиворечив, один запрос может увидеть ключ (.exists () == True), в то время как другой запрос заканчивается на другом сервере s3, который еще не знает о новом ключе.(Непоследовательное чтение - это проблема с в конечном итоге непротиворечивыми хранилищами данных. Это известное поведение для s3 с путом, за которым следует заголовок / получить. Я ожидаю, что он также будет удерживаться для копирования.) После обычно короткого (но неопределенного)Период времени все запросы будут видеть ваш ключ.Обычно это только около секунды или две.Установите 30-секундный тайм-аут в вашем коде между проверкой существует () и копией.Это все еще происходит?

Проблема описана здесь: https://forums.aws.amazon.com/thread.jspa?threadID=21634&tstart=0)

0 голосов
/ 26 апреля 2011

Я думаю, что вы можете столкнуться с проблемой с вашим ключевым именем.Символы косой черты в строке «\ backup \ file» фактически интерпретируются как экранированные строки, поэтому «\ b» заменяется символом возврата ASCII, а «\ f» интерпретируется как подача формы ASCII (см. this Больше подробностей).Хотя это, вероятно, не то, что вы намеревались, на самом деле это все равно должно работать, но была ошибка в экранировании имен ключей в boto2.0b4 (которая теперь исправлена ​​в github master), которая мешала этому работать.

Если вы действительно хотите, чтобы ваше имя ключа было «\ backup \ file», попробуйте указать его как r '\ backup \ file' в Python.Это обрабатывает ее как необработанную строку, и не будет происходить никакой escape-обработки.

...