✍🏼플레이데이터 클라우드 부트캠프 4기_배지영
Amazon Web Service란 전 세계적으로 분포한 데이터 센터에서 제공하는 클라우드 플랫폼이다. aws를 통해 컴퓨팅, 스토리지, 데이터베이스 등 다양한 서비스를 쉽게 이용할 수 있으며 더 빠르고 경제적으로 기존 애플리케이션을 클라우드로 이동하거나 구축할 수 있다. 이번 프로젝트의 목표는 aws를 이용하여 PHP와 MySQL 기반의 오픈 소스 블로그 도구 및 콘텐츠 관리 시스템인 WordPress를 호스팅 할 수 있도록 아키텍처를 구현하는 것이다.
Mac terminal | SSH 원격접속 |
---|---|
AWS VPC | 가용영역, Public서브넷, Private서브넷, NAT게이트웨이 |
인터넷 게이트웨이, 탄력적IP주소 | |
AWS EC2 | 바스티온, 웹서버, AMI, 보안그룹 |
오토스케일링, 로드밸런서, 시작템플릿 | |
AWS RDS | 데이터베이스, 서브넷그룹, 엔드포인트 |
Google Chrome | DNS Endpoint 접속 |
Apache | httpd, PHP, MariaDB |
가상 네트워크 프로그램인 VPC를 구축한다. VPC의 이름은 wp이며 서브넷과 라우팅 테이블, 그리고 프라이빗 서브넷과 연결할 NAT 게이트웨이도 가용 영역 당 하나씩 생성한다. NAT 게이트웨이는 네트워크 주소 변환 서비스인데, 프라이빗 서브넷의 인스턴스가 VPC 내에서 인터넷 게이트웨이와 연결할 수 있는 역할을 줄 때 NAT 게이트웨이를 사용할 수 있다. 엔드포인트는 여기서 필요하지 않으므로 생성하지 않는다.
각 인스턴스와 데이터베이스, 로드 밸런서에 필요한 보안 그룹을 미리 만들어둔다.
bastion host는 프라이빗 서브넷에 위치한 웹 서버에 접속할 수 있게 해주는 인스턴스이다. ssh 접속을 해야하기 때문에 나의 IP주소에서만 접근이 가능하도록 설정한다.
web server는 프라이빗 서브넷 영역에 위치한다. ssh 접속은 bastion host에서만 가능해야 하기 때문에 bastion의 보안 그룹 소스를 할당한다. 그리고 웹 접속이 가능하도록 http포트를 Anywhere로 열어준다.
데이터베이스는 웹에서 접근이 가능하도록 web server의 보안 그룹 소스를 넣어준다.
로드 밸런서의 보안 그룹은 웹 접속이 가능한 80포트를 Anywhere로 열어준다.
인스턴스를 생성하기 전 인스턴스 접속 시 필요한 키 페어를 미리 다운로드 한다.
이름은 ‘mac-wordpress’로 하고 파일 형식은 .pem으로 지정한다. 현재 환경은 맥이어서 인증서 형식인 .cer로 저장이 되지만 .pem 키와 역할은 같다. 앞으로 터미널에서 ssh 명령어를 이용해 인스턴스에 이 키 페어를 통해 접속할 것이다.
다음으로 서버 역할을 하는 인스턴스를 두 개 생성한다. 웹서버에 접속 가능하게 퍼블릭 서브넷에 Bastion Host를, 프라이빗 서브넷에 Web Server를 하나씩 만든다.
Amazon Linux 2 AMI 선택
인스턴스 유형은 프리티어인 t2.micro 선택
bastion host는 외부에서 사용자가 접속이 가능해야 하므로 미리 만든 vpc 네트워크 내의 퍼블릭 서브넷 선택, 퍼블릭 IP 자동 할당으로 퍼블릭 주소가 자동으로 할당 되게 한다.
미리 만들어둔 bastion 보안 그룹 선택
미리 만들어둔 키 페어 선택
터미널에서 키페어 위치 접근하여 Bastion Host 정상 접속을 확인 할 수 있다.
$ ssh -i "키페어이름.cer(pem파일과 동일)" ec2-user@bastionhostIP
bastion host와 같은 유형의 Amazon Linux 2 AMI를 선택한다.
인스턴스 유형도 마찬가지로 프리티어에서 이용 가능한 t2.micro를 선택한다.
웹 서버는 프라이빗 서브넷에 위치하고, 따라서 퍼블릭 IP가 아닌 프라이빗 IP만 할당 된다.
web_server용 보안 그룹을 적용 시킨다.
키 페어는 bastion host와 동일한 키 페어를 사용한다.
터미널에서 bastion host에 키 페어를 전송하는 명령어를 사용해 키 페어를 bastion host에 복사한다.
여기서는 키 페어가 있는 경로로 이동한 다음 명령을 수행하여 복사하였다.
$ scp -i "키 페어 이름.cer" ./"키 페어 이름.cer" ec2-user@bastionhost의 IP:/home/ec2-user
# bastion host의 home 경로에 키를 복사
이 키 페어를 이용해 bastion host에서 웹서버로 접속이 가능하다.
이제 PHP와 데이터베이스 사용을 위한 작업을 시작한다.
[ec2-user ~]$ sudo yum update -y
[ec2-user ~]$ sudo amazon-linux-extras install -y php7.2
[ec2-user ~]$ sudo yum install -y httpd mariadb-server
yum info package_name
[ec2-user ~]$ sudo systemctl start httpd
# Apache 웹 서버를 시작
[ec2-user ~]$ sudo systemctl enable httpd
# systemctl 명령을 사용하여 Apache 웹 서버가 매번 시스템이 부팅할 때마다 시작되도록 함
[ec2-user ~]$ sudo systemctl is-enabled httpd
# httpd 실행되고 있는지 확인
Apache httpd는 Apache document root라는 디렉터리에 보관된 파일을 처리한다. Amazon Linux Apache 문서 루트는 /var/www/html
이며, 기본적으로 루트에서 소유한다.
ec2-user
계정에서 이 디렉터리의 파일을 조작할 수 있게 하려면 디렉터리의 소유권과 권한을 변경해야 하는데 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 여기서는 ec2-user
를 apache
그룹에 추가하여 apache
그룹에 /var/www
디렉터리의 소유권을 부여하고 쓰기 권한을 할당할 것이다.
[ec2-user ~]$ sudo usermod -a -G apache ec2-user
[ec2-user ~]$ exit
[ec2-user ~]$ groups
ec2-user adm wheel apache systemd-journal
[ec2-user ~]$ sudo chown -R ec2-user:apache /var/www
[ec2-user ~]$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
[ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} \;
위와같은 작업으로 ec2-user
와 apache
그룹의 향후 멤버는 Apache document root에서 파일 추가, 삭제, 편집을 할 수 있고, 이를 통해 사용자는 정적 웹 사이트 또는 PHP 애플리케이션과 같은 콘텐츠를 추가할 수 있게 되었다.
데이터베이스 생성 전 서브넷 그룹을 생성
가용 영역으로 만들어둔 VPC 서브넷 안에 해당하는 영역인 a와 b를 선택
웹서버에서 접근할 수 있는 데이터베이스를 생성한다.
WordPress를 실행하기 위한 데이터베이스 MySQL을 선택
템플릿은 무료인 프리티어로 선택
인스턴스 이름 : wordpress
사용자 이름 : admin
암호 설정
프리티어인 t2.micro 선택
스토리지 기본값
프리티어에 해당하는 t2.micro 사용시 다중 AZ 배포 불가
wp-vpc 네트워크 사용, 앞서 만든 wp-group 서브넷 그룹 선택
프라이빗 영역에서 사용해야하므로 퍼블릭 액세스 금지
MySQL을 이용 가능한 3306 포트에 웹 서버의 보안그룹 소스를 허용한 db 보안 그룹 적용
만들어진 wordpress 데이터베이스
터미널에서 web server에 접속하여 명령어를 실행한다.
[ec2-user ~]$ wget https://wordpress.org/latest.tar.gz
[ec2-user ~]$ tar -xzf latest.tar.gz
WordPress 에 대한 데이터베이스 사용자 및 데이터베이스를 생성하려면 다음과 같은 절차를 터미널에서 수행한다.
[ec2-user ~]$ sudo systemctl start mariadb
$ mysql -h 데이터베이스 엔드포인트 주소 -P 3306 -u admin -p
유저 생성하고 패스워드 입력
CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY '패스워드';
데이터베이스 생성, 여기서 데이터베이스 이름은 ‘wordpress-db’
데이터베이스에 대한 전체 권한을 이전에 생성한 WordPress 사용자에게 부여
데이터베이스 권한을 새로고침(flush)해서 모든 변경사항이 적용되도록 하고 mysql 클라이언트 종료
tar 파일을 압축 해제한 wordpress를 확인
php 샘플 파일인 wp-config-sample.php 파일 복사해서 wp-config.php에 붙여넣음
vim 명령어를 통해 파일 내용 수정
RDS에서 만들어둔 데이터베이스의 정보 입력
‘DB-NAME’ : wordpress
‘DB-USER’ : admin
‘DB-PASSWORD’ : 비밀번호
‘DB-HOST’ : wordpress 데이터베이스 엔드포인트 주소
https://api.wordpress.org/secret-key/1.1/salt/
사이트를 방문해서 키 값의 세트를 무작위로 생성하고 이를 wp-config.php 파일로 복사해서 붙여 넣음
WordPress가 올바로 작동하려면 Apache .htaccess
파일을 사용해야 하지만 Amazon Linux에서는 기본적으로 이 파일을 사용할 수 없다. 따라서 아래 방법에 따라 Apache 문서 루트에서 모든 재정의를 허용해야 한다.
[ec2-user ~]$ sudo vim /etc/httpd/conf/httpd.conf
AllowOverride None
라인을 AllowOverride *All*
로 변경하고 wq로 파일 저장 후 텍스트 편집기를 종료
[ec2-user ~]$ sudo systemctl enable httpd && sudo systemctl enable mariadb
[ec2-user ~]$ sudo systemctl status mariadb
[ec2-user ~]$ sudo systemctl status httpd
Create target group 선택
인스턴스 타입 선택
헬스 체크 부분 기본 설정
타겟 등록 → 실행중인 웹서버를 타겟으로 등록 (밑에 있는 include as pending below 버튼 클릭)
target group 등록됨
등록 된 타겟 그룹 액션칸에서 Associate with a new load balancer 클릭
로드 밸런서 이름은 wp-alb로 정하고 인터넷에 접속해야 하므로 internet-facing 선택 (현재 한글번역 상태라 다르게 뜸)
VPC는 만들어둔 wp-vpc 선택하고 가용 영역은 현재 인스턴스가 위치한 ap-northeast-2a와 ap-northeast-2b를 선택
초반에 등록해둔 로드밸런서용 보안그룹 적용. (80번 포트 Anywhere 적용)
타겟 그룹은 자동 선택되고 리스너는 http 실행 가능한 80번 포트
한번에 확인 가능한 요약 페이지
로드 밸런서 생성 완료
고가용성을 위해 시작 템플릿을 생성하여 오토스케일링 실행
프라이빗 웹 서버를 이미지로 생성
웹서버로 만든 web-AMI를 시작 템플릿에 적용
프리티어인 t2.micro와 인스턴스에 사용중인 키 페어 적용
웹서버 보안그룹 적용
기본 스토리지 적용
시작 템플릿 생성됨
오토스케일링 그룹 이름 wp-auto로 설정
wp-vpc 적용하고 웹서버 데이터베이스를 위해 가용 영역은 프라이빗으로 선택함
기존 로드 밸런서에 연결
인스턴스 상태 확인하고 300초 동안 응답이 없는 경우 인스턴스를 새로 생성함
최소 1개, 최대 4개의 인스턴스가 실행되도록 설정함
기본
오토스케일링으로 생성된 작동중인 웹서버
로드밸런서 dns 주소를 통해 wordpress 사이트 접속 성공
등록한 정보 입력
정상적으로 접속 성공
접속 성공
💡느낀점
여기까지 aws 환경에서 VPC, EC2, RDS 등을 이용해 WordPress를 실행시켜 보았다.
초반엔 구현하는데에 있어 실수도 많이했고 중간에 원하는 대로 실행이 되지 않아 몇번씩이나 반복하고 엄청 헤멨는데, 그렇게 많은 실패 후에 처음부터 다시 차근 차근 해보니 실행이 되었다. 복습이 정말 중요하고 개념 하나하나를 이해 하는것이 굉장히 중요하다는 생각이 다시 들었다. 앞으로도 복습을 최우선으로 여기며 열심히 공부 해야겠다.
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/hosting-wordpress.html#install-wordpress
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html
https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/create-asg-ec2-wizard.html