Spring Cloud Config는 MSA 아키텍처에서 분산화된 Spring Application.yml
을 제공해주는 시스템이다. 외부에서 모든 환경 설정 정보를 관리해주는 중앙 서버라고 한다.
설정 정보 저장을 .git
으로 관리해주기 때문에 설정 파일 때문에 서비스를 재구동할 필요가 없어 유용하다.
Spring Cloud Config Server(설정 서버): 버전 관리 레포지토리로 백업된 중앙 집중식 구성 노출을 지원한다.
Spring Cloud Config Client(설정 클라이언트) : 애플리케이션이 설정 서버에 연결하도록 지원한다.
여러 서버의 설정 파일을 중앙 서버에서 관리할 수 있다.
서버를 재배포 하지 않고 설정 파일의 변경사항을 반영할 수 있다.
Git 서버 또는 설정 서버에 의한 장애가 전파될 수 있다.
우선 순위에 의해 설정 정보가 덮어씌워질 수 있다.
프로젝트의 application.yaml
설정 저장소의 application.yaml
프로젝트의 application-{profile}.yaml
설정 저장소의 {application name}/{application name}-{profile}
설정 파일은 덮어쓰는 방식으로 작동하기 때문에 우선순위가 밀려있는 설정 파일이 적용되게 된다.
프로젝트를 생성할 때 spring web
, config server
를 체크하고 만들어주자
이후 추가로 아래 두 개 설정을 추가해주자
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
}
Config Server는 결국 저장소를 참조하기 때문에 우선적으로 생성해주자.
설정 파일을 폴더 구조로 관리할 때에는 yml 파일에 path를 설정해주어야 한다.
설정 파일의 이름을 정할 때에는 규칙이 존재한다
application.yml
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/SWM-MSA-TEST/config
default-label: main
search-paths: ConfigFiles
uri: 설정파일이 있는 깃 주소
default-label: 깃 주소의 브랜치 이름
search-paths: 설정 파일들을 찾을 경로
메인 클래스에 @EnableConfigServer
어노테이션을 붙여주자
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
지금까지 레포지토리의 상태는
public
이다.
서버를 실행한 뒤 configserver.com/eureka/default 에 접속해서 yml 파일이 잘 넘어오는지 확인하자
클라이언트 서비스에서는 동일하게 메인 클래스에 @EnableConfigServer
어노테이션을 붙여주자.
github로 관리되는 환경 설정 정보 특성상 민감한 정보가 노출될 수 있으므로 private 레포지토리에서 관리해야 하는데, 단순히 공개를 숨기는 것으로는 완벽한 보안이라 할 수 없다.
따라서 ssh를 이용해 대칭 키를 만들고, 이를 환경 변수로 지정해서 중요한 값들을 암호화 한 뒤 yml 파일에 적용시키기로 했다.
ssh-keygen -m PEM -t ecdsa -b 256 -f <fileName>
~/.ssh/<fileName>.pub
으로 대칭키를 확인할 수 있다.
여기서 우리가 만든 대칭 키를 넣어서 설정한다.
IntelliJ Edit Configuration
에서 Modify Options를 클릭 후 환경 변수에 우리가 만든 대칭 키를 넣어주자. 추후 배포시에 Linux OS에서 환경 변수를 YML 파일에 적용시키는 방식으로 수정해야 한다.
Config Server 뿐만 아니라 모든 Config Client 는 bootstrap.yml 파일에 키를 넣어주어야 한다.
configserver.com/encrypt
body - raw - text 로 값을 넣어서 post 요청
configserver.com/decrypt
body - raw - text 로 값을 넣어서 post 요청
Config Server가 암호화된 문자열이 암호화 된 문자열임을 식별해주는 {cipher}
헤더를 달아주면 자동으로 인식해서 복호화해서 Config Client에게 보여준다.
넣어줄 문자열은 위에서 encrypt로 확인한 값을 넣어준다.
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/SWM-MSA-TEST/config
default-label: main
private-key: '{cipher}f235684509896efc58a52fd8a4f80c6f2434d477996541a31c3086860c167f76ad6a2fe48ea6734574ef6ee54ca77d8937790fde2ef3ae6e42f7bdb2dc8f501ba6d4ec17d9837e56f42aa7f06b0bafc8ec285d6ce7e056da27382f31bdd6082acda716fd5a0360ce0f0f6c51e06b25d9db4f5caf3a1480697b2fb497d92463b330f8d93b0c0319ca7584b0eea509260d4c1212964fbe147be23e63a68e2ab2be'
passphrase: '{cipher}43540efd2a33624da50589eba685378041a01c6744f143ea9309c6b48f2aeb95'
timeout: 4
ignore-local-ssh-settings: true
username: '{cipher}1274d41ff51e5ccb37f269bc2128dab8a3b0404c460d95016764a0a8ae4d666a'
password: '{cipher}0e324089ccc9002c97f28d4bb340ed4602ad75e17449d3c397dabfa30b0ecc530751092b3352a656f3be5465ec8eed3b57a169cd5a655a84d1eff87150075642'
search-paths: ConfigFiles
private-key : 우리의 대칭 키
passphrase : 대칭키를 생성할 때 설정한 인증 구문
username : github id
password : github login token