1. VPC 생성
Create VPC
test VPC의 이름으로 10.0.0.0/16 CIDR를 가진 VPC 생성
생성 완료
2. IGW 생성 및 Attach
Create internet gateway
testVPC-IGW 이름으로 생성
생성된 IGW를 VPC에 Attach
Attach 할 VPC 선택
Attach 확인
3. Public Subnet, Private Subnet 생성
Create subnet
Public Subnet, Private Subnet 1 생성 확인
Public과 Private의 차이는 라우팅 테이블에 의해 정해지므로 동일한 방법으로 Name과 CIDR만 신경써서 우선 생성한다!
4. Public 라우팅 테이블(Route tables) 생성 및 경로 설정, Subnet 할당
1) Public 라우팅 테이블 생성
Create route table
기본적으로 VPC를 생성하면 Route table도 같이 생성된다.
이 Default route table 사용하지 않고 새로 생성해서 이용할 것이다.
Main 속성에 Yes -> VPC 생성될 때 라우팅 테이블도 즉시 같이 생성됨
▶ 해당 라우팅 테이블이 Public 기본 -> 서브넷 생성 시 해당 라우팅 테이블이 적용되어서 Public의 서브넷이 기본으로 생성되는 것
▶ 해당 라우팅 테이블이 Private 기본 -> 서브넷 생성 시 해당 라우팅 테이블이 적용되어서 Private의 서브넷이 기본으로 생성되는 것
해당 Main 속성의 Yes 값을 가진 라우팅 테이블이 Private이기 때문에 서브넷 생성 시 Private Subnet이 기본적으로 적용되는 것
★ 기본 생성되는 서브넷이 Public이 되는 것보다 Private이 되는 것이 보안 상 더 안전하기 때문에 Default Route table 변경하지 않는 것이 바람직하다!
Public Route 생성
2) Public 라우팅 테이블 경로 추가
생성된 라우팅 테이블에 외부와 통신할 수 있는 IGW 경로를 추가해줘야 한다.
Default 경로를 생성한 IGW로 향하도록 경로 추가
0.0.0.0/0(모든 경로)의 타겟이 IGW인 경로 추가된 것 확인
3) Public 서브넷에 라우팅 테이블 할당
할당된 서브넷 변경
Public 경로(IGW로 향하는)를 가진 라우팅 테이블을 Public Subnet에 할당
해당 서브넷의 라우팅 경로 확인 가능
5. Public Subnet Auto-assign IP 설정
Edit subnet settings
체크로 해당 기능 활성화
Public Sunbet은 당연시하게 공인 IP가 필요하다.
인스턴스를 생성할 때 Public Sunbet에 위치하도록 인스턴스를 생성하면 자동으로 공인 IP를 할당해주는 기능을 활성화 하면 유용하다!!
(이 설정 없이 인스턴스를 생성하면 체크를 별도로 해줘야 한다.)
6. Network ACL & Security Group
1) NACL(Network ACL)
Inbound rules로 모든 경로 허용되어 있다.
Outbound rules로 모든 경로 허용되어 있다.
Security Group에서 세세하게 차단 설정이 가능하기 때문에 NACL은 크게 건드리는 일이 적다.
2) Security Group(SG)
기존의 Default 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 설정
Web Server 1 이름 설정 및 ubuntu22.04 AMI 선택
AWS에서의 AMI 종류
▶ Quickstart AMIs : AWS에서 만들어 제공하는 기본적인 AMI
▶ My AMIs : 내가 직접 만들어 올린 AMI(도커 허브처럼)
▶ AWS Marketplace AMIs : AWS 이외의 개인, 또는 기업들이 만들어 올려놓고 파는 AMI
▶ Community : 어떤 잡다한 것들이 설치되어 있는지 보안 인증을 거치지 않은 AMI -> 매우 위험!!!!
★ Free tier eligible 표시가 없으면 프리티어 기간이더라도 AMI 사용에 대한 비용이 청구된다
2) Key pair
Key pair가 없기 때문에 새로 생성
RSA 타입과 .pem 확장자의 키를 HaksuSecurityKey 이름으로 생성
해당 인스턴스 서버의 공개키를 HaksuSecurityKey로 사용하고 .pem 확장자의 개인키는 호스트 PC에 자동 다운로드
보안을 위해 기본 다운로드 경로가 아닌 개인 폴더에 보관
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 작업을 위한 Advanced details 설정
User data 항목에 스크립트를 작성해 놓으면 인스턴스가 생성될 때마다 해당 스크립트에 작성된 설정이 적용된다.
-> 고정된 작업이 반복되는 경우 유용하다!!
※ AWS Technical Essentials 공인 교육을 받으면서 제공 받은 User data 소스 코드를 이용해 구성하는 것입니다.
#!/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) 인스턴스 생성 확인
인스턴스 생성 확인
(Pending 상태에서 기다렸다가 Running을 확인해야 한다.)
상태 체크도 User data 초기화가 완료되는 것까지 확인해야 한다.
인스턴스 정상 배포 확인
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 내에서 출발한 패킷만 허용)
Name 태그 추가
10. NAT Instance 생성
NAT Gate way를 사용해도 되지만, 생성하는 것만으로 과금이 발생하기 때문에 NAT 역할을 하는 인스턴스를 Public Subnet에 생성해 대신 NAT의 역할을 하도록 할 것이다.
인스턴스명, AMI 설정(Amazon Linux 사용)
t2.micro의 인스턴스 타입, 기존에 생성했던 Key pair 설정
User data 설정(리눅스의 NAT 기능을 통해 NAT 서버의 기능을 하도록 설정)
1) 포워딩 켜기
2) MASQUERADE 설정
3) iptables-services 설치 후 저장(껐다켜더라도 활성화되도록)
11. Change source/destination check 기능 끄기
1) 출발지, 목적지 주소를 체크 해서 조작이 됐다라는 것이 발견되면 차단시키겠다는 기능(기본적으로 켜져 있는 상태로 인스턴스가 생성됨
2) 해커들이 인스턴스들을 이용해 공격하는 것을 방지하기 위해 만들어진 기능(원하면 끌 수 있음)
3) 해커들이 자기가 어렵게 획득한 다른 시스템의 권한을 획득해 공격하는데, 이때 출발지 주소를 변조해 공격함
4) 그 출발지 주소를 속이는 것이 발견되면 못나가게 막는 기능인데, NAT는 이 기능이 핵심이므로 이 기능 자체를 꺼야 함
-> 꼭 NAT가 아니더라도 가상 머신이 외부로 소스 변환해서 나가야하는 장비의 경우 이 기능을 꺼야 함
기능 끄고 저장
12. Private 라우팅 테이블 생성 및 서브넷 할당
생성한 NAT 인스턴스로 향하도록 경로 추가
경로 수정한 라우팅 테이블 서브넷 할당
Private Subnet 1에 할당 후 저장
13. DB Security Group 생성
SG 기본정보(이름, 설명, VPC) 및 인바운드 룰 설정
- SSH : My IP를 통해 내 IP에서 SSH 원격 접속 패킷 허용
- MYSQL/Aurora : Web Instance용 SG(Web Server-SG)를 통과하는 패킷을 허용하는 개념으로 Source를 SG로 설정 가능
Name 태그 추가
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 소스 코드를 이용해 구성하는 것입니다.
#!/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 배포
Pending -> Running 확인 해야 함
User data 초기화 진행 기다려야 한다.
DB 인스턴스 정상 배포
15. Web Instance와 DB Instance 연동
Web Instance에 DB 연동을 위한 경로를 지정해줘야 한다.
지정했던 Key pair 개인키를 이용해 Web Instance 원격 접속
db연동 정보가 담긴 dbconn.php 파일 vi 편집기로 열기
생성한 DB Instance Private IP를 $mysql_hostname 변수에 값으로 입력
연동 에러 문구가 뜨지 않고 연동 성공!
회원가입, 로그인, 게시판 글 작성 모두 가능하다.
'Cloud > AWS(Amazon Web Service)' 카테고리의 다른 글
AWS SAA-C03 일주일 합격 후기 (5) | 2024.03.01 |
---|
개인 공부 목적으로 사용하는 블로그입니다 :)
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!