2022.09.29 - [분류 전체보기] - [사이드프로젝트] 프로젝트 설정 - CI/CD
스프링에서 발생하는 로그를 ec2에 직접 접속하지 않고, 외부에서 쉽게 볼 수 있게 ClouldWatch를 연동했다.
이전에 EC2에 CloudWatchFullAccess 권한을 부여했기 때문에, 해당 설정은 패스.
스프링부트에서 dependency 추가로 쉽게 설정할 수 있었다.
build.gradle에 아래의 모듈을 설정해주고
implementation group: 'ca.pjer', name: 'logback-awslogs-appender', version: '1.6.0'
application.yml에 IAM 사용자의 액세스 키를 설정해주고
aws:
credentials:
access_key: ${aws_access_key}
secret_key: ${aws_secret_key}
logback-spring.xml 에서 AwsLogsAppender를 사용해서 access key, secret key를 가지고 cloudWatch에 전송할 수 있게 했다.
<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>
<springProperty name="AWS_ACCESS_KEY" source="aws.credentials.access_key"/>
<springProperty name="AWS_SECRET_KEY" source="aws.credentials.secret_key"/>
<appender name="aws_cloud_watch_log" class="ca.pjer.logback.AwsLogsAppender">
<layout>
<pattern>${LOG_PATTERN}</pattern>
</layout>
<logGroupName>group-name</logGroupName>
<logStreamUuidPrefix>prefix</logStreamUuidPrefix>
<logRegion>ap-northeast-2</logRegion>
<maxBatchLogEvents>50</maxBatchLogEvents>
<maxFlushTimeMillis>3000</maxFlushTimeMillis>
<maxBlockTimeMillis>1000</maxBlockTimeMillis>
<retentionTimeDays>0</retentionTimeDays>
<accessKeyId>${AWS_ACCESS_KEY}</accessKeyId>
<secretAccessKey>${AWS_SECRET_KEY}</secretAccessKey>
</appender>
구축하고 나서 ec2에 빌드 파일이 올라가는 것까지 확인해서, 배포가 된 줄 알았다. 하지만 사용되고 있는 포트를 보니 8080이 없어서, 로그를 봐보았다.
RuntimeException in Action for tag [springProperty]
java.lang.IllegalArgumentException:
Could not resolve placeholder 'aws_secret_key' in value "${aws_secret_key}"
위와 같이 application-*.yml 파일에 설정해둔 환경변수 key값들이 그대로 출력되고 있었다. ec2 자체에 환경변수를 설정 안해놨어서 그런줄 알고, export를 통해 환경변수를 설정하고 서버 내부에서 직접 배포를 해보았지만 똑같은 결과가 나왔다.
혹시나 해서 vim으로 yml 파일 수정해서 직접 입력하면 정상적으로 스프링이 뜨는 상황… 몇시간 동안 씨름하다가 스프링 로그백 설정하고 나서 로그 파일 쓰는데 permission denied가 떠서 sudo chmod 777 ./app/logs/ 를 해서 해결했던 상황이 있었다. 그래서 혹시나 해서 ./app 폴더까지 권한 설정을 했더니.. 정상적으로 환경 변수가 주입이 되었다..
환경 변수 자체에도 권한이 적용되는 것인건가…?? 잘 모르겠다.. 그래서 해결된 줄 알고 다시 CD로 배포를 해보았지만 똑같이 환경변수가 주입되지 않는 문제가 생겼다… 그래서 환경 변수를 빌드하면서 같이 주입할 수 있는 방법을 찾아 보았고 2가지 방법이 있었따.
- 프로젝트 최상단에 .env 파일을 만들어서 key value 선언
- yml 파일 override
1번은 새로운 파일을 만들어서 넣는것이고, 2번은 기존 yml에 선언된 key value를 다시 overriding하는 것이다.
2번의 방법이 더 쉬워서 2번의 방법대로 git action CD에서 yml을 overriding했다.
- name: Set Yaml
uses: microsoft/variable-substitution@v1
with:
files: ./src/main/resources/application-dev.yml
env:
oauth.kakao.client_id: ${{ secrets.KAKAO_CLIENT_ID}}
oauth.kakao.client_secret: ${{ secrets.KAKAO_CLIENT_SECRET}}
oauth.kakao.redirect_url: ${{ secrets.KAKAO_REDIRECT_URL}}
spring.datasource.username: ${{ secrets.DB_USER}}
spring.datasource.password: ${{ secrets.DB_PASSWORD}}
aws.credentials.access_key: ${{ secrets.AWS_ACCESS_KEY}}
aws.credentials.secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY}}
그리고 EC2에 배포까지 확인했을때도 정상적으로 잘 배포가 되었다.
Github Action으로 CI/CD 구축하기 - 4편 : deploy.yaml 분석