목표
- 오토 스케일링을 통해 게임 서버의 부하를 분산하기 위함
- 클라이언트가 동일한 IP로 접근하였을 때 로드 밸런서를 통해 적절한 인스턴스로 라우팅하기 위함
사용한 기술 스택
- AWS : 클라우드 기반의 IT 인프라를 제공해주는 아마존 웹 서비스. 원격 서버 배포, 오토 스케일링, 로드 밸런서 등 다양한 서비스를 시간과 비용면에서 가장 효율적으로 이용할 수 있다고 판단하여 선택하였다.
- EIP : AWS가 제공하는 탄력적 IP 주소. 클라이언트가 이 퍼블릭 주소를 통해 로드 밸런서에 접속 요청을 보내면, 연결된 인스턴스 중 상태가 원활한 곳으로 라우팅해준다. 오토 스케일링으로 인스턴스가 여러 개 생성되어도 하나의 고정 IP를 사용하고 싶기 때문에 선택하였다.
- NLB : AWS의 네트워크 로드 밸런서. TCP 서버이므로 선택하였고, 고정된 EIP를 통해 접속을 요청할 수 있으며 가용한 개별 인스턴스로 알아서 라우팅해주기 때문에 선택하였다.
- 오토 스케일링 : 배포한 서버의 퍼포먼스가 일정 수준에 도달하면 새로운 인스턴스를 생성하여 부하를 분산하고 싶었다.
배포 과정
0. 시작 템플릿 생성
1) AWS 콘솔 → EC2 → 시작 템플릿 → 시작 템플릿 생성
2) OS 선택
3) Instance Type 선택
4) 키 페어 설정(SSH 접근을 위해 필요)
5) User Data 추가(서버 실행 시 자동 실행될 스크립트)
시작 템플릿 USER DATA 작성하기
🥕 AWS User Data를 위한 쉘 스크립트는 반드시 #!/bin/bash 로 시작해야 한다.
우리의 프로젝트에서는 서버를 도커 이미지로 허브에 저장하였고, 이를 쉘 스크립트를 통해 실행하고자 했다.
도커가 가진 장점에는 여러가지가 있겠지만, 게임 서버의 인스턴스가 다수 생성되어도 언제나 "동일한 실행 환경"을 보장한다는 점에서 선택하게 되었다.
도커 이미지와 컨테이너 기술이 가진 일관성과 도커 허브를 통한 배포의 편리성이 우리 프로젝트에 도입하기에 적합하다고 생각한다.
#!/bin/bash
## 로그 출력 및 저장 설정
exec > >(tee /var/log/user-data.log | logger -t user-data -s 2>/dev/console) 2>&1
echo "EC2 인스턴스 시작 후 설정 중..."
## 패키지 업데이트 및 필수 패키지 설치
echo "1️⃣ 패키지 업데이트 중..."
sudo apt update -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
## Docker 설치
echo "2️⃣ Docker 설치 중..."
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt install -y docker-ce docker-ce-cli containerd.io
## Docker 서비스 시작 및 사용자 권한 설정
echo "3️⃣ Docker 서비스 시작..."
sudo systemctl start docker
sudo systemctl enable docker
## Docker Hub 로그인
echo "4️⃣ Docker Hub 로그인..."
echo "도커 허브 비밀번호 or 도커 허브에서 액세스 토큰을 받아서 여기에 입력하기" | docker login -u "유저 네임" --password-stdin
## Docker 이미지 가져오기
echo "5️⃣ Docker 이미지 가져오는 중..."
docker pull ppiok/moonrabbits:latest
## Docker 컨테이너 실행 (자동 재시작 설정 추가)
echo "6️⃣ 게임 서버 실행 중..."
docker run -d --name moonrabbits --restart unless-stopped -p 3000:3000 ppiok/moonrabbits:latest
## 실행 완료 로그 확인
echo "7️⃣ 게임 서버 실행 완료!"
sleep 3
docker ps
tip : 명령어 echo 다음에 문자열을 입력하면, 문자열을 터미널에 띄울 수 있다. console.log();나 Console.WriteLine();이라고 이해하면 된다.
🐱👤 exec > >(tee /var/log/user-data.log | logger -t user-data -s 2>/dev/console) 2>&1
실행 로그를 /var/log/user-data.log 및 시스템 로그, 콘솔 출력으로 보낸다.
🐱👤 systemctl start docker && systemctl enable docker
Docker 데몬을 시작하고, 재부팅 시 자동 실행되도록 설정한다.
🐱👤 docker pull 및 docker run
최신 게임 서버 이미지를 가져와(pull), 컨테이너로 실행(run).
-p 3000:3000 으로 EC2의 3000번 포트와 컨테이너의 3000번 포트** 매핑.
도커 허브 사용법에 대한 건 다른 게시물에서 자세하게 다루도록 하겠다.
1. Network Load Balancer(NLB) 생성
1) AWS 콘솔 → EC2 → Load Balancers → Create Load Balancer
2) Network Load Balancer 선택
3) AZ(가용 영역)마다 Elastic IP(EIP)를 할당(자동으로 고정 IP 부여됨)
2. Target Group 생성
NLB는 백엔드 인스턴스로 트래픽을 라우팅해야 하므로, Target Group을 설정한다.
1) AWS 콘솔 → EC2 → Target Groups → Create Target Group
2) 타겟 유형 : 인스턴스
3) 리스너 프로토콜 : TCP
4) 리스너 포트 : 3000. 헬스 체크용 포트를 연 게 아니라면 서버 포트와 같은 포트로 설정해줘야 한다.
5) Health Check 설정
3. 오토 스케일링 그룹 생성
1) AWS 콘솔 → EC2 →오토 스케일링 그룹 → 오토 스케일링 그룹 생성
2) 시작 템플릿 선택(위에서 만든 것)
3) VPC & 서브넷 선택(NLB와 같은 VPC 사용)
4) 로드 밸런서 추가(앞서 만든 Target Group 연결)
5) 최소, 최대 용량 설정
여기서 중요한 것은 EIP를 적용하기 위해 서브넷을 NLB와 동일한 것으로 선택해야 한다는 점.
콘솔에서 생성한 EIP를 선택하면 아래와 같은 화면이 나오는데 네트워크 인터페이스 ID를 클릭하여 서브넷 및 VPC에 속성값을 확인할 수 있다.
마지막으로, CPU 사용량을 기준으로 설정하여 오토 스케일링을 해주었다.
🐰 이해를 돕기 위한 중요 포인트!
여기서 생성한 EIP는 직접 인스턴스에 할당하기 위함이 아니다.
로드 밸런서를 위한 IP이며, 해당 IP로 클라이언트가 접속 요청을 보내면 대상 그룹으로 지정된 인스턴스로 알아서 연결을 해준다.
AWS의 로드 밸런서(ALB 또는 NLB)는 "리스너(Listener) → Target Group → 인스턴스" 구조로 동작하며, 각 단계에서 포트를 다르게 설정할 수 있다.
사용자 요청 → [NLB 80] → [Target Group 8080] → [EC2 8080]
로드 밸런서 - 리소스 맵 탭을 통해 헬스 체크도 확인할 수 있다.
🐌 클라이언트가 EIP:3000으로 접속 요청
🐌 로드 밸런서 리스너는 대상 그룹 중에서 사용 가능한 인스턴스로 라우팅
🐌 대상 인스턴스의 3000번 포트로 연결
'JS > TIL(Today I Learned)' 카테고리의 다른 글
2025-03-11 <최종 프로젝트 D-3> EC2 서버 Brute Force 공격 대응하기 (0) | 2025.03.11 |
---|---|
2025-03-10 <최종 프로젝트 D-4> 스트레스 테스트 (1) | 2025.03.10 |
2025-03-06 <EC2(ubuntu) 도커 초기 환경 설정> (0) | 2025.03.06 |
2025-03-05 <최종 프로젝트 D-9> (2) | 2025.03.05 |
2025-03-04 <최종프로젝트 D-10> (0) | 2025.03.04 |
댓글