AWS 클라우드에서 고가용성 Wordpress 서비스 배포

강재민·2022년 4월 8일
2

AWS실습

목록 보기
10/12
post-custom-banner

고가용성 서비스 아키텍처 개념도

이번 프로젝트에서는 Web 서비스 배포, 그 중에서도 Wordpress 서비스를 배포하는 주제를 잡고 시작했다. 특히 다중 AZ 구성을 통해 고가용성 아키텍처를 설계하려고 노력했는데, 비용을 최적화 하면서 최대한 단일 실패 지점을 없애는 방식으로 가용성을 높이려고 노력했다. 우리는 예산이 무제한이 아니기 때문에 현재 AWS에서 제공하는 기본 기능들을 이용해서 고가용성 아키텍처를 설계해보았다.
이를 위해 배스천 호스트와 웹서버 호스트는 오토스케일링으로 구성했고 데이터베이스 또한 대기복제본을 구성해서 단일 실패 지점을 없애려고 했다. 물론 배스천 호스트를 만들어서 보안도 어느정도 신경써서 구성하였다.


아키텍처 구성 순서

VPC \Rightarrow 배스천 호스트 \Rightarrow 데이터 베이스 \Rightarrow 웹서버 호스트

VPC구성은 2개의 가용영역에 대하여 서브넷을 퍼블릭과 프라이빗 2개씩 총 4개를 만들어주고 나머지 배스천 호스트나 데이터 베이스 웹서버 호스트 모두 2개의 가용영역을 이용해서 구성한다. 웹서버를 호스팅 하기전에 데이터 베이스가 만들어져야하고 이 데이터 베이스를 구성하기 위해서는 배스천 호스트를 먼저 구성해야한다.


VPC

VPC생성하기

  1. /서비스/VOC대시보드에서 VPC 마법사 시작를 접속한다.
  2. 우리가 필요한 가용영역은 2개지만 일단 3개를 지정해서 만들어준다. 왜냐하면 VPC 마법사를 통해서는 가용영역이 a,b,c순서대로 만들어지는데 나중에 사용할 EC2인스턴스 micro t2는 가용영역 ac에서만 생성가능하기 때문에 가용영역 3개를 만든 후 가용영역 b는 지워준다.
  3. 서브넷팅을 한다. 서브네팅 시에 삭제할 가용영역 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
  4. NAT 게이트웨이나 VPC 엔드포인트 등 다른 설정들은 비활성화시켜주고 VPC생성을 완료한다.
  5. 이제 /서비스/VPC/서브넷에서 가용영역 b에 대한 퍼블릭 및 프라이빗 서브넷을 삭제시킨다.

배스천 호스트 (Bastion Host)

앞으로 모든 프로젝트나 실무시에 보안을 위해 필요한 설정이다. 배스천 호스트의 원리는 간단하다. 내 데이터 베이스나 주요 인스턴스들은 프라이빗 서브넷에 배치시켜놓고 인바운드 보안그룹배스천 호스트만 허용하는 것이다. 그리고 당연히 배스천 호스트에 대한 인바운드는 최소한의 허용으로 이번 프로젝트에서는 내IP주소만을 허용하도록 설정하였다. 그리고 배스천 호스트의 가용성은 그렇게 중요하지는 않지만 그래도 전체 아키텍처의 가용성을 높이기 위해 오토스케일링 그룹으로 재해복구 설계를 해주었다.

배스천 호스트 이미지 생성

  1. /서비스/ec2/인스턴스에서 인스턴스 시작을 통해 기준이될 인스턴스 생성을 시작해본다.
  2. 아래 표의 설정값으로 인스턴스를 설정해준다.
    항목설정값
    기본 이미지Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
    인스턴스 유형t2.micro
    네트워크[방금 생성한 VPC]
    서브넷ap-northeast-2a public subnet
    퍼블릭 IP 자동 할당활성화
    태그추가{ Name : BastionHost }
    보안그룹{ 유형 : SSH } { 소스 : 내 IP }
  3. 시작하기버튼을 누르고 기존 키페어로 인스턴스를 시작시켜준다.
  4. Windows PowerShell에서 배스천 호스트를 접속한다.
ssh ec2-user@[퍼블릭 IPv4 주소]
  1. 데이터 베이스 접속을 위한 기본 패키지를 설치해준다.
sudo yum install -y mysql

배스천 호스트 시작템플릿 생성

  1. /서비스/EC2/인스턴스에서 BastionHost인스턴스를 중지시켜준다. 실행중에 이미지를 생성하면 에러가 날 수도 있기 때문이다.
  2. 인스턴스를 오른쪽마우스 클릭하고 /이미지 및 템플릿/이미지 생성을 클릭하여 이미지생성을 시작한다.
  3. 아래와 같이 설정하고 이미지생성버튼을 눌러 이미지를 생성한다.
    항목설정값
    이미지 이름BastionHost
    태그{ Name : BastionHost }
  4. /서비스/EC2/시작템플릿에서 시작 템플릿 생성을 눌러 시작 템플릭 생성을 시작한다.
  5. 아래와 같이 설정하고 시작 템플릿 생성버튼을 눌러 시작 템플릿을 생성한다.
    항목설정값
    시작 템플릿 이름BastionHost
    템플릿 버전 설명BastionHost용 시작템플릿
    애플리케이션 및 OS 이미지(Amazon Machine Image)BastionHost
    인스턴스 유형t2.micro
    키 페어 이름[ 기존에 사용하던 키 ]
    보안그룹BastionHost
    리소스 태그{ Name : BastionHost }

배스천 호스트 Auto Scaling 그룹 생성

  1. /서비스/EC2/Auto Scaling 그룹에서 Auto Scaling 그룹 생성을 눌러 Auto Scaling 그룹 생성을 시작한다.
  2. 아래와 같이 설정하고 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 }
  3. /서비스/EC2/네트워크 및 보안/탄력적 IP에서 탄력적 IP 주소 할당 버튼을 클릭하고 현재 서울 리전 ap-northeast-2에서 사용할 탄력적 IP 주소를 하나 생성한다.
  4. /서비스/EC2/네트워크 및 보안/탄력적 IP에서 방금 생성한 탄력적 IP를 클릭하고 오른쪽 상단에 작업/탄력적IP 주소 연결을 클릭하고 아래와 같이 설정하고 연결을 눌러 할당을 완료한다.
    항목설정값
    리소스 유형네트워크 인터페이스
    네트워크 인터페이스eni-0afcdd805309d0083

    네트워크 인터페이스 id 주소는 /서비스/EC2/네트워크 및 보안/네트워크 인터페이스에서 보안그룹BastionHost라고 되어있는 네트워크 인터페이스 ID를 찾아서 해당 인터페이스 ID와 같은 항목을 찾아 선택한다.

  5. /서비스/EC2/네트워크 및 보안/탄력적 IP에서 할당된 IPv4 주소를 확인하고 아래와 같은 명령어로 배스천 호스트에 SSH 접속을 확인해본다.
ssh ec2-user@[ 탄력적IP주소 ]


데이터베이스

데이터 베이스 생성

  1. /서비스/RDS/대시보드에서 데이터베이스 생성을 누르고 시작한다.
  2. 아래와 같이 설정하고 데이터베이스 생성을 클릭해서 마무리한다.
    항목설정값
    엔진 유형MySQL
    템플릿개발/테스트
    DB 인스턴스 식별자wordpress
    마스터 사용자 이름admin
    마스터 암호**********
    암호 확인**********
    다중 AZ 배포대기 인스턴스 생성
    /추가 구성/초기 데이터베이스 이름wordpress
  3. /서비스/EC2/보안그룹에서 데이터베이스에 적용한 보안그룹id를 눌러서 인바운드 규칙 편집을 시작한다. 규칙설정은 베스천호스트 프라이빗 IPv4 주소와 웹서버용 인스턴스의 프라이빗 서브넷 10.0.0.0/27, 10.0.0.64/27만 데이터 베이스에 3306포트로 접속 가능하게 규칙을 설정한다.

데이터 베이스 기본설정

  1. Windows PowerShell에서 배스천 호스트로 접속한 다음 데이터 베이스로 접속해준다.
mysql -h wordpress.ciz2oqzzzdnw.ap-northeast-2.rds.amazonaws.com -u admin -p
  1. WordPress 애플리케이션의 데이터베이스 사용자를 생성하고 “wordpress” 데이터베이스에 액세스할 권한을 부여합니다.
CREATE USER 'wordpress' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO wordpress;
FLUSH PRIVILEGES;
Exit

웹서버

웹서버 호스트 이미지 생성

  1. /서비스/ec2/인스턴스에서 인스턴스 시작을 통해 기준이될 인스턴스 생성을 시작해본다.
  2. 아래 표의 설정값으로 인스턴스를 설정해준다.
    항목설정값
    기본 이미지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 }
  3. 시작하기버튼을 누르고 기존 키페어로 인스턴스를 시작시켜준다.
  4. Windows PowerShell에서 배스천 호스트를 접속한다.
ssh -J ec2-user@[베스천호스트의 퍼블릭 IPv4 주소] ec2-user@[웹서버호스트의 프라이빗 IPv4 주소]
  1. 웹서버 호스팅을 위한 기본 패키지를 설치해준다.
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
  1. 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 == 엔드포인트주소


웹서버 호스트 시작템플릿 생성

  1. /서비스/EC2/인스턴스에서 BastionHost인스턴스를 중지시켜준다. 실행중에 이미지를 생성하면 에러가 날 수도 있기 때문이다.
  2. 인스턴스를 오른쪽마우스 클릭하고 /이미지 및 템플릿/이미지 생성을 클릭하여 이미지생성을 시작한다.
  3. 아래와 같이 설정하고 이미지생성버튼을 눌러 이미지를 생성한다.
    항목설정값
    이미지 이름WebServerHost
    태그{ Name : WebServerHost }
  4. /서비스/EC2/시작템플릿에서 시작 템플릿 생성을 눌러 시작 템플릭 생성을 시작한다.
  5. 아래와 같이 설정하고 시작 템플릿 생성버튼을 눌러 시작 템플릿을 생성한다.
    항목설정값
    시작 템플릿 이름WebServerHost
    템플릿 버전 설명WebServerHost용 시작템플릿
    애플리케이션 및 OS 이미지(Amazon Machine Image)WebServerHost
    인스턴스 유형t2.micro
    키 페어 이름[ 기존에 사용하던 키 ]
    보안그룹WebServerHost
    리소스 태그{ Name : WebServerHost }

웹서버 호스트 Auto Scaling 그룹 생성

  1. /서비스/EC2/Auto Scaling 그룹에서 Auto Scaling 그룹 생성을 눌러 Auto Scaling 그룹 생성을 시작한다.
  2. 아래와 같이 설정하고 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 적용시키기

  1. /서비스/CloudFront/배포에서 배포 생성을 클릭해서 Cloud Front 생성을 시작한다.
  2. 아래와 같은 설정값으로 생성한다.
    항목설정값
    원본 도메인WebServerHost

    나머지는 기본값으로 두고 생성한다.

페이지 접속 시간 비교해보기

/서비스/Cloud Front/배포에서 배포 도메인 이름으로 접속했을 때의 로딩 속도와 기존 로드밸런서 도메인 이름으로 접속했을 때의 속도를 비교해보자

접속경로load시간
일반 주소로 접속845ms
클라우드 프론트 주소로 접속773ms

클라우드 프론트를 사용 했을 때 더 빠른 속도로 웹사이트에 접근이 가능한 것을 확인 할 수 있다. 지금은 서울 리전에서 한국으로 배포를 했기 때문에 큰 차이가 나지 않았지만 만약 전세계에 배포를 한다고 하면 매우 큰 차이로 접속이 될 것이다.

post-custom-banner

4개의 댓글

comment-user-thumbnail
2022년 4월 10일

안녕하세요! 제블로그에 남겨주신 댓글보고 왔습니다.

재민님도 묘하게 저랑 비슷한 미니프로젝트 제목이네요ㅋㅋㅋㅋㅋ 비슷한 강의내용으로 미니프로젝트를 진행해서 그런가봐요

기술문서를 보니까 궁금한게, 혹시 수업시간에 배스쳔 호스트 다루셨나요? 저는 다른 스터디원분들이 알려주셔서 대충 개념만 잡고 검색해봐서 구성해본거라 자세히는 몰랐는데 설명해주신것 보고 이해한거 같아요! 배스천 호스트에는 네트워크 로드밸런서를 달고 웹서버에는 어플리케이션 로드밸런서를 달았는데 다르게 한 이유가 있을지도 궁금하네요.

기술문서도 재밌게 잘봤고 블로그도 잘 봤습니다! 종종 들러서 구경하고 갈게요~

1개의 답글
comment-user-thumbnail
2022년 4월 15일

확실히 사진 캡쳐보다 표로 정리하니까 깔끔하고 보기가 좋네요-!! 고생하셨습니다-!!

1개의 답글