소경관 : AWS EC2 Ubuntu 20.04에서 Docker를 활용해서 MariaDB, MongoDB 구축 후 연동

OH JU HYEON·2022년 9월 17일
1

Project

목록 보기
2/2
post-thumbnail

AWS EC2 Ubuntu 20.04에서 Docker를 활용해서 MariaDB, MongoDB 구축 후 Spring Boot연동, 외부접속

탐구

1. 어떤 내용?

제목 그대로 AWS EC2 Ubuntu 20.04에서 MariaDB와 MongoDB를 활용해야 하는데 이번에는 Docker를 사용해서 Container로 활용을 해 보려고 한다.

2. 사전 내용

이미 인스턴스를 연결하고 Docker는 설치가 되어있다고 가정하고 진행한다.

apt-get update
apt-get install vim
apt-get install net-tools

정도는 미리 받아두는 게 좋다.

MariaDB : 10.5

1. Image

docker pull mariadb:10.5

MariaDB Image를 pull 받아준다. 이번에는 10.5 버전을 사용할 예정이라서 이미지명 뒤에 태그를 달아주고 설치가 다 되었다면 docker images 명령어를 통해 체크를 해 본다.

2. Container

docker run \
-p 3306:3306 \
--name spmMariaDB \
-e MARIADB_ROOT_PASSWORD=1234 \
-d mariadb:10.5

Container를 생성하면서 Port를 연결해 준다.

docker exec -it -u root spmMariaDB /bin/bash

mysql --version

exec를 통해 컨테이너에 접속하는데 -u root를 통해 루트 권한으로 접속해 준다. 접속을 했다면 MariaDB의 버전을 체크해 보면 좋다.

3. Setting

mysql -u root -p

MariaDB Container에 접속한 상태에서 위 명령어를 통해 root 유저에 접속한다. 이때 비밀번호는 Container 생성할 때 설정한 1234이다.

create user 'MyUser'@'%' identified by '1234';

grant all privileges on *.* to 'MyUser'@'%';

flush privileges;

MyUser사용자를 만들고 모든 DB 접근 권한을 허용한다.exit명령어를 통해 MariaDB를 나가고 생성한MyUser`로 접속한다.

mysql -u MyUser -p

마찬가지로 비밀번호는 위에서 설정한 1234이다.

create database User default CHARACTER set UTF8;

show databases;

car 데이터베이스를 생성해주고 한글, 문자열을 저장하게 만들어준다. show databases; 명령어를 통해 데이터베이스가 잘 생성되었는지 확인하고 마무리로 Spring Boot에 붙여주고 외부접속을 진행하면 된다.

4. Connection

# MariaDB Connection
spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://IP주소/데이터베이스명?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=MyUser
spring.datasource.password=1234

생성한 유저와 비밀번호를 참고해서 application.properties에 등록해 준다.

MongoDB : 4.4

1. Image

docker pull mongo:4.4

MongoDB는 4.4 버전을 사용할 예정이다. 마찬가지로 pull 명령어로 Image를 받아주면서 이미지명 뒤에 태그로 버전을 명시해 준다.

2. Container

docker run -i -t \
--name spmMongoDB \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=1234 \
-d mongo:4.4

MongoDB 포트를 연결해 주었다. 필요에 따라 -v 옵션을 통해 Volume 관리를 해 주어도 좋다.

docker exec -it -u root spmMongoDB /bin/bash

MongoDB Container에 접속해 준다.

3. Setting

mongo -u root -p 1234

MongoDB Container에 들어온 다음 위 명령어로 root 유저로 접속한다.

use admin

Databases 생성을 위해 admin 계정으로 들어간다.

db.system.users.find().pretty()

사용자를 조회한다. MongoDB Container를 만들 때 root 계정을 활성화시켰기 때문에 따로 root 계정을 활성화 하지 않아도 된다. 접속할 때도 root 계정으로 접속했다.

db.car.insert({
"name": "오주현",
"phoneNm": "010-9999-9999",
"carNm": "123가1234",
"addr2": "1동1005호"
})

임시로 데이터베이스에 car Collection을 생성하고 Document를 넣어준다.

db.car.find()

Collection에 Document가 잘 생성되었는지 확인한다.

db.createUser({ user: "MyUser", pwd: "1234", roles: ["root"] })

위에서 생성한 데이터베이스를 관리하는 MyUser를 생성해 준다.

db.getUsers()

유저가 정상적으로 생성이 되었는지 체크한다.

db.auth("MyUser","1234")

유저가 정상적으로 생성이 되었는지 체크하는 다른 방법이다.

반환 값으로 1을 뱉으면 아이디와 비밀번호가 정상적인 것이고, 0을 뱉으면 문제가 생긴 것이니 drop으로 MyUser를 날려주고 다시 생성한다.

참고로, 삭제하는 명령어는 db.dropUser(”MyUser”) 이다.

4. Connection

# MongoDB Connection
spring.data.mongodb.host=IP주소
spring.data.mongodb.port=27017
spring.data.mongodb.database=car
spring.data.mongodb.username=MyUser
spring.data.mongodb.password=1234

생성한 유저와 비밀번호를 참고해서 application.properties에 등록해 준다. 외부 접속할 때 (keep-alive query results in error)오류가 뜨면 authSource=admin 파라미터를 추가해 준다.

예시 : mongodb://localhost:27017/car?authSource=admin
오류 해결에 대한 자세한 내용 참고

외부 접속

1. AWS EC2 인바운드 규칙 편집하기

AWS 인스턴스에 들어가서 보안 그룹에 들어가면 인바운드 규칙을 편집할 수 있다.

우측 하단에 핑크색 박스를 보면 인바운드 규칙 편집이 있다. 이것을 눌러서 규칙을 추가해 주면 된다. 처음엔 기본 포트만 열려있고 우리가 사용할 포트는 따로 열어줘야 한다. 나는 MongoDB와 MariaDB 포트를 열어줬고 소스내 IP 주소로 변경해 주었다. 0.0.0.0으로 열어놓고 사용하기도 하지만 만약 해킹을 당하면 요금 폭탄 나올 것이 걱정되서 그냥 귀찮지만 항상 내 IP를 선택해서 사용한다.

주의할 점으로는 인터넷이 바뀌면 IP도 바뀌기 때문에 이동할 때 마다 항상 들어가서 설정을 다시 해 줘야 하는 번거로움이 있다. 그래도 그나마 안전하다.

2. bind-address 편집

기본 값으로 bind-address는 127.0.0.1로 설정되어 있다. 이것을 0.0.0.0으로 바꿔주고 외부 접속에 활용하면 되는데 MariaDB와 MongoDB의 설정 경로는 아래와 같다.

vi /etc/mongod.conf
vi / etc/mysql/mariadb.conf.d/50-server.cnf

딱 봐도 위 경로가 MongoDB, 아래 경로가 MariaDB 라는 것을 알 수 있을 것이다. 이것을 설정하기 전에 해 줘야 하는 게 있는데 Docker에서 Image로 Container를 생성했기 때문에 Vim 설치가 안 되어 있어 아마 편집 기능이 동작하지 않을 것이다.

일단, 순서는 아래와 같다.

1. Container에 `-u root`로 접속한다.
2. apt-get update
3. apt-get install vim

이렇게 설치를 해 주면 된다. 이때 그냥 접속해서 apt-get update를 실행하면 네트워크 경로를 못 찾는다거나.. 무언가 못 찾는다는 오류가 뜨는데 이런 오류 때문에 1번을 참고해서 root로 접속해야 한다.

만약, 이렇게 했는데도 2번, 3번 설치가 되지 않는다면 컨테이너 정지 -> 도커 정지 -> 도커 재실행 -> 컨테이너 재시작 후에 진행하면 정상적으로 설치가 될 것이다. 이 후에는 각각 알맞는 경로에서 bind-address를 찾아 수정해 주면 된다.

4. 방화벽

이번에는 방화벽 설정이다.

apt install firewalld

명령어로 방화벽 관련 설정을 위해 설치해 준다. 이후 각 포트를 열어주면 되는데 명령어는 아래와 같다.

firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --permanent --zone=public --add-port=27017/tcp
firewall-cmd --reload
firewall-cmd --list-all

방화벽 포트를 열어주고 적용한다. 마지막으로 정상적으로 적용이 되었는지 리스트를 통해 확인해 보면 된다. 또 추가할 것이 있다면 마찬가지로 진행하면 된다. 나중에 Redis를 추가 할 생각도 있어서 추후에 하게 된다면 다시 적어 볼 생각이다.

동작 확인

마지막으로 동작 확인을 하면 끝난다.

본인이 사용하는 툴을 활용해서 외부 접속을 해 보면 된다. 나는 DataGrip을 활용하는데 Intellij 안에 붙어있는 툴을 쓴다. 호스트 입력하고 유저 정보 입력 후 데이터베이스를 입력해 주고 Test Connection을 눌러 확인해 주면 된다.

정상적으로 AWS EC2 Ubutnu 20.04에 있는 Docker MariaDB, MongoDB Container가 외부 접속에 성공한 것을 볼 수 있다. 실제로 Spring Boot에 application.yml에 설정을 넣어주면 JPA가 정상적으로 쿼리를 날려 테이블을 생성하는 것도 확인이 된다.

profile
읽기만 해도 이해가 되는 글을 쓰기 위해 노력합니다.

0개의 댓글