Spring Cloud Config를 사용한다.
근데 구축에 앞서 우선 상상을 해보자.
Config Server를 구성하려면 어떤게 필요할까?
일단 설정 파일을 모아둘 저장소
가 필요할 것이다.
그리고 저장소에서 설정파일을 적재적소에 제공해줄 서버
가 있어야 한다.
마지막으로 설정 파일을 사용하는 서비스
가 필요하다.
서버와 서비스는 Spring Cloud Config가 제공하는 Server와 Client를 사용하면 된다. 그럼 저장소는 무엇을 사용하면 좋을까?
어디든 모아둘 수 있고 접근이 가능한 곳이면 된다.
- FTP
- Native File System
- Local Git Stage
- Git Hosting Service(ex. GitHub, GitLab)
여기선 모두에게 익숙한 Github
을 사용한다.
설정 정보는 민감 정보를 포함
하는 경우가 많다. 따라서 설정 정보 비공개를 위해 Public 레포가 아닌 Private 레포를 기준
으로 구축을 시작하겠다.
해당 레포에 설정 파일들을 저장하면 된다.
설정 파일의 이름을 아무렇게나 하면 안된다.
{앱 이름}-{프로파일}.yaml
이 구조로 작성해주어야 한다. 예를 들어 user-dev.yaml
은 user
는 앱 이름이고 dev
는 프로파일에 해당한다.
Spring Boot 프로젝트를 생성한다.
프로젝트를 생성하면서 Spring Web
과 Config Server
의존성을 추가해주거나, 생성 후에 의존성을 추가해주어야 한다.
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-config-server'
Config Server의 메인 클래스에 @EnableConfigServer
를 추가해준다.
@EnableConfigServer
@SpringBootApplication
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
}
server:
port: 8888
spring:
application:
name: config
cloud:
config:
server:
git:
uri: {private repo. 주소}
default-label: {private repo. 브랜치}
이대로 끝이면 좋겠지만 private repo를 사용하기 때문에 SSL 설정이 추가로 필요하다.
1. 비대칭 키 생성
ssh-keygen -m PEM -t ecdsa -b 256
위 명령어로 비대칭키를 생성한다. 이 비대칭키는 Config Server가 Private Repo.에 연결할 때 사용된다.
생성 과정에서 저장할 위치와 passphrase를 지정할 수 있는데
위치는 그냥 enter, passphrase는 enter 혹은 값을 넣어주면 된다.
rsa키는 보안 취약점 때문에 에러가 발생할 수 있어 ecdsa를 사용했다.
명령어의 결과로 id_rsa
라는 private_key
와 id_rsa.pub
라는 public_key
가 생성된다.
2. public key를 deploy key에 등록
다음으로 Private Repo.의 deploy key에 공개키를 저장해주어야 한다.
cat ~/.ssh/id_ecdsa.pub
명령어의 결과로 나온 내용을 전부 Key
칸에 넣어주고 등록하면 된다.
3. application에 private key 정보 추가
생성했던 비대칭 키의 Private Key
는 Config Server의 application.yaml
에 넣어주어야 한다.
cat ~/.ssh/id_ecdsa
private key 값은 위 명령어로 확인 가능하다.
server:
port: 8888
spring:
application:
name: config
cloud:
config:
server:
git:
uri: {private repo. 주소}
default-label: {private repo. 브랜치}
ignore-local-ssh-settings: true
passphrase: {비대칭 키 생성 시 입력 값} // 생략 가능
private-key: |
-----BEGIN EC PRIVATE KEY-----
... KEY 값
-----END EC PRIVATE KEY-----
Client는 매우 쉽다.
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
갑자기 bootstrap
은 어디서 튀어나온건지 의아할 수 있다.
설정 정보를 추가하기 위해서는 bootstrap을 이용하는데, 2021년도 기준으로 spring cloud 에서는 bootstrap 을 자동으로 읽어오는 기능이 빠져있다.그러므로 spring-cloud-starter-bootstrap
의존성을 추가해줘야 한다.
application.yaml
과 동일한 위치에 bootstrap.yaml
을 추가하고 아래의 내용도 함께 추가해준다.
spring:
cloud:
config:
uri: http://localhost:8888
name: user
profile: dev
이제 config server를 사용하면 된다.
하지만 여기서 의문점이 생긴다. 설정 파일이 수정되었다는 것은 어떻게 감지하고 전파하는 것일까? 자동으로 해주는 걸까?
아니다. 현재까지의 설정으로는 수동으로 해주어야 한다.
편하게 쓰려고 사용했는데 수동이라니 너무 귀찮다.
다음 글에서는 설정 파일 수정사항을 감지하고 전파하는 것을 자동화 해보자.