AWS를 이용해 클라이언트 - 웹 서버 - DB서버를 나눈 3 계층 구조를 구축한다.
VPC로는 네트워크, EC2로 웹 서버, RDS로 데이터베이스를 생성하여 서로 연결하는 실습을 진행한다.
3계층 구조 ( 3-Tier Architecture )
서버 한대에 모든 기능을 구축하지 않고 3계층으로 나누어 각각의 기능을 별도의 논리적/물리적 장치에 운영하는 방식이다.
데이터를 저장하는 데이터 계층, 데이터를 처리하는 어플리케이션 계층, 데이터를 표현하는 클라이언트 계층으로 구분한다.
장점 : 독립적으로 구성하므로 서버의 부하를 줄여주며 업무 효율성이 증가한다.
단점 : 관리가 어렵고 계층 구조에 따라 설계를 해야하며 1계층에 비해 비용이 많이 든다.
RDS ( Relational Database Service)
클라우드에서 관계형 데이터베이스를 간편하게 설정, 운영 및 확장할 수 있는 서비스이다. 하드웨어 프로비저닝, 데이터베이스 설정, 패치 및 백업과 같은 시간 소모적인 관리 작업을 자동화하고, 사용자가 애플리케이션에 집중하여 애플리케이션에 필요한 빠른 성능, 고가용성, 보안 및 호환성을 제공할 수 있도록 지원해주는 서비스 입니다.
실습 전 유의 사항
실습을 진행하기 전 이미 VPC가 구축이 되어있는 상태이어야 한다.
VPC를 구축하는 방법을 잘 모르거나 글과 같은 환경에서 진행하고자 한다면 다음 글을 참고하여 환경을 구성하자.
2022.10.17 - [보안 이론/클라우드 보안] - AWS - VPC(Virtual Private Cloud)
또한 EC2를 생성하는 것의 자세한 설명을 다루지 않는다.
실습에서는 Amazon Linux로 WordPress서버를 사용할 것임으로 아래의 글을 참고하자.
2022.10.19 - [보안 이론/클라우드 보안] - AWS - Amazon Linux로 WordPress 웹 서버 구축
실습
웹 서버는 아마존 리눅스에 Apache, php, mysql-client를 이용
RDS는 mysql로 구성하여 웹 서버와 연결
아키텍쳐 설명
1. 클라이언트는 인터넷 게이트 웨이을 통해 VPC에 접근한다.
2. 인터넷 게이트 웨이에서는 Public subnet에 있는 아마존 리눅스 웹서버에 접근 가능하다.
3. 데이터베이스인 RDS는 Private subnet 1과 2에 이원화시켜 배치한다.
4. 아마존 리눅스 웹서버는 Private에 있는 RDS에 접근하여 데이터를 주고 받을 수 있다.
RDS 생성
먼저 AWS 콘솔에서 RDS를 검색해 RDS 서비스에 접속한다.
RDS를 생성하기 전 먼저 RDS를 배치시킬 서브넷 그룹을 생성해야 한다.
사이드바에서 서브넷 그룹 선택 후 DB 서브넷 그룹 생성 버튼을 클릭한다.
서브넷 그룹 생성화면에서는 다음과 같이 설정을 진행한다.
이름을 구분할 수 있도록 설정하고 자신의 VPC를 선택한다.
가용영역
RDS 이원화를 위해 서로 다른 두개의 가용영역을 선택한다.
또한 rds가 프라이빗에 존재하도록 가용영역에 존재하는 private subnet 두 개를 선택한다.
설정이 완료되었으면 서브넷 그룹을 생성한다.
이제 사이드 바에서 데이터베이스 선택 후 데이터베이스 생성 버튼을 클릭한다.
데이터베이스 생성 창에서 다음과 같이 설정한다.
생성 방식
표준 생성 방식을 선택하여 각 설정값을 직접 지정할 것이다.
엔진 옵션
우리는 데이터 베이스로 MySQL을 사용할 것이므로 MySQL을 선택한다.
템플릿
RDS에는 더 좋은 성능으로 만들 수 있는 기능이 있으나 우리는 실습이므로 프리 티어를 선택한다.
DB 인스턴스 식별자
AWS에서 사용될 RDS의 이름이다. 원하는 값을 설정하여준다.
자격 증명 설정
마스터 사용자는 DB에 접속할 수 있는 유저의 ID/PW를 의미한다.
직접 설치한 데이터베이스는 루트 계정을 사용할 수 있는 반면에 클라우드에서 생성되는 데이터 베이스는 루트 계정을 주지 않고 높은 권한의 마스터 사용자만 사용 가능하다.
실습에서는 admin/password로 진행하였다.
인스턴스 구성
DB의 성능을 결정한다. 높은 사양이 필요하지 않음으로 t2.micro or t3.micro를 선택하여 진행한다.
스토리지 설정
저장소에 대한 설정이다. 성능을 높히고 싶다면 조절하여도 좋으나 실습에서는 기본값을 이용한다.
컴퓨팅 리소스 설정
두 가지 선택지가 있는데 EC2 컴퓨팅 리소스에 연결 안 함을 설정한다.
연결 안 함으로 설정해야 사용자가 임의로 인스턴스와 연결하기 용이하다.
오른쪽 선택지를 사용할 경우 자동으로 서브넷과 여러가지 설정되기 때문에 잘 모르고 사용하면 혼란이 가중될 수 있다.
VPC 선택 : 자신의 VPC를 알맞게 선택한다.
DB 서브넷 그룹 설정
위에서 미리 만든 프라이빗 서브넷 그룹을 선택한다.
둘 다 프라이빗 서브넷을 선택한 이유는 확실하게 RDS를 프라이빗 서브넷에 배치하기 위함이다.
퍼블릭 액세스
퍼블릭 액세스는 RDS에 퍼블릭 IP를 할당하는 옵션이다.
우리는 프라이빗한 RDS를 사용해 EC2에 연결할 것이므로 아니요를 체크한다.
VPC 보안 그룹 설정
데이터베이스에 대한 보안 그룹을 설정한 적이 없으므로 새로 생성한다.
가용영역은 서브넷에서 사용되는 가용 영역 중 하나를 선택한다.
보안 그룹에는 DB에 연결하는 포트 3306이 기본값으로 설정되어 있으나 DB 생성 후 수정할 것이다.
나머지 옵션은 기본값으로 두고 데이터베이스를 생성한다.
RDS 생성은 약간의 시간이 소요되므로 기다리는 동안 EC2를 생성하여 서버 구성을 진행한다.
EC2 생성 및 RDS 연결 설정
먼저 Amazon Linux를 Public subnet 01에 생성한다.
EC2의 세부적인 생성 방법은 이전 글에서 다루었으므로 생략한다.
2022.10.19 - [보안 이론/클라우드 보안] - AWS - Amazon Linux로 WordPress 웹 서버 구축
다음과 같이 생성된 EC2의 프라이빗 IPv4 주소를 기억해둔다.
다시 RDS로 돌아가서 RDS 생성이 완료되었으면 RDS의 상세정보에서 보안 그룹을 클릭한다.
보안 그룹 페이지로 넘어가졌다면 해당 보안그룹을 체크 후 인바운드 규칙을 편집한다.
인바운드 규칙 편집으로 들어가면 처음에는 해당 부분에 내 PC 아이피가 적혀있을 것이다.
우리는 생성한 EC2와 연결하기 위해서 해당 IP를 EC2의 프라이빗 IP로 수정한 뒤 저장한다.
이제 EC2에서 프라이빗에 배치된 RDS에 접근이 가능할 것이다.
웹 서버 설치 및 설정
CMD에서 생성한 EC2에 SSH로 접근한다.
ssh -i "[키페어.pem]" ec2-user@[EC2 퍼블릭 주소]
그 뒤 다음과 같이 웹 서버 구축에 필요한 모듈을 설치한다.
# yum 업데이트 진행
sudo yum update -y
# PHP 설치
sudo amazon-linux-extras install -y php7.2
# 아파치 웹서버, 마리아db 클라이언트 설치
sudo yum install httpd mysql php-gd
# 아파치 서버 실행
sudo systemctl start httpd
MySQL DB에 워드프레스에서 사용할 데이터베이스와 유저를 생성한다.
그전에 RDS의 주소를 미리 알아야한다. 접근 주소는 RDS 상세정보에서 엔드포인트에 해당한다.
RDS 주소를 이용해 접근하여 워드 프레스에서 사용할 DB/계정을 생성한다.
# RDS 접근 (admin/password)
sudo mysql -h tae-db.cbiawtz7r58d.us-east-2.rds.amazonaws.com -u admin -p
# 워드프레스에서 사용할 계정, DB 생성 후 권한 설정
create database wp_board;
## 유저 생성 시 ec2의 서브넷 주소를 사용
create user wpuser@'10.1.1.%' identified by 'wpuser';
grant all privileges on wp_board.* to wpuser@'10.1.1.%';
FLUSH PRIVILEGES;
# 마리아DB 종료
exit
워드 프레스를 사용하기 위해 wget 명령어로 워드프레스를 다운로드하여 설치한다.
# 워드프레스 최신버전 설치
wget https://wordpress.org/latest.tar.gz
# 현재 위치에 압축 풀기
tar -xvzf latest.tar.gz
# 압축 푼 폴더를 웹 디렉토리로 이동
sudo mv wordpress/* /var/www/html
cd /var/www/html
# 워드 프레스 설정값 입력
sudo cp wp-config-sample.php wp-config.php
sudo vi wp-config.php
wp-config.php 설정 파일을 입력한 화면이다.
위에 DB 설정 부분은 다음과 같이 설정한다.
define( 'DB_NAME', 'wp_board' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', 'wpuser' );
define( 'DB_HOST', '[자기 RDS주소]:3306' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );
DB_HOST는 RDS 주소에 db포트인 3306까지 붙여서 입력해야한다.
아래의 KEY, SALT를 입력하는 부분은 다음 사이트에서 난수 값을 받아 그대로 적용한다.
https://api.wordpress.org/secret-key/1.1/salt/
다음은 아파치 설정 파일 수정이다.
sudo vi /etc/httpd/conf/httpd.conf
# vi 안에서 문구 찾기
?<Directory "/var/www/html
httpd.conf 파일에서 <Directory "/var/www/html"> 부분을 찾는다.
아래의 AllowOverride가 None으로 되어있는데 All로 바꾼 후 저장한다.
웹 서버 루트 디렉토리의 권한을 수정한다. 이 과정은 WordPress의 사용을 원활하게 하기 위한 설정이다.
# 아파치 그룹(-G apache)에 ec2-user를 추가(-a : add)함
sudo usermod -a -G apache ec2-user
# 웹서버 루트 디렉토리(/var/www)의 소유권을 apache그룹의 ec2-user로 변경함
sudo chown -R ec2-user:apache /var/www
# 웹 루트 디렉토리의 권한을 2775로 설정
sudo chmod 2775 /var/www
# 웹 루트 디렉토리의 하위 디렉토리의 권한을 2775로 설정
sudo find /var/www -type d -exec chmod 2775 {} \;
# 웹 루트 디렉토리의 하위 파일의 권한을 0664로 설정
sudo find /var/www -type f -exec chmod 0664 {} \;
sudo systemctl restart httpd
이제 내부 설정은 마무리되었다.
이제 EC2의 퍼블릭 주소로 접근하면 다음과 같은 워드프레스 설정화면이 나온다.
사용자 정보를 입력 후 진행하면 워드프레스를 정상적으로 사용할 수 있다.
EC2 재실행 시 DB 오류가 뜨는 문제는 다음 포스트에 기술하였다.
우리는 AWS의 VPC, EC2, RDS를 이용하여 클라이언트 - 웹 서버 - DB서버를 나눈 3-Tier 아키텍쳐 웹 서버를 구성하였다.
'보안 이론 > 클라우드 보안' 카테고리의 다른 글
AWS - Auto Scaling (0) | 2022.11.03 |
---|---|
AWS - Load Balancing(ALB, NLB) (0) | 2022.10.26 |
AWS - Amazon Linux로 WordPress 웹 서버 구축 (0) | 2022.10.19 |
AWS - VPC(Virtual Private Cloud) (0) | 2022.10.17 |
AWS - S3(Simple Storage Service) (0) | 2022.10.15 |