프로그래밍/Spring

Spring Cloud Config를 활용하여 설정값(properties), 비밀번호 숨겨서 배포하기

Jay Tech 2019. 12. 9. 13:03
반응형

Spring Cloud Config Server 구축하기

Spring Cloud Config 를 사용하여 비밀번호나 민감한 key들을 숨겨서 관리하는 방법을 알아보겠습니다.

 

전체적인 구상도는 다음과 같습니다. 깃허브 private 저장소에 yml 파일을 업로드합니다. 이 yml 파일안에는 민감 정보가 들어있기 때문에 private에 업로드 하였습니다. 그리고 Spring Cloud Config 서버를 만들고 이 서버가 private 저장소에서 파일을 읽어오게 해야합니다. 그렇기 때문에 서버의 공개키를 깃허브 저장소에 등록을 시켜놓아야 합니다. 자세한 내용은 밑에서 보겠습니다.

 

 

Spring Cloud Server 구축

implementation 'org.springframework.cloud:spring-cloud-config-server'

config server 의존성을 추가합니다.

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }

}

애플리케이션 실행 부분에 @EnableConfigServer를 달아주고,

application.yml을 다음과 같이 수정합니다.

spring:
  cloud:
    config:
      server:
        git:
          uri: git@jay:JunHoPark93/gae-jang-mo-private-properties.git
          skip-ssl-validation: true
server:
  port: 8888

여기서 설정파일들을 관리하는 레포지토리를 적어주는데 이것은 private 레포지토리로 만들어보았습니다. 그래서 이 Spring Cloud Config 서버를 띄울려면 github 서버에게 공개키를 등록시켜주어서 서로 통신하게 만들어야 합니다. 포트는 8888에 띄워봅니다.

git uri에 대한 자세한 내용은 밑에서 설명하겠습니다.

private 저장소에 설정파일 업로드

github 에서 private 저장소를 만들고 yml 파일을 업로드 합니다.

여기서 주의 해야할 것은 yml 파일의 이름의 prefix에 application-name (즉 이 설정을 읽어올 애플리케이션의 이름)이 들어가야 합니다.

저는 productsearchapi라는 이름의 애플리케이션을 띄울 것이므로 productsearchapi-dev.yml 로 만들어 보았습니다. 참고로 대시(-)뒤에 나오는 것은 profile입니다.

productsearchapi-dev.yml

searchapi:
  naverid: [아이디]
  naversecret: [시크릿]
oauth:
  key: [키]
  password: [패스워드]

필요한 설정파일들을 알아서 넣어주면 됩니다. 위에는 단지 예시 일 뿐입니다.

공개키/비밀키 생성

ec2를 로드하고 해당 서버에서 ssh-keygen을 이용해서 공개키/비밀키를 생성해보겠습니다.

$ cd ~/.ssh
$ ls
authorized_keys2  id_dsa       known_hosts
config            id_dsa.pub

.pub의 확장자를 가진것이 공개키이고 나머지는 비밀키 입니다. 이 공개키를 Git 서버에 등록을 시켜주어야 합니다.

공개키/비밀키를 생성해보겠습니다.

$ ssh-keygen -t rsa -b 4096 -C "email주소"

깃허브 아이디로 email주소를 적어주었습니다.

그러면 파일 저장 위치를 결정하라는 말이 나오게 됩니다. 그 때 이름을 지정해주면 되는데 저는 제 레포지토리 이름으로 적어보았습니다.

Enter a file in which to save the key (/Users/<em>you</em>/.ssh/id_rsa):

이 칸에,

config-server.id_rsa

라고 적어주었습니다. 그 이후 패스워드를 입력하라고 하는데 그냥 엔터를 누르고 넘어갑니다.

$ cat ~/.ssh/config-server.pub

이제 다음과 같은 명령어로 공개키를 열어보면 공캐기가 나오게되는데 이것을 GitHub 레포지토리에 Deploy Keys에 들어가서 넣어주면 됩니다.

 

 

그리고 깃허브를 ec2에 등록시켜주기 위해서 config 파일을 만듭니다.

vim ~./ssh/config

HOST jay
  HostName github.com
  User git
  IdentityFile ~/.ssh/config-server.id_rsa
  IdentitiesOnly yes

그리고 다음과 같이 적어줍니다. HOST는 서버내에서 통용될 이름을 지정하는 것이고 HostName은 깃허브의 주소를 적어줍니다. 그리고 이것을 인증할 때에는 아까만든 config-server 비밀키를 이용한다고 명시해줍니다.

chmod 440 ~/.ssh/config

그리고 다음과 같이 권한을 변경해줍니다.

이제 이 서버에서는 private 레포지토리를 다룰 수 있게 되었습니다.

확인차 clone 을 해보면, 다음과 같이 할 수 있겠네요.

git clone git@jay:JunHoPark93/gae-jang-mo-config.git

git@ 뒤에 나오는 것이 아까 설정한 HOST이고 콜론 뒤에 등장하는 것은 [깃허브 아이디] 그리고 그 뒤 슬래시 다음에 나오는것이 레포지토리 이름입니다.

그리고 profile이 dev인 것을 요청해보면, 설정파일들이 로딩되는 것을 알 수 있습니다.

 

(수정!! 사진에 오타가 있네요 포트번호 8080이 아니라 8888입니다!)

 

참고로 요청 url은 {application-name}-{profile}.yml 파일 기준으로 {ip}:{port}/{application-name}/{profile} 입니다. 대시 대신에 슬래시를 넣어서 컨피그 서버를 띄운 포트로 요청을 보내면 됩니다.

Spring Cloud Config Client 구축

이번엔 이것을 사용할 client를 만들어보겠습니다. 사용하려는 애플리케이션 내의 설정을 바꾸면 됩니다.

implementation 'org.springframework.cloud:spring-cloud-starter-config:2.2.0.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

사용하는 측에서 application.yml 이 아닌 bootstrap.yml 에 설정을 넣어줍니다. bootstrap.yml은 application.yml보다 먼저 로드되는 파일입니다.

자세한 설명은 stackoverflow에 설명이 되어 있습니다.

https://stackoverflow.com/questions/32997352/what-is-the-difference-between-putting-a-property-on-application-yml-or-bootstra

server:
  port: 8081

spring:
  application:
    name: productsearchapi
  profiles:
    active: local
---
spring:
  profiles: local
  cloud:
    config:
      enabled: false
---
spring:
  profiles: dev
  cloud:
    config:
      uri: http://[서버ip]:8888

서버는 8081에 띄우고 앱 이름을 productsearchapi로 해줍니다. 아까 위에서 만들었던 yml 파일의 prefix에 해당하는 이름입니다. 이름이 맞지 않으면 설정을 긁어 오지 못합니다.

저는 로컬 환경에서는 intellij의 Edit Configuration에서 직접 설정정보들을 입력해놓았기 때문에 local로 띄웠을 경우 cloud config 를 disabled 해놨습니다.

 

 

dev 환경에서는 config uri 를 config server의 ip로 잡아 놓습니다.

 

그리고 앱을 실행할 때 profiles를 지정해서 jar를 실행시켜주면 됩니다.

java -jar -Dspring.profiles.active=dev [application-name].jar

사용시에는 다음과같이 주입시켜주면 됩니다.

@Value("${searchapi.naverid}")
private String naverId;

@Value("${searchapi.naversecret}")
private String naverSecret;
반응형