Server/CLOUD

[AWS, Github Action] Elastic Beanstalk에 SpringBoot 배포하기(3) - EB에 RDS 사용하여 환경속성 통해 application.yml 주입받기

EARTH_ROOPRETELCHAM 2021. 10. 14. 18:41
728x90
반응형

들어가기 전에

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 과정에 대해 구현하지 않았다면 이전 포스팅들을 먼저 보는 것을 추천합니다.

이전 포스팅

최종 결과물 구조

이전 포스팅에 작업한 내용물에 RDS를 더해 최종적으로 아래와 같은 구조를 생성해볼 예정입니다.

최종 결과물 구조

Elastic Beanstalk에 데이터베이스(RDS) 구성하기

먼저 Elastic Beanstalk의 환경에 접근하여 구성을 클릭합니다.

EB에 신규 RDS 구성 및 환경속성 추가

  • 데이터베이스 삭제 정책을 삭제로 선택한 이유는, develop 환경이라 해당 환경을 삭제할 때에 database까지 모두 함께 삭제할 수 있게 하기 위함입니다.
  • 처음 RDS를 설정시, 적용을 누르지 않으면 RDS의 도메인(RDS_HOSTNAME)이 나오지 않아 RDS_HOSNNAME 환경속성을 넣을 수 없기 때문에 데이터베이스 추가 작업 완료 후 Elastic Beanstalk의 환경에 재 접근하여 구성을 클릭 후 환경속성을 넣어줍니다.
  • 환경 속성에는 springboot 어플리케이션에 주입할 값들을 모두 넣어야 합니다.
    • 환경 속성 설정 예시
      • springboot에서 spring.profiles.active에 대한 변수를 지정하고자 한다면 SPRING_PROFILES_ACTIVE를 이름으로 넣고 값을 넣으면 됩니다.
    • 즉, '.'(dot)은 '_'(underscore)로 변경하고, 소문자는 대문자로 변경해야 합니다.
    • 필자의 경우, 아래와 같이 profiles를 ebdev로 진행하고 해당 파일 내에 db 정보를 환경 속성으로 지정하여 주입받기 위해 위와 같이 설정하였습니다.

application-ebdev.yml 생성 및 EB 환경 속성 주입받기 위해 변수화

추가적으로, 기존에 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에서 접근이 가능하도록 설정합니다.

신규 보안 그룹 생성 및 5432 포트에 대해 로컬 PC에서 접속 가능하도록 오픈

RDS > 데이터베이스에 접근하여 적용하고자 하는 데이터베이스 인스턴스 수정 버튼을 눌러 신규 생성한 보안 그룹을 추가해줍니다. 이때, 즉시 적용이 가능하도록 즉시 적용으로 버튼을 변경해줍니다.

RDS 인스턴스에 보안 그룹 추가

이후, 하기와 같이(필자의 경우 DataGrip 사용) 로컬 PC에서 RDS 인스턴스에 접근하여 EB의 환경 속성으로 지정한 RDS_DBNAME과 동일한 이름의 database를 생성합니다.

database 생성

CREATE DATABASE beanstalk owner postgres ENCODING 'UTF-8';

Github Action을 통해 Beanstalk에 CD 진행하기(RDS 포함)

위 과정까지 진행한 후 CD workflow가 수행되는 행위(예: 필자의 경우 developpush)를 진행하면 아래와 같이 CD가 진행됩니다.

추가 배치를 이용한 롤링 배포 진행 후 신규 버전의 EC2 생성

위처럼 로그를 확인하면, 기존에 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를 입력하면 됩니다.

EC2 로그 확인하기

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으로 수정하면 됩니다.

seoul timezone을 갖는 파라미터 그룹 생성

위 과정을 통해 생성된 DB 파라미터 그룹은 적용하고자 하는 데이터베이스 인스턴스에서 수정버튼을 클릭해 DB 파라미터 그룹 항목을 신규로 생성한 그룹으로 바꿔준 뒤, 즉시 적용을 클릭하면 바로 데이터베이스에 적용이 됩니다.

AWS RDS에 DB 파라미터 그룹 변경

참고 자료

끝내며

3개의 포스팅으로 Github Action + Elastic Beanstalk(ALB + S3 + EC2[nginx + springboot] + RDS) 구조로 배포를 진행해보았습니다. 추후에는 Github Action을 통해 docker에 springboot을 말아올려 ECS에 보관하여 Elastic Beanstalk을 통해 배포하는 실습을 진행해보도록 하겠습니다.

728x90
반응형