본문 바로가기

MSA

[KEUPANG] config server 생성

이전 페이지: root project 생성
다음 페이지: user service 생성

개요

  • 각 서비스들이 사용하는 config 파일들을 공통으로 관리하는 server
  • 각 서비스들은 config server의 설정을 가져다 쓰는 config client
  • spring config server를 사용하여 구현하며, default로 git 레파지토리에서 config 파일을 가져오기 때문에 git 에 yaml 파일을 저장
  • ms1-dev.yml 의 형태를 git에 저장한다. (ms1: 서비스, dev: 환경)
  • 관련 issue github에 생성하고, feature 브랜치 생성 & develop 파일 pull 받기

private Repository 생성

  • 나만 봐야하는 설정 파일 이므로 private으로 생성
  • 우선 대표적으로 user와 product 서비스에 적용할 yaml 파일 생성

  • user-dev.yml과 product-dev 에는 우선 간단하게 port 정보만 작성
# 예시
server:
	port: 8081

 

private repository 접근을 위한 RSA 암호 생성(환경: mac os)

  • 터미널에서 rsa 암호화키 생성
ssh-keygen -m PEM -t rsa -b 4096 -C
  • ~/.ssh/ 폴더안에 개인키와 공개키가 생성
    • finder에서 해당 폴더에 접근하는 방법은 다양함 (terminal에서 접근하는 방법은 쉬우니까 생략)
    • 필자는 User 폴더에서 command + ↑ 를 통해서 ~/ 경로 까지 이동한 후 .ssh 폴더에 접근
    • mac 에서 숨김 파일 표시 여부 단축키 : command + shift + .

  • 들어가보면 개인키와 공개키가 있음.
  • pub가 붙은 것이 공개키

  • config 설정을 저장해둔 private repository로 이동
  • 레파지토리 설정 → Deploy Keys → Add deploy Key → key-1 이라는 이름으로 만들고 그 안에 공개키 복붙해서 넣음

config server 프로젝트 생성

  • spring initializr 로 config-server 프로젝트 생성
    • 주의할점 : https://back-jong.tistory.com/11 에서 생성한 root project 안에서 생성해야함.
    • 굳이 root project 안에서 작업을 안하더라도 나중에 생성된 config-server 프로젝트를 root project 안에 복붙하면 됨.
  • project 정보는 다음과 같음

  • config server와 설정 정보에 대한 보안을 위해 security 의존성 추가 필요

  • config server의 application.yml 파일 설정
spring:
    application:
        name: keupang-config-server
    cloud:
        config:
            server:
                git:
                    uri: git@github.com:JongHak19/keupang-cloud-config.git
                    ignoreLocalSshSettings: true
                    private-key: ${private_key}
server:
    port: 9000
  • private key는 .env 파일에 넣어두고 위와 같이 변수로 접근
    • 방법은 아래에 기술
  • root project 에다가 바로 .env 파일을 생성함.
    • 개인키 값은 아까 접근했던 .ssh 폴더의 id_rsa를 열면 있음.
    • 바로 복붙하면 안됨.
    • env 파일에서는 기본적으로 key=value 형식이기 때문에 비밀키와 같이 여러 줄로 구성된 PEM 형식을 제대로 파싱하지 못함.
  • 터미널에서 ~/.ssh 폴더로 접근
cd ~/.ssh
  • 터미널에 다음과 같이 입력하여 base 64 형태로 출력
    • 기존 개인키 변경 안되니까 신경안써도 됨.
cat id_rsa | base64
  • 출력된 결과는 base64 형태로 한줄로 인코딩 됨
    • "한 줄" 이기 때문에 이제 .env 파일에서 값 자리에 넣을 수 있음.
  • 출력된 결과

  • .env 파일에 출력된 거를 전부 복사해서 .env 파일에 저장
    • 무조건 "" 안에 넣어야함.
private_key= "개인키"
    • config-server에서 .env 의 변수를 불러오는 작업 필요
public class KeupangConfigServerApplication {

    public static void main(String[] args) {
        Dotenv dotenv = Dotenv.configure()
            .directory("./")  // .env 파일 경로 설정
            .load();
        // Base64 복호화
        String base64Key = dotenv.get("private_key");
        String privateKey = new String(Base64.getDecoder().decode(base64Key));

        System.setProperty("private_key", privateKey);
        SpringApplication.run(KeupangConfigServerApplication.class, args);
    }
}
  • 잘보면 root 프로젝트안에 바로 만든 .env 파일을 root 안의 configserver 프로젝트 안에서 접근하는데 경로가 ./ 임.
    • 프로젝트 제일 최상단으로 자동으로 찾아가는 걸 확인
  • .env에 base64 로 인코딩 하여 저장 했었음.
    • 사용하기 위해서 다시 인코딩 필수
    • 인코딩 된 개인키 값을 시스템 속성값에 private_key라는 이름으로 추가
    • 그러면 아까 application.yml에서 ${private_key}로 썼던 거에 자동으로 개인키가 들어가게 되고 github 에 접근할 권한이 생김. 

build.gradle 통합

은 아직 진행 안함.

모듈이 하나라서..ㅋㅋ

보안을 위한 spring security 설정

다른 사용자가 혹시나 설정 파일에 접근할 가능성을 염두에 두고 security 설정

security config 클래스 생성

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        http
            .csrf(AbstractHttpConfigurer::disable);
        http
            .authorizeHttpRequests((auth)->auth.anyRequest().authenticated());
        http
            .httpBasic(Customizer.withDefaults());
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService(){
        UserDetails user1 = User.builder()
            .username("username")
            .password(bCryptPasswordEncoder().encode("password"))
            .roles("ADMIN")
            .build();

        return new InMemoryUserDetailsManager(user1);
    }
}

마무리

config-server 실행

    • 9000 포트로 설정해서 localhost:9000/user/dev 로 접근
      • github에 user-dev.yml 파일에 접근해서 안의 소스들을 가져옴.  
      • user는 나중에 생성할 user 서비스를 나타냄
      • user 서비스의 name을 user로 지정하면 나중에 이 경로로 접근해서 값 가져옴

결과

git push

  • feature 브랜치에서 add, commit 하고 push
  • develop 으로 PR 한 뒤에 feature 브랜치 삭제

'MSA' 카테고리의 다른 글

[KEUPANG] API Gateway 생성  (2) 2024.11.26
[KEUPANG] EurekaClient 설정  (0) 2024.11.26
[KEUPANG] Eureka Server 생성  (0) 2024.11.25
[KEUPANG] User service project 생성  (0) 2024.11.25
[KEUPANG] MSA Root Project 생성  (0) 2024.11.25