AWS

[AWS] 배포 시 Github Secret으로 민감 정보 yml 파일 관리하기

HEY__ 2024. 6. 6. 22:53
728x90

이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!

✅ 배포 시 application.yml은 어떻게 관리하지?

서비스를 개발하면서 DB 계정의 정보(계정 이름, 패스워드...), JWT 시크릿 키 등 외부에 공개되서는 안되는 값들을 `application.yml`과 같은 `yml` 파일에 저장하고,

`.gitignore`에 `yml` 파일들을 등록하여 Github에 올라가지 않도록 한다.

 

그렇다면 AWS EC2 인스턴스에 빌드 파일을 올려 실행할 때, 혹은 Github Actions를 통해 테스트 코드 실행 & 빌드 실행할 때 

이 `yml` 파일이 필요한데 어떻게 관리해야할까?

 

 

여러 가지 방법이 있지만, 그 중 내가 적용해본 방법은 밑과 같다.

1) Github Secret에 yml의 내용을 등록

2) Github Actions workflow 파일인 main.yml의 step에서 yml 파일을 만드는 작업 추가

 

이렇게 하면 Github repository에 yml 파일을 올릴 필요가 없어 보안적으로도 안심이 되고, 등록해두면 작업이 실행되면서 알아서 yml 파일을 만들기 때문에 편리하다는 장점이 있다.


✅ yml 내용을 Github Actions의 repository secrets으로 등록

그럼 개발하면서 작성했던 .yml 파일의 내용을 Github actions secrets으로 등록해보자.

 

`Settings` → `Secrets and variables` → ` Actions` → `New repository secret` 선택

 

 

 

예로 들어 밑과 같은 yml 파일이 있다고 가정하자.

spring:
  profiles:
    include: common, dev

 

시크릿 이름을 원하는 이름으로 설정하고, Secret 란에 yml의 내용을 담고 `Add secret`을 누르면 된다.

 

 

위와 같은 방식으로 yml 파일들의 내용을 모두 Github Actions secrets에 저장하자.


Github Actions workflow 작성

yml 내용들을 모두 Secrets에 저장했으니, 이제 Github actions가 실행될 때 yml 파일을 만들도록 해보자.

 

1. `yml` 파일들이 있어야 할 디렉토리를 생성

Spring boot를 기준으로 yml 파일은 `src/main/resources` 폴더 내에 위치한다.

`mkdir -p` 명령어를 통해 해당 디렉토리가 존재하지 않으면 생성하게끔 한다.

(`-p`를 붙이면 상위 디렉토리까지 함께 만듬)

 

mkdir -p ./src/main/resources

 

2. 필요한 `yml` 파일들을 생성

생성한 디렉토리로 이동(`cd`) 후, 필요한 yml 파일들을 `touch` 명령어를 통해 생성한다.

 

cd ./src/main/resources
touch ./application.yml
touch ./application-common.yml
touch ./application-prod.yml

 

3. 생성한 `yml` 파일에 Github actions secrets으로 설정한 값들을 복사

`echo` 명령어를 통해 값을 복사할 수 있다.

`${{secrets.APPLICATION}}`에서 `secrets.` 뒤에 secrets name(이름)을 적으면 해당 값을 불러올 수 있다.

 

echo "${{ secrets.APPLICATION }}" > ./application.yml
echo "${{ secrets.COMMON }}" > ./application-common.yml
echo "${{ secrets.PROD }}" > ./application-prod.yml

 

 

 

main.yml 전체 버전

name: Build and Deploy to EC2

on:
  push:
    branches: [ "production" ]
  pull_request:
    branches: [ "production" ]

env:
  AWS_REGION: ap-northeast-2
  AWS_S3_BUCKET: gitget-deploy-bucket
  AWS_CODE_DEPLOY_APPLICATION: GitGet-Application-CD
  AWS_CODE_DEPLOY_GROUP: GitGet-Deployment-Group

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v4

      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

	# secrets 내용을 읽어 yml 파일을 특정 위치에 생성
      - name: make application.yml
        run: |
          mkdir -p ./src/main/resources
          cd ./src/main/resources
          touch ./application.yml
          touch ./application-common.yml
          touch ./application-prod.yml
          echo "${{ secrets.APPLICATION }}" > ./application.yml
          echo "${{ secrets.COMMON }}" > ./application-common.yml
          echo "${{ secrets.PROD }}" > ./application-prod.yml

      - name: make test application.yml
        run: |
          mkdir -p ./src/test/resources
          cd ./src/test/resources
          touch ./application.yml
          touch ./application-test.yml
          echo "${{ secrets.APPLICATION_TEST }}" > ./application.yml
          echo "${{ secrets.TEST }}" > ./application-test.yml

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash

      - name: Build and Test
        run: ./gradlew build test

      - name: Make zip file
        run: zip -r ./$GITHUB_SHA.zip .
        shell: bash

      - name: AWS credential 설정
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_REGION }}
          aws-access-key-id: ${{ secrets.CICD_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.CICD_SECRET_KEY }}


      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$AWS_S3_BUCKET/$GITHUB_SHA.zip

      - name: EC2에 배포
        run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=$AWS_S3_BUCKET,key=$GITHUB_SHA.zip,bundleType=zip

 

 


✅ 개선점? - Spring Cloud Config

위의 방식에는 단점도 존재한다.

1) Github secret으로 등록한 값이 무엇인지 확인할 수 없고

2) yml 값이 바뀌면 배포도 다시 해야 함

위와 같이 2가지 단점이 존재해 구글을 통해 조사해본 결과, 이를 보완하는 방법 중 하나로 `Spring Cloud Config`를 예로 들고 있었다.

 

아직 적용은 해보지 못한 상태지만, 이 방법을 조금 더 조사 및 적용해보고 이후에 포스팅을 해보도록 하겠다 :)

 

https://madplay.github.io/post/introduction-to-spring-cloud-config

 

Spring Cloud Config: 소개와 예제

스프링 설정이 바뀌었을 때 빌드, 배포없이 갱신하려면 어떻게 해야할까? 스프링의 설정 파일들을 어떻게 외부로 분리시킬 수 있을까?

madplay.github.io


✅  참고 자료 & 링크

https://velog.io/@austinan/Github-Action-secret-variable-%ED%8C%8C%EC%9D%BC-%EA%B4%80%EB%A6%AC

 

Github Action - secret variable 파일 관리

먼저, 본격적인 파일 보안 관리 글 작성 전에 ci/cd 의 정의와 github action 을 채택한 이유을 작성해보고자 한다.사진으로 먼저 간략하게 보자면, 위와 같다고 할 수 있다.ci 는 Continuous Integration 로서

velog.io

 

https://velog.io/@balparang/Github-Secret-%EC%9C%BC%EB%A1%9C-yml-%ED%8C%8C%EC%9D%BC-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0

 

Github Secret 으로 yml 파일 관리하기

민감한 정보(유출되면 안 되는 비밀번호 등)를 Github에 올리게 되면 피똥을 쌀 수도 있으므로, 이를 암호화 해서 관리하는 방법에 대해서 알아보자.

velog.io

 

https://keeeeeepgoing.tistory.com/170

 

스프링환경설정파일(.properties,.yml),노출되면 안되는 정보 파일 관리, 빌드/배포 [미완]

Spring boot 프로젝트를 github public repository에 올리게 되면 application.* 또는 노출되면 안되는 정보가 적힌 파일이 노출될 수 있다. 외부에 중요한 정보가 노출되지 않고 팀과 파일 공유 / 빌드,배포하

keeeeeepgoing.tistory.com

 

728x90