포스트

2023-11-07-TIL

2023-11-07-TIL

Today I Learned

AWS File Upload Architecture

AWS에서 파일 업로드 API를 만드는 방법을 모아 봤다. 먼저 S3 자체의 업로드 방식이 두 가지다. S3 사용자 가이드 기준으로 PUT 한 번에 올릴 수 있는 객체는 최대 5GB이고, 그보다 큰 객체는 멀티파트 업로드로 올린다. 멀티파트 업로드는 객체를 여러 파트로 나눠 순서와 상관없이, 병렬로 올릴 수 있어서 큰 파일의 업로드 속도와 실패 시 재시도 비용이 좋아진다.

그 위에 API를 얹는 패턴은 AWS Compute 블로그가 세 가지로 정리한다.

패턴방식고려할 점
API Gateway 직접 프록시API Gateway가 S3 통합으로 요청을 그대로 S3에 넘김추가 인프라가 없지만 API Gateway의 10MB 페이로드 제한을 받음
API Gateway + pre-signed URLAPI는 URL 발급만 하고, 클라이언트가 S3에 직접 업로드크기 제한을 피하지만 클라이언트가 요청을 두 번 보내야 함
CloudFront + Lambda@EdgeCDN 엣지에서 요청을 받아 인증 후 S3로 전달엣지 위치를 통해 업로드

서버를 거치지 않는 두 번째 패턴이 가장 흔하다. 업로드가 끝나면 S3 이벤트로 Lambda를 실행해 후처리를 하는 식으로 서버리스 구성과 잘 맞는다. 아래 링크 중 Serverless Framework와 Lambda를 쓰는 글들이 이 조합의 예제다.

  • https://medium.com/cyberark-engineering/making-the-right-choice-when-uploading-files-to-amazon-s3-547ced7012a
  • https://moduscreate.com/blog/upload-files-to-aws-s3-using-a-serverless-framework/
  • https://www.pluralsight.com/resources/blog/cloud/how-to-add-file-upload-features-to-your-website-with-aws-lambda-and-s3
  • https://medium.com/the-smyth-group/scalable-user-uploads-with-amazon-s3-9f523c049543
  • https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html
  • https://aws.amazon.com/ko/blogs/compute/uploading-to-amazon-s3-directly-from-a-web-or-mobile-application/
  • https://aws.amazon.com/ko/blogs/compute/patterns-for-building-an-api-to-upload-files-to-amazon-s3/
  • https://aws.amazon.com/ko/blogs/architecture/building-a-cloud-native-file-transfer-platform-using-aws-transfer-family-workflows/
  • https://www.youtube.com/watch?v=20hKv0Jlzk0
  • https://www.linkedin.com/pulse/uploading-large-files-aws-s3-lightning-fast-speed-parallel-asif
  • https://www.youtube.com/watch?v=QNPoXR-gPm0
  • https://www.youtube.com/watch?v=mw_-0iCVpUc
  • https://aws.amazon.com/ko/architecture/
  • https://moduscreate.com/blog/upload-files-to-aws-s3-using-a-serverless-framework/

AWS Pre-signed URL File Upload

pre-signed URL로 업로드하는 흐름은 이렇다.

  1. 클라이언트가 애플리케이션 API에 업로드할 파일 정보(이름, 형식)를 보내며 URL을 요청한다.
  2. 서버(또는 Lambda)가 권한을 확인하고, 버킷, 객체 키, HTTP 메서드(PUT), 만료 시간을 넣어 서명된 URL을 만든다.
  3. 클라이언트가 그 URL로 S3에 파일을 직접 PUT한다.

S3 문서대로 이 URL을 가진 사람은 AWS 자격 증명 없이도 그 객체를 올릴 수 있다. 그래서 키를 서버가 정하고, 만료 시간을 짧게 두는 것이 기본이다. 링크 중 faun.pub 글은 URL을 만들 때 Content-Type을 지정해 특정 형식의 파일만 올리게 하는 방법을 다룬다.

  • https://www.youtube.com/watch?v=co4iQUgT2ZY
  • https://www.youtube.com/watch?v=1D9ggTJ9Ejc
  • https://faun.pub/generating-s3-pre-signed-url-to-upload-file-with-specific-content-type-2c2563594a29
  • https://www.serverless.com/blog/s3-one-time-signed-url/
  • https://levelup.gitconnected.com/use-presigned-url-to-upload-files-into-aws-s3-db6b7a8c2cc9
  • https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsPresignedUrlUploadObject.html
  • https://allardqjy.medium.com/using-pre-signed-urls-to-upload-files-to-amazon-s3-from-reactjs-5b15c94b66df
  • https://www.linkedin.com/pulse/s3-security-uploading-objects-using-pre-signed-urls-technologies
  • https://stackoverflow.com/questions/63040308/is-it-possible-to-generate-a-single-presigned-url-which-can-allow-multiple-uniqu
  • https://raffaeu.medium.com/generate-an-amazon-s3-pre-signed-url-with-aws-lambda-and-amazon-api-gateway-4ffbea99207d
  • https://sanderknape.com/2017/08/using-pre-signed-urls-upload-file-private-s3-bucket/
  • https://mygumi.tistory.com/380
  • https://www.youtube.com/watch?v=wbNyipJw9rI
  • https://medium.com/@aidan.hallett/securing-aws-s3-uploads-using-presigned-urls-aa821c13ae8d
  • https://www.youtube.com/watch?v=v2yJLMltX1Y

Pre-signed URL

S3의 pre-signed URL 문서에 정리된 성질 중 설계에 영향을 주는 것들이다.

  • URL은 그것을 만든 IAM 주체의 자격 증명으로 동작한다. 만든 사람에게 해당 작업 권한이 없으면 URL도 실패한다.
  • 만료 시간은 콘솔에서 만들면 1분에서 12시간, CLI나 SDK로 만들면 최대 7일이다. 임시 자격 증명으로 만들었다면 그 자격 증명이 만료될 때 URL도 함께 만료된다.
  • 만료 전까지는 같은 URL을 여러 번 쓸 수 있다.
  • 업로드 URL의 키에 이미 객체가 있으면 업로드한 객체로 덮어쓴다.

세 번째 성질 때문에 “한 번만 쓸 수 있는 URL”이 필요하면 별도 장치가 있어야 한다. Serverless 블로그의 one-time URL 글은 발급한 URL의 해시를 유효 토큰으로 저장해 두고, CloudFront 앞단의 Lambda@Edge가 업로드 요청마다 해시가 유효하고 아직 쓰이지 않았는지 확인한 뒤 사용 처리하는 방식으로 재사용을 막는다. 네 번째 성질 때문에 객체 키는 UUID처럼 충돌하지 않는 값으로 서버가 정하는 편이 안전하다.

  • https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html
  • https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html
  • https://negabaro.github.io/archive/S3-Presigned-URL
  • https://medium.com/@laardee/uploading-objects-to-s3-using-one-time-presigned-urls-4374943f0801
  • https://velog.io/@seeh_h/AWS-S3-presignedURL%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-image-Upload-%ED%95%98%EA%B8%B0-qvqo81gk
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다