본문 바로가기

Cloud/AWS

3-tier architecture on EC2, RDS (Vue.js+Node.js+MySQL)

 

본 글은 Vue.js, Node.js, MySQL 기반의 3-tier architecture를 AWS 상에 구축한 내용을 정리한 것입니다.

 

계정 분리 (Root / IAM User)

  • 적용: root 계정과 IAM user 계정을 분리하여 root 계정에서는 비용 현황을 모니터링하고, user 계정으로는 AWS 서비스를 기반으로 아키텍쳐를 구축하였습니다.
  • 설명: root 계정은 AWS 계정을 처음 생성할 때 사용하는 계정으로, 계정에 대한 모든 권한(결제 관리, 서비스 설정, 계정 폐쇄, 인증 관리)을 갖고있어 이 계정이 해킹되거나 악용될 시 전체 AWS 리소스가 위험에 처할 수 있습니다. 따라서 root 계졍과 IAM user 계정을 분리해 사용하는 것이 보안상 안전합니다.

망분리 (Public / Private)

  • 적용: 할당받은 VPC의 네트워크 대역을 쪼개어 8개의 서브넷을 만들고 public 서브넷의 라우팅테이블에만 IGW를 연결하였습니다.
  • 설명: 망을 public과 private으로 분리하는 것은 보안과 네트워크 효율을 위한 일반적인 아키텍쳐 설계 방식이며 public과 private으로 나뉘는 기준은 IGW를 통해 인터넷과 통신 가능여부입니다. public 서브넷에는 인터넷에 노출이 필요한 리소스가 배치되며 private 서브넷에는 외부 인터넷으로부터 보호되어야하는 리소스들이 배치됩니다.

[전형적인 public/private 라우팅 테이블]

- public 

대상경로(Destination) 대상(Target)
10.0.0.0/16 local
0.0.0.0/0 igw-xxxxxxxxx

 

- private

대상경로(Destination) 대상(Target)
10.0.0.0/16 local
0.0.0.0/0 nat-xxxxxxxxx

 

가용영역(AZ, Availability Zone)

  • 적용: 가용영역 a,b를 두고 각 가용영역에 1개의 public subnet과 3개의 private 서브넷 배치
  • 설명: 가용영역을 여러 개 두는 것은 서비스 고가용성과 내결함성 강화를 위한 설계 전략입니다. subnet을 각 AZ에 분산배치하고, 로드밸런서를 사용해 트래픽을 여러 AZ로 분산합니다.

NAT, ALB

  • 적용: public 서브넷에 배치, NAT를 사용해 private subnet의 아웃바운드 트래픽을 인터넷으로 전달하도록 하였으며 ALB를 통해 인바운드 인터넷 트래픽을 private 서브넷의 인스턴스들로 전달하도록, 즉 리버스 프록시로서 역할하도록 배치하였습니다.
  • 설명: private 서브넷은 IGW와 연결되어있지 않은 대신, 인바운드 트래픽은 ALB로 전달받고 아웃바운드 트래픽은 NAT로 내보냅니다.

WEB, WAS, DB

  • 적용: WEB, WAS, DB 모두 private 서브넷 상에 구축하였습니다. WEB, WAS는 EC2 상에 구축하고 DB는 MySQL RDS 매니지드 서비스를 사용하였습니다. 
  • 설명: 웹서버를 public subnet에 둘 수도 있지만, 보안성을 높이기 위해 private 서브넷에 두었습니다. public subnet에 존재하는 ALB를 통해 WEB이 리퀘스트를 전달받고, WAS와 DB가 데이터를 처리하여 다시 반환합니다.

Bastion Host

  • 적용: public 서브넷에 bastion host용 EC2 인스턴스를 두었습니다.
  • 설명: WEB, WAS, DB 등의 리소스가 private 서브넷 상에 구축되어있기 때문에 직접적인 접근이 어려워, 개발 시 public subnet에 bastion host를 두어 이를 통해 ssh 원격 접속을 통해 각 리소스를 관리할 수 있습니다. 이 때 ssh 접속을 위한 키 관리가 필요합니다. RDS의 경우 private 서브넷에 두더라도 퍼블릭 액세스 허용 설정을 통해 필요에 따라 직접적인 접근이 가능합니다. EC2의 경우에도 일시적으로 EIP를 할당해준다면 직접적인 접근이 가능합니다.

DNS, HTTPS

  • 적용: Route53에서 도메인을 구매 및 등록하였으며 Certificate Manager(ACM)에서 해당 도메인 소유 확인 절차를 거쳐 SSL인증서를 발급받았습니다. 그 뒤 인증서를 ALB에 등록해 HTTPS 통신을 활성화하였습니다.
  • 설명: 도메인 등록 > 인증서 발급 > ALB에 인증서 등록

Billing

  기본적으로 프리티어를 사용해 구축하는데 대략 2주정도 소요되어있는데, 도메인 비용 $14를 제하고 약 총 $20정도 청구되었습니다. 인스턴스를 생성한 뒤로부터는 하루에 평균 $1.5에서 $2.5정도 나가는 듯합니다. 비용 절약을 위해 테스트가 끝나면 EC2 인스턴스와 RDS를 중지하였습니다.

 

 

동작 화면