본문 바로가기
Cloud/AWS

AWS RDS 구성하고 Spring Boot와 JPA, Docker Run, Github Action과 연동하기

by 민휘 2023. 10. 29.

기존 프로젝트를 리팩토링하기 전에 도커, AWS, Github Actions를 이용해 배포 파이프라인을 만들어보려고 한다. 이 글은 그중 세번째인 RDS 연동과 기존 파이프라인에 반영하는 부분을 다룬다.

 

순서

  1. AWS RDS 구성
  2. 로컬에서 접속해서 데이터베이스 생성
  3. 스프링 부트 & 스프링 데이터 JPA 테스트 코드 작성
  4. 로컬 환경에서 환경변수 주입해 docker run 테스트
  5. github action 연동

 

AWS RDS 구성

AWS RDS를 다음 옵션으로 생성한다. (DB Engine, 이름, 계정과 비번 등은 원하는 것 선택)

  • free tier
  • public access : yes

 

파라미터 그룹 추가하고 RDS 인스턴스에 연결

  • time_zone : Asia/Seoul
  • character_set_client : utf8mb4
  • character_set_connection : utf8mb4
  • character_set_database : utf8mb4
  • character_set_filesystem : utf8mb4
  • character_set_results : utf8mb4
  • character_set_server : utf8mb4
  • collation_connection : utf8mb4_general_ci
  • collation_server : utf8mb4_general_ci

 

RDS 보안그룹 수정

  • 인바운드 룰 추가 : 자신의 IP - 3306, ec2 인스턴스의 보안그룹 IP - 3306
  • RDS 보안그룹 VPC의 라우팅에 0.0.0.0/0, internetgateway 추가

 

로컬에서 접속해서 데이터베이스 생성

workbench 활용하여 AWS RDS 인스턴스 접속

  • 프로토콜 : SSH
  • hostname : RDS 인스턴스의 엔드 포인트
  • username, password 활용
  • 접속하여 sql로 데이터베이스 생성

 

스프링 부트 & 스프링 데이터 JPA 코드 작성

spring data jpa, h2 메모리 db 사용하여 테스트함. 관련 설정은 gradle.build에서 사전 진행함.

// 엔티티
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity @Getter
public class TestEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String description;

    public TestEntity(String description) {
        this.description = description;
    }
}

// jpa 레포지토리
public interface TestEntityRepository extends JpaRepository<TestEntity, Long> {}

// 컨트롤러
@RequiredArgsConstructor
@RestController
public class TestEntityController {

    private final TestEntityRepository testEntityRepository;

    @PostMapping("/test/entity")
    public void create() {
        testEntityRepository.save(new TestEntity("new"));
    }

    @GetMapping("/test/{id}")
    public TestEntity get(@PathVariable Long id) {
        return testEntityRepository.findById(id).orElse(new TestEntity("default"));
    }

}

 

 

로컬 환경에서 환경변수 주입해 docker run 테스트

AWS의 RDS 인스턴스 연결을 위해 스프링 설정 작성. 프로필 분리하고, 깃헙에 올라가면 안되는 중요한 정보는 환경변수로 주입하여 사용함. 인텔리제이에서 환경변수 세팅 가능.

# application-dev.yaml
spring:
  profiles:
    active: dev, dev-mariadb

# application-dev-mariadb.yaml
spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: ${SPRING_DATASOURCE_URL} # aws rds end point
    username: ${SPRING_DATASOURCE_USERNAME} # aws rds account name
    password: ${SPRING_DATASOURCE_PASSWORD} # aws rds account pwd
  jpa:
    hibernate:
      ddl-auto: none

 

인텔리제이에서 빌드가 잘 된다면, 도커 이미지를 새로 빌드하고 환경변수를 추가하여 컨테이너를 실행하면 된다.

 

배포된 서비스에 접속해서 잘 실행되는지 테스트해본다.

github action 연동

깃헙 액션 스크립트 중 EC2 인스턴스에 접속하여 애플리케이션을 실행하는 스크립트 부분의 docker run 명령어를 환경변수를 추가한 docker run 명령어로 수정한다. DB_URL, DB_USERNAME, DB_PASSWORD는 깃헙 세팅에서 시크릿으로 추가해야한다.

sudo docker run -p ${{ secrets.PORT }}:${{ secrets.PORT }} \\
--name ${{ secrets.PROJECT_NAME }} \\
-e SPRING_DATASOURCE_URL=${{ secrets.DB_URL }} \\
-e SPRING_DATASOURCE_USERNAME=${{ secrets.DB_USERNAME }} \\
-e SPRING_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }} \\
-d ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}

 

끝!