Excepción de Amazon S3: "La clave especificada no existe"

85

Estoy usando AmazonS3Client en una aplicación de Android usando una solicitud getObject para descargar una imagen de mi bucket de Amazon S3.

Actualmente, recibo esta excepción:

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

Aunque puedo ver el objeto con la clave especificada en mi bucket de S3.

usuario4592690
fuente
1
Creo que este error suele ocurrir cuando el objeto / archivo no existe en el depósito especificado. ¿Puede verificar el nombre del depósito que está utilizando para detectar errores de ortografía y si es el mismo depósito donde ve el objeto / archivo? Esto no es un error de autenticación con seguridad.
Shobhit Puri
30
La documentación de Amazon apesta, esta pregunta no se puede rechazar. Es una locura descubrir la programación de S3.
Siddharth
En este momento, Index.html no se encuentra debajo de ninguna carpeta. Los permisos de los buckets de AWS S3 no se perciben como dice la documentación de AWS.
1
Me gusta cómo hay una docena de respuestas diferentes y todas son correctas.
Rob Osborne

Respuestas:

48

Bueno, este error es bastante sencillo. simplemente significa que su archivo no existe dentro del bucket de S3. Varias cosas pueden estar mal:

  1. Podría estar intentando hacer referencia al archivo incorrecto. Vuelva a verificar la ruta que intentó recuperar.

  2. Siempre que se cargó el archivo, debe haber fallado. Consulte los registros de su proceso S3Sync para ver si puede encontrar algún resultado relevante

Fuente

Fahim
fuente
3
los enlaces caducan y las respuestas son inútiles después de un tiempo, debe extraer información de ese enlace y actualizar esta respuesta para que esté completa. siéntase libre de compartir su fuente .. está bien ..
Siddharth
Gracias, esto ayuda a mantener TAN limpio y útil.
Siddharth
1
Me encontré con este problema con una aplicación React que maneja su propio enrutamiento. Mi solución terminó siendo redirigir ambos rooty errorsal mismo index.htmlarchivo. De esa manera, la aplicación de interfaz puede actuar como un truco y dar sentido a cualquier esquema de URL.
sambecker
26

Para mí, el objeto definitivamente existía y se cargó correctamente, sin embargo, su URL s3 aún arrojaba el mismo error:

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

Descubrí que la razón era porque mi nombre de archivo contenía un #símbolo, y supongo que ciertos caracteres o símbolos también causarán este error.

Eliminar este carácter y generar la nueva URL s3 resolvió mi problema.

TrieuNomad
fuente
El mismo problema aquí. El personaje ofensivo era un paréntesis: (
Johann
Estoy enfrentando el mismo problema y mi nombre de archivo es "abcd.jar". ¿La extensión de la función de descarga también es específica?
Rahul Munjal
@RahulMunjal No estoy muy seguro acerca de las extensiones de archivo, ¿tal vez intente ponerlo en una carpeta .zip? y ver si funciona. Además, verifique que los permisos para su archivo sean correctos (por ejemplo, acceso de "solo lectura" para el grupo Todos los usuarios).
TrieuNomad
De manera similar, tuve que usar encodeURIComponent en la clave para que s3 lo encontrara. El nombre del archivo ya estaba codificado, lo que creo que es la razón por la que no funcionaba.
Sean
Tuve el mismo problema. Tenía el símbolo '@' para la subcarpeta / prefijo en S3. eliminar ese símbolo eliminó ese error.
Anil Konsal
12

Tenga en cuenta que esto puede suceder incluso si la ruta del archivo es correcta debido al eventual modelo de coherencia de s3 . Básicamente, puede haber cierta latencia para poder leer un objeto después de que está escrito. Consulte esta documentación para obtener más información.

Nick Resnick
fuente
También fue mi problema. Ahora implementé un reintento automático por un corto tiempo.
moritz.vieli
3

En mi caso, fue porque el nombre del archivo contenía espacios. Solucionado gracias a esta documentación (que no está relacionada con el problema):

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

También debe cargar urllib como una capa con la versión correspondiente (si su lambda es Python 3.7, debe empaquetar urllib en un entorno de python 3.7).

La razón es que AWS transforma '' en '+' (por qué ...) lo cual es realmente problemático ...

Antonin GAVREL
fuente
2

En mi caso, el error aparecía porque había cargado toda la carpeta, que contenía los archivos del sitio web, en el contenedor.

Lo resolví moviendo todos los archivos fuera de la carpeta, directamente al contenedor.

Darush
fuente
1

No olvide que los depósitos son específicos de la región. Eso podría ser un problema.

También intente usar la consola S3 para navegar hasta el objeto real, y luego haga clic en Copy Path, obtendrá algo como:

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

Siempre y cuando lo que sea que le esté pasando a analizar correctamente, creo que es lo más seguro que puede hacer.

P Burke
fuente
0

El motivo del problema es incorrecto o error tipográfico en el nombre del depósito / clave. Verifique si el nombre del depósito o de la clave que está proporcionando existe.

Gaurav Sharma
fuente
0

Paso 1: obtenga lo último 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>

Paso 2: las importaciones correctas

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;

Si está seguro de que el depósito existe, Specified key does not exists errorsignificaría que el nombre del depósito no está escrito correctamente (contiene una barra diagonal o caracteres especiales). Consulte la documentación para conocer la convención de nomenclatura.

El documento cita:

Si el objeto solicitado está disponible en el depósito y los usuarios siguen recibiendo el error 404 NoSuchKey de Amazon S3, verifique lo siguiente:

Confirme que la solicitud coincide exactamente con el nombre del objeto, incluida la capitalización del nombre del objeto. Las solicitudes de objetos S3 distinguen entre mayúsculas y minúsculas. Por ejemplo, si un objeto se llama myimage.jpg, pero se solicita Myimage.jpg, el solicitante recibe un error 404 NoSuchKey. Confirme que la ruta solicitada coincide con la ruta al objeto. Por ejemplo, si la ruta a un objeto es awsexamplebucket / Downloads / February / Images / image.jpg, pero la ruta solicitada es awsexamplebucket / Downloads / February / image.jpg, el solicitante recibe un error 404 NoSuchKey. Si la ruta al objeto contiene espacios, asegúrese de que la solicitud utilice la sintaxis correcta para reconocer la ruta. Por ejemplo, si está utilizando la AWS CLI para descargar un objeto en su máquina Windows, debe usar comillas alrededor de la ruta del objeto, similar a: aws s3 cp "s3: // awsexamplebucket / Trabajo de copia de respaldo 4 / 3T000000.vbk". Opcionalmente, puede habilitar el registro de acceso al servidor para revisar los registros de solicitudes con más detalle en busca de problemas que puedan estar causando el error 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());
ForeverLearner
fuente
0

También me encontré con este problema, pero en mi caso, sin darme cuenta, estaba cambiando el estado interno de mi clave de objeto de origen al construir la clave de destino:

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

Soy nuevo en Ruby y me perdí que sub!tiene efectos secundarios y subdebería haber sido usado en su lugar.

ask417
fuente