Global 빠른 사진 업로드

Heehong Moon
bgpworks
Published in
3 min readJan 14, 2018

웹서비스 또는 앱 서비스를 만들면 공통적으로 구현되야 하는것 중 하나가 사진 upload & serving이다.

가장 심플한 방법

가장 간단한 방법은 사진 업로드를 받아서 S3에 저장하고, Cloudfront(CDN)을 붙여서 serving하는 것이다. 이 방법은 하나의 국가만을 대상으로 서비스 할때는 적당히 괜찮은 방법이라고 볼 수 있다. S3의 region을 해당 국가로 설정하고, 업로드를 받을 서버를 같은 region에 두면 되기 때문이다. 하지만 이 방법은 글로벌 서비스에는 적합하지 않다. 왜냐하면 S3가 하나의 region에 속해 있기 때문에 지구 반대편에 있는 곳에서는 업로드하는데 오래 걸린다.

S3 Transfer Acceleration

S3가 하나의 region에만 속하기 때문에 발생하는 문제인데, 이를 간단하게 해결하는 방법으로 Transfer Acceleration이라는 기능이 있다. 이 기능은 S3의 bucket속성에서 켤수 있는데, 켜게 되면 일반적인 region이 들어간 S3주소가 아니라 bucketname.s3-accelerate.amazonaws.com 이런 주소로 업로드 하게 된다. 그러면 다른 region에서 업로드 하더라도 좀 더 빠르게 업로드 된다. 어쨋든 이 기능을 사용하려면, client에서 S3에 직접 올리는 방법을 사용하거나 여러 region에 서버를 올려두고 이미지 업로드를 받아야 한다.

Region마다 deploy

어짜피 여러 region에 서버를 둘거라면 S3 bucket을 각각 region에 맞게 만드는 방법이 있다. 이렇게 되면 세계 어디에서도 가장 빠른 속도로 업로드가 가능하지만, 각각의 S3 bucket에 Cloudfront를 따로 붙여 줘야 한다.

  • ap-northeast-2 : web server, S3, cloudfront
  • us-east-1 : web server, S3, cloudfront
  • ….

이런식으로 region별로 web server, S3, cloudfront 3가지의 서비스를 벌로 생성하고 관리 해야 한다. 서버 관리적인 이슈를 봤을때 S3, cloudfront는 만들어두면 되고, 웹서버 관리가 복잡해진다고 볼 수 있다. 그리고 업로드 서버의 endpoint가 region별로 생기기 때문에 client에서 어디 서버가 가장 빠른지 결정해서 업로드 해야 한다.

Route53

route53에는 latency 기반 routing을 지원한다. DNS에서 가장 latency가 낮은 서버의 ip로 결과를 주는 기능인데, 이를 사용하면 하나의 domain에서 가장 빠른 서버로 접속하게 해준다.

Lambda & API Gateway

웹서버를 lambda 를 사용해서 올려두면 여러 region에 쉽게 deploy할 수 있다. 그리고 region별 API endpoint는 API Gateway서비스를 이용해서 만들 수 있다.

얼마전까지는 API Gateway의 custom domain에 Edge optimized 만 되어서 도메인을 하나만 등록 가능했다. 다른 말로 하면 여러 Route53의 latency routing을 사용할 수 없었는데, 최근에 Regional Endpoint를 지원하면서 latency routing이 가능하다.

결론적으로

Lambda, API Gateway, S3, Cloudfront, Route53

위 서비스의 조합으로 세계 어디에서든 이미지 업로드 속도, 다운로드 속도가 빠른 서비스를 구현할 수 있다. 이게 구현이 되면 https://www.imgix.com/ 이런 서비스 처럼 이미지 manipulation도 쉽게 구현 가능하다.

--

--