글로벌 사진 사이트 구축하기

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

지금까지 각 AWS 리소스들의 사용 방법을 알아보았습니다. 이번 장부터는 실전과 유사한 사례를 설명하고, AWS 리소스들을 조합하여 직접 구축해보겠습니다. 글로벌 사진 사이트는 인스타그램, 트윗픽과 같은 서비스를 떠올리면 이해하기 쉽습니다. 그리고 의류 쇼핑몰도 이미지를 많이 사용하므로 성격이 비슷합니다. 좀더 응용하면 사진 사이트 구성에 장바구니와 결제 기능을 붙이면 쇼핑몰이 됩니다.

글로벌 사진 사이트를 구축하라면 어떻게 해야 할까요? 사용할 AWS 리소스를 선택하기 전에 구축하려는 서비스의 요구사항을 먼저 파악해야 합니다.

글로벌 사진 사이트의 요구사항을 정리해보면 다음과 같습니다.

  • 대용량의 이미지 파일을 저장해야 한다.
  • 전 세계 어디서나 사이트 및 이미지를 보여주는 속도가 빨라야 한다.
  • 원본 사진의 크기를 웹사이트에 맞게 조절해야 한다(요즘 사진들은 해상도가 매우 높으므로).
  • 사용자가 늘어났을 때 대비할 수 있어야 한다.

이제 요구사항에 맞게 사용할 AWS 리소스와 서비스 구조를 설계해보겠습니다.

  • 대용량의 이미지를 저장해야 하니 S3가 적합합니다. 표 31-1처럼 EBS에 저장하는 것은 비효율적이고 비용이 많이 듭니다.
  • 전 세계에 빠르게 사이트와 이미지를 배포해야 하니 CloudFront가 적합합니다.
  • 원본 사진의 크기를 조절할 때는 EC2를 사용해야 합니다. 하지만 이미지 변환을 웹 서버에서 처리한다면 웹사이트 반응 속도에 영향을 미칩니다. 따라서 변환할 이미지 목록을 SQS에 메시지로 보낸 뒤 변환 전용 EC2 인스턴스에서 처리하면 됩니다.
  • EC2에 웹 서버를 구축하고, 데이터는 RDS에 저장합니다. 사용자가 증가했을 때는 ELB와 Auto Scaling으로 대응하면 되고, RDS의 DB 인스턴스 클래스를 높이고 용량을 늘리면 됩니다.
  • 도메인 처리는 Route 53를 사용합니다.
  • 사이트의 소스(HTML, JavaScript) 파일은 S3에 저장하겠습니다(GitHub, Bitbucket이나 자체 구축한 버전 관리 시스템 서버를 사용해도 됩니다).
  EBS General Purpose SSD EBS Magnetic S3 Standard S3 Reduced Redundancy
100GB $12 $8 $3.3 $2.64
1TB $120 $80 $33 $26.4
10TB $1,200 $800 $324 $259

표 31-1 Tokyo 리전에서 EBS, S3 100GB당 한달 요금

EBS는 EC2를 통해 데이터를 전송하고, S3은 직접 전송한다고 했을 때 데이터 전송 요금은 동일합니다.


그림 31-1 글로벌 사진 웹사이트 구성도

저는 프로젝트 이름은 ExamplePhoto로 하고, 코드양을 줄이기 위해 Node.js에 JavaScript로 구현하겠습니다. 실무에서는 각자 상황에 맞게 원하는 언어와 플랫폼을 사용하면 됩니다.

이제 ExamplePhoto 서비스의 동작 흐름입니다.

  1. examplephoto.com에 이미지 파일(사진)을 올립니다.
  2. 웹 서버 EC2 인스턴스는 이미지 파일을 S3 버킷에 저장하고, 이미지 파일명을 SQS 메시지로 보냅니다. 그리고 이미지 파일 정보를 RDS 데이터베이스에 저장합니다.
  3. 이미지 변환 EC2 인스턴스에서는 SQS에서 메시지를 받은 뒤 이미지 파일의 해상도를 줄입니다. 그리고 해상도를 줄인 이미지 파일을 S3 버킷에 저장하고, SQS 메시지를 삭제합니다.
  4. 웹 서버에서는 RDS 데이터베이스에서 이미지 파일 목록을 가져와서 보여줍니다.

예제 소스 코드는 저의 GitHub 저장소에서 받을 수 있습니다.
https://github.com/pyrasis/awsbook


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.