부하테스트용 EC2 백엔드 서버 및 인프라 구축 방법

부하테스트용 백엔드 인프라 구성 방법

부하테스트용 EC2 백엔드 서버 생성 방법

AWS > EC2 검색 > 인스턴스 시작 버튼 > 이름 : backend-server 입력 > Quick Start : Ubuntu 운영체제 선택 > 인스턴스 유형 : t3a.small (테스트용 스프링부트 애플리케이션의 사양에 맞는 인스턴스 유형 선택) 확인 > 키 페어(로그인) : 키 페어 생성 > 네트워크 설정에서 방화벽(보안 그룹) : 다음에서 SSH 트래픽 허용 (0.0.0.0/0), 인터넷에서 HTTP 트래픽 허용 선택 (80번 포트로 서버와 통신 가능) > 인스턴스 시작 > 인스턴스 상태가 대기 중에서 실행 중으로 변경되면 서버 연결 가능
부하테스트 서버에서 부하를 보낼 테스트용 백엔드 서버 EC2 인스턴스를 생성합니다.

RDS DB 전용 보안그룹 생성 ★

AWS > EC2 검색 > 네트워크 및 보안 > 보안그룹 메뉴 > 보안 그룹 생성 > 보안 그룹 이름 : mysql-db-sg 입력 > 설명 : MySQL 전용 DB 보안그룹 입력 > 인바운드 규칙 : 규칙 추가 > 유형 : MYSQL/Aurora 선택, 소스 : 소스 : Anywhere-IPv4 (0,0,0,0/0) 선택 > 보안 그룹 생성
MySQL DB에 접속 가능하도록 허용하는 인바운드 규칙을 따로 관리하는 보안 그룹을 생성합니다.
실습 편의를 위해 0.0.0.0/0으로 설정했으나, 필요한 IP 또는 보안 그룹으로 접근을 제한하는 것이 좋습니다.

AWS RDS 생성 방법

AWS > RDS 검색 > 데이터베이스 생성 > 표준 생성 > MySQL 선택 > 템플릿 : 프리티어 > DB 인스턴스 식별자 : test-database > 마스터 사용자 이름 : admin > 마스터 암호, 마스터 암호 확인 : 패스워드 입력하여 설정 > 인스턴스 구성 : db.t4g.micro > 퍼블릭 액세스 : 예 선택 > 기존 VPC 보안 그룹 : 생성한 mysql-db-sg 보안그룹 선택 > 추가 구성 > 초기 데이터베이스 이름 : testdb > 데이터베이스 생성 > 데이터베이스 상태가 생성 중에서 백업 중으로 변경되면 엔드포인트가 표시되고, 사용 가능으로 변경되면 엔드포인트로 DB 연결 가능

AWS ALB 생성 방법

AWS > EC2 검색 > 로드 밸런싱 > 로드밸런서 메뉴 > 로드밸런서 생성 > 로드밸런서 유형 ALB 선택 > 생성 > 로드 밸런서 이름 : backend-alb 입력 > 네트워크 매핑에서 가용 영역 : 서브넷 4개 모두 선택 > 보안 그룹 : 새 보안 그룹 생성 > 보안 그룹 이름 : backend-alb-sg 입력 > 설명 : ALB 전용 보안그룹 입력 > 인바운드 규칙 : 규칙 추가 > 유형 : HTTP 선택, 소스 : 소스 : Anywhere-IPv4 (0,0,0,0/0) 선택 > 보안 그룹 생성 > 보안 그룹 우측 새로고침 버튼 클릭 > 기존 default 보안그룹 제거 > 생성한 backend-alb-sg 보안그룹 선택 > 리스너 및 라우팅 : 대상 그룹 생성 > 대상 유형 선택 : 인스턴스 체크 > 대상 그룹 이름 : backend-tg 입력 > 상태 검사 경로 : /health 입력 > 다음 > 대상 등록에서 사용 가능한 인스턴스 : 생성한 EC2 백엔드 서버 인스턴스 체크 > 선택한 인스턴스를 위한 포트 : 80 확인 > 아래에 보류 중인 것으로 포함 클릭 > 대상 그룹 생성 > 대상 그룹 선택 우측 새로고침 버튼 클릭 > 생성한 대상그룹 backend-tg 선택 > 로드밸런서 생성 > ALB 로드밸런서 상태가 프로비저닝 중에서 활성 중으로 변경되면 로드밸런서 사용 가능
부하테스트 툴에서 요청을 보내면, 여러 백엔드 서버로 요청을 분산하는 로드밸런서를 생성합니다.
ELB 중에서 ALB는 HTTP/HTTPS 웹 트래픽 처리에 특화된 로드밸런서입니다.


EC2 백엔드 서버에 스프링부트 애플리케이션 실행 방법

EC2 서버 콘솔 접속

AWS > EC2 검색 > name : backend-server 인스턴스 ID 클릭 > 연결 > 연결

JDK 설치

sudo apt update
sudo apt install openjdk-17-jdk

스프링부트 애플리케이션을 실행하기 위해서 JDK 설치를 선행해야 합니다.

JDK 정상 설치 확인

java -version

스프링부트 프로젝트 클론 받기

$ git clone https://github.com/JSCODE-COURSE/load-testing-server.git

부하테스트용 간단한 스프링부트 프로젝트 코드를 GitHub 저장소에서 내려받습니다.

스프링부트 프로젝트 구성 확인

ALB Health Check용 API

@RestController
public class AppController {

  @GetMapping("/health")
  public String healthCheck() {
    return "Success Health Check";
  }
}

ALB 로드밸런서가 호출하여 인스턴스 정상 실행 여부를 확인하는 헬스 체크 API 컨트롤러입니다.

게시글 조회 및 생성 API

@RestController
@RequestMapping("boards")
public class BoardController {

  private BoardService boardService;

  public BoardController(BoardService boardService) {
    this.boardService = boardService;
  }

  @GetMapping()
  public List<Board> getBoards(
      @PageableDefault(size = 20, sort = "createdAt", direction = Sort.Direction.DESC)
      Pageable pageable
  ) {
    return boardService.getBoards(pageable);
  }

  @PostMapping()
  public Board writeBoard(@RequestBody Board board) {
    return boardService.writeBoard(board);
  }
}

게시글을 최신순으로 조회하거나 생성하는 API 컨트롤러입니다.
부하테스트 툴에서 호출하여 테스트하기 위한 용도로 작성되었습니다.

생성한 RDS 정보 입력

vi /프로젝트명/src/main/resources/application.yml

아래와 같이, application.yml 파일에 DB 연결 정보를 작성하고 저장합니다.

# 생략하면 스프링부트 기본 포트 8080으로 설정 됨
server:
  port: 80

# DB 연결 정보 설정
spring:
  datasource:
    url: jdbc:mysql://RDS엔드포인트:3306/testdb
    username: admin
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: create

ddl-auto: create는 애플리케이션을 실행할 때마다 기존 테이블을 삭제하고 다시 만드는 설정입니다.
부하테스트 실습용 프로젝트이므로 테스트 환경을 초기화하기 위해 사용하였습니다.

스프링부트 프로젝트 빌드

cd /프로젝트명
./gradlew clean build -x test

build 폴더 안에 스프링부트 프로젝트가 빌드된 JAR 파일이 생성됩니다.

스프링부트 애플리케이션 실행

cd build/libs
sudo nohup java -jar jscode-0.0.1-SNAPSHOT.jar > app.log 2>&1 &

nohup 명령어로 빌드된 JAR 파일을 이용하여 스프링부트 프로젝트를 백그라운드에서 실행합니다.
표준 출력 및 에러는 app.log에 저장되어 tail 명령어로 확인할 수 있습니다.

스프링부트 애플리케이션 정상 실행 여부 확인

sudo lsof -i:80
또는
ps -ef | grep java

80번 포트를 사용 중인 프로세스를 확인하거나, java 프로세스가 실행중인지 확인하면 됩니다.

EC2 서버로 요청하여 스프링부트 애플리케이션 응답 확인

http://EC2서버IP/health

EC2 서버에서 실행 중인 스프링부트 애플리케이션의 /health API를 직접 호출하여,
Success Health Check가 웹 화면에 정상 표시되는지 확인합니다.

ALB 로드밸런서로 요청하여 스프링부트 애플리케이션 응답 확인
AWS > EC2 검색 > 로드 밸런싱 > 로드밸런서 메뉴 > 생성한 backend-alb 로드밸런서 이름 클릭 > DNS 이름 복사 >

http://ALB로드밸런서DNS이름/health

ALB 로드밸런서 DNS 이름으로 /health API를 호출하면, 대상 그룹에 등록된 EC2 서버로 요청이 전달됩니다.
Success Health Check가 웹 화면에 정상 표시되는지 확인합니다.