개요
presigned url 을 도입했음
기존에 s3 에 파일 업로드하던 구조는 다음과 같음
1. client 가 server 에게 파일 객체 전송
2. server 는 받은 파일 객체를 s3 에 업로드
이번에 새로 개발하는 기능은
특정 페이지에서 한 번에 100개 이상의 파일을 업로드를 할 수 있어야 했음
기존 방식으로 진행할 경우, 100개의 파일을 client 에서 server 로, server 에서 s3 로 전송해야 하기 때문에
서버에 상당한 부하가 걸릴 수 있을 것 같아서
그에 대한 해결책으로 presigned url 을 적용하게 됨
문제 발생
로컬 서버에서는 presigned url 테스트 잘 됐는데
클라우드(aws)에 배포된 서버 기준으로 테스트하니 오류 발생함
차이점이 있다면 aws credential 밖에 없었음..
로컬 서버: iam user 이용함
클라우드 서버: iam role 이용함
(참고로 둘 다 presigned url 업로드 권한은 다 부여한 상태라서 권한 부족 문제는 아님)
에러메세지는 아래와 같다.
문제 원인
AWS STS 문서에서 ASIA 로 시작하는 access key 에 대한 설명을 발견함
AWS STS를 통해 발급된 임시 자격 증명은 ASIA로 시작하는 Access Key ID를 가진다는 것
위에서 첨부했던 에러메세지 캡쳐를 보면 Access Key ID 가 ASIA... 로 시작하는 것을 볼 수 있음
우리 서버는 aws ecs 에서 기동되고 있고
그 ecs 는 iam role 을 이용하여 각종 aws 리소스에 접근하고 있음. 즉, 임시 자격 증명이라는 소리
결론적으로
1. 클라우드 서버에서 presigned url 생성
2. 클라이언트가 해당 url 에 파일 업로드 ➡️ 이 시점에 임시 자격 증명이 만료되어서 오류가 발생한 것으로 보임
해결 방법
1. 새로운 IAM User 생성 (*IAM Role 말고 IAM User임!!)
2. 위에서 생성한 credential 정보를 서버 환경 변수 파일(.env)에 설정
3. 위 credential 정보로 presigend url 생성
이렇게 한 이유는
IAM User 는 영구 자격 증명을 가질 수 있기 때문에 임시 자격 증명 만료 문제를 방지할 수 있기 때문.