0부터 시작하는 AWS 공부 - 3 Tier 구축 3편 - DataBase

Jaehong Lee·2023년 4월 4일
2
post-thumbnail

1. DB

DB 보안그룹 및 인스턴스 생성

  • DB 인스턴스용 보안그룹을 생성하자. WAS 서버로부터 3306 포트에 대한 접근을 허용한다
  • Bastion 서버에서의 SSH 접속도 허용해주자
  • 보안 그룹은 Stateful하므로 응답에 대한 아웃바운드 규칙을 따로 지정하지 않아도 된다. 그러므로 아웃바운드 규칙은 모두 삭제하자

  • 단, MYSQL 설치 작업에서 소스 파일을 외부에서 다운 받아야 하므로, 설치 과정 중에만 아웃바운드를 모두 허용으로 설정하자. 설치가 끝나면, 해당 아웃바운드 규칙을 삭제하자

Bastion Host 보안그룹

  • Bastion Host 보안그룹에 DB 서버로 SSH 접속을 할 수 있도록 아웃 바운드 규칙을 추가하자

WAS 보안그룹

  • WAS 보안그룹에 DB 서버의 MYSQL에 접근할 수 있도록 아웃바운드 규칙을 수정하자

자 이제 보안그룹 설정은 모두 끝났다!!

  • DB 인스턴스를 생성해주자

MySql 5.7 소스 설치

DB 인스턴스에 접속하자

sudo groupadd mysql
sudo useradd -g mysql -s /bin/bash -m mysql
  • MYSQL 계정을 생성해주자
sudo yum install -y --allowerasing gcc gcc-c++ openssl curl autoconf ncurses-devel bison zlib curl bzip2-devel rpcgen libtirpc libtirpc-devel cmake
  • 필요 패키지들을 설치해주자
  • allowerasing : 종속성 해결을 위해 기존 설치된 패키지를 삭제하고 종속성이 해결된 패키지를 설치하는 옵션
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.23.tar.gz
tar xvf mysql-boost-5.7.23.tar.gz
cd mysql-5.7.23
  • mysql 소스 파일을 다운 받아 압축 해제 후 이동하자
sudo cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql57 -DMYSQL_DATADIR=/usr/local/mysql57/data -DMYSQL_UNIX_ADDR=/usr/local/mysql57/mysql.sock -DSYSCONFDIR=/usr/local/mysql57 -DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 \-DWITH_INNOBASE_STORAGE_ENGINE=1 \-DWITH_ARCHIVE_STORAGE_ENGINE=1 \-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \-DDOWNLOAD_BOOST=0 -DWITH_BOOST=./boost 
  • cmake를 이용해 MAKEFILE을 생성하자
sudo make && sudo make install
  • MAKEFILE을 이용하여 설치를 해주자
  • make : makefile에 따라 코드를 컴파일하여 설치 파일 생성
  • make install : make 를 통해 만들어진 설치 파일을 시스템 디렉토리에 설치

MySql 설정

# sudo vi /usr/local/mysql57/my.cnf
[mysqld]
port=3306
# basedir=/usr/local/mysql57
# datadir=/usr/local/mysql57/data
# pid-file=/usr/local/mysql57/mysqld.pid
# log_error=/usr/local/mysql57/mysql_error.log
# lc-messages-dir=/usr/local/mysql57/share

init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
character-set-server=utf8
collation-server=utf8_general_ci
# table_cache=1024
max_connections=2048
max_user_connections=500
max_connect_errors=10000
wait_timeout=300
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 5M
slow_query_log
long_query_time=3
max_allowed_packet=16M
sort_buffer_size = 2M
# skip-innodb
skip-name-resolve
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8
  • my.cnf 파일을 만들고, 위 내용을 추가해주자
  • my.cnf는 유닉스 계열에서 MySql 서버의 설정 파일이다
sudo chown -R mysql:mysql /usr/local/mysql57
  • MySql이 설치된 디렉토리를 위에서 생성한 mysql 계정으로 권한을 수정하자
cd /usr/local/mysql57
bin/mysql_install_db --no-defaults --user=mysql --datadir=/usr/local/mysql57/data --basedir=/usr/local/mysql57 -v
  • MySql 데이터 베이스를 설치하여 초기화 하자
# sudo vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql57/bin
export PATH
  • bash_profile에 들어가 환경 변수를 추가하자
source ~/.bash_profile
  • 추가한 환경 변수 설정을 적용하자

MySQL 서비스 등록 및 실행

sudo cp /usr/local/mysql57/support-files/mysql.server /etc/init.d/mysqld57
  • mysql.server 파일을 /etc/init.d 디렉토리에 복사하자
# sudo vi /etc/init.d/mysqld57
basedir=/usr/local/mysql57
datadir=/usr/local/mysql57/data
  • 서비스 파일에 들어가서 MySql 설치 디렉토리와 데이터 디렉토리 경로를 설정해주자
sudo chkconfig --add mysqld57
sudo chmod +x /etc/init.d/mysqld57
sudo chkconfig --level 345 mysqld57 on
  • 서비스 파일을 이용하여 서비스를 등록하자
  • chkconfig 는 리눅스 서버가 부팅될 때 실행될 프로그램을 설정한다. 부팅시 자동으로 스크립트를 실행하여 특정 데몬을 시작시킨다
  • 프로그램을 추가하고, 서비스 파일에 실행 권한을 주자
  • 런레벨 3 ( Cli 환경 ), 4 ( 사용 안함 ), 5 ( GUI 환경 )으로 부팅 시 자동 실행되게 설정하자
sudo service mysqld57 start
  • MySql을 실행하자

MySql 접속 및 비밀번호 변경

cat /root/.mysql_secret
  • MySql 5.7 부터는 root 임시 비밀번호를 발급해준다. 해당 비밀번호를 확인하자
bin/mysql -u root -p
  • root 계정으로 접속하자. 비밀번호는 위에서 확인한 임시 비밀번호를 입력하면 된다
ALTER USER 'root'@'localhost' IDENTIFIED BY 'test123';
flush privileges;
  • root 계정에 대한 비밀번호를 변경하고, 적용하자
  • 비밀번호를 임시 비밀번호에서 변경해야지 MySql을 사용할 수 있다

  • 이제 MySql을 사용할 수 있다

  • 서비스 포트 번호도 확인하자

DB 원격 접속용 계정 생성

Tomcat에서 접속용 계정을 만들자

CREATE USER tomcatuser@10.0.118.77 identified by 'test123';
CREATE USER tomcatuser@10.0.118.87 identified by 'test123';

GRANT SELECT ON *.* TO tomcatuser@10.0.118.77 identified by 'test123';
GRANT SELECT ON *.* TO tomcatuser@10.0.118.87 identified by 'test123';

# 권한 변경 사항 적용
flush previleges;
  • 2 개의 WAS 서버에서 접속할 tomcat 유저 계정을 만들자
  • WAS 에서 데이터 조회만 할 것이므로, 모든 데이터베이스와 테이블에 대해 Select 권한만 주자

  • 잘 생성되었다

MySql 원격 접속 설정

[root@ip-10-0-118-105 mysql57]# sudo netstat -ntlp | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      1930/mysqld
  • 현재 MySql Server의 Listen Ip를 확인하자
# vi /usr/local/mysql57/my.cnf
bind-address = 0.0.0.0
  • 모든 IP 대역에서 원격 접속이 가능하게 허용하자. 인스턴스 보안그룹에서 특정 IP로부터의 트래픽만 허용하기 때문에 0.0.0.0으로 설정해도 된다
sudo service mysqld57 restart

[root@ip-10-0-118-105 mysql57]# sudo netstat -ntlp | grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      3000/mysqld
  • 설정 변경 사항을 적용하고, Listen Ip를 확인하자

MySql Table 생성

create database TOMCATDB;
use TOMCATDB;
  • TOMCATDB 데이터베이스를 생성하고, 들어가자
 CREATE TABLE TESTTABLE( id Int(11) NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, location VARCHAR(20) NOT NULL, CONSTRAINT TESTTABLE_PK PRIMARY KEY(id) );
  • TESTTABLE 테이블을 생성하자. 여기에 ID, 이름, 사는 곳이 입력될 것이다
  • AUTO INCREMENT : 자동으로 값이 1씩 증가
  • NOT NULL : 값을 비워둘 수 없다
  • CONSTRAINT : 제약 조건으로 제약 조건의 이름은 TESTTABLE_TK이며, TESTTABLE의 PRIMARY KEY를 id 컬럼으로 지정하는 제약 조건이다
mysql> desc TESTTABLE;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(20) | NO   |     | NULL    |                |
| location | varchar(20) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
  • 잘 생성되었다
mysql> insert into TESTTABLE(name,location) values('jaehong','sindolim');
Query OK, 1 row affected (0.00 sec)

mysql> insert into TESTTABLE(name,location) values('chelsuu','gangnam');
Query OK, 1 row affected (0.00 sec)

mysql> insert into TESTTABLE(name,location) values('younghee','youngshan');
Query OK, 1 row affected (0.00 sec)

mysql> select * from TESTTABLE;
+----+----------+-----------+
| id | name     | location  |
+----+----------+-----------+
|  1 | jaehong  | sindolim  |
|  2 | chelsuu  | gangnam   |
|  3 | younghee | youngshan |
+----+----------+-----------+
3 rows in set (0.00 sec)
  • 데이터를 추가해주고, 확인하자

DB에서 필요한 설정은 모두 끝났다. 이제 아웃바운드에서 모든 트래픽을 허용하는 규칙을 삭제하자


2. WAS - DB 연동

MySql Connector 설치

WAS 서버에 접속하자. JAVA 프로그램이 MySql과 연결하려면 MySql Connector가 필요하다

  • 외부에서 Connector를 다운 받아야 하므로, 설치 과정 중에만 임시로 모든 트래픽으로 나가는 아웃바운드 규칙을 추가하자
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.23.tar.gz
tar xvfz mysql-connector-java-8.0.23.tar.gz
cd mysql-connector-java-8.0.23/
  • Mysql Connector 압축 파일을 다운 받아 압축을 해제하자

  • 압축 해제 후, 디렉토리에 들어가면 jar 파일이 있다. 우리는 이 jar 파일이 필요하다
  • JAR ( Java Archive ) : 여러 개의 자바 Class 파일과 관련 리소스 등 메타 데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷
sudo cp -a mysql-connector-java-8.0.23.jar /usr/lib/jvm/jre/lib/ext/
sudo cp -a mysql-connector-java-8.0.23.jar /usr/local/tomcat8.5/lib/
  • 해당 JAR 파일을 Java 설치 파일과 Tomcat 라이브러리에 복사해주자

Tomcat 설정

# sudo vi /usr/local/tomcat8.5/conf/context.xml
<Context>
	<Resource name="jdbc/test"
        	auth="Container"
        	type="javax.sql.DataSource"
        	username="Mysql 접속 계정 이름"
        	password="Mysql 접속 계정 비밀번호"
        	driverClassName="com.mysql.jdbc.Driver"
        	url="jdbc:mysql://Mysql서버주소:3306/DB이름" 
        	maxActive="15"
        	maxIdle="3"/>
</Context>
  • context.xml에 들어가서 Context 란 안에 위 설정을 추가하자. context.xml은 웹 애플리케이션의 자원을 명시해주는 파일이다
  • username : MySql 접속 계정
  • password : MySql 접속 계정 비밀번호
  • url : MySql 서버 주소와 접속할 DB 이름
# sudo vi /usr/local/tomcat8.5/conf/web.xml

<web-app>
 ...
 <resource-ref>
                <res-ref-name>jdbc/test</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
 </resource-ref>
 ...
</web-app>
  • web.xml에 들어가서 web-app 란에 위 설정을 추가하자
  • Tomcat의 실행 환경 정보가 있는 환경설정 파일로 Tomcat의 모든 웹 애플리케이션의 기본 설정을 정의하는 파일이다
sudo systemctl restart tomcat
  • 변경한 설정을 적용해주자

WEB PAGE 작성

MySql에서 데이터를 가져와서 출력해보자

sudo vi /usr/local/tomcat8.5/webapps/ROOT/index.jsp
  • index.jsp를 편집기로 열자
<%@ page import = "java.sql.*" %>
<%
  try{
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://'MySql 서버 주소':3306/'DB 이름'";
        Connection conn = DriverManager.getConnection(url, "MySql 접속 계정 이름", "MySql 접속 계정 비밀번호");

        out.println("SHOW NAME AND LOCATION - WEB 1");
        out.println("<BR>");
        out.println("-------------------------------");
        out.println("<BR>");
        PreparedStatement ps=(PreparedStatement)conn.prepareStatement("SELECT * from TESTTABLE");
        ResultSet rs=ps.executeQuery();

        while(rs.next()){

                String name=rs.getString("name");
                String location=rs.getString("location");

                out.println("name : "+ name);
                out.println("<BR>");
                out.println("location : "+location);
                out.println("<BR>");
                out.println("-----------------------------");
                out.println("<BR>");

        }

  }
  catch(Exception e){
        out.print(e.toString());
  }

%>
  • MySql 서버에 원격으로 Select Query 문을 보내서 가져온 데이터를 출력하는 페이지를 작성하자
sudo systemctl restart tomcat
  • 변경한 사항을 적용해주자

WAS 2 서버도 동일하게 설정해주자

  • 모든 구축이 끝났으므로, WAS 서버의 아웃바운드에서 모든 트래픽으로 나가는 아웃바운드 규칙을 삭제하자

  • Tomcat - DB 연동이 잘 되었다

프로젝트 결과는 다음 편에서 이어집니다

https://velog.io/@lijahong/0%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-AWS-%EA%B3%B5%EB%B6%80-3-Tier-%EA%B5%AC%EC%B6%95-4-%EA%B2%B0%EA%B3%BC-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0

profile
멋진 엔지니어가 될 때까지

0개의 댓글