1. DB
DB 보안그룹 및 인스턴스 생성
- DB 인스턴스용 보안그룹을 생성하자. WAS 서버로부터 3306 포트에 대한 접근을 허용한다
- Bastion 서버에서의 SSH 접속도 허용해주자
- 보안 그룹은 Stateful하므로 응답에 대한 아웃바운드 규칙을 따로 지정하지 않아도 된다. 그러므로 아웃바운드 규칙은 모두 삭제하자
- 단, MYSQL 설치 작업에서 소스 파일을 외부에서 다운 받아야 하므로, 설치 과정 중에만 아웃바운드를 모두 허용으로 설정하자. 설치가 끝나면, 해당 아웃바운드 규칙을 삭제하자
Bastion Host 보안그룹
- Bastion Host 보안그룹에 DB 서버로 SSH 접속을 할 수 있도록 아웃 바운드 규칙을 추가하자
WAS 보안그룹
- WAS 보안그룹에 DB 서버의 MYSQL에 접근할 수 있도록 아웃바운드 규칙을 수정하자
자 이제 보안그룹 설정은 모두 끝났다!!
MySql 5.7 소스 설치
DB 인스턴스에 접속하자
sudo groupadd mysql
sudo useradd -g mysql -s /bin/bash -m 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 설정
[mysqld]
port=3306
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
character-set-server=utf8
collation-server=utf8_general_ci
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-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 데이터 베이스를 설치하여 초기화 하자
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 디렉토리에 복사하자
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 접속 및 비밀번호 변경
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을 사용할 수 있다
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]
tcp6 0 0 :::3306 :::* LISTEN 1930/mysqld
- 현재 MySql Server의 Listen Ip를 확인하자
bind-address = 0.0.0.0
- 모든 IP 대역에서 원격 접속이 가능하게 허용하자. 인스턴스 보안그룹에서 특정 IP로부터의 트래픽만 허용하기 때문에 0.0.0.0으로 설정해도 된다
sudo service mysqld57 restart
[root@ip-10-0-118-105 mysql57]
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 설정
<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 이름
<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
<%@ 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 서버의 아웃바운드에서 모든 트래픽으로 나가는 아웃바운드 규칙을 삭제하자
프로젝트 결과는 다음 편에서 이어집니다
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