EC2에 웹 서버를 올리고 웹 서비스를 서비스해보도록 할게요. 지금까지 포스팅한 거 짜깁기
- EC2 instance 생성
- 웹 서버 설치
- SG / NACL 설정
EC2 instance 생성 / 삭제
Free Tier 적용 범위
이미 EC2 instance를 생성했으면 또 생성할 필요는 없어요. 새로운 instance를 생성하고 새로운 마음으로 시작하고 싶다면 새로운 instance를 생성해도 괜찮아요. Free tier를 적용받고 있다면 t2.micro 혹은 t3.micro 인스턴스를 750h/M 동안 무료로 사용할 수 있어요.
24h*31=744h 이니까 한 달 내내 켜놔도 무료로 사용할 수 있는 시간을 넘기지 않아요. 그리고 2개의 t2.micro 혹은 t3.micro 인스턴스를 보름 동안만 켜놓는 것도 가능해요. 하지만 한 달 동안 750개의 인스턴스를 한 시간만 딱 쓰겠다. 는 안 돼요. 왜 안 되는지는 나중에 이야기해볼게요.
Instance 생성
EC2 instance 생성을 어떻게 하는지 모른다? 하면 아래 포스트를 참조해주세요.
2022.02.14 - [AWS] - Amazon EC2 - Launch an Instance
Amazon EC2 - Launch an Instance
Amazon EC2 instance 만드는 방법 Amazon EC2 instance 연결 Amazon EC2 instance 만드는 방법 Amazon EC2 instance를 만드는 방법은 여러 가지가 있어요. aws cli를 통해서 만들 수도 있고 rest api를 통해서..
xodwkx2.tistory.com
Instance 중지/삭제
실행 중인 EC2 Instance는 중지, 재부팅 혹은 삭제(종료)할 수 있어요. 중지/삭제하려고 하는 인스턴스의 체크박스를 누르고 상단 메뉴에서 Stop instance / Terminate instance를 누르면 끝이에요. 인스턴스를 중지하는 것과 삭제(종료)하는 것에 대한 자세한 내용은 아래 링크에서 확인 가능해요.
인스턴스 수명 주기 - Amazon Elastic Compute Cloud
인스턴스를 재부팅해도 running 상태로 남아있기 때문에 새 인스턴스 청구 기간이 시작되지 않습니다.
docs.aws.amazon.com
간단하게 큰 차이점만 이야기하면 중지했다가 다시 시작하면 인스턴스는 private IP는 유지하지만 public IP는 변경돼요. 혹시 Elastic IP를 사용 중이라면 public IP는 변경되지 않지만 중지된 인스턴스에 할당된 Elastic IP는 인스턴스가 중지되어있어도 계속 과금이 돼요.
웹 서버 설치
웹 서버는 종류가 참 많아요.
Apache, IIS, Lighttpd, NGINX, Node.js... 물론 이중에 가장 많이 쓰이는 건 Apache와 NGINX일 것 같네요. Node.js를 사용해서 웹 서버를 구성해보도록 할게요. 아. 이 것도 이미 docker image 만들기 때 해봤네요. 오늘은 배포한 EC2에 설치하고 바로 실행해볼게요.
Node.js 설치
Node.js LTS (16.x)를 설치할게요. ec2-user는 root는 아니니까 아래 명령어를 복붙 해주세요.
# No root privileges
curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
그러면 아래와 같이 출력이 나오고
## Run `sudo yum install -y nodejs` to install Node.js 16.x and npm.
## You may run dnf if yum is not available:
sudo dnf install -y nodejs
## You may also need development tools to build native addons:
sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install yarn
시키는 대로 nodejs 패키지를 설치해주세요. 그리고 설치가 잘 되었는지 확인하고 오늘은 express-generator를 사용해서 express project를 생성해볼게요. 그리고 바로 실행까지 해주세요.
Express 프로젝트 생성
sudo yum install -y nodejs
node -v
npm -v
npx express-generator --pug ec2webserver
cd ec2webserver
npm i
DEBUG=ec2webserver:* npm start
위와 같이 실행하면 포트 3000번으로 express 웹 서버가 오픈돼요. 그럼 브라우저에서 접속을 해볼까요?
브라우저 주소 창에 {EC2 인스턴스의 public IP}:3000 하면 열리지 않아야 해요. 물론 EC2를 만들 때 네트워크 설정에서 아래 그림에 강조된 HTTP, HTTPS 트래픽을 허용한다고 체크하셨어도 안 돼야 정상이에요.
그럼 이제 Securigy Group과 Network ACL 설정을 하러 가볼까요?
SG / NACL 설정
아래 그림과 같이 EC2 Dashboard에서 해당 EC2를 선택하고 Security 탭을 봐주세요.
EC2 인스턴스를 만들면서 함께 자동 생성된 launch-wizard-2 시큐리티 그룹을 선택해주세요.
인바운드 룰을 선택해 주시고 에디트 버튼을 눌러서 수정해줄게요.
웹서비스니까 80 포트를 열어주세요. Source를 0.0.0.0/0로 설정해서 어디서든 접속이 가능하게 하는 것도 잊지 말아 주시고요. 저장해주세요.
PREROUTING?
이제 한 가지 설정을 더 해줘야 해요. 우리 웹 서버는 port 3000번을 열고 응답을 기다리고 있어요. 그리고 SG에서는 TPC Port 80을 허용해 놓았고요. 이제 이 두 포트를 iptables의 prerouting 설정을 통해서 port 80으로 들어오는 패킷은 port 3000으로 prerouting 해 줄 거예요. 이렇게 하는 이유는 두 가지예요. 첫째로 브라우저에서 포트 번호를 따로 넣는 건 귀찮아요. 그리고 두 번째로 리눅스 안에서 1024 아래 포트 번호를 오픈하려면 root 권한이 필요해요. 그럼 설정을 해볼까요? 먼저 iptables의 NAT 테이블에 어떤 설정이 들어있는지 확인해볼게요.
[ec2-user@ip-172-31-8-6 ~]$ sudo iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
아무것도 없네요. 이제 아래 명령어를 통해 tcp 프로토콜로 port 80으로 들어오는 패킷은 port 3000으로 prerouting 한다는 정책을 넣어주도록 할게요. 그리고 다시 확인을 해보면 아래와 같이 PREROUTING 체인에 redirect 정책이 들어간 것을 확인할 수 있어요.
[ec2-user@ip-172-31-8-6 ~]$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
[ec2-user@ip-172-31-8-6 ~]$ sudo iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 3000
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
트래픽 흐름을 VPC까지 확장해서 다시 한번 생각해볼게요. EC2 instance(EC2 Web Server)의 public IP(:80)으로 패킷이 Internet Gateway에 도착하면 igw는 public IP를 EC2 Web Server의 private IP로 NAT 해서 172.31.8.6 주소의 port 80으로 패킷을 전달하면 EC2 Web Server는 이 패킷을 받아서 dst port 가 80인 것을 확인하고 이 패킷을 port 3000으로 REDIRECT 해요. 그래서 EC2 Web Server의 public IP(혹은 public dns)를 웹 브라우저에서 열면
이렇게 뒤에 포트 번호를 붙이지 않아도 웹페이지가 잘 나오는 것을 볼 수 있어요.
이렇게 EC2 Instance에 웹 서버를 올리고 웹 서비스를 서비스하는 것을 해봤어요.