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.
android
amazon-web-services
amazon-s3
user4592690
quelle
quelle
Antworten:
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:
Möglicherweise versuchen Sie, auf die falsche Datei zu verweisen. Überprüfen Sie den Pfad, den Sie abrufen wollten.
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
quelle
root
underrors
dieselbeindex.html
Datei umzuleiten . Auf diese Weise kann die Frontend-App als Sammelbegriff fungieren und für jedes URL-Schema einen Sinn ergeben.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.
quelle
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 .
quelle
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.
quelle
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 ...
quelle
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.
quelle
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 Path
Sie 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.
quelle
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 error
würde bedeuten , die bucketname nicht ist Dinkel richtig (enthält Slash oder Sonderzeichen). Informationen zur Namenskonvention finden Sie in der Dokumentation .Das Dokument zitiert:
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());
quelle
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 undsub
stattdessen hätte verwendet werden sollen.quelle