기본적인 CI/CD 구축에 앞서, 서버에서 사용할 MySQL 컨테이너를 EC2 Linux 서버에 띄우고 Spring Application과의 Connection을 확인할 것입니다.
MySQL 컨테이너를 실행하기 위하여 최신 버전을 pull 받아줍니다.
docker pull mysql
docker images
정상적으로 다운로드된 것을 확인했다면 해당 이미지를 기반으로 컨테이너를 생성하여 실행합니다.
별도의 설정을 하지 않으면 임의의 해시 값을 이름으로 가지는 Volume을 할당합니다.
우리의 데이터베이스는 소중하기 때문에 의도치 않은 컨테이너 종료에 대비하여 Volume 설정을 하여 Mount 해줍시다!
docker run --name reach-rich-user-mysql -e MYSQL_ROOT_PASSWORD='비밀번호' -v reach-rich-user-mysql-volume:/var/lib/mysql -d -p 3306:3306 mysql:latest
필자는 MySQL의 기본 포트인 3306을 그대로 사용했습니다.
프로세스를 확인해보면, 컨테이너가 잘 실행된 것을 확인할 수 있습니다.
프로젝트에서 사용할 스키마를 생성해야되므로, 컨테이너에 접속해 MySQL에 로그인합니다.
docker exec -it [컨테이너명]
mysql -u root -p
create database [스키마명]
외부에서 연결하기 위해, EC2의 보안그룹 인바운드 규칙에 3306 포트를 허용시켜줍니다.
그럼 이제 외부 IP에서 접속이 가능한지 테스트해봅니다. 간단하게 MySQL 워크벤치를 사용하겠습니다.
테스트 결과, Connection에 성공한 것을 확인할 수 있습니다.
그럼 이제 Spring Application으로 넘어와 datasource를 설정하여 MySQL 서버에 정상적으로 연결할 수 있는지 테스트하면 됩니다.
# application-mysql.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://[IP or Domain]/[Schema]/useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
username:
password:
# 나머지는 생략
데이터베이스 연결을 위한 Config 작성 후 Run 하면...
Access denied for user '유저명'@'IP' (using password: YES)
위와 같은 에러가 발생할 수 있습니다...😂
위 에러는 단순히 로그인 정보가 잘못되어 발생할 수 있지만, 다음과 같은 경우에도 발생합니다. (MySQL의 사용자 및 권한은 여기를 참고해주세요!)
1번은 접속하는 IP에 맞는 계정이 없는 상황에 발생합니다.
MySQL의 경우 단순하게 계정명을 사용하여 식별하는 것이 아닌, 계정명과 IP를 종합하여 계정을 식별합니다.
localhost로 접속하는 경우에도 그에 맞은 도메인이 필요하며 외부 IP로 접속하는 경우에도 마찬가지입니다.
따라서 접속하는 IP에 맞는 계정을 생성하고, 만약 모든 IP에 대한 접속을 허용하는 계정을 만들고싶다면 host 컬럼에 '%'를 넣어 계정을 생성합니다. (Schema는 mysql)
계정 생성과 권한 부여 쿼리는 다음과 같습니다.
create user '계정명'@'IP(모든 IP는 %)' identified by '비밀번호';
grant all privileges on *.* to '계정명'@'IP';
flush privileges;
2번의 경우는 비밀번호를 설정해주면 되며, 다음 쿼리를 사용합니다.
alter user '계정명'@'%' identified with mysql_native_password by '비밀번호';
3번의 경우는 MySQL 비밀번호 정책과 관련되어 있습니다.
비밀번호 정책을 LOW로 설정하는 경우가 아니라면 '0000'과 같은 비밀번호로 만든 계정은 외부 IP 접속 시 denied 될 수 있습니다.
따라서 8자 이상이고 숫자, 대소문자, 특수문자의 배합을 포함한 비밀번호로 계정을 만들어야 Spring과 같은 Application에서의 Connection이 가능할 수 있습니다.
필자의 이슈는 3번에 해당되었고, 비밀번호를 제대로 설정한 뒤 다시 Run 해보면...
Connection에 성공한 것을 확인할 수 있습니다.