웹 개발 공부 : Back-end/DevOps

[클라우드타입] FCM 비공개 SDK json 파일 배포하기 (해결)

Developer KTU 2024. 9. 23. 16:47
반응형

1. 개요

프로젝트 초반 비용 문제 및 간단 배포 테스트로 클라우드타입 서버를 선택했다.
서버 스펙은 SpringBoot + MySQL 이며, 무료티어를 선택했다. 서비스 기능 중 푸시알림 서비스를 제공하기 위해 FCM (Firebase Cloud Messaging) 솔루션을 채택했고, 당연히 Local 개발환경에서는 잘 구현이 되었다. 클라우드타입 서버에 배포만 하면 푸시알림 기능은 해결되는 상황이었다.

 

 

2. 이슈발생

클라우드타입은 기본적으로 FTP, SFTP 방식의 파일 업로드 기능을 제공하지 않는다. 비공개 json 파일을 배포하기 위해선 깃헙에 푸시를 해야하는데 (클라우드타입은 Git + Github Action의 CI/CD 방식을 채택한다.) 보안상의 문제로 json파일은 깃헙에 푸시할 수 없다. 즉, 클라우드타입에 배포할 수 없다는 의미이다.

 

기존 FCMConfig.java의 일부 코드를 보면,

@Configuration
public class FCMConfig {
    @Bean
    FirebaseMessaging firebaseMessaging() throws IOException {
        // Local
        ClassPathResource resource = new ClassPathResource("fcm_비공개SDK_파일이름.json");
        InputStream refreshToken = resource.getInputStream();
        
        ...
        
        ...
        
        ...
    }    
}

이런식으로, ClassPathResource 클래스를 사용하여 ClassPath에 존재하는 파일을 읽어오는 방식이었다. json 파일 배포 자체가 안되는데, 해당 json 파일을 읽어오려하니 당연히 에러가 날 수 밖에...

 

 

3. 시도방법

3-1. 워크플로에서 scp 명령으로 json 파일 전송

워크플로에서 해당 json을 생성한 후 scp 명령으로 클라우드타입 SpringBoot 서버로 파일을 전송하려 했다. 하지만, 클라우드타입에서는 22번 포트를 활용한 외부 터미널 접속을 허용하지 않는데다, 서버가 하루에 한번 내려가며 초기화되기 때문에 터미널에서 설정한 내용들이 초기화된다는 치명적인 특징때문에 실패했다.

 

3-2. json 내용을 클라우드 타입 환경변수 등록

json 내용을 클라우드타입의 시크릿과 스프링부트 환경변수에 등록하였지만, deploy.yml에 적용되지 않아, 환경변수 목록에서 자꾸 사라지는 현상을 마주했다. 아마 보안상의 이유로 json 내용은 deploy.yml에 등록되지 않는 것 같다.

 

3-3. deploy.yml에 json 내용 박제

이 방법은 배포에 성공했다. 하지만 보안에 아주 취약하다. 왜냐하면 deploy.yml에 등록한 json 내용이 깃헙에 그대로 푸시되기 땜문에 외부에 노출되는 것이다. 이러면 보안을 지키려는 노력에 전혀 부합하지 않기 때문에 당연히 pass 했다.

 

3-4. 깃헙액션 시크릿에 json 내용을 등록하고, deploy.yml에 값 가져와 등록

이 방법이 정석이지만, 스프링부트 로직상 json 내용이 String으로 넘어와야하는데, 자꾸 Object로 넘어와서, 에러가 떴다.

 

 

4. 해결

깃헙액션에서 시크릿을 등록할때 싱글 커테이션 ( '' )으로 json 내용을 감싼 후 deploy.yml에 해당 시크릿 내용을 불러왔다.

- name: 환경변수명
  value: ${{ secrets.시크릿이름 }}
// SpringBoot -> FireBase Cloud Message 빈 등록
@Configuration
public class FCMConfig {
    @Bean
    FirebaseMessaging firebaseMessaging() throws IOException {
        InputStream refreshToken = new ByteArrayInputStream(환경변수명.getBytes());
        
        ...
        
        ...
        
        ...
    }    
}

 

이렇게 설정하니, 서버도 정상적으로 기동되었고, FCM 기능도 문제없이 동작하였다!

 

물론, 추후에 AWS로 서버를 이관하게 된다면, FTP나 SFTP로 해당 json 파일을 업로드하면 쉽게 해결이 가능하겠지만, 현재는 클라우드타입을 사용하고 있으니, 아주 머리를 싸매면서 고민하면서 해결한 것 같다.

 

 

클라우드타입을 사용하는데, json을 등록하려는 개발자분들에게 도움이 되는 포스트였으면 좋겠다 :)

 

 

반응형