Skip to content

This is a simple serverless file store which has enough ability to share files but it doesn't have a feature to manage multiple acounts for simplicity.

Notifications You must be signed in to change notification settings

kyopark2014/simple-serverless-filestore

Repository files navigation

Simple Serverless File Store: AWS 서버리스로 간단한 파일 서버 구현하기

본 문서에서는 Serverless architecture 기반의 파일공유 서비스를 소개하고자 합니다. 서버리스 파일공유 서비스는 파일을 업로드 또는 다운로드 할때만 인프라 비용이 발생하며 경제적이며, 파일이 저장되는 스토리지인 S3는 1GB당 $0.023/월로 매우 경쟁력이 있는 가격 정책을 가지고 있을뿐 아니라, Lifecycle Rule을 정의하면 자동삭제하도록 설정이 가능합니다. 무엇보다 업로드 가능한 최대 파일 크기가 REST API를 사용할 경우에 5GB이어서, 일반적인 파일 공유 목적으로 유용하게 사용 할 수 있습니다.

전체적인 Serverless Architecture는 아래와 같습니다.

image

주요 사용 시나리오는 아래와 같습니다.

  1. 사용자가 업로드한 컨텐츠는 RESTful API를 통해 API Gateway를 통해 전송되는데 이때 보안을 위해 https를 이용해 전달됩니다. 이후, Lambda에 전달된 event에서 파일을 추출해서 S3에 저장하게 됩니다.

  2. 두번째 Lambda는 S3의 Put event notification을 받아서 trigger 되는데, CloudFront의 URL과 파일명을 가지고 파일 다운로드 URL 생성하여 SNS에 전달 합니다.

  3. SNS는 Lambda로 부터 전달된 SUBJECT와 URL을 포함한 Body를 email을 발송하게 됩니다. 수신자는 해당 URL을 별도 인증 절차 없이 사용 할 수 있으므로, 필요에 따라서 파일 공유등의 목적으로 활용 할 수 있습니다.

간단하게 구현하여 사용할 수 있도록, 멀티 Account를 고려하지 않고, 고정비용을 줄이기 위하여 데이터베이스도 사용하지 않습니다.

상세한 동작구성은 아래 Sequence Diagram을 참고 부탁드립니다.

image

문서 가독성을 위하여 아래와 같이 기능별 문서 파일에서 상세한 구현과 설정방법에 대해 설명 합니다.

1. Lambda-upload 구현

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/lambda-upload.md

2. S3 구현

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/S3.md

3. Lambda-notification 구현

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/lambda-notification.md

4. API Gateway 구현

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/api-gateway.md

5. SNS 구현

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/sns.md

6. CloudFront 구현

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/cloudfront.md

API Gateway 로그 설정

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/api-gateway-log.md

상기와 같이 Lambda, S3, API Gateway를 모두 적절히 설치한후 아래와 같이 테스트를 할 수 있습니다.

테스트 방법

curl 을 활용한 바이너리 업로드 테스트

[curl 명령어의 예]

$ curl -i https://viwb8crpob.execute-api.ap-northeast-2.amazonaws.com/dev/upload -X POST --data-binary '@sample1.jpeg' -H 'Content-Type: image/jpeg' -H 'Content-Disposition: form-data; name="sample1"; filename="sample1.jpeg"'

curl 실행 결과는 아래와 같습니다.

image

Postman을 이용한 이미지 업로드 테스트

Content-Type 및 Content-Disposition을 설정합니다.

image

Body에 “binary” 형태로 이미지 파일을 전송합니다.

image

Postman을 이용해 이미지 파일을 업로드시에 아래와 같이, 성공의 의미로 버켓이름, Key(파일이름), 컨텐츠 타입을 전달합니다.

image

본 과제에 필요한 Lambda upload와 notification 에 대한 코드 및 설명은 아래를 참조 바랍니다.

실행 결과

파일이 업로드가 되면 S3에 저장하고, 다운로드가 가능하도록 CloudFront의 주소를 SNS를 통해 사용자에게 이메일로 전달하게 됩니다. 아래와 같이 SNS에 등록한 이메일로 컨텐츠 URL이 전달되면, 자신의 컨텐츠 저장소로 쓰거나 필요시 공유용 저장소로 사용할 수 있습니다.

image

서버 삭제

해당 서버의 사용이 끝나서 삭제가 필요할때 아래 가이드를 참고합니다.

https://github.com/kyopark2014/simple-serverless-filestore/blob/main/docs/clean-up.md

Web Client 구현

Web에서 업로드 테스트를 위해 Web client을 구현하였습니다. 이때 CORS 설정이 필요합니다.

About

This is a simple serverless file store which has enough ability to share files but it doesn't have a feature to manage multiple acounts for simplicity.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages