구름

[3Tier 구축] Web-WAS-DB 3tier in AWS 본문

Cloud/일반

[3Tier 구축] Web-WAS-DB 3tier in AWS

Cloudest 2021. 1. 27. 09:38
 

Cloudest - 블로그 이사했습니다

노션으로 블로그를 옮겼습니다.

흥미로운 포스팅이 올라옵니다!

cloudest.oopy.io

🛠
준비물 : 기본 인프라 생성 능력 및 EC2, RDS등을 주어진 환경에 맞게 생성하고 배치하고 연동할 수 있는 기초능력

시작 전


  • Web - WAS - DB(RDS)의 3Tier 환경 구축 실습 중 처음부터 끝까지 자세하게 적어놓은 포스팅을 찾지 못해서 실습에 어려움을 느끼고 최대한 정리 해 봤다.
  • 개발자가 아니라서 WEB, WAS에 실제 서비스를 올려서 구성하진 못했지만 적어도 연동정도의 경험은 필요하다고 생각해서 실습했다.
  • 아래 주어진 개념도를 따라서 실습했지만 IP대역은 조금 다르다. 또한 너무 많은 서브넷관리가 어렵다면 Public , Private 서브넷만 나눠 놓고 보안그룹에서 Source IP를 확실하게 부여하는 방식으로도 조금 더 간단하게 실습할 수 있다.
  • 이 포스팅은 3Tier 구축에 대한 최소환경 및 최소설정으로 구성하였다.

인프라 생성


인프라 개념도
  • VPC : cloudest (172.31.0.0/16)
  • 서브넷
    • pub-AZ-a : 172.31.0.0/24
      pub-AZ-c : 172.31.1.0/24
      web-AZ-a : 172.31.2.0/24
      web-AZ-c : 172.31.3.0/24
      was-AZ-a : 172.31.4.0/24
      was-AZ-c : 172.31.5.0/24
      db-AZ-a : 172.31.6.0/24
      db-AZ-c : 172.31.7.0/24
  • IGW 생성 및 VPC 연결
  • NAT Instance 생성
  • ALB 생성
    1. Name : ex-LB
      Subnet : pub-AZ-a,c
      SG : external-LB-SG
    1. Name : in-LB
      Subnet : web-AZ-a,c
      SG : internal-LB-SG
  • 보안그룹 생성
    • 모든 보안그룹은 TCP만 허용
    • bastion-SG : allow 22 from 0.0.0.0/0
      External-LB-SG : allow 80 from 0.0.0.0/0
      web-SG : allow 80 from External-LB-SG
      Internal-LB-SG : allow 8080 from web-SG
      was-SG : allow 8080 from Internal-LB-SG
      db : allow 3306 from was-SG
  • 라우팅 테이블 생성 및 서브넷 연결
  • Bastion Host 생성
  • 서버 생성 (2개 생성하는 서버는 가용영역 a,c에 나누어 생성)
    • Web Instance 2개 생성
    • WAS Instance 2개 생성
    • RDS 생성

 

3Tier 서버 설정


  • WEB 서버 동작 확인
    • 인프라 구성
    • WEB 인스턴스 생성 및 Apache 패키지 다운
      sudo yum -y update 
      sudo yum -y install httpd 
      sudo chkconfig httpd on 
      sudo systemctl start httpd
      • 2개의 웹서버에 각각 web1 - web2로 다르게 /var/www/html/index.html 페이지 생성 (로드밸런싱 확인을 위해)
    • 로드밸런서 -대상그룹 등록
      • healty check 확인후 - dns를 통한 접속
        → 로드밸런싱 동작 확인
  • WAS서버 구축
    1. WAS 인스턴스 설치
    1. 자바가 없는 경우 설치 (amazon linux 2에는 안 깔려있다.)
      sudo yum install java-1.8.0-openjdk 
      sudo yum install java-1.8.0-openjdk-devel.x86_64 
      • 환경구성
        $ echo $JAVA_HOME -> 안나타날경우 which를 이용하여 절대경로 확인 
        $ which java 
        /usr/bin/java 
        
        sudo vi /etc/profile <마지막부분에 기입> 
        
        export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.amzn2.0.1.x86_64/jre 
        export PATH=$PATH:$JAVA_HOME/bin 
        export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar 
        export CATALINA_HOME=/usr/local/src/tomcat8.5 
        
        source /etc/profile 으로 변경 적용 
        → 설정적용 확인
    1. 톰캣 설치
      wget https://downloads.apache.org/tomcat/tomcat-8/v8.5.61/bin/apache-tomcat-8.5.61.tar.gz 
      tar -xvf apache-tomcat-8.5.61.tar.gz 
      mv apache-tomcat-8.5.61 /usr/local/src/tomcat8.5 
      • vi 에디터로 server.xml을 편집
        vi /usr/local/src/tomcat8.5/conf/server.xml 
        
        <Connector port="8080" protocol="HTTP/1.1" 
        		URIEncoding="UTF-8" -> 이부분을 추가 
                connectionTimeout="20000" 
                redirectPort="8443" /> 
                
        sudo /usr/local/src/tomcat8.5/bin/startup.sh -> 실행
    1. 대상그룹 등록
      로드 밸런서의 대상(Target) 상태가 healthy여야 정상적으로 로드밸런싱 되는 것이다.

     

  • WAS와 Proxy 설정을 통한 WEB-WAS 연동 (mod proxy 사용)
    1. mod_proxy를 이용하면 mod_jk 는 ttl을 이용하지 못한다.
    1. mod_proxy의 pass를 이용해 로드밸런서로 전달가능참고 포스팅 : https://kchanguk.tistory.com/
    //WEB에서 vi /etc/httpd/conf/httpd.conf 에서 맨아래 다음과 같이 추가하기
    
    <VirtualHost *:80> 
    ServerName [external 로밸 DNS] 
    ErrorLog logs/counterjp.fureweb.com-error_log 
    ProxyRequests Off ->리버스 프록시 모드 
    ProxyPreserveHost On ->was로 리다이렉트할시 host정보 함께 전달 
    
    <Proxy *> 
    Order deny,allow -> 명령 우선순위 deny ->allow 
    Allow from all -> 서버 접근 허용 
    </Proxy> 
    
    #ProxyPass / http://[internal 로밸 DNS]:8080/ 
    ProxyPassMatch ^/(.*\.do)$ http://[internal 로밸 DNS]:8080/ 
    ProxyPassMatch ^/(.*\.jsp)$ http://[internal 로밸 DNS]:8080/ 
    ProxyPassReverse / http://[internal 로밸 DNS]:8080/ 
    </VirtualHost> 
    // WAS에서 vi /usr/local/src/tomcat8.5/webapps/ROOT/test.jsp 에 다음과 같이 추가
    
    <%@ page language="java" contentType="text/html; charset=UTF-8" 
    	pageEncoding="UTF-8"%> 
        
    <!DOCTYPE html> 
    <html> 
    <head> 
    <meta charset="UTF-8"> 
    <title>JSP Test scriptlet.jsp</title> 
    </head> 
    <body> 
    		<% int i = 24; %> 
            <% 
            		out.println("was1하루는 " +i +"시간이며,<BR>"); 
                    out.println("was1하루는 " + i * 60+" 분 입니다."); 
            %> 
    </body> 
    </html>
    외부 ELB에 /test.jsp 경로로 접속했을 때 내부 ELB를 타고 WAS에 접근 성공
  • DB연동
    1. mysql RDS생성
    1. 파라미터 생성 - 한글 패치
    1. WAS 홈 디렉터리에 /usr/local/src/tomcat8.5/webapps/ROOT/dbcon.jsp생성
      <%@ page import = "java.sql.*" %> 
      <% 
      		Statement stm = null; 
              ResultSet rs = null; 
              Class.forName("com.mysql.jdbc.Driver"); 
              String myUrl = "jdbc:mysql://[RDS엔드포인트]/[Database 이름]"; 
              Connection conn = DriverManager.getConnection(myUrl, "admin", "[PW]"); 
              try { 
              		stm = conn.createStatement(); 
                      if(stm.execute("select * from user")) { 
                      		rs = stm.getResultSet(); 
                      }
              		while(rs.next()) { 
                              out.println(rs.getString("userID")); 
                              out.println(rs.getString("userPassword")); 
                              out.write("<br>"); 
              } 
              rs.close(); 
              stm.close(); 
              } 
      catch(Exception e) {
      		out.println("rs.next() ERROR");
      } 
      conn.close(); 
      %>
    1. mysql-connector 다운 (mysql 5.5 이상은 최신버전커넥터사용하면된다)https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.22.tar.gz
    1. tar -xvf로 압축풀고 디렉토리 내부에 mysql-connector-java-8.0.22.jar파일을 usr/lib/jvm/jre/lib/ext/mysql-connector-java-8.0.22.jar 해당경로로 복사
      • 커넥터 → /lib/jvm/openjdk/lib , /usr/local/tomcat/lib
      • /usr/local/src/tomcat8.5/bin/shutdow.sh → /usr/local/src/tomcat8.5/bin/startup.sh
    1. 워크밴치로 접속하여 쿼리 확인
    1. 작성된 db.jsp 파일을 통해 해당 정보 추출
      → 연동됨을 확인했다.
    1. WAS와 DB가 연동 된 것을 확인할 수 있다. WEB은 WAS와 연동되었으므로 WEB을 통해 DB까지 3Tier 연동이 된 것을 확인했다.
  • 회원가입을 통한 DB 쿼리 동작 확인 (WEB에서 입력한 값을 WAS가 처리해 DB에 저장)
    • 이 부분은 직접 실험해보진 못했다.
    • 회원가입 페이지
      vi /usr/local/src/tomcat8.5/webapps/ROOT/login.jsp 
      
      <%@ page contentType="text/html;charset=UTF-8" %> 
      <HTML>
      <HEAD><TITLE>회원 입력</TITLE></HEAD> 
      <BODY bgcolor=white>
      <FORM action="join.jsp" method="post">
      <font color=gray> 
      아이디 : <INPUT type="text" name="id" maxlength="8"><BR>
      암호 : <INPUT type="password" name="pwd" maxlength="8"><BR> 
      <INPUT type="submit" value=" 저 장 "></font> 
      </FORM> 
      </BODY>
      </HTML>
    • db전송 페이지
      <%@ page contentType="text/html;charset=utf-8" import="java.sql.*" %> 
      
      <% 
      request.setCharacterEncoding("utf-8"); //Set encoding 
      //INPUT.JSP 페이지로부터 받아온 파라미터를 각각 get메소드로 가져옴 
      String userID = request.getParameter("userID");
      String userPassword = request.getParameter("userPassword"); 
      //POST로 Input.html로부터 입력받은 내용을 변수화 
      try{ 
          //jdbc 참조변수 준비 
          PreparedStatement pstmt = null; 
          //드라이버 로딩 
          Class.forName("com.mysql.jdbc.Driver"); 
          String url = "jdbc:mysql://[RDS엔드포인트]"; 
          //db연동 
          Connection con = DriverManager.getConnection(url,"admin","[PW]"); 
          //SQL준비 
          String query = "INSERT INTO user(userID, userPassword) VALUES(?,?)"; 
          //prepareStatement 가 객체의 동일한 질의문을 특정값만 바꾸어서 여러번 실행할시유용 
          //Statement 객체는 단순 질의문 사용에 적합 
          pstmt = con.prepareStatement(query); 
          pstmt.setString(1, userID); 
          pstmt.setString(2, userPassword); 
          //실행 
          pstmt.executeUpdate(); 
          //JDBC자원닫기
          pstmt.close(); 
          con.close(); 
      }
      catch(Exception e){ 
      	out.println( e ); 
      } 
      response.sendRedirect("db.jsp"); 
      %>

결론


  • WEB-WAS-DB 3Tier 구조를 생성했다. 사용자는 WAS, DB에 직접적인 접근을 하지 못하고 관리자가 원하는 기능만 WEB서버를 통해 접근할 수 있다.
  • 3Tier 구축이 가능하게만 설정했지만 완성 된 3Tier가 연동, 접근제어되는 환경의 보안그룹, 로드밸런서, 서브넷과 같은 환경의 역할을 잘 이해하면 좋을 것 같다.

'Cloud > 일반' 카테고리의 다른 글

AWS Session Manager (SSM) - Windows Server  (0) 2021.02.26
Amazon WorkSpaces에 MFA 연동하기  (0) 2021.02.17
AWS RDS (MS-SQL) 설치 및 사용 방법  (0) 2021.01.19
AWS Backup  (0) 2021.01.19
VPC 피어링  (0) 2021.01.17
Comments