AWS에 WordPress 고가용성 인프라 구축(Toy Project)

김유신·2024년 2월 12일
0

Project

목록 보기
1/7

클라우드 미니 프로젝트

AWS 클라우드를 통한 격리 네트워크를 구성해
Bastion,Web(DB)Server,Load balancing,Auto scaling 인프라 구축 및 wordpress 서비스 베포

구조 아키텍처 -

1 VPC 생성

고가용성을 위해 가용 영역 2개 지정 NAT 게이트웨이 AZ당 1개
Bastion Host, 로드밸런서를 연결할 퍼블릭 서브넷 각 가용영역마다 생성
Web Server, RDS를 연결할 프라이빗 서브넷 각 가용영역마다 생성

2 보안그룹 생성 bastion,web,db,elb용
sg_bastion - 생성한 VPC 연결 후 보안을 위해 나의IP만 SSH 접속 허용

sg_web - 생성한 VPC 연결 후 bastion host만 SSH 가능하도록 허용(Bastion host의 보안그룹으로 인바운드 지정)
웹 접속에 대한 80포트 모든 IP에 허용 (HTTP)

sg_db - MariaDB를 사용했음으로 MYSQL/Aurora 선택 web server에서만 db 접속 가능하도록 인바운드 규칙을 web server 보안그룹으로 지정

sg_ELB 웹 접속 요청이 web server로 가니 80 포트 모든 IP에 허용(HTTP)
아웃바운드 규칙 , 태그 - 기본설정 사용

3. bastion_host 구축
Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type

bastion host는 VPC 선택후 퍼블릭 서브넷1과 연결, 퍼블릭IP 할당
생성해둔 sg_bastion 보안그룹으로 지정 SSH 키페어 생성

bastion_host 접속
생성한 키가 있는 윈도우 폴더> ssh -i .\키 파일 ec2-user@bastion의 퍼블릭 IP

(키파일이 있는 폴더로 이동하여 ssh 접속을 요청)

4 Web Server 구축

Web Sever는 프라이빗 서브넷1과 연결
생성해둔 sg_web 보안그룹으로 지정 기존 키 페어 선택

web Server 접속

프라이빗 서브넷에 있는 Web Server는 퍼블릭 서브넷의 bastion을 통해 접속

[ec2-user@bastion ~]$ vi .ssh/key
[ec2-user@bastion ~]$ chmod 400 .ssh/key
[ec2-user@bastion ~]$ ssh -i .ssh/key ec2-user@web server의 프라이빗 IP

bastion에 키페어가 없기 때문에 윈도우에서 pem파일 내용을 복사해 key파일에 복사 붙여넣기

[ec2-user@webserver ~]$

5 APACHE(httpd) 설치

[ec2-user@webserver ~]$ sudo yum -y install httpd

웹서비스를 위해 Apache 설치

Apache 활성화

[ec2-user@webserver ~]$ sudo systemctl start httpd
[ec2-user@webserver ~]$ sudo systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

wordpress 이용을 위해 종속성에 해당하는 php 설치

[ec2-user@webserver ~]$ sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2

wordpress 다운

wordress 설치 패키지 다운

[ec2-user@webserver ~]$ wget https://wordpress.org/latest.tar.gz

압축해제

[ec2-user@webserver ~]$ tar -xzf latest.tar.gz

wordpress 설정 파일 편집

샘플 복사

[ec2-user@webserver ~]$ cp wordpress/wp-config-sample.php wordpress/wp-config.php

샘플파일을 복사하여 구성

편집

[ec2-user@webserver ~]$ vim wordpress/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-db' );

/** Database username */
define( 'DB_USER', 'wordpress-user' );

/** Database password */
define( 'DB_PASSWORD', '데이터베이스 비밀번호' );

/** Database hostname */
define( 'DB_HOST', 'RDS의 엔드포인트' );
...

DB_NAME : 데이터베이스 서버에 있는 wordpress와 연결할 데이터베이스 이름
DB_USER : wordpress-db를 관리하는 사용자
DB_PASSWORD : wordpress-user의 비밀번호
DB_HOST : 원격 접속을 위한 RDS의 엔드포인트

Apache 설정
wordpress 설정 파일 이동

[ec2-user@webserver ~]$ sudo cp -r wordpress/* /var/www/html/

wordpress 구성파일들을 Apache 서버폴더로 이동

Apache 문서 루트에서 모든 재정의 허용 및 php 연동

[ec2-user@webserver ~]$ sudo vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
...
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
AllowOverride All

#
# Controls who can get stuff from this server.
#
Require all granted
... 퍼머링크 사용을 위한 오버라이드 허용
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#

<IfModule dir_module>
    DirectoryIndex index.php
</IfModule>

httpd 서비스가 html이 아닌 php파일을 인식할 수 있도록 설정

파일 권한 수정
/var/www/ 소유권을 Apache 사용자에게 허용

[ec2-user@webserver ~]$ sudo chown -R apache /var/www

/var/www 및 하위 그룹 소유권을 apache에게 허용

[ec2-user@webserver ~]$ sudo chgrp -R apache /var/www

/var/www 그룹 쓰기 권한추가

[ec2-user@webserver ~]$ sudo chmod 2775 /var/www
[ec2-user@webserver ~]$ find /var/www -type d -exec sudo chmod 2775 {} \;
[ec2-user@webserver ~]$ find /var/www -type f -exec sudo chmod 0664 {} \;

Apache 재시작하여 새 그룹 및 권한 가져오기

[ec2-user@webserver ~]$ sudo systemctl restart httpd

6 RDS를 사용한 DB 구축 (MariaDB)

서브넷 2개가 필요하기때문에 DB 서브넷 그룹 생성
생성한 VPC 선택 후 프라이빗 서브넷1,2 선택

DB 생성 - 표준 생성 MariaDB

★ DB 이름 작성 따로 설정하지 않을시 기본 DB가 생성되지 않음
연결 - 생성해둔 VPC,서브넷 그룹과 연결
퍼블릭 엑세스 - 아니요
보안그룹 - 생성했던 sg_db 지정
가용영역 - 2a지정 암호인증 생성

Web Server에서 접속

[ec2-user@webserver ~]$ mysql -u admin -p -h RDS의 엔드포인트
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.27 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.

MySQL [(none)]

WordPress 사용자 생성

MySQL [(none)]> CREATE USER 'wordpress-user'@'10.0.%' IDENTIFIED BY '비밀번호';
Query OK, 0 rows affected (0.00 sec)
MySQL [mysql]> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | admin            |
| 10.0.%    | wordpress-user   |
| localhost | MariaDB.sys        |
| localhost | rdsadmin         |
+-----------+------------------+
7 rows in set (0.00 sec)

wordpress 데이터베이스를 관리할 사용자 생성, VPC내의 10번대 IP의 외부 접속 허용

wordpress 데이터베이스 생성

MySQL [(none)]> CREATE DATABASE `wordpress-db`;
Query OK, 1 row affected (0.01 sec)
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress-db       |
+--------------------+
5 rows in set (0.00 sec)

wordpress에서 사용할 데이터베이스 생성

WordPress 사용자에게 권한 부여

MySQL [(none)]> GRANT ALL PRIVILEGES ON `wordpress-db`.* TO "wordpress-user"@"10.0.%";
Query OK, 0 rows affected (0.01 sec)

MySQL [mysql]> SHOW GRANTS FOR 'wordpress-user'@'10.0.%';
+-----------------------------------------------------------------------+
| Grants for wordpress-user@10.0.%
              |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `wordpress-user`@`10.0.%`
              |
| GRANT ALL PRIVILEGES ON `wordpress-db`.* TO `wordpress-user`@`10.0.%` |
+-----------------------------------------------------------------------+
2 rows in set (0.01 sec)

wordpress-user에게 wordpress-db에 대한 모든 권한 부여

데이터베이스 권한 새로고침

MySQL [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

7 ELB 구축
웹서버가 프라이빗 서브넷에 있기 때문에 웹 접속 및 오토스케일링을 위한 로드밸런서 구축

대상 그룹 생성

웹서버 인스턴스 대상 만들어둔 VPC 선택
HTTP : 80 로드밸런서로 80번 포트 처리 지정
타겟 등록 - Web Server 인스턴스 선택후 그룹에 포함 후 생성

로드밸런서 생성

웹 프로그램 로드밸런싱 - ALB 선택

인터넷 게이트웨이와 연결하기때문에 internet-facing
만들어둔 VPC선택
고 가용성을 위해 서브넷은 두개의 가용영역에서 두개의 퍼블릭 서브넷 선택
생성해둔 sg_elb 보안그룹 선택
리스너 지정 80포트에 대한 요청을 타겟그룹 tg-webserver 80요청으로 설정

로드밸런서 생성

로드밸런서의 DNS 이름으로 웹 접속

8 Auto Scaling 구축

Web Server 인스턴스 이미지 생성
스케일 아웃 시 생성할 인스턴스 복제를 위한 이미지 생성

이미지 생성 후 생성한 이미지로 기존 설정후 시작 템플릿 생성

Auto Scaling 그룹 생성

Auto Scaling에 사용할 인스턴스 템플릿을 생성해둔 웹 템플릿으로 선택
Web Server 인스턴스가 자동으로 생성될 가용영역 a,b의 프라이빗 서브넷 지정
로드배런서 연결 - 기존 로드 밸런서에 연결 로드 밸런서 대상 그룹에서 선택
웹 접속을 위해 기존에 만들어둔 로드밸런서와 연결

그룹 크기 설정
원하는 용량 2 최소 용량 2 최대 용량 4
로드밸런싱을 위해 가용영역 a, 가용영역 b에 기본적으로 1개씩 배치

자동 조정 설정
대상 추적 조정 정책

시스템에 대한 요청이 많을 때 자동으로 스케일 아웃하도록 자동 조정 설정
CPU 사용률이 50%가 넘어가면 스케일 아웃
인스턴스 요구사항을 지정하여 새로운 인스턴스 생성에 유예기간을 지정
평균 CPU 사용률 대상 값 50 태그 키-A1 값-asweb로 설정했음.

bastion Auto Scaling . bastion 인스턴스 이미지 생성후
시작 템플릿 생성 AMI 지정(bastionAMI)
기존 키페어,sg_bastion 보안 그룹으로 템플릿 생성

Auto Scaling 그룹 생성
시작 템플릿 구성 및 구성 선택

시작 템플릿- 바스티온 템플릿 선택 네트워크 - 만들어둔 VPC 선택 퍼블릭 서브넷 A,B 선택

로드밸런서 연결 - bastion host는 로드밸런싱 X (로드 밸런서 없음)
clout wath 내에서 그룹 지표 수집 활성화 선택
그룹 크기 - 원하는 용량 1 최소 용량 1 최대 용량 4
bastion host는 프라이빗 서브넷의 서버로 접속하는 역할이기 때문에 사용량이 적을 것이기에 설정 용량 1 지정

자동 조정 설정

CPU 사용률이 50%가 넘어가면 자동으로 스케일 아웃하도록 설정 평균 CPU 사용률 대상 값 50
태그 - 키-A2 값-asBastion으로 설정했음.

업로드중..

9 wordpress 접속

로드밸런서 DNS로 접속후 화면

사용자 생성

로그인

메인페이지

KYS's 예제 페이지

                                끝!
profile
KYS's blog

0개의 댓글