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 URL | API는 URL 발급만 하고, 클라이언트가 S3에 직접 업로드 | 크기 제한을 피하지만 클라이언트가 요청을 두 번 보내야 함 |
| CloudFront + Lambda@Edge | CDN 엣지에서 요청을 받아 인증 후 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로 업로드하는 흐름은 이렇다.
- 클라이언트가 애플리케이션 API에 업로드할 파일 정보(이름, 형식)를 보내며 URL을 요청한다.
- 서버(또는 Lambda)가 권한을 확인하고, 버킷, 객체 키, HTTP 메서드(
PUT), 만료 시간을 넣어 서명된 URL을 만든다. - 클라이언트가 그 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
댓글
아직 댓글이 없습니다