AWS 서비스를 이용해 wordpress를 배포해볼 것이다.
AWS를 처음 사용해보는 사람도 쉽게 따라할 수 있도록 최대한 자세히 설명해 보았다 !
설계한 시스템 아키텍처는 다음과 같다.
사용한 AWS 서비스 목록 : EC2, EBS, VPC, RDS, ELB, Autoscaling
전체적인 시스템 흐름을 설명해보자면,
가용영역 2개에 각각 퍼블릭 서브넷 1개 프라이빗 서브넷 2개를 둔다.
퍼블릭 서브넷에는 배스천 호스트를 두어 외부에서 내부의 웹 서버에 접근할 수 없도록 한다.
프라이빗 서브넷 영역에는 wordpress를 배포한 ec2 인스턴스 웹 서버와 데이터가 저장되는 RDS 데이터베이스가 위치하는데
이 때 웹 서버에 장애가 발생해도 데이터에는 손상이 없도록 하기위해 같은 프라이빗 영역에 배치하지 않았다.
(free tier를 사용해 실제로 그렇지 않지만) DB 백업본을 다른 가용영역의 프라이빗 서브넷에 두어 DB 고가용성을 만족시킬 수 있다.
관리자는 SSH를 이용해 배스천 호스트를 통해 웹 서버, DB 서버에 직접 접속할 수 있으며
사용자는 인터넷 게이트웨이를 통해 ELB가 적용된 웹 서버에 접속할 수 있다.
ELB를 사용해 사용자 트래픽이 몰릴 경우 트래픽을 분배할 수 있으며 서버가 무너지는 경우를 대비해 오토 스케일링을 구성하였다.
네트워크 구축하기
인스턴스를 할당하기 위해 VPC 생성, subnet 구축, Internet Gateway 설정, NAT gateway 설정 및 routing table을 설정하는 작업을 진행한다.
리젼은 버지니아 북부(us-east-1)을 선택했다.
VPC 내에는 Bastion Host를 위한 public subnet 및 web server를 위한 private subnet이 필요하며
이후 web server에 RDS database를 연결할 것이므로 DB용 subnet이 각 가용영역마다 1개씩 더 필요하다.
따라서 가용 영역 2개(us-east-1a, us-east-1b) 내에 각각 public subnet 1개 private subnet 2개를 구성한다.
ip 주소 디자인은 다음과 같다.
VPC CIDR | 10.0.0.0/16 | |
us-east-1a | public subnet | 10.0.10.0/24 |
private subnet | 10.0.50.0/24 | |
private subnet (for RDS) |
10.100.0./24 | |
us-east-1b | public subnet | 10.0.20.0/24 |
private subnet | 10.0.60.0/24 | |
private subnet (for RDS) |
10.200.0.0/24 |
Internet Gateway는 public subnet의 수만큼 알아서 생성이 될 것이며,
NAT Gateway는 두개의 Available Zone에서 각각 외부에 연결될 수 있도록 AZ당 1개를 선택한다.
구성한 VPC의 미리 보기는 다음과 같다.
인스턴스 생성 및 환경 설정
Bastion Host 인스턴스 1대와 wordpress를 위한 인스턴스 2개를 생성한다.
Bastion Host 인스턴스는 인스턴스 생성 시 보안 그룹만 추가하여 생성한다.
wordpress용 인스턴스는 2개의 가용영역에wordpress 인스턴스를 각각 1대씩 띄우고 로드밸런서를 이용해 오토 스케일링할 것이므로 시작 템플릿에 사용할 이미지로 만들 인스턴스를 생성한다.
인스턴스 생성 후 apache, php, wordpress 설치 및 설정을 순서대로 진행할 것이며 정상적으로 wordpress가 동작하면 이를 AMI 이미지로 만든다.
wordpress 용 인스턴스 생성
wordpress용 인스턴스를 먼저 생성한다.
단계 1: Amazon Machine Image(AMI) 선택
사용한 OS : Amazon Linux AMI
단계 2 : 인스턴스 유형 선택
인스턴스 유형 : t2.micro (free tier)
단계 3 : 인스턴스 세부 정보 구성
네트워크를 이전에 구성한 VPC로 설정하고 private 가용영역 중 하나를 지정한다. wordpress를 위한 인스턴스이므로 퍼블릭 IP 자동 할당 옵션을 비활성화로 변경한다.
단계 4 : 스토리지 추가
기본 설정 그대로 진행
단계 5 : 태그 추가
기본 설정 그대로 진행
단계 6 : 보안 그룹 구성
bastion host를 통해 SSH 접속할 것이므로 SSH 유형을 추가해주고 소스는 bastion host가 위치한 서브넷 CIDR 블록인 10.0.20.0/24를 지정해준다.
이후 Bastion Host용 wordpress용 인스턴스를 모두 띄운 후 보안 그룹을 수정할 것이다.
단계 7 : 인스턴스 시작 검토
앞서 설정한 인스턴스 설정이 잘 되었는지 검토하고 [시작하기]를 누른다.
기존에 생성해 둔 키 페어가 있다면 써도 되고 아니면 새 키 페어를 생성한다. 이 때 키 페어의 저장 위치를 확인해두자
이후 [인스턴스 시작] 버튼을 클릭해 인스턴스를 생성한다.
Bastion Host 용 인스턴스 생성
bastion host 용 인스턴스는 public subnet에 구성하고 퍼블릭 IP를 자동 할당해준다.
보안 그룹은 내 IP(관리자)에서만 SSH로 접근할 수 있도록 설정한다.
인스턴스를 생성한다.
RDS 인스턴스 생성
DB 서브넷 그룹 생성
RDS를 private 서브넷에 생성할 때는 최소 2개의 가용 영역(AZ) 또는 서브넷이 선택되어야 한다.
RDS 데이터베이스 생성 시 필요한 서브넷 그룹을 미리 생성한다. RDS에서 [서브넷 그룹] - [DB 서브넷 그룹 생성]을 클릭한다.
RDS 접속을 위한 보안 그룹을 생성한다.
wordpress 인스턴스에서 RDS 인스턴스로 접속할 것이므로 wordpress subnet의 CIDR을 추가해줘야 한다.
MySQL 엔진 유형을 선택하고 안정적인 버전(5.7.30)을 선택한다.
DB 인스턴스 식별자, 마스터 사용자 이름, 마스터 암호를 설정한다.
이는 RDS 인스턴스에서 MySQL에 접속할 때 사용할 정보이므로 기억해둬야 한다.
RDS 인스턴스는 보안을 위해 외부에서 접근할 수 없어야 하므로 퍼블릭 액세스를 "아니요"로 설정한다.
서브넷 그룹과 VPC 보안 그룹은 바로 앞 단계에서 만들어 놓은 것을 지정하고 인스턴스를 띄울 가용영역을 선택한다.
RDS에서 사용할 데이터베이스의 초기 이름을 지정한다.
RDS 인스턴스 생성에는 시간이 소요된다. 그동안 ec2 인스턴스에 wordpress를 구성해보자
wordpress 배포를 위한 ec2 인스턴스 초기 세팅
생성한 인스턴스에 접속해 wordpress 배포를 위한 패키지 설치 및 설정을 할 것이다.
키 페어를 이용해 bastion host를 점프해 wordpress (private host) 인스턴스로 접속한다.
우선 AWS 키 페어 생성을 통해 다운받은 private key를 복사해 로컬 pc의 .ssh 경로에 id_rsa라는 이름으로 생성한다.
이후 ssh -J 옵션으로 wordpress 인스턴스에 접근한다.
sohuishin@sohuishinui-MacBookAir ~ % cd .ssh
sohuishin@sohuishinui-MacBookAir .ssh % ls
known_hosts known_hosts.old
sohuishin@sohuishinui-MacBookAir .ssh % vi id_rsa
sohuishin@sohuishinui-MacBookAir .ssh % ls
id_rsa known_hosts known_hosts.old
sohuishin@sohuishinui-MacBookAir ~ % ssh -J ec2-user@23.20.45.64 ec2-user@10.0.60.12
이제 wordpress를 배포하기 위한 세팅을 진행한다.
wordpress를 배포하려면 EC2 인스턴스에서 웹 서버를 실행해야 한다.
apache 웹 서버를 설치한다.
# 최신 버그 수정 및 보안 업데이트를 얻기위해 인스턴스의 소프트웨어를 업데이트한다.
sudo yum update -y
# PHP 소프트웨어 패키지가 포함된 Apache 웹 서버를 설치한다.
sudo yum install -y httpd24 php56 php56-mysqlnd
# 웹 서버를 시작한다.
sudo service httpd start
# 웹 서버를 활성화시킨다.
sudo systemctl enable httpd.service
# 서버 부팅 시에 웹 서버가 자동으로 시작되도록 설정
sudo chkconfig httpd on
# 로그인 중인 ec2-user로 웹 서버의 기본 루트 페이지 파일을 수정 변경 가능하도록 설정하기 위해
# /var/www 디렉토리의 소유권 및 권한을 변경해야 한다.
# 다음 명령을 사용해 www라는 그룹을 추가하고 /var/www에 대한 소유권과 권한을 부여한다.
sudo groupadd www
sudo usermod -aG www ec2-user
# 이후 ec2 재접속
exit
# ec2-user가 그룹에 추가되었는지 확인한다.
groups
# /var/www 디렉토리 및 해당 콘텐츠의 그룹 소유권을 www 그룹으로 변경한다.
sudo chown -R root:www /var/www
# /var/www/ 및 그 하위 디렉토리의 권한을 변경해 그룹 쓰기 권한을 추가하고,
# 나중에 생성될 하위 디렉토리에서 그룹 ID를 설정한다.
sudo chmod 2775 /var/www
sudo find /var/www -type d -exec sudo chmod 2775 {} \;
# /var/www 및 하위 디렉토리의 파일 권한을 계속 변경해서 그룹 쓰기 권한을 추가한다.
sudo find /var/www -type f -exec sudo chmod 0664 {} \;
wordpress 설치 및 wp-config.php 파일 설정
# wget을 이용하여 url로 wordpress 파일을 설치한다.
wget https://wordpress.org/latest.tar.gz
# -C 옵션을 통해 위치를 /var/www/html로 지정하여 아카이브를 해제합니다.
tar -xvzf latest.tar.gz -C /var/www/html
# wordpress 디렉토리로 이동한다.
cd /var/www/html/wordpress
# wp-config-sample.php를 wp-config.php로 복사한다.
cp /var/www/html/wordpress/wp-config-sample.php wp-config.php
# 에디터를 열어 wp-config.php를 수정한다.
vi wp-config.php
wp-config.php 파일에 DB 정보를 입력한다.
Authentication unique keys and salts의 영역은 아래 url에 접속하여 복사 붙여넣기한다.
https://api.wordpress.org/secret-key/1.1/salt/
WordPress가 올바로 작동하려면 Apache.htaccess 파일을 사용해야 하지만
Amazon Linux에서는 기본적으로 이 파일을 사용할 수 없다.
따라서 Apache 문서 루트에서 모든 재정의를 허용해야 한다.
httpd.conf 파일에서 <Directory"/var/www/html"> 세션에 AllowOverride를 None에서 All로 변경해준다.
도메인을 통해 접속시 wordpress의 index.php가 처음 뜨도록 하기위해
DocumentRoot를 /var/www/html/wordpress로 변경하고, DirectoryIndex를 index.php로 변경한다.
# 압축해제된 wordpress 디렉토리와 그 하위 디렉토리의 소유자, 소유그룹을 apache로 변경한다.
sudo chown -R apache:apache /var/www/html/wordpress
# wordpress에 필요한 애플리케이션 종속성을 설치한다.
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
# 변경사항이 적용되도록 Apache 웹 서버를 다시 시작한다.
sudo service httpd restart
MySQL 설치
# 실제 MySQL을 설치하는 것이 아니라 명령어를 사용하기 위해 설치하는 것이다.
sudo yum install mysql
wordpress 인스턴스를 통해 RDS에 접속한 뒤 MySQL 설정을 해야한다.
앞서만든 RDS-allow-2 보안 그룹에 wordpress 인스턴스가 있는 private subnet 소스를 추가해준다.
RDS 데이터베이스의 엔드포인트를 이용해 접속한다.
[ec2-user@ip-10-0-60-12 ~]$ mysql -u shinsohui -p -h db-instance.cpaynaavk9oi.us-east-1.rds.amazonaws.com
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.7.30-log Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
생성한 사용자에게wordpress 데이터베이스에 액세스 권한을 부여한다.
MySQL [(none)]> grant all privileges on sample.* to shinsohui;
Query OK, 0 rows affected (0.00 sec)
MySQL [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
MySQL [(none)]> exit
Bye
# EC2 인스턴스에 계속 연결되어 있을 때 디렉토리를 /var/www로 변경하고
# inc라는 새로운 하위 디렉토리를 생성한다.
cd /var/www
mkdir inc
cd inc
# 에디터로 편집한다.
vim dbinfo.inc
다음으로 오토 스케일링 그룹 구성 및 로드 밸런싱 설정 방법에 대해 알아보자 !
'Project' 카테고리의 다른 글
AWS 서비스를 이용해 고가용성 Wordpress를 배포해보자 ! (2) (0) | 2022.04.09 |
---|---|
APM을 이용한 웹 서버 구축 및 Wordpress를 활용한 웹 사이트 (Web, DB, DNS 서버 분리) - 4 (0) | 2022.03.18 |
APM을 이용한 웹 서버 구축 및 Wordpress를 활용한 웹 사이트 (Web, DB, DNS 서버 분리) - 3 (0) | 2022.03.15 |
APM을 이용한 웹 서버 구축 및 Wordpress를 활용한 웹 사이트 (Web, DB, DNS 서버 분리) - 2 (0) | 2022.03.15 |
APM을 이용한 웹 서버 구축 및 Wordpress를 활용한 웹 사이트 (Web, DB, DNS 서버 분리) - 1 (0) | 2022.03.15 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!