공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
이번 시간에는 파이프라인을 실행 중일 때 동적으로 설정된 값을 변경하는 실습을 진행한다. 이 과정은 특히 로컬 환경에서 환경 변수를 사용하면서도, 퍼블릭하게 노출되고 싶지 않은 값들을 안전하게 관리하고자 할 때 매우 유용하다.
1. 로컬 환경에서 기본값 설정
우선, 로컬 환경에서 사용할 기본값을 설정해 준다. 예를 들어, 아래와 같은 YAML 파일을 application.yaml에 작성한다.
override:
value: 'from local'
- 이 설정은 로컬에서 애플리케이션을 실행할 때 사용할 기본값이다. 이 값을 기반으로 애플리케이션이 동작하며, 외부에 노출되지 않도록 한다.
2. 컨트롤러 작성
다음으로, Spring Boot 애플리케이션에서 설정된 값을 출력하는 컨트롤러를 작성한다. 이 컨트롤러는 설정된 override.value 값을 가져와 출력한다.
package dev.be.githubaction.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@Value("${override.value}")
private String value;
@GetMapping("/demo")
public String demo() {
return "demo" + value;
}
}
- 이 컨트롤러는 /demo 엔드포인트로 요청이 들어올 때, 설정된 override.value 값을 반환한다. 로컬 환경에서 서버를 띄우고 /demo 엔드포인트에 접근하면 demo from local이라는 응답이 반환된다.
이 상태로 서버를 띄워본다.
3. Github Actions를 이용한 동적 값 주입
이제, 이 로컬 값이 아닌, 배포 환경에 맞춰 동적으로 값을 주입하는 방법을 알아보자. 이를 위해 deploy.yaml 파일에 환경 변수를 설정하고, 해당 변수를 활용해 값을 동적으로 변경하도록 한다.
name: CI-CD
on:
push:
branches:
- main
env:
S3_BUCKET_NAME: s3-eunchan
RESOURCE_PATH: ./src/main/resources/application.yaml //추가
CODE_DEPLOY_APPLICATION_NAME: CODE-DEPLOY
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: CODE-DEPLOY-GROUP
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
//추가
- name: Set yaml file
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.RESOURCE_PATH }}
env:
override.value: ${{ secrets.DI_FROM_SECRET }}
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make zip file
run: zip -r ./$GITHUB_SHA .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
- name: Code Deploy
run: |
aws deploy create-deployment \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip
RESOURCE_PATH: ./src/main/resources/application.yaml
- 이 환경 변수는 우리가 값을 동적으로 치환하고자 하는 YAML 파일의 경로를 지정한다.
- ./src/main/resources/application.yaml 파일은 스프링 부트 애플리케이션의 기본 설정 파일로, 이 파일에 정의된 설정 값들을 배포 과정에서 동적으로 변경할 예정이다.
- name: Set yaml file uses: microsoft/variable-substitution@v1 with: files: ${{ env.RESOURCE_PATH }} env: override.value: ${{ secrets.DI_FROM_SECRET }}
- 이 부분은 Github Actions의 빌드 프로세스 중 YAML 파일의 특정 값을 동적으로 변경하는 역할을 한다.
- microsoft/variable-substitution@v1 액션을 사용하여, 지정된 YAML 파일(files: ${{ env.RESOURCE_PATH }})에서 특정 값을 치환한다.
- env 키워드를 통해, 우리가 변경하고자 하는 환경 변수 override.value의 값을 Github Secrets에 저장된 DI_FROM_SECRET 값으로 설정한다.
이 설정을 통해 배포된 애플리케이션이 예상대로 DI_FROM_SECRET에 저장된 값을 사용하도록 하여, 실제 프로덕션 환경에서 안전하고 일관된 동작을 보장할 수 있다.
4. Github Secrets 설정
이제, Github의 Secrets에 해당 값을 설정해 준다. Settings > Secrets and variables > Actions로 이동하여, 아래와 같이 값을 추가한다.
- Name: DI_FROM_SECRET
- Secret: from prod
이렇게 설정하면, 로컬에서는 from local 값이 사용되지만, 실제 배포 시에는 from prod 값이 사용된다.
5. 배포 후 결과 확인
이제 코드를 푸시하고, 배포된 애플리케이션이 정상적으로 동작하는지 확인한다. Github Actions가 성공적으로 동작했는지 확인하고, AWS 서버에 접속해 다음 명령어를 실행해 보자.
이 명령어는 /demo 엔드포인트에 요청을 보내고, 응답으로 컨트롤러에서 반환하는 값을 확인할 수 있다. 만약 demo from prod라는 응답이 반환된다면, 이는 배포된 애플리케이션이 Github Secrets에 저장된 값을 성공적으로 주입받아 동작하고 있다는 것을 의미한다.
여기서 중요한 점은, 로컬 환경에서는 from local 값이 사용되었지만, 실제 배포 시에는 우리가 설정한 from prod 값이 애플리케이션 내에 반영되었다는 점이다. 이는 Github Actions의 variable-substitution 단계에서 환경 변수가 성공적으로 치환되었음을 보여준다.
또한, 이 결과는 application.yaml 파일에 하드코딩된 값이 아닌, 외부에서 안전하게 관리된 비밀 값이 실제 배포 시에 사용되었음을 의미한다. 이렇게 하면 민감한 정보가 소스 코드에 직접 포함되지 않도록 하면서도, 배포 환경에 맞춘 설정을 유연하게 관리할 수 있다.
따라서, curl 명령어로 확인한 결과가 기대한 대로 나온다면, Github Secrets를 통한 동적 변수 주입이 성공적으로 이루어진 것을 확인할 수 있다.
6. 기타 보안 방법
추가적으로, application.yaml 파일을 .gitignore에 추가해 푸시할 때 해당 파일이 GitHub에 노출되지 않도록 설정할 수도 있다. 이렇게 하면 로컬 환경에서 편리하게 개발할 수 있으면서도, 배포할 때는 안전하게 시크릿 값을 사용할 수 있다.
'BackEnd > Project' 카테고리의 다른 글
[PharmNav] Ch03. 프로젝트 설계 (0) | 2024.09.01 |
---|---|
[PharmNav] Ch02. 요구사항 분석 (0) | 2024.09.01 |
[RealPJ] Ch04. build.gradle에서 주의할 점 (0) | 2024.09.01 |
[RealPJ] Ch04. AWS - Project 개발 고도화 (4) | 2024.09.01 |
[RealPJ] Ch04. AWS - appspec.yaml 작성 (0) | 2024.09.01 |