DEV-STUDY/Infra

[트러블슈팅] AWS S3 : NoSuchKey 이슈

HwangJerry 2023. 11. 26. 10:13

사이드 프로젝트(송곳매)를 진행하던 중, 정적 페이지 호스팅을 위해 s3를 활용하였는데, 호스팅 이후에 no such key라는 이슈가 발생하였다.

 

문제 상황

문제를 재현해보면 다음과 같다.

나는 index.html을 요청하기 위해 루트 도메인 주소(www.songgotmae.com)를 호출하였는데, 아래와 같은 페이지가 뜨며 에러가 발생하였다.

 

문제 원인

기본적으로 S3는 파일을 key-value 형식으로 저장한다. 여기서 key는 파일 이름, 그리고 value는 파일 객체를 의미한다.

 

따라서 no such key라는 것은, 요청한 url에 해당하는 파일을 찾을 수 없다는 것을 의미한다.

 

s3 호스팅 설정을 보면, main.html을 index 페이지로 제공할 수 있도록 설정해 두었는데, (당연하지만) 기본적으로 파일이 s3 내에 있는 경로와 함께 설정해줘야 한다. 위의 경우에는 root 경로에 main.html이 있지 않으면 에러가 발생할 수 있는 형태이다.

 

내 상황의 경우에는 templates/main.html 구조로 파일이 저장되어 있었다. 따라서 main.html만 써서는 s3에서 파일을 찾을 수 없던 것이다.

 

문제 해결

main.html을 templates에서 빼내어 root 경로에 두면 된다.

 

매우 직관적인 방법으로, root 경로에 index.html 파일을 두는 방법이다. 그리고 연결된 페이지들은 main.html에 상대 경로를 설정해주면 된다.

 

 

인덱스 문서 설정에 파일 경로까지 선언해주는 방법을 시도해봤다.

 

경로를 명시해주기 위해 templates/main.html로 선언했는데 인식할 수 없다는 The IndexDocument Suffix is not well formed 에러가 떠서 "엥, 경로 설정을 못하는건가?"라고 생각했었다. 그래서 templates\main.html로 선언하니까 에러는 사라졌다. 

 

즉, \를 이용하여서는 인식을 하긴 한다는 건데, 막상 접근을 하면 경로는 / 로 나타내지 않으면 인식하지 못한다. 즉, templates\main.html이라고 선언해주면 에러만 발생하지 않는다 뿐이지, s3 내부에서도 이를 객체 경로로써 이해하지 않는다. 딱 \ 는 이스케이프 문자로써만 존재하는 걸로 추정된다.

 

결론

참... 풀고 나니 별것 아닌 에러인데, 처음에는 "404...? 파일이 있고, 파일 이름도 알려줬는데 왜 404지?" 하면서 시간을 좀 쓴 것 같다. aws s3가 동작하는 원리를 조금만 생각하면 알 수 있는 문제였어서 다행이다.