
이번 프로젝트에서는 Web 서비스 배포, 그 중에서도 Wordpress 서비스를 배포하는 주제를 잡고 시작했다. 특히 다중 AZ 구성을 통해 고가용성 아키텍처를 설계하려고 노력했는데, 비용을 최적화 하면서 최대한 단일 실패 지점을 없애는 방식으로 가용성을 높이려고 노력했다. 우리는 예산이 무제한이 아니기 때문에 현재 AWS에서 제공하는 기본 기능들을 이용해서 고가용성 아키텍처를 설계해보았다.
이를 위해 배스천 호스트와 웹서버 호스트는 오토스케일링으로 구성했고 데이터베이스 또한 대기복제본을 구성해서 단일 실패 지점을 없애려고 했다. 물론 배스천 호스트를 만들어서 보안도 어느정도 신경써서 구성하였다.
VPC구성은 2개의 가용영역에 대하여 서브넷을 퍼블릭과 프라이빗 2개씩 총 4개를 만들어주고 나머지 배스천 호스트나 데이터 베이스 웹서버 호스트 모두 2개의 가용영역을 이용해서 구성한다. 웹서버를 호스팅 하기전에 데이터 베이스가 만들어져야하고 이 데이터 베이스를 구성하기 위해서는 배스천 호스트를 먼저 구성해야한다.
/서비스/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
비활성화시켜주고 VPC생성을 완료한다./서비스/VPC/서브넷에서 가용영역 b에 대한 퍼블릭 및 프라이빗 서브넷을 삭제시킨다.앞으로 모든 프로젝트나 실무시에 보안을 위해 필요한 설정이다. 배스천 호스트의 원리는 간단하다. 내 데이터 베이스나 주요 인스턴스들은 프라이빗 서브넷에 배치시켜놓고 인바운드 보안그룹은 배스천 호스트만 허용하는 것이다. 그리고 당연히 배스천 호스트에 대한 인바운드는 최소한의 허용으로 이번 프로젝트에서는 내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 }
/서비스/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
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
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 }
/서비스/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 이름을 복사해서 크롬 주소창에 입력해본다.


현재는 웹서버를 거의 사용하지 않기 때문에 CPU 사용량도 매우 적고 목표 인스턴스 개수인 2개를 유지하다가 최소 인스턴스 개수인 1개로 줄어든 것을 확인 할 수 있다.


아무것도 없는것에 해쉬함수를 돌리면 무한으로 계산하게 되면서 CPU사용량이 급속도로 증가한다. 이를 이용해 임의로 CPU사용량을 증가시키고 이에 따른 인스턴스 수 변화를 관찰해보자
sha256sum /dev/zero


/서비스/CloudFront/배포에서 배포 생성을 클릭해서 Cloud Front 생성을 시작한다.
항목 설정값 원본 도메인 WebServerHost 나머지는 기본값으로 두고 생성한다.
/서비스/Cloud Front/배포에서 배포 도메인 이름으로 접속했을 때의 로딩 속도와 기존 로드밸런서 도메인 이름으로 접속했을 때의 속도를 비교해보자


접속경로 load시간 일반 주소로 접속 845ms 클라우드 프론트 주소로 접속 773ms 클라우드 프론트를 사용 했을 때 더 빠른 속도로 웹사이트에 접근이 가능한 것을 확인 할 수 있다. 지금은 서울 리전에서 한국으로 배포를 했기 때문에 큰 차이가 나지 않았지만 만약 전세계에 배포를 한다고 하면 매우 큰 차이로 접속이 될 것이다.
안녕하세요! 제블로그에 남겨주신 댓글보고 왔습니다.
재민님도 묘하게 저랑 비슷한 미니프로젝트 제목이네요ㅋㅋㅋㅋㅋ 비슷한 강의내용으로 미니프로젝트를 진행해서 그런가봐요
기술문서를 보니까 궁금한게, 혹시 수업시간에 배스쳔 호스트 다루셨나요? 저는 다른 스터디원분들이 알려주셔서 대충 개념만 잡고 검색해봐서 구성해본거라 자세히는 몰랐는데 설명해주신것 보고 이해한거 같아요! 배스천 호스트에는 네트워크 로드밸런서를 달고 웹서버에는 어플리케이션 로드밸런서를 달았는데 다르게 한 이유가 있을지도 궁금하네요.
기술문서도 재밌게 잘봤고 블로그도 잘 봤습니다! 종종 들러서 구경하고 갈게요~