조급하면 모래성이 될뿐

서브모듈 적용해서 DB접속정보 보호하기 ! 본문

TroubleShooting/데브코스

서브모듈 적용해서 DB접속정보 보호하기 !

Pawer0223 2022. 8. 7. 22:34

Why?


  • 배포 환경을 구축하다 보니 환경 구성도 분리해야 했다. 그 과정에서 dev환경(aws)의 접속 정보 또한 github에 올려야 했다.
  • 사실 로컬에 대한 접속 정보도 올릴 때마다 찝찝했다.. 그리고 이번에 직접 RDS에 구성한 DB에 접속하기 위한 정보를 push를 해야 하는데.. 이건 아니다 싶었다.

 

How?


  • 이것도 여러 가지 방법이 있었다.
  • 암호화는 복호화 과정에서 필요한 key를 계속 관리해야 한다는 게.. 마음에 들지 않았다. 또 OS환경변수는 뭔가 너무 간단(?)했다. 그래서 서브모듈을 써봤다.
  • 서브모듈을 통해 application-dev.yml 파일을 관리했다.

 

서브모듈?


  • 쉽게 private repository를 만들고 거기에 중요한 파일을 올린다.
  • 그리고 프로젝트에 private repository를 서브 모듈로 연결시킨다.
  • 결과적으로 서브모듈은 하나의 디렉터리처럼 관리된다.

private repository
서브모듈 연결하면 이렇게 보임 !
연동된 서브모듈은 하나의 디렉토리처럼 관리된다.
서브모듈 디렉토리로 들어가면 remote가 해당 repository로 연동된다

 

적용방법


  • 적용 자체는 어렵지 않다. 참조한 블로그를 첨부한다.
  • 참조

 

서브모듈을 CI과정에 포함시키는 법


  • 서브모듈 디렉터리에 있는 파일을 복사하도록 build.gradle에 추가했다.
task copySecret(type: Copy) {
    from file("10wonmoa-BE-Security")
    into file("src/main/resources/")
}
  • 그래서 CI 돌면서 build 하면서 복사하고, 배포할 때 resources에 application-dev.yml이 잘 배포될 것이라 예상했다..
  • 하지만 제대로 배포되지 않았다. 애플리케이션이 구동하면서 application-dev.yml을 읽지 못했다. (DB 테이블이 생성되지 않음..)
  • 원인은 CI가 GithubActions Runner에서 동작하면서 서브모듈 디렉터리에서 파일을 인식하지 못했던 것 같다..
    • copy 스크립트가 동작하더라도, 해당 디렉터리에 있는 파일을 읽을 수 없었던 것 같다.
  • 그럼 필요한 건 Runner에서 서브모듈을 알 수 있게 하자.. 였다.
  • 관련 키워드로 찾아보니, 서브모듈에 체크아웃하는 과정이 필요했다.

결과적으로 ci에 서브모듈을 checkout 하는 step을 추가했다.

steps:
  - name: Checkout repository and submodules
    uses: actions/checkout@v2
    with:
      token: ${{ secrets.CI_ACCESS_TOKEN }}
      submodules: true
  • 처음에는 저 token이 뭔지 몰라서.. 그냥 빼고 해 봤는데.. 에러가 났다..

  • Checkout 하면서 PW로 token값을 사용하는데, 아무 정보도 없이 checkout 하려고 하니 문제가 발생한 것 같다.
  • private 저장소를 만든 계정으로 새롭게 토큰을 하나 만들었다.
  • 생성된 토큰을 레파지토리 Secrets Actions에 등록해주었다.
    • 즉, checkout 하면서 토큰(pw)를 알 수 있도록했다.

  • 나름 많은 삽질을..하면서 결국 성공했다.

  • 실제로 CD가 완료되고 application-dev.yml에 있는 RDS의 DB에 접속해서 테이블이 생성됐다 !

성공 !

 

 

다른 팀원이 서브모듈에 Push 하려면 ?


  • 기본적인 서브모듈 적용방식은 위에 첨부한 블로그에 역시 잘 설명되어있다.
  • 그런데 push할 때 권한이 없어서 문제가 발생했다..
    • 다른 사람 계정에서 private repository에 대한 접근권한이 없기때문.
  • 해결책은 remote정보를 권한이 있는 token값으로 지정해주면된다.
git remote set-url origin https://{토큰!}@{.git으로 끝나는 서브모듈 레파지토리 URL}
반응형