application.yml을 암호화해서 jenkins에 올리자
Spring gradle project에는 application.yml
이라는 설정파일이 있는데 이 설정 파일에 DB에 대한 아이디와 비밀번호가 있다
아이디와 비밀번호를 AWS의 Parameter store를 이용하여 평문을 암호화해보자
배경: 기존 CICD 프로세스
- git에서 변경이력을 push
- jenkins에서 git 소스 코드를 변경감지 이후
gradlew build
하여jar
파일로 만든다- 이 때,
application.yml
은 gitignore에 등록하였기때문에 untracked파일이다 - untracked이기때문에 jenkins에선 이전에 빌드에 사용했던 application.yml을 이용하여 빌드한다
- 이 때,
- jenkins에서
jar
파일을 ec2에게 전달한다 - 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설정
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
여기까지하면 정상적으로 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해도 된다!
댓글 쓰기