들어가기 전에
Github Action을 통해 Elastic Beanstalk에 SpringBoot 배포하는 부분은 이전 2가지의 포스팅을 통해 완료하였습니다.
기존 SpringBoot 프로젝트의 경우 h2 database를 메모리로 올리는 방식을 사용했습니다. 따라서, Github이 public repository라해도 DB 계정을 암호화하지 않아도 문제가 없었습니다. 하지만, 로컬 데이터베이스가 아닌 환경을 이용할 때에는 보안을 통해 접근을 막는다해도 해당 정보를 모든 사람에게 공유하는 것은 좋지 않습니다.
이번 포스팅에서는 DB의 username이나 password 등 민감 정보를 application.yml에 작성하지 않고 Elastic Beanstalk의 환경속성에 기입하여 각 환경별로 원하는 값을 주입하여 SpringBoot을 실행하는 방법에 대해 알아보고자 합니다.
만약 아직 Elastic Beanstalk과 Github Action을 통해 CD 과정에 대해 구현하지 않았다면 이전 포스팅들을 먼저 보는 것을 추천합니다.
이전 포스팅
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 배포하기(1) - EB 기본 세팅
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 배포하기(2) - IAM 인증키 Github Action에서 사용하여 배포
최종 결과물 구조
이전 포스팅에 작업한 내용물에 RDS를 더해 최종적으로 아래와 같은 구조를 생성해볼 예정입니다.
Elastic Beanstalk에 데이터베이스(RDS) 구성하기
먼저 Elastic Beanstalk의 환경에 접근하여 구성을 클릭합니다.
- 데이터베이스 삭제 정책을 삭제로 선택한 이유는, develop 환경이라 해당 환경을 삭제할 때에 database까지 모두 함께 삭제할 수 있게 하기 위함입니다.
- 처음 RDS를 설정시, 적용을 누르지 않으면 RDS의 도메인(
RDS_HOSTNAME
)이 나오지 않아RDS_HOSNNAME
환경속성을 넣을 수 없기 때문에 데이터베이스 추가 작업 완료 후 Elastic Beanstalk의 환경에 재 접근하여 구성을 클릭 후 환경속성을 넣어줍니다. - 환경 속성에는 springboot 어플리케이션에 주입할 값들을 모두 넣어야 합니다.
- 환경 속성 설정 예시
- springboot에서
spring.profiles.active
에 대한 변수를 지정하고자 한다면SPRING_PROFILES_ACTIVE
를 이름으로 넣고 값을 넣으면 됩니다.
- springboot에서
- 즉,
'.'
(dot)은'_'
(underscore)로 변경하고, 소문자는 대문자로 변경해야 합니다. - 필자의 경우, 아래와 같이 profiles를
ebdev
로 진행하고 해당 파일 내에 db 정보를 환경 속성으로 지정하여 주입받기 위해 위와 같이 설정하였습니다.
- 환경 속성 설정 예시
추가적으로, 기존에 h2 database를 쓰다가 mySQL 또는 postgreSQL 등으로 DB를 처음 바꾸는 경우 springboot의 build.gradle
에 해당 database에 대한 driver가 설치되어 있지 않을 수 있습니다. 따라서, build.gradle
에 해당하는 db 정보에 대해 dependencies
가 걸려있지 않으면 해당 dependencies
를 추가하여 github에 commit & push해야 합니다.
// postgreSQL의 경우
dependencies {
...
runtimeOnly 'org.postgresql:postgresql'
...
}
RDS에 직접 접근하여 database 생성하기
RDS 내 database를 생성해야 해당 database에 springboot가 접근이 가능하기 때문에 먼저 로컬에서 RDS에 접근하여 database를 생성해보겠습니다. 물론, application.yml
을 통해 database가 없을 경우 생성할 수도 있겠지만, RDS 접근이 제대로 되는지 확인할 겸 직접 작성해보겠습니다.
먼저 로컬 환경에서 RDS database에 접근하기 위해 RDS의 보안그룹을 추가해주도록 하겠습니다. 아래와 같이 EC2의 보안그룹 탭을 클릭하고, 신규 보안 그룹을 생성합니다. 이때 해당 보안 그룹에는 인바운드 규칙으로 5432 포트에 대해 로컬 PC에서 접근이 가능하도록 설정합니다.
RDS > 데이터베이스
에 접근하여 적용하고자 하는 데이터베이스 인스턴스 수정 버튼을 눌러 신규 생성한 보안 그룹을 추가해줍니다. 이때, 즉시 적용이 가능하도록 즉시 적용으로 버튼을 변경해줍니다.
이후, 하기와 같이(필자의 경우 DataGrip 사용) 로컬 PC에서 RDS 인스턴스에 접근하여 EB의 환경 속성으로 지정한 RDS_DBNAME
과 동일한 이름의 database를 생성합니다.
CREATE DATABASE beanstalk owner postgres ENCODING 'UTF-8';
Github Action을 통해 Beanstalk에 CD 진행하기(RDS 포함)
위 과정까지 진행한 후 CD workflow가 수행되는 행위(예: 필자의 경우 develop
에 push
)를 진행하면 아래와 같이 CD가 진행됩니다.
위처럼 로그를 확인하면, 기존에 EB 환경설정했을 때와 같이 추가 배치를 이용한 롤링 배포가 진행됨을 알 수 있습니다.
신규 버전으로 배포가 완료되면, 기존 버전의 EC2는 삭제되며, 배포 초기에는 아무래도 CPU 사용량이 많아 상태가 성능 저하됨으로 뜨다가 점차 정상화되면 위와 같이 초록색 동그라미로 바뀌게 됩니다.
배포가 완료되면 위의 왼쪽 사진 속 도메인을 클릭하면 현재 배포한 SpringBoot 어플리케이션으로 이동할 수 있습니다. 또한, 배포가 완료되면, 실행 버전에 신규로 들어간 버전의 어플리케이션명이 뜨게 됩니다. 해당 어플리케이션명은 github action의 cd.yml
(필자의 경우 earth-cd.yml
)에 존재하는 version_label
명에 해당하는 것입니다.
- 필자의 경우
/
위치에 html 파일이 있어 위와 같이 떴지만, 만약 따로 구현한 부분이 없다면 swagger를 넣어서 테스트 해볼 수도 있습니다.
EC2에 SSH로 직접 접근해서 로그 확인하기
Github Action과 Elastic Beanstalk에 의해 EC2에 제대로 배포되었는지 SSH 로그를 통해 확인해보고자 합니다. 확인하기 위해서는 먼저 EB에 의해 EC2의 키페어를 로컬에 저장해야 합니다. 일반적으로 ~/.ssh
위치에 저장하며 키를 400으로 권한을 변경한 후 /var/log
에 접근하여 web.stdout.log
를 통해 springboot 로그를 확인할 수 있습니다.
- 이때, AWS linux2의 경우 ssh에 붙는 user명은
ec2-user
인데 로그는 root로 쌓이기 때문에sudo
를 통해서 로그를 확인할 수 있습니다.- EC2 VM 환경에 따라 ssh 접속 user명이 다르기 때문에 해당 부분은 자신의 VM이 AWS linux2가 아니라면 구글링 후 접속하는 것을 추천드립니다.
- 또한 ssh 접근 url의 경우 EC2에서 접근하고자하는 인스턴스 클릭 후 해당 인스턴스의 퍼블릭 IPv4 DNS를 입력하면 됩니다.
cd ~/.ssh
chmod 400 [키페어 - ~/.ssh위치에 있다고 가정]
ssh -i [키페어] ec2-user@[ec2 public ipv4 dns]
cd /var/log
sudo vi -R web.stdout.log
추가 정보
EB에 의해 생성된 RDS timezone 설정 변경하기
먼저 AWS RDS > 파라미터 그룹을 클릭하여 파라미터 그룹 생성을 클릭합니다. 신규 파라미터 그룹을 생성한 후, 해당 그룹을 클릭하여 파라미터 수정을 클릭합니다. 이때, timezone을 검색하여 수정 버튼을 클릭하면 timezone을 바로 찾을 수 있고 해당 파라미터를 자신이 원하는 timezone으로 수정하면 됩니다.
위 과정을 통해 생성된 DB 파라미터 그룹은 적용하고자 하는 데이터베이스 인스턴스에서 수정버튼을 클릭해 DB 파라미터 그룹 항목을 신규로 생성한 그룹으로 바꿔준 뒤, 즉시 적용을 클릭하면 바로 데이터베이스에 적용이 됩니다.
참고 자료
끝내며
3개의 포스팅으로 Github Action + Elastic Beanstalk(ALB + S3 + EC2[nginx + springboot] + RDS) 구조로 배포를 진행해보았습니다. 추후에는 Github Action을 통해 docker에 springboot을 말아올려 ECS에 보관하여 Elastic Beanstalk을 통해 배포하는 실습을 진행해보도록 하겠습니다.