카카오클라우드 MemStore를 이용한 채팅 웹 서비스 배포
3-tier 아키텍처를 기반으로 클라우드에서 채팅 애플리케이션을 배포하는 방법을 소개합니다.
- 예상 소요 시간: 60분
- 사용자 환경
- 권장 운영 체제: MacOS, Ubuntu
- Region: kr-central-2
- 사전 준비 사항
시나리오 소개
채팅이나 온라인 게임처럼 여러 사용자가 동시에 메시지를 주고받아야 하는 경우, 서버와 클라이언트 간의 지속적인 연결과 실시간 통신이 필요합니다. 기본적으로 브라우저와 서버 간 통신에 사용되는 HTTP 프로토콜은 비연결지향적이며, 서버는 클라이언트의 요청이 있어야만 정보를 전송할 수 있습니다. 이를 해결하기 위해 개발자는 Server-Sent Events(SSE)나 WebSocket을 사용하여 서버에서 클라이언트로 직접 정보를 전송할 수 있습니다. SSE는 주로 서버에서 클라이언트로의 단방향 메시지 전송에 사용되고, WebSocket은 양방향 통신에 적합합니다. 하지만 클라이언트가 다른 서버에 분산되면 실시간 통신이 어려워집니다.
이 문제를 해결하기 위해 Pub/Sub 방식을 사용할 수 있습니다. Pub/Sub는 메시지 발행자와 구독자를 분리하여 독립적인 메시지 전달을 가능하게 합니다. 카카오클라우드 MemStore의 Pub/Sub 기능을 이용하면, 여러 서버와 클라이언트가 실시간으로 메시지를 주고받을 수 있습니다.
시나리오 아키텍처
아키텍처 동작 시나리오
- User A가 메시지를 작성하여 애플리케이션을 통해 서버로 전송합니다.
- 메시지는 애플리케이션 로드 밸런서를 통해 웹 서버로 전달됩니다.
- 로드 밸런서는 스티키 세션 기능을 사용하여 동일한 클라이언트 요청을 동일한 웹 서버에 전달합니다.
- 웹 서버는 메시지를 로드 밸런서를 통해 WebSocket 서버로 전달합니다.
- 로드 밸런서는 스티키 세션 기능을 사용하여 동일한 클라이언트 요청을 동일한 WebSocket 서버에 전달합니다.
- WebSocket 서버는 메시지를 받아 MemStore Pub/Sub 시스템의 특정 채널로 발행합니다.
- MemStore는 발행된 메시지를 구독 중인 모든 WebSocket 서버에 전달합니다.
- 메시지를 구독한 WebSocket 서버는 이를 User B에게 전송하고, User B는 실시간으로 메시지를 수신합니다.
시작하기 전에
사전 작업 단계에서는 채팅 웹 서비스 구성에 필요한 리소스를 생성합니다. 우선 해당 아키텍처를 배포하기 위한 카카오클라우드 네트워크 환경을 구축합니다. 그다음 VM에서 Web 서버 인스턴스, App 서버 인스턴스와 함께, 보안적인 이유로 외부에서 직접 접속할 수 없는 사설 네트워크에 위치한 서버에 접근하기 위해, 중간 단계의 서버인 Bastion 서버 인스턴스를 구성해 보겠습니다.
1. VPC와 서브넷 설정
카카오클라우드에서 컴퓨팅 환경을 구축하기 전에 먼저 VPC와 서브넷의 설정이 필요합니다. 이를 위해, 다중 가용 영역에서 NAT 인스턴스를 이용한 네트워크 구축 문서를 참조하여 프라이빗 서브넷에 존재하는 리소스들이 외부 통신이 가능하도록 네트워크 환경을 구축하세요. 이 튜토리얼의 실습에 필요한 네트워크 설정은 다중 가용 영역에서 NAT 인스턴스를 이용한 네트워크 구축 문서에서 정한 값에 기반합니다.
2. 보안 그룹 설정
-
카카오클라우드 콘솔 > Beyond Networking Service > VPC > 보안 그룹으로 이동합니다.
-
우측의 [보안 그룹 생성] 버튼을 클릭하고, 다음을 참고하여 새로운 보안 그룹을 생성합니다.
보안 그룹: tutorial-bastion-sg
-
보안 그룹 이름과 설명을 아래와 같이 입력합니다.
이름 설명(선택) tutorial-bastion-sg Bastion 호스트의 보안정책 -
하단의 [추가] 버튼을 클릭 후, 인바운드 조건을 아래와 같이 설정하고 [생성] 버튼을 클릭합니다.
나의 퍼블릭 IP 확인하기다음 버튼을 클릭하면 현재 사용 중인 나의 퍼블릭 IP를 확인할 수 있습니다.
추가할 인바운드 규칙 항목 설정값 bastion inbound policy 1 프로토콜 TCP 패킷 출발지 {사용자 퍼블릭 IP}/32
포트 번호 10000-10010 정책 설명(선택) bastion inbound policy 1 bastion inbound policy 2 프로토콜 TCP 패킷 출발지 {사용자 퍼블릭 IP}/32
포트 번호 81 정책 설명(선택) bastion inbound policy 2 bastion inbound policy 3 프로토콜 TCP 패킷 출발지 {사용자 퍼블릭 IP}/32
포트 번호 22 정책 설명(선택) bastion inbound policy 3
보안 그룹: tutorial-web-sg
-
보안 그룹 이름과 설명을 아래와 같이 입력합니다.
이름 설명(선택) tutorial-web-sg 웹서버의 보안정책 -
하단의 [추가] 버튼을 클릭 후, 인바운드 조건을 아래와 같이 설정하고 [생성] 버튼을 클릭합니다.
추가할 인바운드 규칙 항목 설정값 web inbound policy 프로토콜 TCP 패킷 출발지 10.0.0.0/20
포트 번호 80 정책 설명(선택) web inbound
보안 그룹: tutorial-app-sg
-
보안 그룹 이름과 설명을 아래와 같이 입력합니다.
이름 설명(선택) tutorial-app-sg 애플리케이션 서버의 보안정책 -
하단의 [추가] 버튼을 클릭 후, 인바운드 조건을 아래와 같이 설정하고 [생성] 버튼을 클릭합니다.
추가할 인바운드 규칙 항목 설정값 app inbound policy 프로토콜 TCP 패킷 출발지 10.0.32.0/20 포트 번호 8080 정책 설명(선택) app inbound
보안 그룹: tutorial-redis-sg
-
보안 그룹 이름과 설명을 아래와 같이 입력합니다.
이름 설명(선택) tutorial-redis-sg Redis 노드의 보안정책 -
하단의 [추가] 버튼을 클릭 후, 인바운드 조건을 아래와 같이 설정하고 [생성] 버튼을 클릭합니다.
추가할 인바운드 규칙 항목 설정값 redis inbound policy 프로토콜 TCP 패킷 출발지 10.0.0.0/16 포트 번호 6379 정책 설명(선택) redis inbound
-
3. Bastion 인스턴스 생성
Bastion 호스트는 클라우드 인스턴스에 대한 게이트웨이 역할을 하며, 직접적인 접근을 차단해 보안을 강화합니다. 이를 통해 원격 접속과 클라우드 인스턴스 관리가 효율적으로 이루어지며, 계층 간 통신도 원활히 조율할 수 있습니다.
아래는 VM에서 Bastion 인스턴스를 생성하는 방법을 설명합니다.
-
카카오클라우드 콘솔 > Beyond Compute Service > Virtual Machine 메뉴로 이동합니다.
-
인스턴스 메뉴에서 [인스턴스 생성] 버튼을 클릭한 후, 다음과 같이 VM 인스턴스를 생성합니다.
구분 항목 설정/입력값 비고 기본 정보 이름 tutorial-bastion 개수 1 이미지 Ubuntu 20.04 인스턴스 유형 m2a.large 볼륨 루트 볼륨 20 키 페어 {USER_KEYPAIR}
⚠️ 키 페어는 최초 1회 안전하게 보관해야 합니다.
잃어버린 키는 복구할 수 없으며, 재발급이 필요합니다.네트워크 VPC tutorial 서브넷 main (10.0.0.0/20) 보안 그룹 tutorial-bastion-sg
4. Web 인스턴스 생성
-
카카오클라우드 콘솔 > Beyond Compute Service > Virtual Machine 메뉴로 이동합니다.
-
인스턴스 메뉴에서 [인스턴스 생성] 버튼을 클릭한 후, 다음과 같이 VM 인스턴스를 생성합니다.
주의구분 항목 설정/입력값 비고 기본 정보 이름 tutorial-web 개수 2 이미지 Ubuntu 20.04 인스턴스 유형 m2a.large 볼륨 루트 볼륨 20 키 페어 {USER_KEYPAIR}
위에서 생성 또는 사용한 키 페어를 선택 네트워크 VPC tutorial 서브넷 {VPC_ID}
_sn_2 (10.0.16.0/20)보안 그룹 tutorial-web-sg
5. App 서버 인스턴스 생성
-
카카오클라우드 콘솔 > Beyond Compute Service > Virtual Machine 메뉴로 이동합니다.
-
인스턴스 메뉴에서 [인스턴스 생성] 버튼을 클릭한 후, 다음과 같이 VM 서버 인스턴스를 생성합니다.
구분 항목 설정/입력값 비고 기본 정보 이름 tutorial-app 개수 2 이미지 Ubuntu 20.04 인스턴스 유형 m2a.large 볼륨 루트 볼륨 20 키 페어 {USER_KEYPAIR}
위에서 생성 또는 사용한 키 페어를 선택 네트워크 VPC tutorial 서브넷 {VPC_ID}
_sn_4 (10.0.48.0/20)보안 그룹 tutorial-app-sg
시작하기
본격적인 Web 서비스 구성을 위한 세부 작업은 다음과 같습니다.
Step 1. Bastion 호스트 설정
Bastion 서버는 Web 서버와 App 서버 접속을 위한 관문 역할을 하며, 외부에서 접근할 수 있도록 퍼블릭 IP를 부여해야 합니다.
키 페어 파일 권한 문제로 bad permissions
오류가 발생할 경우, sudo
명령어를 추가하여 문제를 해결할 수 있습니다.
-
Virtual Machine > 인스턴스 메뉴에서 위에서 생성했던
Bastion
인스턴스를 선택 후, 우측의 [퍼블릭 IP 연결] 버튼을 클릭합니다.- 연결된 퍼블릭 IP는 네트워크 탭에서 확인할 수 있습니다.
-
로컬 환경에서 터미널 실행 후,
cd
명령어를 사용하여 키 페어 파일을 다운로드받은 폴더로 이동합니다.- 키 파일을 최초 생성해서 사용했다면, 기본적으로 다운로드 폴더에 저장됩니다. (
cd ~/Downloads
)
- 키 파일을 최초 생성해서 사용했다면, 기본적으로 다운로드 폴더에 저장됩니다. (
-
다음 명령어를 실행하여 SSH 접근합니다.
chmod 400 ${PRIVATE_KEY}.pem # 읽기 권한 부여
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP}환경변수 설명 PRIVATE_KEY🖌︎ 키 파일 이름 BASTION_PUBLIC_IP🖌︎ Virtual Machine > 인스턴스 메뉴에서 생성해 둔 `Bastion` 인스턴스 클릭 후, 네트워크 탭에서 확인 가능 -
Nginx Proxy Manager를 실행하기 위해, 먼저 Bastion 호스트를 구성합니다. 다음의 명령어로 프로비저닝을 수행합니다.
sudo curl -o /tmp/install-bastion.sh https://raw.githubusercontent.com/kakaoenterprise/kakaocloud-tutorials/bastion-host/install-bastion.sh
bash /tmp/install-bastion.shNginx Proxy Manager(NPM)란?Nginx Proxy Manager(NPM)는 Nginx를 기반으로 한 웹 서버를 쉽게 설정하고 관리할 수 있도록 도와주는 오픈 소스 프로젝트입니다. 이 도구를 사용하면 사용자는 웹 서버를 효과적으로 구성하고 여러 도메인을 관리할 수 있습니다.
-
사용자 로컬 환경에서 브라우저를 열고, 아래 주소를 입력하여 관리 페이지에 접속합니다.
-
http://${BASTION_PUBLIC_IP}:81/login
- ID :
admin@example.com
- 비밀번호 :
changeme
항목 설명 {BASTION_PUBLIC_IP}
Virtual Machine > 인스턴스 메뉴에서 생성해 둔 Bastion
인스턴스를 클릭 후, 네트워크 탭에서 확인 가능 -
-
Dashboard > Streams로 이동합니다.
-
다음과 같이 Web과 App 호스트의 정보를 각각 입력합니다.
구분 항목 설정값 tutorial-web-1 Incoming Port 10000 Forward Host 생성해 둔 tutorial-web-1
인스턴스의 프라이빗 IP
- Virtual Machine > 인스턴스 메뉴에서 생성해 둔tutorial-web-1
인스턴스를 클릭 후, 네트워크 탭에서 확인 가능Forward Port 22 tutorial-web-2 Incoming Port 10001 Forward Host 생성해 둔 tutorial-web-2
인스턴스의 프라이빗 IP
- Virtual Machine > 인스턴스 메뉴에서 생성해 둔tutorial-web-2
인스턴스를 클릭 후, 네트워크 탭에서 확인 가능Forward Port 22 tutorial-app-1 Incoming Port 10002 Forward Host 생성해 둔 tutorial-app-1
인스턴스의 프라이빗 IP
- Virtual Machine > 인스턴스 메뉴에서 생성해 둔tutorial-app-1
인스턴스를 클릭 후, 네트워크 탭에서 확인 가능Forward Port 22 tutorial-app-2 Incoming Port 10003 Forward Host 생성해 둔 tutorial-app-2
인스턴스의 프라이빗 IP
- Virtual Machine > 인스턴스 메뉴에서 생성해 둔tutorial-app-2
인스턴스를 클릭 후, 네트워크 탭에서 확인 가능Forward Port 22 -
내부 호스트로 들어오는 트래픽은 Bastion을 통해 전달됩니다. 따라서 Web과 App 호스트가 Bastion에서 보낸 트래픽을 받을 수 있도록 보안 그룹을 다음과 같이 설정합니다.
Web 인스턴스
-
Virtual Machine > 인스턴스 메뉴으로 이동 후, 생성해 둔
Web
인스턴스를 클릭합니다. -
보안 탭에서 하이퍼링크 처리된 tutorial-web-sg↗️를 클릭 후, [인바운드 규칙 관리] 버튼을 선택합니다.
-
[추가] 버튼을 클릭하여, 다음과 같이 인바운드 규칙을 추가하고 [적용] 버튼을 클릭합니다.
주의[적용] 버튼을 클릭하지 않으면 저장되지 않습니다.
구분 항목 설정값 Web 프로토콜 TCP 패킷 출발지 {BASTION_PRIVATE_IP}/32
- Virtual Machine > 인스턴스 메뉴에서 생성해 둔Bastion
인스턴스를 클릭 후, 네트워크 탭에서 확인 가능포트 번호 22 정책 설명(선택) Web inbound policy
App 인스턴스
-
Virtual Machine > 인스턴스 메뉴에서 생성해 둔
App
인스턴스를 클릭합니다. -
보안 탭에서 하이퍼링크 처리된 tutorial-app-sg↗️를 클릭 후, [인바운드 규칙 관리] 버튼을 선택합니다.
-
[추가] 버튼을 클릭하여, 다음과 같이 인바운드 규칙을 추가하고 [적용] 버튼을 클릭합니다.
주의[적용] 버튼을 클릭하지 않으면 저장되지 않습니다.
구분 항목 설정값 App 프로토콜 TCP 패킷 출발지 {BASTION_PRIVATE_IP}/32
- Virtual Machine > 인스턴스 메뉴에서 생성해 둔Bastion
인스턴스를 클릭 후, 네트워크 탭에서 확인 가능포트 번호 22 정책 설명(선택) App inbound policy
-
-
사용자 로컬 환경에서 각 호스트에 접근 가능한지 확인하기 위해, 앞서 설정한 포워딩 정보를 참고하여 각 호스트에 맞는 포트로 연결합니다. 키 페어 파일이 있는 폴더로 이동한 후, 아래 명령어를 실행합니다.
*tutorial-web-1
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10000
\*tutorial-web-2
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10001
\*tutorial-app-1
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10002
\*tutorial-app-2
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLICIP} -p 10003환경 변수 설명 PRIVATE_KEY🖌︎ 키파일 이름 BASTION_PUBLIC_IP🖌︎ BASTION_PUBLICIP🖌︎ Virtual Machine > 인스턴스 메뉴에서 생성해 둔 `Bastion` 인스턴스 클릭 후, 네트워크 탭에서 확인 가능
Step 2. 관리형 MySQL 데이터베이스 생성
카카오클라우드의 MySQL은 완전 관리형 데이터베이스 서비스로 VPC 환경에서 제공됩니다. 이 서비스를 사용하면 복잡한 설치 과정 없이 콘솔에서 쉽게 MySQL 인스턴스를 프로비저닝할 수 있고, 논리적으로 분리된 네트워크에서 안전하게 사용할 수 있습니다.
-
카카오클라우드 콘솔 > Data Store > MySQL 메뉴로 이동합니다.
-
Instance Group 메뉴에서 [인스턴스 그룹 만들기] 버튼을 클릭 후, 다음을 참고하여 인스턴스 그룹을 생성합니다.
구분 항목 설정/입력값 기본 설정 인스턴스 그룹 이름 tutorial-mysql 설명 선택 MySQL 설정 엔진 버전 지정된 값을 사용 MySQL 사용자 이름 (예시)admin MySQL 비밀번호 (예시)root1234 인스턴스 가용성/개수 단일 (Primary 인스턴스) 인스턴스 유형 m2a.large 스토리지 유형/크기 100 로그 스토리지 유형/크기 100 네트워크 설정 VPC tutorial 서브넷 {VPC_ID}_sn_5 (10.0.64.0/20)
자동 백업 자동 백업 옵션 미사용
Step 3. 클러스터 생성
카카오클라우드의 MemStore는 인 메모리 데이터 스토어 서비스로 VPC 환경에서 제공됩니다. 이 서비스를 사용하면 복잡한 운영 서버 생성이나 네트워크 구성 등 Redis 노드 프로비저닝에 필요한 모든 과정을 자동으로 수행하며, 다양한 관리 기능을 통해 데이터베이스를 간편하게 관리할 수 있도록 설계되었습니다.
-
카카오클라우드 콘솔 > Data Store > MemStore 메뉴로 이동합니다.
-
클러스터 메뉴에서 [클러스터 생성] 버튼을 클릭 후, 다음을 참고하여 클러스터를 생성합니다.
구분 항목 설정/입력값 구성 옵션 신규 클러스터 생성 Cluster 모드 설정 사용 안 함 기본 설정 Cluster 이름 tutorial-redis 설명 (선택) 튜토리얼 레디스 Redis 호환 설정 엔진 버전 Redis 6.2.5 포트 6379 노드 수 2 (고가용성 체크) 노드 유형 m2a.large 네트워크 설정 VPC tutorial 서브넷 {VPC_ID}_sn_5 (10.0.64.0/20)
보안 그룹 tutorial-redis-sg
노드 배치 Primary(노드) {VPC_ID}_sn_5 (10.0.64.0/20)
노드 배치 Replica(노드) {VPC_ID}_sn_5 (10.0.64.0/20)
자동 백업 자동 백업 옵션 미사용
Step 4. 애플리케이션 서버 생성
WAS(Web Application Server)는 DB와 연결되어 회원가입, 로그인, 댓글 등 복잡한 기능의 서비스를 제공할 수 있습니다.
-
nginx-proxy-manager에서 설정한 포트에 맞게 매핑해 둔 Virtual Machine으로 접속합니다.
# tutorial-app-1
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10002
# tutorial-app-2
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10003환경 변수 설명 PRIVATE_KEY🖌︎ 키파일 이름 BASTION_PUBLIC_IP🖌︎ Virtual Machine > 인스턴스 메뉴에서 생성해 둔 `Bastion` 인스턴스 클릭 후, 네트워크 탭에서 확인 가능 -
예제 프로젝트를 설치합니다.
git clone -b kakaocloud-library https://github.com/kakaoenterprise/kakaocloud-tutorials
-
예제 프로젝트가 위치한 폴더로 이동합니다.
cd kakaocloud-tutorials
-
예제 프로젝트를 빌드 및 실행하는 데 필요한 패키지를 설치합니다.
bash install-requirements.sh
-
환경변수 입력한 뒤, 예제 애플리케이션을 실행합니다.
sudo docker run -it \
-e MYSQL_HOST=${MYSQL_HOST} \
-e DB_USERNAME=${DB_USERNAME} \
-e DB_PASSWORD=${DB_PASSWORD} \
-e REDIS_HOST=${REDIS_HOST} \
-p 8080:8080 \
--name kakaocloud-library-server -d \
$(sudo docker build -q -f ./server/deploy/Dockerfile ./server)환경 변수 설정값 설명 MYSQL_HOST🖌︎ MYSQL_ENDPOINT MySQL 호스트의 주소, MySQL > Instance Group 탭에서 생성해 둔 `tutorial-mysql` 인스턴스 그룹을 클릭 후, 상단 엔드포인트에서 확인 가능 DB_USERNAME🖌︎ ex. admin 데이터베이스 유저 이름 DB_PASSWORD🖌︎ ex. root1234 데이터베이스 유저 패스워드 REDIS_HOST🖌︎ REDIS_PRIMARY_ENDPOINT Redis Primary 엔드포인트
Step 5. Application 서버에 로드 밸런서 생성
-
카카오클라우드 콘솔 > Beyond Networking Service > Load Balancing > 로드 밸런서 메뉴로 이동 후, [로드 밸런서 생성] 버튼을 클릭합니다.
-
로드 밸런서 생성에 필요한 정보를 입력 후, 다음을 참고하여 정보를 입력 후 [생성] 버튼을 클릭합니다.
구분 항목 설정/입력값 유형 선택 Application Load Balancer (L7) 기본 정보 로드 밸런서 이름 tutorial-app-lb 네트워크 VPC tutorial 서브넷 {VPC_ID}_sn_3
(10.0.32.0/20)리스너 프로토콜 HTTP
포트 8080 -
생성한 로드 밸런서의 프로비저닝 상태가
Active
가 될 때까지 대기합니다.- 1~3분 정도 시간이 소요됩니다.
-
좌측 사이드바에서 대성 그룹을 클릭 후, [대상 그룹 생성] 버튼을 클릭합니다.
-
다음을 참고하여 정보를 설정 후, [다음] 버튼을 클릭합니다.
구분 항목 설정/입력값 로드 밸런서 가용 영역 kr-central-2-a 로드 밸런서 tutorial-app-lb 리스너 HTTP:8080 기본 정보 대상 그룹 이름 tutorial-app-target-group 프로토콜 HTTP 알고리즘 라운드 로빈 고정 세션 사용 유형 HTTP 쿠키 고정 기간 3600 싱태 확인 사용
유형 HTTP
HTTP 메서드 GET
HTTP 버전 1.1
HTTP 상태 코드 200
체크 경로 /api/v1.0/status/chat
체크 주기 10
타임 아웃 5
상태 전환 기준 (성공) 3
상태 전환 기준 (실패) 3
-
목록에서 대상 그룹에 추가할 App 인스턴스를 선택합니다.
-
다음과 같이 포트 정보를 입력하고, [대상 추가] 버튼을 클릭한 뒤 [다음] 버튼을 클릭합니다.
대상 인스턴스 포트 tutorial-app-1 8080 tutorial-app-2 8080 -
생성한 정보를 확인 후 [생성] 버튼을 클릭합니다.
-
로드 밸런서와 헬스체크는 연결한 대상인 Application 서버에 접근할 수 있어야 합니다. 이를 위해 Application 서버의 보안 그룹인
tutorial-app-sg
에 아래와 같은 인바운드 규칙을 추가합니다.-
VPC > 보안 그룹으로 이동하여,
tutorial-app-sg
을 선택합니다. -
[인바운드 규칙 관리] 버튼을 클릭하고 다음 정책을 추가합니다. 상태 확인 IP는 2개를 추가해야 합니다.
인바운드 규칙 정책 설명 프로토콜 패킷 출발지 포트 번호 app inbound policy 1 로드 밸런서의 접근 TCP {app-lb-private-ip}/32
- 로드 밸런서 목록에서 생성한 App 서버 로드 밸런서를 선택 후, 세부 정보 탭에서 확인 가능8080 app inbound policy 2 상태 확인을 하는 호스트의 접근 1 TCP {healthcheck-ip1}/32
- Load Balancing > 로드 밸런서 > 대상 그룹 메뉴 > 대상 탭 > 서브넷별 상태 확인 IP에서 확인 가능8080 app inbound policy 3 상태 확인을 하는 호스트의 접근 2 TCP {healthcheck-ip2}/32
- Load Balancing > 로드 밸런서 > 대상 그룹 메뉴 > 대상 탭 > 서브넷별 상태 확인 IP에서 확인 가능8080
-
Step 6. Web 서버 생성
Web 서버는 인터넷 네트워크상에서 HTTP 프로토콜을 통해 HTML, CSS, Javascript 등의 정적 콘텐츠를 웹 브라우저로 전송합니다. 정적 데이터를 제공하기 위해 웹 서버 애플리케이션인 Nginx를 설치하고, 예제 React 프로젝트를 웹 서버를 통해 정적 콘텐츠로 제공하도록 설정합니다. 또한, /api 이하 경로로 들어오는 요청은 app 서버로 포워딩합니다.
-
Nginx Proxy Manager에서 설정한 포트에 맞게 매핑해 둔 VM으로 접속합니다. 키 페어 파일이 존재하는 폴더로 이동하여 실행합니다.
# tutorial-web-1
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10000
# tutorial-web-2
ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10001환경 변수 설명 PRIVATE_KEY🖌︎ 키 파일 이름 BASTION_PUBLIC_IP🖌︎ Virtual Machine > 인스턴스 메뉴에서 생성해 둔 `Bastion` 인스턴스 클릭 후, 네트워크 탭에서 확인 가능 -
예제 프로젝트를 설치합니다.
git clone -b kakaocloud-library https://github.com/kakaoenterprise/kakaocloud-tutorials
-
예제 프로젝트가 위치한 폴더로 이동합니다.
cd kakaocloud-tutorials
-
예제 프로젝트를 빌드 및 실행하는데 필요한 패키지를 설치합니다.
bash install-requirements.sh
-
환경변수 입력한 뒤, 웹 서버를 실행합니다.
sudo docker run -it \
-e SERVER_ENDPOINT=http://${SERVER_ENDPOINT}:8080 \
-p 80:80 -p 443:443 \
--name kakaocloud-library-client -d \
$(sudo docker build -q -f ./client/deploy/Dockerfile ./client)환경 변수 설명 SERVER_ENDPOINT🖌︎ 생성한 Application Load Balancer의 프라이빗 IP를 `{APP_LB_PRIVATE_IP}`에 입력합니다.
Step 7. Web 서버에 로드 밸런서 생성
Web 서버에서 클라이언트의 요청을 수신하고, 해당 트래픽을 여러 서버로 분산하는 로드 밸런서를 설정합니다.
-
카카오클라우드 콘솔 > Beyond Networking Service > Load Balancing > 로드 밸런서로 이동 후, [로드 밸런서 생성] 버튼을 클릭합니다.
-
다음을 참고하여 로드 밸런서 생성에 필요한 정보를 입력 후, [생성] 버튼을 클릭합니다.
구분 항목 설정/입력값 유형 선택 Application Load Balancer
기본 정보 로드 밸런서 이름 tutorial-web-lb 네트워크 VPC tutorial 서브넷 main 리스너 프로토콜 HTTP 포트 80 -
생성한 로드 밸런서의 프로비저닝 상태가
Active
가 될 때까지 대기합니다.- 1~3분 정도 시간이 소요됩니다.
-
좌측 사이드바에서 대성 그룹을 선택 후, [대상 그룹] 버튼을 클릭합니다.
-
다음을 참고하여 설정 후, [다음] 버튼을 클릭합니다.
구분 항목 설정/입력값 로드 밸런서 가용 영역 kr-central-2-a 로드 밸런서 tutorial-web-lb 리스너 HTTP::80 기본 정보 대상 그룹 이름 tutorial-web-target-group 프로토콜 HTTP 알고리즘 라운드 로빈 고정 세션 사용 유형 HTTP 쿠키 고정 기간 3600 싱태 확인 사용
유형 HTTP
HTTP 메서드 GET
HTTP 버전 1.1
HTTP 상태 코드 200
체크 경로 /
체크 주기 10
타임 아웃 5
상태 전환 기준 (성공) 3
상태 전환 기준 (실패) 3
-
목록에서 대상 그룹에 추가할 인스턴스를 선택합니다.
-
포트 입력란에 다음의 정보를 입력하고 [대상 추가] 버튼과 [다음] 버튼을 순차적으로 클릭합니다.
대상 인스턴스 포트 tutorial-web-1 80 tutorial-web-2 80 -
생성한 정보를 확인 후 [생성] 버튼을 클릭합니다.
-
로드 밸런서와 헬스체크는 연결한 대상인 Web 서버에 접근할 수 있어야 합니다. 이를 위해 Web 서버의 보안 그룹인
tutorial-web-sg
에 아래와 같은 인바운드 규칙을 추가합니다.-
VPC > 보안 그룹으로 이동하여, app-sg을 선택합니다.
-
[인바운드 규칙 관리] 버튼을 클릭하고 다음 정책을 추가합니다. 상태 확인 IP는 2개를 추가해야 합니다.
인바운드 규칙 정책 설명 프로토콜 패킷 출발지 포트 번호 web inbound policy 1 로드 밸런서의 접근 TCP {web-lb-private-ip}/32
- LB 목록에서 생성한 Web 서버 로드 밸런서를 선택 후, 세부 정보 탭에서 확인 가능80 web inbound policy 2 상태 확인을 하는 호스트의 접근 1 TCP {healthcheck-ip1}/32
- Load Balancing > 로드 밸런서 > 대상 그룹 메뉴 > 대상 탭 > 서브넷별 상태 확인 IP에서 확인 가능80 web inbound policy 3 상태 확인을 하는 호스트의 접근 2 TCP {healthcheck-ip2}/32
- Load Balancing > 로드 밸런서 > 대상 그룹 메뉴 > 대상 탭 > 서브넷별 상태 확인 IP에서 확인 가능80
-
Step 8. Web 서버 로드 밸런서에 퍼블릭 IP 연결
- Load Balancing > 로드 밸런서 메뉴로 이동 후, 생성해 둔 Web 로드 밸런서를 선택합니다.
- [퍼블릭 IP 연결]을 클릭합니다.
- 세부 정보 탭에서 퍼블릭 IP를 확인합니다.
Step 9. 채팅 기능 확인
브라우저에서 등록한 퍼블릭 IP로 접속하여 서비스를 확인합니다. 정상적으로 연결된 경우, 다음과 같은 '카카오클라우드 도서관' 서비스의 우측 하단 채팅하기 버튼을 통해 채팅 기능을 확인할 수 있습니다.