Ошибка выборки Amazon S3: «NoSuchKey», однако ключ действительно существует

#javascript #reactjs #amazon-web-services #amazon-s3

#javascript #reactjs #amazon-веб-сервисы #amazon-s3

Вопрос:

Я пытаюсь извлечь объект S3 с помощью хранилища AWS

 fetchAvatar = async () => {
  try {
      const imageData = await Storage.get("public/public/us-east-2:/1597842961073/family.jpg")
      console.log(imageData)
  } catch (err) {
      console.log('error fetching avatar: ')
      console.log(err)
  }
}  

Когда я нажимаю на ссылку, которую предоставляет ImageData, я получаю ошибку NoSuchKey, однако она существует
Изображение ключа

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

Комментарии:

1. Также, если я попаду в консоль управления S3 и нажму на изображение, оно действительно существует и загружается вручную .. idk, если это поможет, но я надеюсь, что это поможет.

Ответ №1:

Итак, я выяснил причину, и это должно что-то сделать с управлением AWS S3. По какой-то причине, каждый раз, когда я загружаю изображение, папка сбрасывается и становится privet. Когда я переделываю папки и общедоступное изображение вручную, я могу правильно отобразить изображение…Так что я думаю, это скорее проблема AWS или ошибка, которую им нужно исправить, я думаю

Комментарии:

1. Можно с уверенностью предположить, что проблема не внутри S3, а в вашей настройке есть что-то, чего вы не понимаете. Не существует такого понятия, как сброс папки и ее приватность, потому что в S3 нет такого понятия, как разрешения на уровне папки, за исключением тех, которые обрабатываются в политиках IAM, о которых вы не упомянули и которые не будут изменены при загрузке объектов. Включите ведение журнала в вашей корзине, и то, что на самом деле происходит, должно стать очевидным из журналов.

2. Да, я вроде как новичок в AWS, но я разобрался, мне просто пришлось добавить новую политику в корзину из-за того, что она автоматически закрыта. И это решило проблему.

Ответ №2:

Я предлагаю использовать javascript aws sdk, вы можете получить объект из корзины, как показано ниже:

  var params = {
    Bucket: "your-bucket-name", 
    Key: "yourFileName.jpg"
 };
 s3.getObject(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(data);  
 });
  

Обновить:

Вы можете определить свой регион при создании экземпляра s3, например:

 const s3 = new S3({
  region: 'eu-central-1',
});
  

Комментарии:

1. нужно ли мне также добавлять регион в параметры? поскольку объекты s3 состоят из ключа, корзины и региона?

2. @StevanNajeeb Вы можете определить свой регион при создании экземпляра s3, я обновлю ответ, что-то вроде: const sqs = new S3({ region: ‘eu-central-1’, });