AWS Lambda, присоединенный к событию S3 ObjectCreated, возвращает "NoSuchKey: указанный ключ не существует:
Я загружаю файл с устройства Android в корзину S3 через этот код
TransferUtility trasnferManager = new TransferUtility(s3, context);
trasnferManager.upload(..,..,..);
После этого у меня есть лямбда-триггер, присоединенный к событию S3:ObjectCreated.
Когда лямбда выполняется, я пытаюсь получить файл через функцию S3.getObject(). К сожалению, иногда я получаю сообщение об ошибке " NoSuchKey: указанный ключ не существует: ". После этого лямбда несколько раз повторяет попытку, успешно получает файл и продолжает его выполнение.
По моему мнению лямбда-функция выполняется до того, как файл в S3 доступен? Но это не должно происходить по замыслу. Триггер должен сработать после завершения загрузки файла на S3.
Согласно объявлению от 4 августа 2015 года:
Контейнеры Amazon S3 во всех регионах обеспечивают согласованность операций чтения-после-записи для PUTS новых объектов и возможную согласованность для операций PUTS и DELETES с перезаписью.
Согласованность чтения после записи позволяет извлекать объекты сразу после создания в Amazon S3.
Но до этого:
Все регионы, кроме стандарта США (переименованы в Восток США (Северная Вирджиния)), поддерживают согласованность чтения после записи для новых объектов, загруженных в Amazon S3.
Мое ведро находится в восточном регионе США (Северная Вирджиния) и создано до 4 августа 2015 года. Я не знаю, что это может быть проблемой...
РЕДАКТИРОВАТЬ: 20.10.2016
В соответствии с документацией - операция EVENTUALLY CONSISTENT READ может вернуть NO RESULT, даже если две или более операции WRITE были выполнены до этого.
В этом примере W1 (запись 1) и W2 (запись 2) завершаются до начала R1 (чтение 1) и R2 (чтение 2). Для согласованного чтения R1 и R2 оба возвращают color = ruby. Для в конечном итоге непротиворечивого чтения R1 и R2 могут возвращать color = red, color = ruby или нет результатов, в зависимости от того, сколько времени прошло.
2 ответа
Иногда, когда файлы имеют большой размер, они загружаются с помощью многоэтапной загрузки, и он отправляет триггер лямбде до полной загрузки файла. Предположительно, это связано с событием, которое запускает лямбда-функцию. В поле события лямбда-функции убедитесь, что вы добавили в событие как положенную, так и полную загрузку из нескольких частей.
Для защиты от этой проблемы можно использовать официанта S3 SDK. После получения уведомления мы можем убедиться, что объект действительно находится там. Например, для AWS JavaScript SDK вы можете использовать следующий фрагмент:
s3.waitFor("objectExists", {
Bucket: "<bucket-name>",
Key: "<object-key>"
}, callback);
Обратите внимание, что waitFor увеличит время выполнения вашей лямбды, а это означает, что вам нужно будет увеличить время ожидания. Согласно документации, проверка будет выполняться каждые 5 секунд до 20 раз. Поэтому установка времени ожидания около 1 минуты должна помочь избежать исключений времени ожидания выполнения.
Ссылка на документацию: AWS JavaScript SDK S3 Class