기존 프로젝트를 리팩토링하기 전에 도커, AWS, Github Actions를 이용해 배포 파이프라인을 만들어보려고 한다. 이 글은 그중 세번째인 RDS 연동과 기존 파이프라인에 반영하는 부분을 다룬다.
순서
- AWS RDS 구성
- 로컬에서 접속해서 데이터베이스 생성
- 스프링 부트 & 스프링 데이터 JPA 테스트 코드 작성
- 로컬 환경에서 환경변수 주입해 docker run 테스트
- 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 }}
끝!
'Cloud > AWS' 카테고리의 다른 글
json 파일 업로드/다운로드하는 API 만들기 : AWS API Gateway, Lambda, S3 사용 (0) | 2023.12.24 |
---|---|
AWS API Gateway로 S3에 파일 직접 업로드/다운로드하는 API 만들기 (0) | 2023.12.24 |
Github Actions와 Docker Hub를 활용해서 CI/CD 파이프라인 구축하기 (1) | 2023.10.29 |
EC2 생성하고 Spring Boot 프로젝트 도커로 배포하기 (0) | 2023.10.29 |
[AWS Session 기록] 12가지 디자인 패턴으로 알아보는 클라우드 네이티브 마이크로서비스 아키텍처 - 김형일, AWS / 박진현, AWS :: AWS Summit Seoul 2023 (0) | 2023.10.27 |