고가용성 서비스 아키텍처 개념도
이번 프로젝트에서는 Web 서비스 배포, 그 중에서도 Wordpress
서비스를 배포하는 주제를 잡고 시작했다. 특히 다중 AZ
구성을 통해 고가용성 아키텍처
를 설계하려고 노력했는데, 비용
을 최적화 하면서 최대한 단일 실패 지점
을 없애는 방식으로 가용성
을 높이려고 노력했다. 우리는 예산이 무제한이 아니기 때문에 현재 AWS에서 제공하는 기본 기능들을 이용해서 고가용성 아키텍처를 설계해보았다.
이를 위해 배스천 호스트와 웹서버 호스트는 오토스케일링
으로 구성했고 데이터베이스 또한 대기복제본
을 구성해서 단일 실패 지점
을 없애려고 했다. 물론 배스천 호스트를 만들어서 보안
도 어느정도 신경써서 구성하였다.
아키텍처 구성 순서
VPC ⇒ 배스천 호스트 ⇒ 데이터 베이스 ⇒ 웹서버 호스트
VPC구성은 2개의 가용영역에 대하여 서브넷을 퍼블릭과 프라이빗 2개씩 총 4개를 만들어주고 나머지 배스천 호스트나 데이터 베이스 웹서버 호스트 모두 2개의 가용영역을 이용해서 구성한다. 웹서버를 호스팅 하기전에 데이터 베이스가 만들어져야하고 이 데이터 베이스를 구성하기 위해서는 배스천 호스트를 먼저 구성해야한다.
VPC
VPC생성하기
/서비스/VOC대시보드
에서 VPC 마법사 시작
를 접속한다.
- 우리가 필요한 가용영역은
2개
지만 일단 3개
를 지정해서 만들어준다. 왜냐하면 VPC 마법사
를 통해서는 가용영역이 a,b,c순서대로 만들어지는데 나중에 사용할 EC2인스턴스 micro t2
는 가용영역 a
와 c
에서만 생성가능하기 때문에 가용영역 3개를 만든 후 가용영역 b
는 지워준다.
- 서브넷팅을 한다. 서브네팅 시에 삭제할 가용영역
b
에 대한 서브넷팅은 최소
로하였다. 그리고 우리가 만들 인스턴스들이 그렇게 많지가 않아서 최초 IPv4 CIDR 블록
은 /24
으로 256개만 만들었다.
IPv4 CIDR 블록 | 10.0.0.0/24 |
---|
ap-northeast-2a 퍼블릭 서브넷 CIDR 블록 | 10.0.0.0/27 |
ap-northeast-2b 퍼블릭 서브넷 CIDR 블록 | 10.0.0.32/28 |
ap-northeast-2c 퍼블릭 서브넷 CIDR 블록 | 10.0.0.64/27 |
ap-northeast-2a 프라이빗 서브넷 CIDR 블록 | 10.0.0.128/27 |
ap-northeast-2b 프라이빗 서브넷 CIDR 블록 | 10.0.0.160/28 |
ap-northeast-2c 프라이빗 서브넷 CIDR 블록 | 10.0.0.192/27 |
- NAT 게이트웨이나 VPC 엔드포인트 등 다른 설정들은
비활성화
시켜주고 VPC생성
을 완료한다.
- 이제
/서비스/VPC/서브넷
에서 가용영역 b
에 대한 퍼블릭 및 프라이빗 서브넷을 삭제
시킨다.
배스천 호스트 (Bastion Host)
앞으로 모든 프로젝트나 실무시에 보안을 위해 필요한 설정이다. 배스천 호스트의 원리는 간단하다. 내 데이터 베이스나 주요 인스턴스들은 프라이빗 서브넷에 배치시켜놓고 인바운드 보안그룹은 배스천 호스트만 허용하는 것이다. 그리고 당연히 배스천 호스트에 대한 인바운드는 최소한의 허용으로 이번 프로젝트에서는 내IP주소만을 허용하도록 설정하였다. 그리고 배스천 호스트의 가용성은 그렇게 중요하지는 않지만 그래도 전체 아키텍처의 가용성을 높이기 위해 오토스케일링 그룹으로 재해복구 설계를 해주었다.
배스천 호스트 이미지 생성
/서비스/ec2/인스턴스
에서 인스턴스 시작
을 통해 기준이될 인스턴스 생성을 시작해본다.
- 아래 표의 설정값으로 인스턴스를 설정해준다.
항목 | 설정값 |
---|
기본 이미지 | Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type |
인스턴스 유형 | t2.micro |
네트워크 | [방금 생성한 VPC] |
서브넷 | ap-northeast-2a public subnet |
퍼블릭 IP 자동 할당 | 활성화 |
태그추가 | { Name : BastionHost } |
보안그룹 | { 유형 : SSH } { 소스 : 내 IP } |
시작하기
버튼을 누르고 기존 키페어
로 인스턴스를 시작시켜준다.
Windows PowerShell
에서 배스천 호스트를 접속한다.
ssh ec2-user@[퍼블릭 IPv4 주소]
- 데이터 베이스 접속을 위한 기본 패키지를 설치해준다.
sudo yum install -y mysql
배스천 호스트 시작템플릿 생성
/서비스/EC2/인스턴스
에서 BastionHost
인스턴스를 중지
시켜준다. 실행중에 이미지를 생성하면 에러가 날 수도 있기 때문이다.
- 인스턴스를
오른쪽마우스 클릭
하고 /이미지 및 템플릿/이미지 생성
을 클릭하여 이미지생성을 시작한다.
- 아래와 같이 설정하고
이미지생성
버튼을 눌러 이미지를 생성한다.
항목 | 설정값 |
---|
이미지 이름 | BastionHost |
태그 | { Name : BastionHost } |
/서비스/EC2/시작템플릿
에서 시작 템플릿 생성
을 눌러 시작 템플릭 생성을 시작한다.
- 아래와 같이 설정하고
시작 템플릿 생성
버튼을 눌러 시작 템플릿을 생성한다.
항목 | 설정값 |
---|
시작 템플릿 이름 | BastionHost |
템플릿 버전 설명 | BastionHost용 시작템플릿 |
애플리케이션 및 OS 이미지(Amazon Machine Image) | BastionHost |
인스턴스 유형 | t2.micro |
키 페어 이름 | [ 기존에 사용하던 키 ] |
보안그룹 | BastionHost |
리소스 태그 | { Name : BastionHost } |
배스천 호스트 Auto Scaling 그룹 생성
/서비스/EC2/Auto Scaling 그룹
에서 Auto Scaling 그룹 생성
을 눌러 Auto Scaling 그룹 생성을 시작한다.
- 아래와 같이 설정하고
Auto Scaling 그룹
버튼을 눌러 Auto Scaling 그룹을 생성한다.
항목 | 설정값 |
---|
Auto Scaling 그룹 이름 | BastionHost |
시작 템플릿 | BastionHost |
VPC | [ 방금 생성했던 VPC ] |
가용 영역 및 서브넷 | 가용영역 a와 b의 퍼블릭서브넷 |
로드 밸런싱 | 새 로드 밸런서에 연결 |
로드 밸런서 유형 | Network Load Balancer |
로드 밸런서 체계 | Internet-facing |
리스너 및 라우팅 | 대상 그룹 생성 |
태그 | { Name : BastionHost } |
상태 확인 유형 | ELB |
그룹 크기 | 1,1,1 |
태그 추가 | { Name : BastionHost } |
/서비스/EC2/네트워크 및 보안/탄력적 IP
에서 탄력적 IP 주소 할당
버튼을 클릭하고 현재 서울 리전 ap-northeast-2
에서 사용할 탄력적 IP 주소를 하나 생성한다.
/서비스/EC2/네트워크 및 보안/탄력적 IP
에서 방금 생성한 탄력적 IP
를 클릭하고 오른쪽 상단에 작업/탄력적IP 주소 연결
을 클릭하고 아래와 같이 설정하고 연결
을 눌러 할당을 완료한다.
항목 | 설정값 |
---|
리소스 유형 | 네트워크 인터페이스 |
네트워크 인터페이스 | eni-0afcdd805309d0083 |
네트워크 인터페이스 id 주소는 /서비스/EC2/네트워크 및 보안/네트워크 인터페이스
에서 보안그룹
에 BastionHost
라고 되어있는 네트워크 인터페이스 ID
를 찾아서 해당 인터페이스 ID와 같은 항목을 찾아 선택한다.
/서비스/EC2/네트워크 및 보안/탄력적 IP
에서 할당된 IPv4 주소
를 확인하고 아래와 같은 명령어로 배스천 호스트에 SSH 접속을 확인해본다.
ssh ec2-user@[ 탄력적IP주소 ]
데이터베이스
데이터 베이스 생성
/서비스/RDS/대시보드
에서 데이터베이스 생성
을 누르고 시작한다.
- 아래와 같이 설정하고
데이터베이스 생성
을 클릭해서 마무리한다.
항목 | 설정값 |
---|
엔진 유형 | MySQL |
템플릿 | 개발/테스트 |
DB 인스턴스 식별자 | wordpress |
마스터 사용자 이름 | admin |
마스터 암호 | ********** |
암호 확인 | ********** |
다중 AZ 배포 | 대기 인스턴스 생성 |
/추가 구성/초기 데이터베이스 이름 | wordpress |
/서비스/EC2/보안그룹
에서 데이터베이스에 적용한 보안그룹id
를 눌러서 인바운드 규칙 편집
을 시작한다. 규칙설정은 베스천호스트 프라이빗 IPv4 주소
와 웹서버용 인스턴스의 프라이빗 서브넷 10.0.0.0/27
, 10.0.0.64/27
만 데이터 베이스에 3306포트
로 접속 가능하게 규칙을 설정한다.
데이터 베이스 기본설정
Windows PowerShell
에서 배스천 호스트로 접속한 다음 데이터 베이스로 접속해준다.
mysql -h wordpress.ciz2oqzzzdnw.ap-northeast-2.rds.amazonaws.com -u admin -p
- WordPress 애플리케이션의 데이터베이스 사용자를 생성하고 “wordpress” 데이터베이스에 액세스할 권한을 부여합니다.
CREATE USER 'wordpress' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO wordpress;
FLUSH PRIVILEGES;
Exit
웹서버
웹서버 호스트 이미지 생성
/서비스/ec2/인스턴스
에서 인스턴스 시작
을 통해 기준이될 인스턴스 생성을 시작해본다.
- 아래 표의 설정값으로 인스턴스를 설정해준다.
항목 | 설정값 |
---|
기본 이미지 | Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type |
인스턴스 유형 | t2.micro |
네트워크 | [방금 생성한 VPC] |
서브넷 | ap-northeast-2a public subnet |
퍼블릭 IP 자동 할당 | 활성화 |
태그추가 | { Name : WebServerHost } |
보안그룹 | { 유형 : SSH }, { 소스 : [베스천호스트의 프라이빗 IPv4 주소] } |
보안그룹 | { 유형 : HTTP }, { 소스 : 0.0.0.0/0, ::/0 } |
시작하기
버튼을 누르고 기존 키페어
로 인스턴스를 시작시켜준다.
Windows PowerShell
에서 배스천 호스트를 접속한다.
ssh -J ec2-user@[베스천호스트의 퍼블릭 IPv4 주소] ec2-user@[웹서버호스트의 프라이빗 IPv4 주소]
- 웹서버 호스팅을 위한 기본 패키지를 설치해준다.
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
- Wordpress를 설치하고 적용시켜준다.
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
cp wordpress/wp-config-sample.php wordpress/wp-config.php
vi wordpress/wp-config.php
sudo cp -r wordpress/* /var/www/html/
sudo service httpd restart
wp-config.php
파일은 아래 내용과 같이 편집해준다.
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** Database username */
define( 'DB_USER', 'admin' );
/** Database password */
define( 'DB_PASSWORD', '[마스터 암호]' );
/** Database hostname */
define( 'DB_HOST', 'wordpress.ciz2oqzzzdnw.ap-northeast-2.rds.amazonaws.com' );
각 요소는 처음에 데이터베이스를 생성할 때 설정했던 사항으로 다음과 같다
DB-NAME
== DB 인스턴스 식별자
DB_USER
== 마스터 사용자 이름
DB_PASSWORD
== 마스터 암호
DB_HOST
== 엔드포인트주소
웹서버 호스트 시작템플릿 생성
/서비스/EC2/인스턴스
에서 BastionHost
인스턴스를 중지
시켜준다. 실행중에 이미지를 생성하면 에러가 날 수도 있기 때문이다.
- 인스턴스를
오른쪽마우스 클릭
하고 /이미지 및 템플릿/이미지 생성
을 클릭하여 이미지생성을 시작한다.
- 아래와 같이 설정하고
이미지생성
버튼을 눌러 이미지를 생성한다.
항목 | 설정값 |
---|
이미지 이름 | WebServerHost |
태그 | { Name : WebServerHost } |
/서비스/EC2/시작템플릿
에서 시작 템플릿 생성
을 눌러 시작 템플릭 생성을 시작한다.
- 아래와 같이 설정하고
시작 템플릿 생성
버튼을 눌러 시작 템플릿을 생성한다.
항목 | 설정값 |
---|
시작 템플릿 이름 | WebServerHost |
템플릿 버전 설명 | WebServerHost용 시작템플릿 |
애플리케이션 및 OS 이미지(Amazon Machine Image) | WebServerHost |
인스턴스 유형 | t2.micro |
키 페어 이름 | [ 기존에 사용하던 키 ] |
보안그룹 | WebServerHost |
리소스 태그 | { Name : WebServerHost } |
웹서버 호스트 Auto Scaling 그룹 생성
/서비스/EC2/Auto Scaling 그룹
에서 Auto Scaling 그룹 생성
을 눌러 Auto Scaling 그룹 생성을 시작한다.
- 아래와 같이 설정하고
Auto Scaling 그룹
버튼을 눌러 Auto Scaling 그룹을 생성한다.
항목 | 설정값 |
---|
Auto Scaling 그룹 이름 | WebServerHost |
시작 템플릿 | WebServerHost |
VPC | [ 방금 생성했던 VPC ] |
가용 영역 및 서브넷 | 가용영역 a와 b의 퍼블릭서브넷 |
로드 밸런싱 | 새 로드 밸런서에 연결 |
로드 밸런서 유형 | Application Load Balancer |
로드 밸런서 체계 | Internet-facing |
리스너 및 라우팅 | 대상 그룹 생성 |
태그 | { Name : BastionHost } |
상태 확인 유형 | ELB |
상태 확인 유예 기간 | 60초 |
모니터링 | 활성화 |
원하는 용량 | 2 |
최소 용량 | 1 |
최대 용량 | 4 |
대상 추적 조정 정책 | 활성화 |
지표 유형 | 평균 CPU 사용률 |
대상 값 | 30 |
인스턴스 요구 사항 | 60초 |
태그 추가 | { Name : BastionHost } |
웹서버 접속
/서비스/EC2/로드 밸런싱/로드밸런서
에서 웹서버용 로드밸런서를 클릭하고 DNS 이름
을 복사해서 크롬 주소창에 입력해본다.
Autoscaling 테스트하기
현재 인스턴스 수
현재는 웹서버를 거의 사용하지 않기 때문에 CPU 사용량도 매우 적고 목표 인스턴스 개수인 2개를 유지하다가 최소 인스턴스 개수인 1개로 줄어든 것을 확인 할 수 있다.
CPU 사용량 임의로 증가시기기
아무것도 없는것에 해쉬함수
를 돌리면 무한으로 계산하게 되면서 CPU사용량
이 급속도로 증가한다. 이를 이용해 임의로 CPU사용량을 증가시키고 이에 따른 인스턴스 수 변화
를 관찰해보자
sha256sum /dev/zero
Cloud Front
Cloud Front 적용시키기
/서비스/CloudFront/배포
에서 배포 생성
을 클릭해서 Cloud Front 생성을 시작한다.
- 아래와 같은 설정값으로 생성한다.
나머지는 기본값으로 두고 생성한다.
페이지 접속 시간 비교해보기
/서비스/Cloud Front/배포
에서 배포 도메인 이름
으로 접속했을 때의 로딩 속도와 기존 로드밸런서 도메인 이름
으로 접속했을 때의 속도를 비교해보자
접속경로 | load시간 |
---|
일반 주소로 접속 | 845ms |
클라우드 프론트 주소로 접속 | 773ms |
클라우드 프론트를 사용 했을 때 더 빠른 속도로 웹사이트에 접근이 가능한 것을 확인 할 수 있다. 지금은 서울 리전에서 한국으로 배포를 했기 때문에 큰 차이가 나지 않았지만 만약 전세계에 배포를 한다고 하면 매우 큰 차이로 접속이 될 것이다.
안녕하세요! 제블로그에 남겨주신 댓글보고 왔습니다.
재민님도 묘하게 저랑 비슷한 미니프로젝트 제목이네요ㅋㅋㅋㅋㅋ 비슷한 강의내용으로 미니프로젝트를 진행해서 그런가봐요
기술문서를 보니까 궁금한게, 혹시 수업시간에 배스쳔 호스트 다루셨나요? 저는 다른 스터디원분들이 알려주셔서 대충 개념만 잡고 검색해봐서 구성해본거라 자세히는 몰랐는데 설명해주신것 보고 이해한거 같아요! 배스천 호스트에는 네트워크 로드밸런서를 달고 웹서버에는 어플리케이션 로드밸런서를 달았는데 다르게 한 이유가 있을지도 궁금하네요.
기술문서도 재밌게 잘봤고 블로그도 잘 봤습니다! 종종 들러서 구경하고 갈게요~