파일을 업로드할때 s3로 곧바로 업로드하기

파일 저장소로 s3를 쓰는건 거스를수 없는 대세입니다. 아직도 안쓰고 계셨나요

 

비용도 저렴하고,

 

용량 가득 찰까봐 걱정할일도 없고,

 

cloudfront와 연결하여 전세계 어디든 빠른 속도로 리소스를 제공할수 있습니다

 

 

s3로 파일 업로드 어떻게 하고 계신가요

 

아마도 여러분의 어플리케이션 서버로 먼저 파일을 업로드하고,

 

aws sdk를 이용하여 어플리케이션 서버가 업로드된 파일을 s3로 다시 업로드하는 과정으로도 많이 구현하실거예요

 

업로드된 이미지의 썸네일을 만든다던가 그런코드도 있을수 있겠죠?

 

 

물론 이러한 방법을 사용하는것도 파일의 사용을 내가 직접 컨트롤한다는 점에서 좋습니다

 

그런데 업로드되는 파일의 크기가 크다면 여러모로 고민되는 부분들이 있습니다.

 

 

"용량이 큰파일을 s3로 곧바로 업로드하면 네트워크 비용을 좀 더 절감할수 있지 않을까?"

 

 

 

그리고 작은 파일은 상관이 없겠지만

 

큰 파일을 먼저 어플리케이션 서버에 업로드하고 그 어플리케이션 서버가 업로드된 파일을 다시 s3로 업로드한다면

 

실제로 걸리는 시간이 2배가 되겠죠?

 

(뭐 백그라운드에서 처리한다면 조금 더 효율적일수 있겠지만, s3로 다이렉트로 업로드하는것보다는 당연히 시간이 조금 더 걸리겠죠?)

 

 

aws는 미리 서명된 url(pre signed url)을 통해서 s3로 바로 업로드할수 있는 방법을 제공하고 있습니다

 

예제로 다양한 언어로 샘플 코드도 있습니다

 

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/PresignedUrlUploadObject.html

 

미리 서명된 URL을 사용하여 객체 업로드 - Amazon Simple Storage Service

유효한 보안 자격 증명을 가진 사용자는 누구나 미리 서명된 URL을 만들 수 있습니다. 단, 미리 서명된 URL에서 제공하려는 작업을 수행할 권한이 있는 사용자가 생성해야 이 URL을 통해 성공적으로 객체를 업로드할 수 있습니다.

docs.aws.amazon.com

 

aws sdk를 이용하여 먼저 presignedurl을 생성합니다.

 

그리고 그렇게 생성된 url로 파일을 PUT method를 사용하여 업로드하시면 됩니다

 

 

그런데 저는 모처럼 다시 이 세팅을 하다가 엄청난 시간을 소비하며 삽질을 했는데요

 

presignedurl을 생성할때 content-type을 명시할수 있는데,

 

여기서의 content-type이 계속 적용이 안되는 현상이 발생했습니다

 

video/mp4 타입으로 presigned url을 생성해서 업로드를 했는데

 

실제로 s3에 업로드된 파일을 클릭해 보면 video/mp4 타입으로 저장이 되어있지가 않더라구요

 

그래서 해당 리소스에 접근하면 content-type이 video/mp4가 아니라 재생이 되지 않고

 

곧바로 다운이 되더라고요

 

왜그럴까 한참을 삽질을 했는데

 

PUT메소드를 사용하여 파일을 업로드할때 content-type이 명시가 되어야하더라구요

 

content-type 이 명시되어있지 않아 원하는 content-type이 설정되지 않았던것이었어요



 

Tag : ,

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ··· | 1829 |