[AWS] 배포 시 Github Secret으로 민감 정보 yml 파일 관리하기
이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
✅ 배포 시 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
✅ 참고 자료 & 링크
https://velog.io/@austinan/Github-Action-secret-variable-%ED%8C%8C%EC%9D%BC-%EA%B4%80%EB%A6%AC
https://keeeeeepgoing.tistory.com/170