Case 1. WhatIsTheTime.com
- 요구사항
- 사람들에게 시간을 알려줌
- No DB
- downtime 제거를 위한 수직 및 수평적 scaling 필요
- 구현
- EC2 인스턴스 재시작을 위한 고정IP 할당 (Elastic IP) 👉EC2-(2) 글 참고
- 트래픽 증가로 인한 대용량 부하처리를 위한 upscaling (t2.micro -> m5.large) 👉EC2-(1) 글 참고
- 더 큰 트래픽 처리를 위한 scale out
- scale out에 따라 다수의 인스턴스가 생성되고, 해당 인스턴스들에 접근하려면 각각의 Elastic IP를 알아야 함
-> Elastic IP 제거(region당 다섯개의 고정ip 할당 가능) 후 Route53 추가 (url : api.whatisthetime.com)
-> A type의 Route53의 도메인으로부터 여러 인스턴스들의 ip들을 받음 👉Route53 글 참고 - 인스턴스 한 개가 삭제되는 등 문제가 생기면, 자동 재생성이 안될 뿐더러 TTL시간동안 해당 인스턴스로 계속 접근할 것이기 때문에 VOC발생
-> public EC2 인스턴스들을 동일 가용영역의 private EC2로 전환, public Load Balancer 추가 (health check 기능 내장, 문제의 인스턴스로 트래픽 전달x), Load Balancer - EC2간 보안그룹 규칙을 추가하여 트래픽 제어 👉LoadBalancer 글 참고
-> Load Balancer는 ip가 계속 바뀌기 때문에 Rout53 A record를 alias record로 전환 👉Route53 글 참고 - auto-scaling 기능 추가, private EC2 인스턴스를 ASG (Auto Scaling Group)으로 묶음
-> 트래픽에 따라 자동 scale in/out이 진행되고, 오류로 인해 인스턴스가 내려가도 자동으로 재생성 해줌 👉ASG 글 참고 - 가용성을 위한 multi-AZ 추가, 각각의 가용영역(AZ)당 1개의 ELB(Elastic Load Balancer)를 추가, ASG 또한 가용영역당 1개씩 추가
-> 천재지변 등에 의해 특정 가용영역 전반에 문제가 생길 경우, multi-az로 다중화되어 있어 서비스 영향도 없음 - application 비용 절감 plan 활용 가능, 용량에 따라 비용이 절감될 수 있도록 reserved instances 활용 (극단적 비용절감을 위해 spot instance 활용도 고려될 수 있음) 👉EC2-(1) 글 참고
- Architecture 설계 시, 비용/성능/신뢰성/보안/운영효율 등을 고려해야 함
Case 2. MyClothes.com
- 요구사항
- 온라인으로 옷을 삼
- 장바구니 기능이 있음
- 수백 명의 동시접속자가 있음
- 확장 가능 및 수평 확장성 유지
- application app teer를 최대한 무상태로 유지 (장바구니 기능이라는 상태가 존재하지만 쉽게 확장가능해야 함 -> 사용자가 장바구니 데이터를 잃으면 안됨)
- 주소 등과 같은 사용자 정보를 효과적으로 DB에 보관
- 구현
- WhatIsTheTime.com과 같은 동일 아키텍처 (Route53 -> Multi-AZ -> ELB -> ASG -> EC2)
- 장바구니 기능 구현
A. ELB Stickiness 활성화 👉LoadBalancer 글 참고
B. 쿠키를 활용하여 사용자측에서 장바구니 내용 저장-> ELB가 cookie를 활용하여 동일 사용자의 접근은 이전 접근했던 EC2로 redirect 시켜 줌, 사용자로 하여금 만료기간동안 EC2 세션이 유지됨 -> EC2 인스턴스가 내려가면 장바구니 데이터와 같은 데이터들이 삭제됨
C. 서버 세션 기능 활용, 사용자는 쿠키를 통해 Session_id 전송-> Load Balancer에 접속할 때마다 EC2 인스턴스는 cookie를 통해 장바구니 데이터를 알 수 있음 -> HTTP 요청이 무거워짐 -> cookie가 노출됨에 따른 보안 위험 존재 (EC2 인스턴스가 사용자 cookie를 검증해야 함)
-> 장바구니에 데이터 저장이 필요할 때, ElastiCache 클러스터에 저장 👉[ElastiCache](https://woongsdogfoot.tistory.com/47) 글 참고 -> 사용자가 전송하는 Session_id는 ElastiCache 저장소의 id가 됨 -> 다른 EC2로 접근해도 동일 Session_id를 전송받아 ElastiCache에 접근하기 때문에 데이터 유지 가능 -> 고성능의 조회성능 -> 대안으로 DynamoDB도 활용 가능
- 사용자 정보를 DB 저장, Amazon RDS(DB인스턴스) 활용 (장기적인 저장) 👉RDS 글 참고
-> Multi-AZ 무상태 솔루션 효과 - RDS 읽기 성능 향상 👉RDS/ElastiCache 글 참고
A. write용도의 RDS Master에서 Read Replicas(읽기전용 RDS) 복제
B. ElastiCache 활용-> Read Replicas 확장 가능
-> RDS 조회 전, ElastiCache에 먼저 요청하여 데이터가 있는지 확인 (Cache Storage는 조회성능이 좋음) -> RDS 상의 트래픽 감소
- 재해 예방, EC2의 Multi-AZ 뿐만 아니라 RDS도 복제본을 생성하여 재해 예방 (ElastiCache의 경우에도 Redis의 경우, Multi-AZ 가능)
- 보안 그룹 설정, ELB는 모든요청을 수용할 수 있어야 함(HTTP/HTTPS, 0.0.0.0/0), EC2는 ELB로부터 오는 트래픽만 받아야 함, ElastiCache/RDS는 EC2 보안 그룹으로부터 오는 트래픽만 받아야 함
Case 3. MyWordPress.com
- 요구사항
- 완전 확장가능한 웹사이트
- 업로드한 그림이 표시
- 사용자 데이터, 블로그 내용 등 MySQL DB에 저장
- Global 확장
- 구현
- WhatIsTheTime.com과 같은 동일 아키텍처 (Route53 -> Multi-AZ -> ELB -> ASG -> EC2)
- Aurora 추가 👉Aurora 글 참고
-> Multi-AZ, Read Replicas, Global DB 등 가능 - 이미지 저장 기능 추가
-> image는 Amazon EBS Volume에 저장되도록 설정 - Multi-AZ, 다중 인스턴스의 경우, 각 EC2당 EBS에 image가 따로 저장되는 문제 발생
-> EFS(NFS) 추가 👉EFS
-> Multi-AZ 연결을 위해 각 AZ에 ENI(Elastic Network Interface) 생성 (ENI는 EFS에 접근하는 모든 EC2에서 사용 가능)
-> EC2에 요청으로 들어온 image는 각 ENI를 통해 EFS에 전송되어 저장됨
Application 설치 및 배포 in AWS
- AWS를 활용한 빠르고 효율적인 배포 방법
- EC2 : Golden AMI 활용 -> 이미 설치된 상태에서 바로 배포 -> 빠른 배포 가능
- EC2 : Bootstrap using User Data -> User가 구성한 스크립트를 EC2 실행 시에 진행하도록 함 -> 동적 설정이 필요할 때 활용
- EC2 : Hybrid -> Golden AMI + Bootstrap using User Data -> Elastic Beanstalk
- RDS : snapshot 활용 -> 복구 및 빠른 설치 가능
- EBS : snapshot 활용 -> 데이터 복구 가능
Beanstalk
- 배경
- 관리해야할 인스턴스가 다양하고 많음 (ELB, ASG, EC2, RDS 등, scale out)
- 인프라 관리가 까다로움
- 대량 인스턴스의 코드 배포가 어려움
- 모든 인스턴스의 설정이 필요함
- scaling 관점 고민 필요
Beanstalk : 개발자 입장에서 application을 쉽게 AWS에 배포할 수 있도록 해주는 tool (기존 컴포넌트 재사용 방식) -> 개발자에게 application architecture가 하나의 인터페이스 번들로 제공됨 (웹사이트 배포 및 운영에 필요한 인스턴스들을 번들로 제공)
기능 (개발자는 application의 코드만 신경쓰면 됨)
- capacity provisioning
- load balancing
- scaling
- application health monitoring
- instance configuration
- etc...
- 특징
- 무료 (Beanstalk이 활용하는 인스턴스의 비용은 유료)
- 다양한 프로그래밍 언어 지원 (Custom 플랫폼 생성도 가능)
- Beanstalk에서 생성하려는 인스턴스들을 배후에서 CloudFormation이 생성 (architecture를 그림으로도 볼 수 있음)
- 구성
- Application : Beanstalk component 모음 (environments, versions, configurations, etc...)
- Application Versions : application code의 버전
- Environment : 사용되는 AWS 자원 모음
- Tiers : Web Server, Worker 두 가지 Tier로 나뉨 (각각의 architecture)
- Web Server Tier와 Worker Tier를 하나로 합쳐서 활용할 수도 있음
- dev, test, prod 등 다양한 환경을 지원
- Web Tier (ELB + ASG)
- Worker Tier (Worker환경(?) 중심, EC2에 직접 접근하는 client가 없고 EC2간 SQS Queue를 활용)
- process
- Deployment Modes (dev vs prod)
: prod환경은 dev환경과 달리 고가용성에 초점
'개발 > AWS' 카테고리의 다른 글
[AWS] Amazon S3 (2) (0) | 2024.05.22 |
---|---|
[AWS] Amazon S3 (1) (0) | 2024.05.20 |
[AWS] Route 53 (0) | 2024.05.18 |
[AWS] Amazon RDS/Aurora/ElastiCache (1) | 2024.05.10 |
[AWS] Auto Scaling Group (ASG) (0) | 2024.05.06 |