Spring Cloud Config Server

반영환·2023년 7월 1일
0

springCloud

목록 보기
1/4
post-thumbnail

Config Server

Config Server?

Spring Cloud Config는 MSA 아키텍처에서 분산화된 Spring Application.yml 을 제공해주는 시스템이다. 외부에서 모든 환경 설정 정보를 관리해주는 중앙 서버라고 한다.

설정 정보 저장을 .git 으로 관리해주기 때문에 설정 파일 때문에 서비스를 재구동할 필요가 없어 유용하다.

관계 정의

  • Spring Cloud Config Server(설정 서버): 버전 관리 레포지토리로 백업된 중앙 집중식 구성 노출을 지원한다.

  • Spring Cloud Config Client(설정 클라이언트) : 애플리케이션이 설정 서버에 연결하도록 지원한다.

장점

  • 여러 서버의 설정 파일을 중앙 서버에서 관리할 수 있다.

  • 서버를 재배포 하지 않고 설정 파일의 변경사항을 반영할 수 있다.

단점

  • Git 서버 또는 설정 서버에 의한 장애가 전파될 수 있다.

  • 우선 순위에 의해 설정 정보가 덮어씌워질 수 있다.

우선순위

  1. 프로젝트의 application.yaml

  2. 설정 저장소의 application.yaml

  3. 프로젝트의 application-{profile}.yaml

  4. 설정 저장소의 {application name}/{application name}-{profile}

설정 파일은 덮어쓰는 방식으로 작동하기 때문에 우선순위가 밀려있는 설정 파일이 적용되게 된다.

Config Server 구축

build.gradle

프로젝트를 생성할 때 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}-{profile}.yml

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 어노테이션을 붙여주자.

private Repository 변경

github로 관리되는 환경 설정 정보 특성상 민감한 정보가 노출될 수 있으므로 private 레포지토리에서 관리해야 하는데, 단순히 공개를 숨기는 것으로는 완벽한 보안이라 할 수 없다.

따라서 ssh를 이용해 대칭 키를 만들고, 이를 환경 변수로 지정해서 중요한 값들을 암호화 한 뒤 yml 파일에 적용시키기로 했다.

ssh 대칭 키 만들기

ssh-keygen -m PEM -t ecdsa -b 256 -f <fileName>

~/.ssh/<fileName>.pub 으로 대칭키를 확인할 수 있다.

github Deploy Key 설정

여기서 우리가 만든 대칭 키를 넣어서 설정한다.

IntelliJ 환경 변수 설정

IntelliJ Edit Configuration 에서 Modify Options를 클릭 후 환경 변수에 우리가 만든 대칭 키를 넣어주자. 추후 배포시에 Linux OS에서 환경 변수를 YML 파일에 적용시키는 방식으로 수정해야 한다.

bootstrap.yml에 키 저장하기


Config Server 뿐만 아니라 모든 Config Client 는 bootstrap.yml 파일에 키를 넣어주어야 한다.

암호화 값 확인

encrypt

configserver.com/encrypt
body - raw - text 로 값을 넣어서 post 요청

decrypt

configserver.com/decrypt
body - raw - text 로 값을 넣어서 post 요청

yml 암호화

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

출처

데런의 코장소
망나니개발자
에러핸들링
private repository 핸들링

profile
최고의 오늘을 꿈꾸는 개발자

0개의 댓글