Amazon S3 예외 : "지정된 키가 없습니다."


85

Amazon S3 버킷에서 이미지를 다운로드하기 위해 getObject 요청을 사용하여 Android 앱에서 AmazonS3Client를 사용하고 있습니다.

현재이 예외가 발생합니다.

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

내 S3 버킷에서 지정된 키가있는 객체를 볼 수 있지만.


1
이 오류는 일반적으로 지정된 버킷에 객체 / 파일이 없을 때 발생한다고 생각합니다. 오타로 사용중인 버킷의 이름과 객체 / 파일이 표시되는 버킷이 동일한 지 다시 확인할 수 있습니까? 이것은 확실히 인증 오류가 아닙니다.
Shobhit Puri 2015

30
아마존 문서는 형편 없지만이 질문은 반대 할 수 없습니다. S3 프로그래밍을 이해하는 것은 미친 짓입니다.
Siddharth 2015

현재 Index.html은 폴더 아래에 없습니다. AWS S3 버킷 권한은 AWS 설명서에 나와있는 것처럼 인식되지 않습니다.

1
나는 12 개의 다른 답이 있고 그것들이 모두 옳다는 것을 좋아합니다.
Rob Osborne

답변:


48

이 오류는 실제로 다소 간단합니다. 단순히 파일이 S3 버킷 내에 존재하지 않음을 의미합니다. 몇 가지 문제가있을 수 있습니다.

  1. 잘못된 파일을 참조하려고 할 수 있습니다. 검색하려는 경로를 다시 확인하십시오.

  2. 파일이 업로드 될 때마다 실패했을 것입니다. S3Sync 프로세스에 대한 로그를 확인하여 관련 출력을 찾을 수 있는지 확인하십시오.

출처


3
링크가 만료되어 잠시 후 답변이 쓸모 없게됩니다. 해당 링크에서 정보를 추출하고이 답변을 완전하게 업데이트해야합니다. 소스를 자유롭게 공유하십시오 .. 괜찮습니다 ..
Siddharth

감사합니다. 이것은 매우 깨끗하고 유용하게 유지하는 데 도움이됩니다.
싯다 르트 나라 얀

1
자체 라우팅을 처리하는 React 앱에서이 문제가 발생했습니다. 내 솔루션은 리디렉션 었죠 rooterrors동일하게 index.html파일. 이렇게하면 프론트 엔드 앱이 모든 것을 포괄하고 모든 URL 스키마를 이해할 수 있습니다.
sambecker

26

나를 위해 객체는 확실히 존재하고 올바르게 업로드되었지만 s3 URL은 여전히 ​​같은 오류를 던졌습니다.

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

그 이유는 내 파일 이름에 #기호가 포함되어 있기 때문이라는 것을 알았고 특정 문자 나 기호도이 오류를 일으킬 것 같습니다.

이 문자를 제거하고 새 s3 URL을 생성하면 문제가 해결되었습니다.


여기에도 같은 문제가 있습니다. (: 잘못된 문자는 브래킷이었다
요한

동일한 문제가 발생하고 파일 이름은 "abcd.jar"입니다. 다운로드 기능 확장도 특정합니까?
Rahul Munjal

@RahulMunjal 파일 확장자에 대해 잘 모르겠습니다. .zip 폴더에 넣어보십시오. 작동하는지 확인하십시오. 또한 파일에 대한 권한이 올바른지 다시 확인하십시오 (예 : 모든 사용자 그룹에 대한 "읽기 전용"액세스).
TrieuNomad

비슷한 맥락에서 키에 encodeURIComponent를 사용하여 s3를 찾아야했습니다. 파일 이름이 이미 인코딩 되었기 때문에 작동하지 않는 이유라고 생각합니다.
Sean

나는 같은 문제가 있었다. S3의 하위 폴더 / 접두사에 '@'기호가 있습니다. 해당 기호를 제거하면 해당 오류가 제거되었습니다.
Anil Konsal

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 인 경우 Python 3.7 환경에서 urllib를 패키징해야 함).

그 이유는 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 잘못되었음을 의미 합니다 (슬래시 또는 특수 문자 포함). 명명 규칙에 대한 설명서 를 참조하십시오 .

문서는 다음을 인용합니다.

요청 된 객체를 버킷에서 사용할 수 있고 사용자가 여전히 Amazon S3에서 404 NoSuchKey 오류를 수신하는 경우 다음을 확인하십시오.

요청이 개체 이름의 대문자를 포함하여 개체 이름과 정확히 일치하는지 확인합니다. 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 / Backup Copy Job 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

저는 Ruby를 처음 접했고 sub!부작용 sub이있어서 대신 사용해야 하는 것을 놓쳤습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.