[AWS] 기본 웹 서비스 인프라 구성(VPC, Security Group, Web, DB, NAT 등)
1. VPC 생성
2. IGW 생성 및 Attach
3. Public Subnet, Private Subnet 생성
Public과 Private의 차이는 라우팅 테이블에 의해 정해지므로 동일한 방법으로 Name과 CIDR만 신경써서 우선 생성한다!
4. Public 라우팅 테이블(Route tables) 생성 및 경로 설정, Subnet 할당
1) Public 라우팅 테이블 생성
- Create route table

기본적으로 VPC를 생성하면 Route table도 같이 생성된다.
이 Default route table 사용하지 않고 새로 생성해서 이용할 것이다. - Public Route 생성

Main 속성에 Yes -> VPC 생성될 때 라우팅 테이블도 즉시 같이 생성됨
▶ 해당 라우팅 테이블이 Public 기본 -> 서브넷 생성 시 해당 라우팅 테이블이 적용되어서 Public의 서브넷이 기본으로 생성되는 것
▶ 해당 라우팅 테이블이 Private 기본 -> 서브넷 생성 시 해당 라우팅 테이블이 적용되어서 Private의 서브넷이 기본으로 생성되는 것해당 Main 속성의 Yes 값을 가진 라우팅 테이블이 Private이기 때문에 서브넷 생성 시 Private Subnet이 기본적으로 적용되는 것
★ 기본 생성되는 서브넷이 Public이 되는 것보다 Private이 되는 것이 보안 상 더 안전하기 때문에 Default Route table 변경하지 않는 것이 바람직하다!
2) Public 라우팅 테이블 경로 추가
3) Public 서브넷에 라우팅 테이블 할당
5. Public Subnet Auto-assign IP 설정
Public Sunbet은 당연시하게 공인 IP가 필요하다.
인스턴스를 생성할 때 Public Sunbet에 위치하도록 인스턴스를 생성하면 자동으로 공인 IP를 할당해주는 기능을 활성화 하면 유용하다!!
(이 설정 없이 인스턴스를 생성하면 체크를 별도로 해줘야 한다.)
6. Network ACL & Security Group
1) NACL(Network ACL)
Security Group에서 세세하게 차단 설정이 가능하기 때문에 NACL은 크게 건드리는 일이 적다.
2) Security Group(SG)
SSH, HTTP 허용하는 인바운드 룰 추가 (SSH는 My IP를 통해 현재 내 IP로만 접속 가능하도록 설정, HTTP는 웹 서버 특성 상 모든 곳에서 접속 가능하도록 설정)

Security Group(SG)은 태그가 자동으로 적용되지 않는다. 추후 운영적으로도 태그를 꼭 달아주는 것이 좋다!

NACL과 Security Group 차이
▶ NACL은 서브넷 레벨에서 적용되고, SG는 인스턴스 레벨에서 적용된다.
▶ NACL은 상태 비저장, SG는 상태를 저장한다.
▶ NACL은 기본적으로 모든 트래픽 허용, SG는 인바운드 트래픽을 기본적으로 거부한다.
7. Web Instance 생성
1) Instance Name, AMI 설정
AWS에서의 AMI 종류 ▶ Quickstart AMIs : AWS에서 만들어 제공하는 기본적인 AMI
▶ My AMIs : 내가 직접 만들어 올린 AMI(도커 허브처럼)
▶ AWS Marketplace AMIs : AWS 이외의 개인, 또는 기업들이 만들어 올려놓고 파는 AMI
▶ Community : 어떤 잡다한 것들이 설치되어 있는지 보안 인증을 거치지 않은 AMI -> 매우 위험!!!!
★ Free tier eligible 표시가 없으면 프리티어 기간이더라도 AMI 사용에 대한 비용이 청구된다
2) Key pair
3) Network 설정
해당 인스턴스를 배포할 네트워크 설정
- VPC : test VPC
- Subnet : Public Sunbet
- Auto-assign public IP : (미지정) 자동으로 Enable 선택됨
- Firewall(security groups) : 기존에 생성했기 때문에 Select existing security group 선택 -> Web Server-SG 
4) User data 설정
User data 항목에 스크립트를 작성해 놓으면 인스턴스가 생성될 때마다 해당 스크립트에 작성된 설정이 적용된다. -> 고정된 작업이 반복되는 경우 유용하다!!

※ AWS Technical Essentials 공인 교육을 받으면서 제공 받은 User data 소스 코드를 이용해 구성하는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#!/bin/bash #This Userdata was tested on Ubuntu Server 20.04 and 22.04 sudo add-apt-repository ppa:ondrej/php sudo apt update # -> 레파지토리 업데이트, apt 업데이트 #Install Util sudo apt -y install unzip #Change Hostname #When creating an EC2 instance, for Allow tags in metadata, select Enabled. NAME_TAG=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/tags/instance/Name` if [[ $NAME_TAG == *"404 - Not Found"* ]]; then NAME_TAG="Web App" fi echo $NAME_TAG | sudo tee /etc/hostname echo $NAME_TAG | sudo tee /proc/sys/kernel/hostname # -> 호스트네임 변경, 서버 이름이 명령창에 뜨도록 # -> 메타데이터라는 곳에 접근을 해야함(인스턴스가 생성되고 나서 인스턴스에 대한 정보, management console 창에서는 보여지는데 운영체제에서는 보이지 않음(가상환경 안에 갖혀있기 때문에), 가상환경에서 바로 접속이 되지 않도록 설정되어 있는 것 # -> 운영체제가 메타데이터에 접근해야 해당 서버의 호스트네임을 불러와 변경하는 방식 #Install apache php sudo apt install -y apache2 sudo apt install libapache2-mpm-itk sudo apt install -y php7.4 sudo apt install -y php-mbstring php-gd php-curl php-xml php-mysql sudo apt install -y php7.4-mysqli # -> 아파치 설치, DB 연동 #Set Environment sudo sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /etc/php/7.4/apache2/php.ini sudo sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /etc/php/7.4/cli/php.ini sudo sed -i 's/short_open_tag = Off/short_open_tag = On/g' /etc/php/7.4/apache2/php.ini sudo sed -i 's/short_open_tag = Off/short_open_tag = On/g' /etc/php/7.4/cli/php.ini sudo service apache2 restart # -> php 명령 수정 #Download Source Code sudo chown ubuntu:ubuntu /var/www/html sudo wget [html, php 등 모든 소스코드 파일 다운 경로] sudo mkdir /var/www/html/basic sudo unzip basic_php7_Load.zip -d /var/www/html/basic sudo sed -i 's/>Security Solution/>'"$NAME_TAG"'/g' /var/www/html/basic/index.php sudo sed -i 's/>Security Solution/>'"$NAME_TAG"'/g' /var/www/html/basic/header.php sudo wget [index.html 파일 다운 경로] sudo cp index.html /var/www/html/ sudo wget [index.php 파일 다운 경로] sudo cp index.php /var/www/html/ sudo chmod 0777 /var/www/html/basic/data # -> 필요한 파일, 설정 다운 및 다운 받은 파일 변경 #Set DB Connection #Change string DBURL to Database Private DNS Endpoint sudo sed -i 's/dbaddress/DBURL/g' /var/www/html/basic/login/dbconn.php sudo service apache2 restart # -> 아직 DB 생성이 안되어서 지금은 이 부분확인 불가
스크립트 내용 중 호스트 네임을 수정하는 코드 부분에 메타데이터를 이용한다. 운영체제가 메타데이터에 접근해 해당 서버의 호스트 네임을 불러와 변경하는 방식으로 이용한다.

5) 인스턴스 생성 확인
8. Web Instance 접속 테스트
Public Subnet에 Auto-assign IP 설정을 하거나, 인스턴스 생성 시 Public IP Enable 설정을 하면 Public address가 부여된다. (이를 과금해서 내가 원하는 ip로 지정하는 Elastic IPs도 가능은 하다)

9. NAT Security Group 생성
1) 원격 접속을 위한 SSH 인바운드 규칙 허용
2) Private Subnet에서 NAT로 보낼 인바운드 TCP 규칙 허용(0~1023 well-known port 오픈 - 위험하기 때문에 VPC 내에서 출발한 패킷만 허용)
3) Private Subnet에서 NAT로 보낼 인바운드 UDP 규칙 허용(0~1023 well-known port 오픈 - 위험하기 때문에 VPC 내에서 출발한 패킷만 허용)
4) Private Subnet에서 테스트로 ping을 보낼 인바운드 규칙 허용(위험하기 때문에 VPC 내에서 출발한 패킷만 허용) 
10. NAT Instance 생성
NAT Gate way를 사용해도 되지만, 생성하는 것만으로 과금이 발생하기 때문에 NAT 역할을 하는 인스턴스를 Public Subnet에 생성해 대신 NAT의 역할을 하도록 할 것이다.
User data 설정(리눅스의 NAT 기능을 통해 NAT 서버의 기능을 하도록 설정)
1) 포워딩 켜기
2) MASQUERADE 설정
3) iptables-services 설치 후 저장(껐다켜더라도 활성화되도록)
11. Change source/destination check 기능 끄기
1) 출발지, 목적지 주소를 체크 해서 조작이 됐다라는 것이 발견되면 차단시키겠다는 기능(기본적으로 켜져 있는 상태로 인스턴스가 생성됨)
2) 해커들이 인스턴스들을 이용해 공격하는 것을 방지하기 위해 만들어진 기능(원하면 끌 수 있음)
3) 해커들이 자기가 어렵게 획득한 다른 시스템의 권한을 획득해 공격하는데, 이때 출발지 주소를 변조해 공격함
4) 그 출발지 주소를 속이는 것이 발견되면 못나가게 막는 기능인데, NAT는 이 기능이 핵심이므로 이 기능 자체를 꺼야 함
-> 꼭 NAT가 아니더라도 가상 머신이 외부로 소스 변환해서 나가야하는 장비의 경우 이 기능을 꺼야 함 
12. Private 라우팅 테이블 생성 및 서브넷 할당
13. DB Security Group 생성
SG 기본정보(이름, 설명, VPC) 및 인바운드 룰 설정
- SSH : My IP를 통해 내 IP에서 SSH 원격 접속 패킷 허용
- MYSQL/Aurora : Web Instance용 SG(Web Server-SG)를 통과하는 패킷을 허용하는 개념으로 Source를 SG로 설정 가능
14. DB Instance 생성
1) DB명, AMI 설정
DB Server 이름으로 ubuntu 22.04 AMI 설정 
2) 인스턴스 타입, Key pair 설정
t2.micro의 인스턴스 타입, 기존에 생성했던 Key pair 사용 
3) Network 설정
VPC, Subnet, SG 설정 (DB는 Private Subnet에 위치하기 때문에 Auto-assign public IP 설정이 Disable이다.) 
4) User data 설정
※ AWS Technical Essentials 공인 교육을 받으면서 제공 받은 User data 소스 코드를 이용해 구성하는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #!/bin/bash #This Userdata is for a MySQL 8.0 and was tested on Ubuntu Server 20.04 and 22.04 sudo apt update # Turn on password authentication for lab challenge echo 'ubuntu:hackers' | sudo chpasswd sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config sudo service sshd restart # -> 인증을 패스워드 기반 인증으로 변경 # ubuntu의 계정 패스워드를 hackers로 변경 후 해당 설정 # (AWS에서는 keypair 기반 원격 접속 인증을 하는데, 이를 패스워드 기반 인증하도록 변경) #Install Util sudo apt -y install unzip #Install mySQL DB sudo apt -y install mysql-client mysql-server #Download query file and run sudo wget [파일 다운 경로] sudo unzip admin_query_MySQL8.zip sudo mysql -uroot < root_query.sql sudo mysql -ucareadmin -phackers care_db < member.sql sudo mysql -ucareadmin -phackers care_db < greet.sql # -> DB 생성, 계정 생성, 계정 권한 부여 설정이 root_query.sql에 저장 # -> careadmin 계정을 이용해 member.sql과 greet.sql이라는 DB를 생성 #sudo chkconfig mysqld on sudo sed -i 's/bind-address\t\t=/#bind-address\t\t=/g' /etc/mysql/mysql.conf.d/mysqld.cnf sudo service mysql restart # -> DB에 쿼리를 보내는 것을 막는 설정을 주석처리
※ Private Subnet에 생성된 인스턴스에 접속하는 방법
1. Bastion Host, 점핑 호스트
- Public Subnet에 관리용 서버를 생성해 이 서버를 경유하여 접속하도록 함
2. SSH 터널링
- Private Subnet에 생성된 인스턴스에 터널을 다이렉트로 뚫어 바로 Key pair 인증 가능
3. VPN
- VPN을 뚫어 Private Subnet 인스턴스에 접근
5) DB Instance 배포
15. Web Instance와 DB Instance 연동
회원가입, 로그인, 게시판 글 작성 모두 가능하다.
























































