Виняток Amazon S3: «Вказаний ключ не існує»


85

Я використовую AmazonS3Client в додатку для Android, використовуючи запит getObject для завантаження зображення з мого сегмента Amazon S3.

На даний момент я отримую такий виняток:

com.amazonaws.services.s3.model.AmazonS3Exception: 
The specified key does not exist.
 (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey;

Навіть незважаючи на те, що я можу побачити об'єкт із зазначеним ключем у моєму сегменті S3.


1
Я думаю, що ця помилка зазвичай виникає, коли об'єкт / файл не існує у вказаному сегменті. Чи можете ви ще раз перевірити назву сегмента, який ви використовуєте для друкарської помилки, і якщо це те саме сегмент, де ви бачите об'єкт / файл? Це точно не помилка автентифікації.
Шобхіт Пурі

30
Документація Amazon відмовна, це питання не може бути проти. Це божевільно з’ясовувати програмування S3.
Сіддхарт,

Наразі Index.html не знайдено під жодною папкою. Дозволи на сегменти AWS S3 не сприймають, як сказано в документації AWS.

1
Мені подобається, як існує десяток різних відповідей, і всі вони є правильними.
Роб Осборн,

Відповіді:


48

Ну, ця помилка насправді досить пряма. це просто означає, що ваш файл не існує в межах сегмента S3. Дещо може бути неправильним:

  1. Можливо, ви намагаєтеся зробити посилання на неправильний файл. Перевірте шлях, який ви намагалися отримати.

  2. Щоразу, коли файл було завантажено, він мав помилку. Перевірте журнали для вашого процесу S3Sync, щоб побачити, чи можете ви знайти якісь відповідні результати

Джерело


3
Термін дії посилань закінчується, що робить відповіді марними через деякий час, вам слід витягти інформацію із цього посилання та оновити цю відповідь, щоб вона була повною. не соромтеся поділитися своїм джерелом .. це добре ..
Сіддхарт

Дякуємо, це допомагає підтримувати ТАК чисті та корисні.
Сіддхарт

1
Я зіткнувся з цією проблемою з додатком React, який обробляє власну маршрутизацію. Моє рішення закінчилось тим, що я перенаправляв обидва файли rootта errorsдо одного index.htmlфайлу. Таким чином, інтерфейсний додаток може виступати загальним і зрозуміти будь-яку схему URL-адреси.
sambecker

26

Для мене об'єкт безумовно існував і був завантажений правильно, однак його URL-адреса s3 все одно викликала ту ж помилку:

<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>

Я з’ясував, що причина в тому, що моє ім’я файлу містило #символ, і, мабуть, певні символи чи символи також спричинять цю помилку.

Видалення цього символу та створення нової URL-адреси s3 вирішили мою проблему.


Те саме питання тут. Образ, що ображав, був дужкою: (
Йоганн

Я стикаюся з такою ж проблемою, і моє ім'я файлу "abcd.jar". Чи є розширення функції завантаження також специфічним?
Рахул Мунджал

@RahulMunjal Я не надто впевнений у розширеннях файлів, можливо, спробуйте помістити його в папку .zip? і подивіться, чи це працює. Крім того, двічі перевірте правильність дозволів для вашого файлу (наприклад, доступ лише для читання для групи всіх користувачів).
TrieuNomad

Подібним чином мені довелося використовувати encodeURIComponent на ключі, щоб отримати s3, щоб знайти його. Ім'я файлу вже було закодовано, і, на мою думку, це не спрацювало.
Шон

У мене була та сама проблема. У мене був символ @ для підпапки / префікса на S3. видалення цього символу видалило цю помилку.
Аніл Консал

12

Зауважте, що це може статися, навіть якщо шлях до файлу правильний через можливу модель узгодженості s3 . В основному, може бути деяка затримка в можливості прочитати об’єкт після його запису. Докладнішу інформацію див. У цій документації .


Це також було моє питання. Тепер я впровадив автоматичну повторну спробу протягом короткого часу.
moritz.vieli

3

У моєму випадку це було тому, що назва файлу містила пробіли. Вирішив це завдяки цій документації (яка не пов’язана з проблемою):

from urllib.parse import unquote_plus
key_name = unquote_plus(event['Records'][0]['s3']['object']['key'])

Вам також потрібно завантажити urllib як шар із відповідною версією (якщо ваша лямбда - Python 3.7, вам потрібно упакувати urllib у середовищі python 3.7).

Причина в тому, що AWS перетворює `` в '' (чому ...), що насправді проблематично ...


2

У моєму випадку помилка з’являлася, оскільки я завантажив у контейнер всю папку, що містить файли веб-сайту.

Я вирішив це, перемістивши всі файли за межі папки, прямо в контейнер.


1

Не забувайте, що відра залежать від регіону. Це може бути проблемою.

Також спробуйте скористатися консоллю S3 для переходу до фактичного об'єкта, а потім клацніть на Copy Path, ви отримаєте щось на зразок:

s3://<bucket-name>/<path>/object.txt

Поки що б ви не передавали його на синтаксичний аналіз, я вважаю, що це найбезпечніше.


0

Причиною проблеми є неправильна помилка або помилка в назві сегмента / ключа. Перевірте, чи існує назва кошика або ключа, яку ви надаєте.


0

Крок 1: Отримайте останню версію aws-java-sdk

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.660</version>
</dependency>

Крок 2: Правильний імпорт

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListObjectsRequest;
import com.amazonaws.services.s3.model.ObjectListing;

Якщо ви впевнені, Specified key does not exists errorщо сегмент існує, це означатиме, що ім'я сегмента написано неправильно (містить скісну риску або спеціальні символи). Зверніться до документації щодо правила іменування.

Документ цитує:

Якщо запитуваний об’єкт доступний у сегменті, і користувачі все ще отримують помилку 404 NoSuchKey від Amazon S3, перевірте наступне:

Переконайтеся, що запит точно відповідає назві об’єкта, включаючи великі літери імені об’єкта. Запити на об’єкти S3 чутливі до регістру. Наприклад, якщо об'єкт має ім'я myimage.jpg, але запитується Myimage.jpg, запитувач отримує помилку 404 NoSuchKey. Переконайтеся, що запитуваний шлях відповідає шляху до об’єкта. Наприклад, якщо шлях до об'єкта awsexamplebucket / Downloads / February / Images / image.jpg, але запитуваний шлях awsexamplebucket / Downloads / February / image.jpg, то запитувач отримує помилку 404 NoSuchKey. Якщо шлях до об’єкта містить пробіли, переконайтеся, що запит використовує правильний синтаксис для розпізнавання шляху. Наприклад, якщо ви використовуєте AWS CLI для завантаження об’єкта на свою машину Windows, ви повинні використовувати лапки навколо шляху до об’єкта, подібні до: aws s3 cp "s3: // awsexamplebucket / Завдання резервного копіювання 4 / 3T000000.vbk". За бажанням, ви можете ввімкнути журналювання доступу до сервера, щоб детальніше переглянути записи запитів на наявність проблем, які можуть спричинити помилку 404.

AWSCredentials credentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_KEY);
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
ObjectListing objects = s3Client.listObjects("bigdataanalytics");
System.out.println(objects.getObjectSummaries());

0

Я також зіткнувся з цією проблемою, але в моєму випадку мимоволі змінив внутрішній стан ключа вихідного об'єкта при побудові ключа призначення:

  source_objects.each do |item|
    key = item.key.sub!(source_prefix, dest_prefix)
    item.copy_to(bucket: dest_bucket, key: key)
  end

Я новачок у Рубі, і я пропустив, що sub!має побічні ефекти, і його subслід було використовувати замість цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.