학습 동기
SSAFY 기업연계 프로젝트를 진행하면서, 실 기업이라면 분명 운영과 개발을 동시에 가져가야하는 DevOps 상황이 분명히 존재할 것이며, Spring boot Container와 MySQL의 Container를 동시에 모니터링 해야할 것이라고 생각해 시스템을 붙여보게 되었다.
이번 MySQLD-Exporter를 통해 실 Spring boot에 모니터링 컨테이너를 붙이던 도중, 나를 정말 애먹이던 상황이 있었다,
그런데 docker Container를 구축하던 중, 난 계속 비밀번호를 Flag 변수라고 생각하고 mysqld-password flag로 넣었고 오류를 찾지 못해 2시간가량을 허비하게 되었는데, 결국 공식문서에 답이 있겠지 하고 README.md를 꼼꼼하게 읽어가던 중 발견한 부분이 있었다.
https://github.com/prometheus/mysqld_exporter
GitHub - prometheus/mysqld_exporter: Exporter for MySQL server metrics
Exporter for MySQL server metrics. Contribute to prometheus/mysqld_exporter development by creating an account on GitHub.
github.com
해당 링크는 Prometheus/mysqld-exporter의 Github 링크이며, 해당 링크에서 프로메테우스 MySQLd-exporter의 사용 방법을 볼 수 있다.
바로 MySQLD_EXPORTER_PASSWORD로 docker의 명령어인 -e를 이용해서 환경변수로 별도로 지정을 했어야 했다.
좀 허탈하긴 헀으나, 그럼 왜 환경변수는 뭐고 플래그가 차이가 있는 것인지 명확히 해두고자 한다.
환경변수의 정의
프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임이다.
동적인 값?? 무슨 의미일까
어떤 프로그램의 실행을 위해서 해당 프로그램의 파일의 값을 읽어오는 과정이 있어야 하며, 이 환경 변수를 설정하지 않으면 해당 프로그램의 디렉터리까지 찾아가야하는 번거로움이 있다.
이때 환경변수를 사용한다면 해당 디렉터리를 포함한 값을 변수처럼 쓸 수 있단 것이다.
그러면 왜 mysql의 password와 같은 값들은 꼭 환경변수로 저장해줘야하는 것일까?
환경변수는 보안 설정에 필요한 이유
.env는 Git을 활용한 버전관리를 하지 않기 때문이다.
DB의 username,password등은 application.yml혹은 application.properties 파일에 올려 resource 파일로 활용한다.
이때, DB의 username,password 등은 개발자의 필요에 따라 Server에 직접 올리기도 한다.
그러나 Git이 꼬일 수도 있고 Github라는 공개된 장소에 올리는 것은 사실상 내 서버의 문을 활짝 열어놓고 해커들을 기다리는 편에 속하기에 올리지 않는 편을 선호하고 이때 application.yml의 값을 넣어줄 수 있는 게 .env파일을 통한 환경변수 값 주입이다.
추가로 .env를 gitignore 무조건 시켜야 한다..!
환경변수와 플래그의 차이
결국 환경변수의 정의를 쭉 따라왔다면 true/false로 구분하는 Flag 변수의 차이도 알 수 있다.
Flag 변수 : 프로그램 실행 시 커맨드라인 인자(Command-line argument)로 전달되어, 프로그램의 실행 동작을 제어하는 구성 값입니다.
동적인 값일 필요가 없다.
보안에 중요한 값이 아니기에, 값을 숨길 필요도 없고 그저 설정 값의 일부이기 때문이다.