application.yml을 암호화해서 jenkins에 올리자
Spring gradle project에는 application.yml이라는 설정파일이 있는데 이 설정 파일에 DB에 대한 아이디와 비밀번호가 있다
아이디와 비밀번호를 AWS의 Parameter store를 이용하여 평문을 암호화해보자

배경: 기존 CICD 프로세스

  1. git에서 변경이력을 push
  2. jenkins에서 git 소스 코드를 변경감지 이후 gradlew build하여 jar파일로 만든다
    • 이 때, application.yml은 gitignore에 등록하였기때문에 untracked파일이다
    • untracked이기때문에 jenkins에선 이전에 빌드에 사용했던 application.yml을 이용하여 빌드한다
  3. jenkins에서 jar파일을 ec2에게 전달한다
  4. ec2는 java -jar를 통해 실행한다
    • 저는 java -jar을 직접 실행하지않고 Docker를 통하여 스프링프로젝트를 이미지화하여 실행하였습니다

즉, git에서 변경 -> jekins에서 jar 빌드 -> jar를 외부(ec2)로 전달 -> EC2에서 jar를 Docker를 이용하여 실행

단순하게 application.yml 업데이트(git application.yml 포함X)

EC2에서 jar실행을 Docker를 이용하여 실행하기때문에 application.yml을 업데이트하고 싶으면 단순히 Docker를 실행하는 호스트(ec2)에서 application.yml을 지정하여 DockerFile로 구성하면 되긴하지만 정상적인 프로세스가 아니다

ec2에서 실행

1
2
3
4
5
6
FROM openjdk:11-jre-slim
ARG JAR_FILE=build/libs/*-SNAPSHOT.jar // jenkins에서 통해 전달받은 jar 경로
ARG ENV_FILE=build/libs/*.yml // 업데이트할 application.yml을 미리 ec2로 옮겨놓는다
COPY ${JAR_FILE} app.jar
COPY ${ENV_FILE} application.yml
ENTRYPOINT ["nohup","java","-jar","/app.jar","--spring.config.name=application”,”&”]

application.yml 암호화(git application.yml 포함)

1. AWS parameterStore설정

image
parameter 생성

2. application.yml에 적용

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://********.ap-northeast-2.rds.amazonaws.com:3306/review_db
    username: ${/k5s/db/id}
    password: ${/k5s/db/passwd}
  application:
    name: webclient

Infra:
  aws:
    credentials:
      instance-profile: false
      access-key: [access key]
      secret-key: [secret key]
    region:
      auto: false
      static: ap-northeast-2
    stack:
      auto: false

하지만 aws의 key를 외부에 공개하면 보안상 좋지않다
터미널에 aws credentials을 등록하면 된다

3. jenkins에서 AWS 자격증명

jenkins에서도 jar를 build할 경우 aws credentials이 필요하다

  • a. Jenkins 관리 -> 플러그인 관리 -> AWS Parameter Store Build Wrapper -> Jenkins 재부팅
  • b. Jenkins 관리 -> Manage Credentials
    Add credentials

여기까지하면 정상적으로 jenkins에서 빌드 성공할 것이다

만약 freestyle이 아니라 pipeline을 사용할 경우

1
2
3
4
5
6
7
8
9
10
11
stage('test aws parameter store') {
           steps {
               withAWSParameterStore(credentialsId: 'jenkins에서 설정한 credetianls ID', 
               path: "/all-knu/firebase_${env.PROFILE}",
               naming: 'basename',
               regionName: 'ap-northeast-2') { 
                            echo "${env.ADMINSDK}"
                            writeFile file: 'test.json', text: "${env.ADMINSDK}"
                   }
           }
       }

EC2에서 전달받은 jar을 그대로 실행시킬거면 jenkins에서 빌드 후 조치에 java -jar ~/ec2/전달받은 경로 로 하면 되지만, EC2에서 Docker를 이용하여 jar 실행할 경우 따로 환경변수 명령어를 적어줘야한다

4. Docker에 AWS 자격증명

Docker Image 만들기

1
2
3
4
5
ARG JAR_FILE=build/libs/*-SNAPSHOT.jar
ARG ENV_FILE=build/libs/*.yml
COPY ${JAR_FILE} app.jar
COPY ${ENV_FILE} application.yml
ENTRYPOINT ["nohup","java","-jar","/app.jar","&"]

Docker Container 실행

docker run -e AWS_ACCESS_KEY_ID=*** -e AWS_SECRET_ACCESS_KEY=**** ImageName

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.5)

Docker Compose를 사용하는 경우

1
2
3
4
5
6
7
8
9
version: "3"
services:
  review-server:         # Spring Boot 컨테이너 이름 (원하는 이름)
    image: emrhssla/k5s-review
    environment:
      - AWS_ACCESS_KEY_ID=****
      - AWS_SECRET_ACCESS_KEY=****
    ports:
      - 8080:8080

이제 git에 application.yml와 같은 민감한 정보가 포함되어있는 파일을 tracked해도 된다!

댓글 쓰기