Amazon S3-Ausnahme: "Der angegebene Schlüssel existiert nicht"


79

Ich verwende den AmazonS3Client in einer Android-App mithilfe einer getObject-Anforderung, um ein Bild aus meinem Amazon S3-Bucket herunterzuladen.

Derzeit erhalte ich diese Ausnahme:

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

Obwohl ich das Objekt mit dem angegebenen Schlüssel in meinem S3-Bucket sehen kann.


1
Ich denke, dieser Fehler tritt normalerweise auf, wenn das Objekt / die Datei nicht im angegebenen Bucket vorhanden ist. Können Sie den Namen des Buckets, den Sie für Tippfehler verwenden, überprüfen und feststellen, ob es sich um denselben Bucket handelt, in dem Sie das Objekt / die Datei sehen? Dies ist mit Sicherheit kein Authentifizierungsfehler.
Shobhit Puri

23
Die Amazon-Dokumentation ist zum Kotzen, diese Frage kann nicht herabgestuft werden. Es ist verrückt, die S3-Programmierung herauszufinden.
Siddharth

Derzeit befindet sich Index.html unter keinem Ordner. Die Berechtigungen für AWS S3-Buckets werden gemäß der AWS-Dokumentation nicht wahrgenommen.

1
Mir gefällt, wie es ein Dutzend verschiedene Antworten gibt und sie alle richtig sind.
Rob Osborne

Antworten:


47

Nun, dieser Fehler ist eigentlich ziemlich einfach. Es bedeutet einfach, dass Ihre Datei nicht im S3-Bucket vorhanden ist. Mehrere Dinge könnten falsch sein:

  1. Möglicherweise versuchen Sie, auf die falsche Datei zu verweisen. Überprüfen Sie den Pfad, den Sie abrufen wollten.

  2. Wann immer die Datei hochgeladen wurde, muss sie fehlgeschlagen sein. Überprüfen Sie die Protokolle für Ihren S3Sync-Prozess, um festzustellen, ob Sie relevante Ausgaben finden können

Quelle


3
Links verfallen und machen Antworten nach einer Weile unbrauchbar. Sie sollten Informationen aus diesem Link extrahieren und diese Antwort aktualisieren, um vollständig zu sein. Fühlen Sie sich frei, Ihre Quelle zu teilen .. das ist in Ordnung ..
Siddharth

Vielen Dank, dies hilft so sauber und nützlich zu halten.
Siddharth

1
Ich bin auf dieses Problem mit einer React-App gestoßen, die ihr eigenes Routing verwaltet. Meine Lösung bestand darin, beide rootund errorsdieselbe index.htmlDatei umzuleiten . Auf diese Weise kann die Frontend-App als Sammelbegriff fungieren und für jedes URL-Schema einen Sinn ergeben.
Sambecker

26

Für mich existierte das Objekt definitiv und wurde korrekt hochgeladen, aber seine s3-URL warf immer noch den gleichen Fehler:

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

Ich fand heraus, dass der Grund darin lag, dass mein Dateiname ein #Symbol enthielt , und ich denke, dass bestimmte Zeichen oder Symbole ebenfalls diesen Fehler verursachen.

Das Entfernen dieses Zeichens und das Generieren der neuen s3-URL hat mein Problem behoben.


Gleiches Problem hier. Der beleidigende Charakter war eine Klammer: (
Johann

Ich habe das gleiche Problem und mein Dateiname lautet "abcd.jar". Ist die Download-Funktionserweiterung auch spezifisch?
Rahul Munjal

@RahulMunjal Ich bin mir bei Dateierweiterungen nicht sicher. Versuchen Sie vielleicht, sie in einen ZIP-Ordner zu legen. und sehen, ob das funktioniert. Überprüfen Sie außerdem, ob die Berechtigungen für Ihre Datei korrekt sind (z. B. "Nur-Lese" -Zugriff für die Gruppe "Alle Benutzer").
TrieuNomad

In ähnlicher Weise musste ich encodeURIComponent für den Schlüssel verwenden, damit s3 ihn findet. Der Dateiname wurde bereits verschlüsselt, was meiner Meinung nach der Grund dafür ist, dass er nicht funktioniert hat.
Sean

Ich hatte das gleiche Problem. Ich hatte das '@' Symbol für Unterordner / Präfix in S3. Durch Entfernen dieses Symbols wurde dieser Fehler behoben.
Anil Konsal

11

Beachten Sie, dass dies auch dann passieren kann, wenn der Dateipfad aufgrund des eventuellen Konsistenzmodells von s3 korrekt ist . Grundsätzlich kann es zu einer gewissen Latenz kommen, wenn ein Objekt nach dem Schreiben gelesen werden kann. Weitere Informationen finden Sie in dieser Dokumentation .


War auch mein Problem. Jetzt habe ich für kurze Zeit einen automatischen Wiederholungsversuch implementiert.
moritz.vieli

2

In meinem Fall trat der Fehler auf, weil ich den gesamten Ordner mit den Website-Dateien in den Container hochgeladen hatte.

Ich habe es gelöst, indem ich alle Dateien außerhalb des Ordners direkt in den Container verschoben habe.


2

In meinem Fall lag es daran, dass der Dateiname Leerzeichen enthielt. Es wurde dank dieser Dokumentation gelöst (die nichts mit dem Problem zu tun hat):

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

Sie müssen auch urllib als Layer mit der entsprechenden Version hochladen (wenn Ihr Lambda Python 3.7 ist, müssen Sie urllib in einer Python 3.7-Umgebung packen).

Der Grund ist, dass AWS '' in '+' umwandelt (warum ...), was wirklich problematisch ist ...


0

Der Grund für das Problem ist falsch oder ein Tippfehler im Bucket / Key-Namen. Überprüfen Sie, ob der von Ihnen angegebene Bucket- oder Schlüsselname vorhanden ist.


0

Vergessen Sie nicht, dass Eimer regionenspezifisch sind. Das könnte ein Problem sein.

Versuchen Sie auch, mit der S3-Konsole zum eigentlichen Objekt zu navigieren, und klicken Copy PathSie dann auf , um Folgendes zu erhalten:

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

Solange was auch immer Sie es an Parses weitergeben, finde ich, dass dies das Sicherste ist.


0

Schritt 1: Holen Sie sich die neuesten 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>

Schritt 2: Die richtigen Importe

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;

Wenn Sie sicher , dass der Eimer vorhanden sind, Specified key does not exists errorwürde bedeuten , die bucketname nicht ist Dinkel richtig (enthält Slash oder Sonderzeichen). Informationen zur Namenskonvention finden Sie in der Dokumentation .

Das Dokument zitiert:

Wenn das angeforderte Objekt im Bucket verfügbar ist und Benutzer weiterhin den 404 NoSuchKey-Fehler von Amazon S3 erhalten, überprüfen Sie Folgendes:

Stellen Sie sicher, dass die Anforderung genau mit dem Objektnamen übereinstimmt, einschließlich der Großschreibung des Objektnamens. Bei Anforderungen für S3-Objekte wird zwischen Groß- und Kleinschreibung unterschieden. Wenn beispielsweise ein Objekt den Namen myimage.jpg trägt, Myimage.jpg jedoch angefordert wird, erhält der Anforderer einen 404 NoSuchKey-Fehler. Stellen Sie sicher, dass der angeforderte Pfad mit dem Pfad zum Objekt übereinstimmt. Wenn der Pfad zu einem Objekt beispielsweise awsexamplebucket / Downloads / February / Images / image.jpg lautet, der angeforderte Pfad jedoch awsexamplebucket / Downloads / February / image.jpg lautet, erhält der Anforderer einen 404 NoSuchKey-Fehler. Wenn der Pfad zum Objekt Leerzeichen enthält, stellen Sie sicher, dass die Anforderung die richtige Syntax verwendet, um den Pfad zu erkennen. Wenn Sie beispielsweise die AWS-CLI zum Herunterladen eines Objekts auf Ihren Windows-Computer verwenden, müssen Sie den Objektpfad in Anführungszeichen setzen, ähnlich wie: aws s3 cp "s3: // awsexamplebucket / Sicherungskopiejob 4 / 3T000000.vbk". Optional können Sie die Serverzugriffsprotokollierung aktivieren, um Anforderungsdatensätze detaillierter auf Probleme zu überprüfen, die möglicherweise den 404-Fehler verursachen.

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

Ich bin auch auf dieses Problem gestoßen, aber in meinem Fall habe ich beim Erstellen des Zielschlüssels versehentlich den internen Status meines Quellobjektschlüssels geändert:

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

Ich bin neu bei Ruby und habe vermisst, dass sub!es Nebenwirkungen hat und substattdessen hätte verwendet werden sollen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.