본문 바로가기

카테고리 없음

AWS s3 presigned url 도입하는 과정에서 생긴 문제

Presigned Url 을 사용하게 된 계기

기존에 s3 에 파일 업로드하던 구조는 다음과 같음
1. client 가 server 에게 파일 객체 전송
2. server 는 받은 파일 객체를 s3 에 업로드
 

 이번에 새로 개발하는 기능은
특정 페이지에서 한 번에 100개 이상의 파일을 업로드를 할 수 있어야 했음

기존 방식으로 진행할 경우, 100개의 파일을 client 에서 server 로, server 에서 s3 로 전송해야 하기 때문에
서버에 상당한 부하가 걸릴 수 있을 것 같아서
그에 대한 해결책으로 presigned url 을 적용하게 됨
 
 
 
 

Challenge (찾아온 고비)

로컬 컴퓨터에서 내 AWS 계정의 자격증명 (= s3 full access 권한 있음) 을 사용해
presigned url 을 발급 받고 그 url 에 파일 업로드 할 때  스무~스하게 잘만 됐는데,
 
aws 환경에 서버 배포하고 그 서버에서 presigned url 발급받아 파일을 업로드하려니 오류가 발생함 -_-..
 
 

(나 빨리하고 퇵은해야한단 말이다. 대충 얼른 되라고!!!!!!!)

 
 
 

아래는 에러 메세지임

에러 코드에 InvalidAccessKeyId 라고 되어 있는데
처음 추측했던건 aws 서버 인스턴스에 presigend url 생성 권한이 없나보다? 했음
하지만 알아본 결과, 해당 인스턴스에 presigend url
생성 권한은 있었음.. (추측실패...)
 
 
 
 
 

문제 원인

그러다 개발자분의 도움으로 AWS STS 문서에서 ASIA 로 시작하는 access key 에 대한 설명을 발견함

https://docs.aws.amazon.com/STS/latest/APIReference/API_GetAccessKeyInfo.html

 
즉, AWS STS를 통해 발급된 임시 자격 증명은 ASIA로 시작하는 Access Key ID를 가지며
이러한 임시 자격 증명은 일반적으로 짧은 시간 동안 유효하며 그 기간이 지나면 만료된다는 것임
위 오류 캡쳐를 보면 Access Key ID 가 ASIA... 로 시작하는 것을 볼 수 있음
 
 
 
현재 우리 서버는 ECS 를 이용하고 있는데
조사 결과, IAM Role 을 통해 ECS 컨테이너에 임시 자격 증명을 제공하고 있는 상황이었음
 
결론적으로 ECS 에서 임시 자격 증명을 사용해서 presigned url 생성은 정상적으로 했지만,
클라이언트가 해당 presigned url 을 통해 파일 업로드하려는 시점에는
임시 자격 증명이 만료되어서 오류가 발생한 것으로 보임
 
 
 
 

해결 방법

새로운 IAM User (*IAM Role 말고 User임) 를 생성해서 presigned url 생성 권한을 부여하고
이 IAM User 의 access key, access secret 값을 서버 환경 변수 파일(.env)에 설정함
그리고 presigned url 생성 코드에서는 이 IAM User 자격 증명을 사용해서 생성하도록 변경함
 
이렇게 한 이유는
IAM User 는 영구 자격 증명을 가질 수 있기 때문에 임시 자격 증명 만료 문제를 방지할 수 있음
물론 그렇다고 해서 presigend url 에 천년 만년 업로드할 수 있는건 아님!
보안을 위해 presigned url 생성할 때, 최대 10분 동안만 업로드 가능하게 제한 걸어 놓았기 때문