목록 | 내용 |
---|---|
작업 기간 | 2022.04.07~2022.04.08 |
인원 | 1명 |
AWS 리전 | 버지니아 북부 |
참고자료 | Google, AWS Docs |
AWS 서비스를 이용한 격리된 네트워크를 구성 하여 Web Server, Database Server, Load balancing 인프라 구축 및 wordpress 구현
패키지명 | 버전 |
---|---|
Linux | Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type |
Apache(httpd) | 2.4.52-1.amzn2.x86_64 |
php | 7.2.34-1.amzn2.x86_64 |
Mariadb | 10.2.38 |
MySql | 15.1 |
Client | Window Chrome |
사용한 AWS 서비스 목록 | 설명 |
---|---|
AWS VPC | 네트워크 구성 |
AWS EC2 | Bastion host, Web Server 인스턴스 |
AWS RDS | 데이터베이스 서버 |
AWS ELB | 로드밸런서 |
프로젝트의 사용할 격리된 네트워크 VPC 영역을 마법사로 생성
서브넷, 인터넷 게이트웨이, 라우팅 테이블, NAT 게이트웨이를 자동으로 생성되게 지정. 10번대 IPv4를 지정
고가용성을 위해 가용 영역 2개 지정
Bastion Host, 로드밸런서를 연결할 퍼블릭 서브넷 각 가용영역마다 생성
Web Server, RDS를 연결할 프라이빗 서브넷 각 가용영역마다 생성
프라이빗 인스턴스의 인터넷을 위한 NAT 게이트웨이 가용영역마다 생성
VPC 엔드포인트는 사용하지 않음
bastion host의 적용할 보안규칙
생성한 VPC 연결
보안을 위해 관리자 IP(나의 IP)만 SSH 접속 허용
기본설정 사용
기본설정 사용
Web Server 인스턴스에 적용할 보안규칙
생성한 VPC 연결
bastion host만 SSH 가능하도록 허용(Bastion host의 보안그룹으로 인바운드 지정)
웹 접속에 대한 80포트 모든 IP에 허용
기본설정 사용
기본설정 사용
데이터베이스 서버(RDS)에 사용할 보안규칙
Web Server에서만 MYSQL 접속 가능하도록 인바운드 규칙을 Web Server의 보안그룹으로 지정
기본설정 사용
기본설정 사용
로드밸런서 보안그룹
웹 접속 요청을 Web Server로 보내야하니 80 포트 모든 IP에 허용
기본설정 사용
기본설정 사용
Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type를 사용
프리티어인 t2.micro 사용
bastion host는 퍼블릭 서브넷1과 연결
기본 설정 사용
기본 설정 사용
생성해둔 sg_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.
키파일이 있는 폴더로 이동하여 ssh 접속을 요청
Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type를 사용
프리티어인 t2.micro 사용
Web Sever는 프라이빗 서브넷1과 연결
기본 설정 사용
기본 설정 사용
생성해둔 sg_web 보안그룹으로 지정
설저사항 검토
생성한 키가 있는 윈도우 폴더> 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을 통해 접속
[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파일에 복사 붙여넣기
[ec2-user@webserver ~]$ sudo yum -y install mariadb-server
RDS로 접속을 위한 Mariadb 설치
[ec2-user@webserver ~]$ sudo yum -y install httpd
웹서비스를 위한 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.
[ec2-user@webserver ~]$ sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
wordpress 이용을 위한 종속성에 해당하는 php 설치
[ec2-user@webserver ~]$ wget https://wordpress.org/latest.tar.gz
[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
[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의 엔드포인트
[ec2-user@webserver ~]$ sudo cp -r wordpress/* /var/www/html/
wordpress 구성파일들을 Apache 서버폴더로 이동
[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파일을 인식할 수 있도록 설정
[ec2-user@webserver ~]$ sudo chown -R apache /var/www
[ec2-user@webserver ~]$ sudo chgrp -R apache /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 {} \;
[ec2-user@webserver ~]$ sudo systemctl restart httpd
RDS는 서브넷을 2개로 필요로 하기때문에 그룹을 생성
생성한 vpc 선택
데이터베이스는 공개되어서는 안 되기 때문에 프라이빗 서브넷1과 프라이빗 서브넷2를 선택
프리티어로 선택
프리티어 RDS는 가용성 및 내구성 선택 불가
데이터베이스를 관리할 사용자와 비밀번호 지정
프리티어인 t2.micro 사용
기본 구성으로 설정
생성해둔 서브넷 그룹과 연결
데이터베이스는 외부에 공개되어선 안 됨. 따라서 퍼블릭 액세스 미설정
생성해둔 sg_db 보안그룹 지정
데이터베이스가 위치할 가용영역 지정
기본 설정 사용
[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)]>
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의 외부 접속 허용
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에서 사용할 데이터베이스 생성
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)
변경사항 반영
웹서버가 프라이빗 서브넷에 있기 때문에 웹 접속 및 오토스케일링을 위한 로드밸런서 구축
EC2 인스턴스인 웹서버 인스턴스를 대상으로 할 것이기 때문에 인스턴스로 지정
로드밸런서로 들어오는 80포트에 대한 처리를 지정
Web Server 인스턴스를 선택후 Include 하여 그룹에 포함
웹 프로그램을 로드밸런싱 할 것이기 때문에 어플리케이션 로드 밸런서 선택
로드밸런서는 인터넷 게이트웨이와 연결하므로 Internet-facing 선택
고가용성을 위해 두 개의 가용영역에서 두 개의 퍼블릭 서브넷 선택
생성해둔 sg_ELB 보안그룹 선택
80포트에 대한 요청을 타겟그룹 tg-webServer 80요청으로 넘겨주도록 설정
스케일 아웃 시 생성할 인스턴스 복제를 위한 이미지 생성
Auto Scaling에 사용할 인스턴스 템플릿을 생성해둔 webTem 템플릿으로 지정
Web Server 인스턴스가 자동으로 생성될 가용영역 a,b의 프라이빗 서브넷 지정
웹 접속을 위해 기존에 만들어둔 로드밸런서와 연결
상태 확인 유예 기간을 지정하여 첫 인스턴스 생성 후의 유예기간을 지정
스케일 아웃, 인 상태를 확인하기위한 모니터링 데이터 수집 설정
로드밸런싱을 위해 가용영역 a, 가용영역 b에 기본적으로 1개씩 배치
시스템에 대한 요청이 많을 때 자동으로 스케일 아웃하도록 자동 조정 설정
CPU 사용률이 50%가 넘어가면 스케일 아웃
인스턴스 요구사항을 지정하여 새로운 인스턴스 생성에 유예기간을 지정
bastion host는 로드밸런싱을 하지 않기때문에 없을 설정
bastion host는 프라이빗 서브넷의 서버로 접속하는 역할이기 때문에 사용량이 적을 것으로 예상 -> 원하는 용량을 1개로 지정
CPU 사용률이 50%가 넘어가면 자동으로 스케일 아웃하도록 설정
로드밸런서의 DNS로 접속했을 때 마주친 오류
로드밸런서 보안그룹 설정 시, 실수로 아웃바운드 규칙을 제거하여 웹서버로 요청을 보내지 못해 생긴 오류
오토스케일링으로 인해 생성된 인스턴스가 초기화 되어 httpd가 설치되지 않아 생긴 오류
인스턴스로 이미지 생성이 아닌 템플릿으로 바로 만들어 오토스케일링 그룹으로 묶어서 생긴 상황
로드밸런서의 DNS로 접속하고 나서의 처음 화면
안녕하세요. 옆기수에서 구경하러왔습니다!
이쪽클래스는 진도 더나가고 2일동안만 프로젝트작업을했나요? 2일 동안 진행하시고 문서작성하기 쉽지 않으셨을텐데 대단하시네요ㄷㄷㄷ...
보다가 한가지 질문드릴게 있는데,
2.7.1.3.5. 그룹 크기 설정 부분에서 복수의 서브넷을 선택하고 2/2/4로 설정하시면 알아서 각 가용영역에 1개씩 배치되나요? 저는 한 AZ에 몰려서생길까봐 각 가용영역에 1/1/2로 2개의 오토스케일링그룹을 만들었었거든요.
한 AZ에 몰려서 생성되도 어쨌든 오토스케일링은 적용됐으니 부하생기거나 가용영역문제시 반대편에도 생기겠지만, 자동으로 분배가되면 그냥 2/2/4로 설정하는게 편하겠다싶어서 질문드렸습니당!
VPC의 가용영역을 a와 b로 하셨는데 t2.micro는 가용영역 a와 c에서만 생성이 가능하지 않으셨나요??