# aws를 사용한 다음날에는 꼭 과금이 얼마 됐는지 확인


NAT-GW

  • 프라이빗 서브넷에 대해 아웃바운드 트래픽만 허용하고 싶을 때 구성
  • 프라이빗 서브넷 대역을 퍼블릭 대역으로 NAT하는 개념
    = 퍼블릭 서브넷에 있으면 외부(outbound)로 통신되니까

# 사실 VPC에 존재하는 자원들이 통신이 되냐 안되냐의 차이는 기본적으로 공인아이피가 있냐 없냐로 볼 수 있음. 공인아이피를 달고있는 서버가 IGW를 next-hop으로 라우팅이 되어있다면(=퍼블릭서브넷에 있다면) 인바운드, 아웃바운드 다 된다. 마찬가지로 프라이빗 서브넷에 존재하는 서버가 외부로 통신이 안되는 이유는 공인아이피도 없고 라우팅도 안되어있기때문이다. 따라서 아웃바운드라도 가능하게 하기위해서 NAT-GW에 EIP를 붙여서 PAT를 해준다고 생각하면 좋다.

 

고정된 공인IP(Elastic IP, EIP) 필요

주의사항) NAT-GW는 퍼블릭 서브넷에 존재한다
                과금이 많이 되니까 주의(시간당기본요금 + 트래픽요금 + EIP요금)

NAT-GW 생성


 

 


실습)

pri-srv를 프라이빗 서브넷에 하나 만들고, bastion을 퍼블릭 서브넷에 하나 만든다음 scp로 bastion 서버에 pem파일을 전송해보세요. 전송한 pem파일로 pri-srv에 접근해서, 패키지(nginx)가 다운로드되는지 확인해보세요. 외부에서는 웹속이 안되지만, bastion에선 curl로 통신이 되는걸 확인해보세요!
  • 로컬 컴퓨터(cmd)
root@ip-10-10-1-126:~# vi aws8.pem
root@ip-10-10-1-126:~# chmod 600 aws8.pem
root@ip-10-10-1-126:~# scp -i ~/aws8.pem ~/aws8.pem ubuntu@3.35.51.78:~/.ssh/

# bastion-srv의 pub IP: 3.35.51.78

  • bastion srv
ubuntu@ip-10-10-1-126:~$ ssh -i ~/aws8.pem ubuntu@10.10.1.85
ubuntu@ip-10-10-1-126:~$ sudo apt install -y nginx
ubuntu@ip-10-10-1-126:~$ curl ubuntu@10.10.1.85

# pri-srv의 pri IP: 10.10.1.85

풀이)

윈도우에서 pem파일이 있는 경로를 복사한다음, cmd창을 관리자권한으로 연다.

root@ip-10-10-1-131:/home/ubuntu# scp -i aws8.pem aws8.pem ubuntu@
root@ip-10-10-1-131:/home/ubuntu# chmod 400 aws8.pem
  • pri-srv 생성

  • 생성한 서버로 ssh 접속
root@ip-10-10-1-131:/home/ubuntu# ssh -i aws8.pem ubuntu@10.10.2.173
  • 웹서버 설치
root@ip-10-10-2-173:~# apt install -y nginx

# NAT-GW가 구성되어있기때문에 아웃바운드 트래픽이 가능하다. 

# bastion에서도 접속이 잘 된다.


NAT-GW 제거

  • nat-gw가 걸려있는 라우팅테이블의 정책부터 삭제

  • nat-gw 삭제

  • 삭제 후에 EIP도 삭제


실습)

172.16.0.0 /16 대역에 tom-vpc를 생성하여

web-was-db 3 tier를 구성해보세요.

각 티어별로 서브넷을 생성하고 최소 두개의 가용영역(a,c)을 갖게 하세요.

 

web서버는 퍼블릭 서브넷,

was-db는 프라이빗 서브넷.

was는 톰캣, db는 rds를 쓰세요!

 

web은 tom-web.pem

was는 tom-was.pem 키페어를 쓰도록하세요.

 

was 인스턴스는 web대역을 허용, db는 was 대역에서의 접속만 허용.

RDS의 포트는 33306으로 하세요!


- VPC 생성

# RDS 만들 때 꼭 필요함

- 서브넷 생성

  • web: pub / was, db: pri
  • VPC ID: tom-vpc / 가용영역: a, c

- 라우팅 테이블 생성

  • tom-vpc-pub-rt 생성 후 명시적 서브넷 연결 편집
    - web-pub-sub1, web-pub-sub2 추가 

  • vpc를 만들면 자동으로 생성됐던 라우팅 테이블 tom-vpn-pri-rt로 변경

- IGW 생성

  • IGW를 VPC에 연결

  • tom-vpc-pub-rt에 IGW 추가

- NAT-GW 생성

  • tom-vpc-pri-rt에 NAT-GW 추가

- 보안그룹 생성

  • web-sg 생성

# 아웃바운드: 모든 트래픽, 0.0.0.0/0

  • was-sg 생성

# 아웃바운드: 모든 트래픽, 0.0.0.0/0

- 인스턴스 생성

  • tom-web.pem, tom-was.pem 생성

1. web

애플리케이션 및 OS 이미지: red hat

키 페어: tom-web

WEB의 공인 주소 = WEB public IP = 3.38.107.223

WEB의 서버 주소 = WEB private IP = 172.16.10.136

2. was

애플리케이션 및 OS 이미지: red hat

키 페어: tom-was

WAS의 서버 주소 = WAS private IP = 172.16.32.37

- 서브넷 그룹 생성

- RDS 생성


Web 접속

  • web의 퍼블릭 IP(3.38.107.223)에 tom-web.pem 키로 연결

[ec2-user@ip-172-16-10-136 ~]$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=48 time=27.7 ms
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 27.709/27.709/27.709/0.000 ms

WAS 접속

  • web에 tom-was.pem 키 생성 후 was로 ssh 연결
[ec2-user@ip-172-16-10-136 ~]$ vi tom-was.pem
[ec2-user@ip-172-16-10-136 ~]$ ssh -i tom-was.pem ec2-user@172.16.32.37
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[ec2-user@ip-172-16-10-136 ~]$ chmod 600 tom-was.pem
[ec2-user@ip-172-16-10-136 ~]$ ssh -i tom-was.pem ec2-user@172.16.32.37

tomcat 구축

  • was 셀리눅스 끄기
[ec2-user@ip-172-16-32-37 ~]$ sudo -i
[root@ip-172-16-32-37 ~]# setenforce 0
  • openjdk11과 wget, unzip을 설치
[root@ip-172-16-32-37 ~]# yum install -y java-11-openjdk wget unzip
[root@ip-172-16-32-37 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-10/vin/apache-tomcat-10.1.35.zip
[root@tomcat ~]# unzip apache-tomcat-10.1.35.zip > /dev/null
[root@tomcat ~]# mv apache-tomcat-10.1.34/ tomcat
[root@tomcat tomcat]# chmod 777 -R /root/tomcat
[root@ip-172-16-32-37 ~]# cd tomcat
[root@tomcat tomcat]# sh ./bin/startup.sh

 안될 경우 인터넷 연결 확인, NAT GW 생성 후 tom-vpc-pri-rt 라우팅에 추가했는지 확인 

# 아래를 통해  진행상황 확인
# [root@ip-172-16-32-37 tomcat]# curl localhost:8080
  • 아래 내용을 수정하여 dbtest.jsp 파일 생성
cat <<EOF > dbtest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<h1>DB</h2>
<%
        Connection conn=null;
        try{
                String Url="jdbc:mysql://<DB주소>/<DB이름>";
                String Id="<DB유저>";
                String Pass="<유저암호>";

                Class.forName("com.mysql.jdbc.Driver");
                conn=DriverManager.getConnection(Url,Id,Pass);
                out.println("was-db Connection Success!");
        }catch(Exception e) {
                e.printStackTrace(); 
}
%>

EOF
  • DB사용자: admin
  • DB사용자암호: test1234
  • DB이름: testdb
[root@tomcat ~]# vi dbtest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<h1>DB</h2>
<%
        Connection conn=null;
        try{
                String Url="jdbc:mysql://database.cdgocownortheast-.rds.amazonaws.com/testdb";
                # String Url="jdbc:mysql://<DB주소>/<DB이름>";
                # DB주소 = RDS의 DB 앤드포인트: database.cdgocownortheast-.rds.amazonaws.com
                String Id="admin";
                String Pass="test1234";

                Class.forName("com.mysql.jdbc.Driver");
                conn=DriverManager.getConnection(Url,Id,Pass);
                out.println("was-db Connection Success!");
        }catch(Exception e) {
                e.printStackTrace();
}
%>
[root@ip-172-16-32-37 tomcat]# mv dbtest.jsp /root/tomcat/webapps/ROOT
[root@ip-172-16-32-37 tomcat]# wget https://repo1.maven.org/maven2/mysql/mector-java/8.0.23/mysql-connector-java-8.0.23.jar
[root@ip-172-16-32-37 tomcat]# mv mysql-connector-java-8.0.23.jar /root/to
[root@ip-172-16-32-37 tomcat]# ./bin/shutdown.sh
[root@ip-172-16-32-37 tomcat]# ./bin/startup.sh
  • mysql 패키지 설치
[root@ip-172-16-32-37 ROOT]# yum install -y mysql
  • DB 접속 시도
[root@ip-172-16-32-37 ROOT]# mysql -u admin -ptest1234 -h database.cdgocownortheast-.rds.amazonaws.com -P 33306

# RDS의 DB 앤드포인트: database.cdgocownortheast-.rds.amazonaws.com

보안그룹을 열어야 DB로 접근이 가능하다

  • 보안그룹 활성화

  • 인바운드 규칙 편집

  • 포트번호 33306으로 수정

# 접속 시 db까지 잘 보임

  • 내용 확인
[root@ip-172-16-32-37 ROOT]# curl localhost:8080/dbtest.jsp
<h1>DB</h2>
was-db Connection Success!

Web 접속

  • web의 퍼블릭 IP(3.38.107.223)에 tom-web.pem 키로 연결 후 셀리눅스 끄기
[ec2-user@ip-172-16-10-136 ~]$ sudo -i
[root@ip-172-16-10-136 ~]# setenforce 0
  • httpd 패키지 설치
[root@ip-172-16-10-136 ~]# yum install -y httpd
[root@ip-172-16-10-136 ~]# systemctl restart httpd
[root@ip-172-16-10-136 ~]# systemctl enable httpd
[root@ip-172-16-10-136 ~]# vi /etc/httpd/conf/httpd.conf
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<VirtualHost *:80> # 80번 포트로 들어오는 모든 ip에 대한 설정
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass /test http://172.16.32.37:8080
    ProxyPassReverse /test http://172.16.32.37:8080
# WAS의 서버 주소 = WAS private IP = 172.16.32.37


</VirtualHost>
[root@ip-172-16-10-136 ~]# systemctl restart httpd
[root@ip-172-16-10-136 ~]# systemctl enable httpd
  • 내용 확인
[root@ip-172-16-10-136 ~]# curl 3.38.107.223/test
<h1>DB</h2>
was-db Connection Success!

# 3.38.107.223/test


풀이)

  • 서브넷

1. AZ-A(ap-northeast-2a)

pub-sub1 172.16.1.0/24

pri-sub1 172.16.2.0/24

db-sub1 172.16.3.0/24

 

2. AZ-C(ap-northeast-2c)

pub-sub2 172.16.11.0/24

pri-sub2 172.16.12.0/24

db-sub2 172.16.13.0/24

 

서브넷 설정 편집 및, VPC설정 편집도 꼭 반드시 해준다!!!

(자동으로 IP 및 영문주소 받기, vpc 호스트네임 활성화)

 

# RDS 생성할때 신경써야되는 부분

  • RDS에 적용시킬 보안그룹

  • WAS에 적용시킬 보안그룹

  • web에 적용시킬 보안그룹

 

  • RDS의 주소
database-1.cfuh4lfzteua.ap-northeast-2.rds.amazonaws.com
  • tom-web 서버 생성

# NAT-GW 생성

  • was 서버 주소

172.16.2.36

root@ip-172-16-2-36:~# apt install -y openjdk-11-jdk

# db로 연동되는걸 확인

 

tom-web에서 리버스프록시 구성

 

방법1) cent9에서

[root@ip-172-16-1-229 ~]# yum install -y httpd
[root@ip-172-16-1-229 ~]# vi /etc/httpd/conf/httpd.conf

web서버에서 was의 dbtest는 잘 불러와졌는데 안된다  리버스프록시 의심

리버스프록시도 잘 한 것 같은데 안된다 → 방화벽, 셀리눅스 의심

방법2) ubuntu에서 apache2(=centos의 httpd)를 설치

방법3) ubuntu에서 nginx로 리버스프록시 구성