AWS에서 WordPress 인프라 구축/미니프로젝트 README

김건호·2022년 4월 8일
5

AWS WordPress 설계 및 구현

목록내용
작업 기간2022.04.07~2022.04.08
인원1명
AWS 리전버지니아 북부
참고자료Google, AWS Docs

목차

  1. 프로젝트개요
    1.1 프로젝트 목적
    1.2 프로젝트 환경
    1.3 시스템구조
  2. 프로젝트 과정
    2.1. VPC 생성
    2.2. 보안 그룹 생성
    2.3. bastion_host 구축
    2.4. Web Server 구축
    2.5. RDS를 이용한 데이터베이스 구축
    2.6. ELB 구축
    2.7. Auto Scaling 구축
  3. 트러블슈팅
    3.1. 504 time out
    3.2. 502 bad gate way
    3.3. 오토스케일링으로 인해 생성된 인스턴스가 초기화 된 상황
  4. 프로젝트 결과
    4.1. wordpress 접속
  5. 참고문헌

1. 프로젝트 개요

1.1. 프로젝트 목적

AWS 서비스를 이용한 격리된 네트워크를 구성 하여 Web Server, Database Server, Load balancing 인프라 구축 및 wordpress 구현

1.2. 프로젝트 환경

1.2.1. 패키지 환경

패키지명버전
LinuxAmazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
Apache(httpd)2.4.52-1.amzn2.x86_64
php7.2.34-1.amzn2.x86_64
Mariadb10.2.38
MySql15.1
ClientWindow Chrome

1.2.2. 사용한 AWS 서비스

사용한 AWS 서비스 목록설명
AWS VPC네트워크 구성
AWS EC2Bastion host, Web Server 인스턴스
AWS RDS데이터베이스 서버
AWS ELB로드밸런서

1.3. 시스템 구조

2. 프로젝트 과정

2.1. VPC 생성

2.1.1. VPC 마법사 시작


프로젝트의 사용할 격리된 네트워크 VPC 영역을 마법사로 생성

2.1.1.1. VPC 설정


서브넷, 인터넷 게이트웨이, 라우팅 테이블, NAT 게이트웨이를 자동으로 생성되게 지정. 10번대 IPv4를 지정

2.1.1.2. 가용영역 지정


고가용성을 위해 가용 영역 2개 지정

2.1.1.3. 퍼블릭 서브넷 수 지정


Bastion Host, 로드밸런서를 연결할 퍼블릭 서브넷 각 가용영역마다 생성

2.1.1.4. 프라이빗 서브넷 수 지정


Web Server, RDS를 연결할 프라이빗 서브넷 각 가용영역마다 생성

2.1.1.5. NAT 게이트웨이 수 지정


프라이빗 인스턴스의 인터넷을 위한 NAT 게이트웨이 가용영역마다 생성

2.1.1.6. VPC 엔드포인트 설정


VPC 엔드포인트는 사용하지 않음

2.1.1.7. DNS 옵션

2.1.1.8. VPC 미리보기

2.1.1.9. VPC 생성

2.2. 보안 그룹 생성

2.2.1. sg_bastion

bastion host의 적용할 보안규칙

2.2.1.1. 기본 세부 정보 설정


생성한 VPC 연결

2.2.1.2. 인바운드 규칙


보안을 위해 관리자 IP(나의 IP)만 SSH 접속 허용

2.2.1.3. 아웃바운드 규칙

기본설정 사용

2.2.1.4. 태그

기본설정 사용

2.2.2. sg_web

Web Server 인스턴스에 적용할 보안규칙

2.2.2.1. 기본 세부 정보


생성한 VPC 연결

2.2.2.2. 인바운드 규칙


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

2.2.2.3. 아웃바운드 규칙

기본설정 사용

2.2.2.4. 태그

기본설정 사용

2.2.3. sg_db

데이터베이스 서버(RDS)에 사용할 보안규칙

2.2.3.1. 기본 세부 정보

2.2.3.2. 인바운드 규칙

Web Server에서만 MYSQL 접속 가능하도록 인바운드 규칙을 Web Server의 보안그룹으로 지정

2.2.3.3. 아웃바운드 규칙

기본설정 사용

2.2.3.4. 태그

기본설정 사용

2.2.4. sg_ELB

로드밸런서 보안그룹

2.2.4.1. 기본 세부 정보

2.2.4.2. 인바운드 규칙


웹 접속 요청을 Web Server로 보내야하니 80 포트 모든 IP에 허용

2.2.4.3. 아웃바운드 규칙

기본설정 사용

2.2.4.4. 태그

기본설정 사용

2.3. bastion_host 구축

2.3.1. 인스턴스 생성

2.3.1.1. AMI 선택


Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type를 사용

2.3.1.2. 인스턴스 유형 선택


프리티어인 t2.micro 사용

2.3.1.3. 인스턴스 세부 정보 구성
2.3.1.3.1. 네트워크 설정


bastion host는 퍼블릭 서브넷1과 연결

2.3.1.4. 스토리지 추가

기본 설정 사용

2.3.1.5. 태그 추가

기본 설정 사용

2.3.1.6. 보안 그룹 구성


생성해둔 sg_bastion 보안그룹으로 지정

2.3.1.7. 검토 및 시작

설저사항 검토

2.3.1.8. 키 페어 생성

2.3.2. bastion_host 접속

생성한 키가 있는 윈도우 폴더> ssh -i .\키 파일 ec2-user@bastion의 퍼블릭 IP
Last login: Fri Apr  8 10:28:19 2022 from *

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
14 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.

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

2.4. Web Server 구축

2.4.1. 인스턴스 생성

2.4.1.1. AMI 선택


Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type를 사용

2.4.1.2. 인스턴스 유형 선택


프리티어인 t2.micro 사용

2.4.1.3. 인스턴스 세부 정보 구성
2.4.1.3.1. 네트워크 설정


Web Sever는 프라이빗 서브넷1과 연결

2.4.1.4. 스토리지 추가

기본 설정 사용

2.4.1.5. 태그 추가

기본 설정 사용

2.4.1.6. 보안 그룹 구성


생성해둔 sg_web 보안그룹으로 지정

2.4.1.7. 검토 및 시작

설저사항 검토

2.4.1.8. 기존 키 페어 선택

2.4.2. Web Server 접속

2.4.2.1. bastion 접속
생성한 키가 있는 윈도우 폴더> ssh -i .\키 파일 ec2-user@bastion의 퍼블릭 IP
Last login: Fri Apr  8 10:28:19 2022 from *

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
14 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.

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

2.4.2.2. 키 페어 복사
[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
Last login: Fri Apr  8 10:32:18 2022 from bastion

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
14 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.
[ec2-user@webserver ~]$

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

2.4.3. Mariadb 설치

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

RDS로 접속을 위한 Mariadb 설치

2.4.4. APACHE(httpd) 설치

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

웹서비스를 위한 Apache 설치

2.4.5. 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.

2.4.6. php 설치

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

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

2.4.7. wordpress 다운

2.4.7.1. wordress 설치 패키지 다운
[ec2-user@webserver ~]$ wget https://wordpress.org/latest.tar.gz
2.4.7.2. 압축해제
[ec2-user@webserver ~]$ tar -xzf latest.tar.gz
[ec2-user@webserver ~]$ ls wordpress/
index.php             wp-includes
license.txt           wp-links-opml.php
readme.html           wp-load.php
wp-activate.php       wp-login.php
wp-admin              wp-mail.php
wp-blog-header.php    wp-settings.php
wp-comments-post.php  wp-signup.php
wp-config-sample.php  wp-trackback.php
wp-content            xmlrpc.php
wp-cron.php

2.4.8. wordpress 구성

2.4.8.1. wordpress 설정 파일 편집
2.4.8.1.1. 샘플 복사
[ec2-user@webserver ~]$ cp wordpress/wp-config-sample.php wordpress/wp-config.php

샘플파일을 복사하여 구성

2.4.8.1.2. 편집
[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의 엔드포인트

2.4.9. Apache 설정

2.4.9.1. wordpress 설정 파일 이동
[ec2-user@webserver ~]$ sudo cp -r wordpress/* /var/www/html/

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

2.4.9.2. 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
</Directory>
...

퍼머링크 사용을 위한 오버라이드 허용

# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    DirectoryIndex index.php
</IfModule>

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

2.4.9.2. 파일 권한 수정
2.4.9.2.1. /var/www/ 소유권을 Apache 사용자에게 허용
[ec2-user@webserver ~]$ sudo chown -R apache /var/www
2.4.9.2.2. /var/www 및 하위 그룹 소유권을 apache에게 허용
[ec2-user@webserver ~]$ sudo chgrp -R apache /var/www
2.4.9.2.3. /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 {} \;
2.4.9.2.4. Apache 재시작하여 새 그룹 및 권한 가져오기
[ec2-user@webserver ~]$ sudo systemctl restart httpd

2.5. RDS를 이용한 데이터베이스 구축

2.5.1. 서브넷 그룹 생성


RDS는 서브넷을 2개로 필요로 하기때문에 그룹을 생성

2.5.1.1. 서브넷 그룹 세부 정보 설정


생성한 vpc 선택

2.5.1.2. 서브넷 추가


데이터베이스는 공개되어서는 안 되기 때문에 프라이빗 서브넷1과 프라이빗 서브넷2를 선택

2.5.1.3. 생성완료

2.5.2. 데이터베이스 생성

2.5.2.1. 데이터베이스 생성 방식 선택

2.5.2.2. 엔진 옵션 선택

2.5.2.3. 템플릿 선택


프리티어로 선택

2.5.2.4. 가용성 및 내구성


프리티어 RDS는 가용성 및 내구성 선택 불가

2.5.2.5. 기타 설정


데이터베이스를 관리할 사용자와 비밀번호 지정

2.5.2.6. DB 인스턴스 클래스 선택


프리티어인 t2.micro 사용

2.5.2.7. 스토리지 선택


기본 구성으로 설정

2.5.2.8. 연결설정


생성해둔 서브넷 그룹과 연결

2.5.2.8.1. 퍼블릭 액세스


데이터베이스는 외부에 공개되어선 안 됨. 따라서 퍼블릭 액세스 미설정

2.5.2.8.2.보안 그룹 설정


생성해둔 sg_db 보안그룹 지정

2.5.2.8.3.가용 영역 설정


데이터베이스가 위치할 가용영역 지정

2.5.2.9. 데이터베이스 인증 방식 설정

2.5.2.10. 추가 구성

기본 설정 사용

2.5.2.11. 생성 완료

2.5.3. 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)]>

2.5.4. 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 | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | rdsadmin         |
+-----------+------------------+
7 rows in set (0.00 sec)

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

2.5.5. 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에서 사용할 데이터베이스 생성

2.5.6. 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에 대한 모든 권한 부여

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

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

변경사항 반영

2.6. ELB 구축

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

2.6.1. 대상 그룹 생성

2.6.1.1. 그룹화 대상 종류 선택


EC2 인스턴스인 웹서버 인스턴스를 대상으로 할 것이기 때문에 인스턴스로 지정

2.6.1.2. 이름 지정 및 VPC 설정


로드밸런서로 들어오는 80포트에 대한 처리를 지정

2.6.1.3. Health checks

2.6.1.4. 타겟 등록



Web Server 인스턴스를 선택후 Include 하여 그룹에 포함

2.6.1.5. 대상그룹 생성

2.6.2. 로드밸런서 생성

2.6.2.1. 로드밸런서 유형 지정


웹 프로그램을 로드밸런싱 할 것이기 때문에 어플리케이션 로드 밸런서 선택

2.6.2.2. 기본 설정


로드밸런서는 인터넷 게이트웨이와 연결하므로 Internet-facing 선택

2.6.2.3. 네트워크 연결
2.6.2.3.1. VPC 지정

2.6.2.3.2. 서브넷 지정


고가용성을 위해 두 개의 가용영역에서 두 개의 퍼블릭 서브넷 선택

2.6.2.4. 보안그룹 지정


생성해둔 sg_ELB 보안그룹 선택

2.6.2.5. 리스너 지정


80포트에 대한 요청을 타겟그룹 tg-webServer 80요청으로 넘겨주도록 설정

2.6.2.6. 로드밸런서 생성

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

2.7. Auto Scaling 구축

2.7.1. Web Server Auto Scaling

2.7.1.1. Web Server 인스턴스 이미지 생성


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

2.7.1.1.1. 이름 지정 및 설정

2.7.1.1.2. 이미지 생성

2.7.1.2. 시작 템플릿 생성

2.7.1.2.1. 이름 지정

2.7.1.2.2. AMI 지정

2.7.1.2.3. 인스턴스 유형 지정

2.7.1.2.4. 키 페어 지정

2.7.1.2.5. 네트워크 설정

2.7.1.2.6. 스토리지 구성

2.7.1.2.7. 시작 템플릿 생성

2.7.1.3. Auto Scaling 그룹 생성

2.7.1.3.1. 시작 템플릿 구성 및 구성 선택


Auto Scaling에 사용할 인스턴스 템플릿을 생성해둔 webTem 템플릿으로 지정

2.7.1.3.2. 네트워크 지정


Web Server 인스턴스가 자동으로 생성될 가용영역 a,b의 프라이빗 서브넷 지정

2.7.1.3.3. 로드밸런서 연결


웹 접속을 위해 기존에 만들어둔 로드밸런서와 연결

2.7.1.3.4. 상태확인 설정


상태 확인 유예 기간을 지정하여 첫 인스턴스 생성 후의 유예기간을 지정
스케일 아웃, 인 상태를 확인하기위한 모니터링 데이터 수집 설정

2.7.1.3.5. 그룹 크기 설정


로드밸런싱을 위해 가용영역 a, 가용영역 b에 기본적으로 1개씩 배치

2.7.1.3.6. 자동 조정 설정


시스템에 대한 요청이 많을 때 자동으로 스케일 아웃하도록 자동 조정 설정
CPU 사용률이 50%가 넘어가면 스케일 아웃
인스턴스 요구사항을 지정하여 새로운 인스턴스 생성에 유예기간을 지정

2.7.1.3.7. 태그 설정

2.7.1.3.8. 인스턴스 추가 된 모습 확인

2.7.2. bastion Auto Scaling

2.7.2.1. bastion 인스턴스 이미지 생성

2.7.2.1.1. 이름 지정 및 설정

2.7.2.1.2. 이미지 생성

2.7.2.2. 시작 템플릿 생성

2.7.2.2.1. 이름 지정

2.7.2.2.2. AMI 지정

2.7.2.2.3. 인스턴스 유형 지정

2.7.2.2.4. 키 페어 지정

2.7.2.2.5. 네트워크 설정

2.7.2.2.6. 스토리지 구성

2.7.2.2.7. 시작 템플릿 생성

2.7.2.3. Auto Scaling 그룹 생성

2.7.2.3.1. 시작 템플릿 구성 및 구성 선택

2.7.2.3.2. 네트워크 지정

2.7.2.3.3. 로드밸런서 연결


bastion host는 로드밸런싱을 하지 않기때문에 없을 설정

2.7.2.3.4. 상태확인 설정

2.7.2.3.5. 그룹 크기 설정


bastion host는 프라이빗 서브넷의 서버로 접속하는 역할이기 때문에 사용량이 적을 것으로 예상 -> 원하는 용량을 1개로 지정

2.7.2.3.6. 자동 조정 설정


CPU 사용률이 50%가 넘어가면 자동으로 스케일 아웃하도록 설정

2.7.2.3.7. 태그 설정

3. 트러블슈팅

3.1. 504 time out

로드밸런서의 DNS로 접속했을 때 마주친 오류
로드밸런서 보안그룹 설정 시, 실수로 아웃바운드 규칙을 제거하여 웹서버로 요청을 보내지 못해 생긴 오류

3.2. 502 bad gate way

오토스케일링으로 인해 생성된 인스턴스가 초기화 되어 httpd가 설치되지 않아 생긴 오류

3.3. 오토스케일링으로 인해 생성된 인스턴스가 초기화 된 상황

인스턴스로 이미지 생성이 아닌 템플릿으로 바로 만들어 오토스케일링 그룹으로 묶어서 생긴 상황

4. 프로젝트 결과

4.1. wordpress 접속

4.1.1. 언어설정


로드밸런서의 DNS로 접속하고 나서의 처음 화면

4.1.2. 사용자 생성

4.1.3. 로그인

4.1.4. 메인페이지

4.1.5. ken의 wordpress 접속

5. 참고문헌

아마존 리눅스에서 워드프레스 설치

profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

9개의 댓글

comment-user-thumbnail
2022년 4월 10일

VPC의 가용영역을 a와 b로 하셨는데 t2.micro는 가용영역 a와 c에서만 생성이 가능하지 않으셨나요??

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

안녕하세요. 옆기수에서 구경하러왔습니다!

이쪽클래스는 진도 더나가고 2일동안만 프로젝트작업을했나요? 2일 동안 진행하시고 문서작성하기 쉽지 않으셨을텐데 대단하시네요ㄷㄷㄷ...

보다가 한가지 질문드릴게 있는데,
2.7.1.3.5. 그룹 크기 설정 부분에서 복수의 서브넷을 선택하고 2/2/4로 설정하시면 알아서 각 가용영역에 1개씩 배치되나요? 저는 한 AZ에 몰려서생길까봐 각 가용영역에 1/1/2로 2개의 오토스케일링그룹을 만들었었거든요.

한 AZ에 몰려서 생성되도 어쨌든 오토스케일링은 적용됐으니 부하생기거나 가용영역문제시 반대편에도 생기겠지만, 자동으로 분배가되면 그냥 2/2/4로 설정하는게 편하겠다싶어서 질문드렸습니당!

1개의 답글