- 배포 아키텍처
- AWS 인프라 설정
- LiveKit Cloud 설정
- 백엔드 배포 (AWS EC2)
- 프론트엔드 배포 (Netlify)
- OAuth 콜백 URL 수정
- 배포 후 테스트
- CI/CD 파이프라인 설정
- 비용 예상
- 모니터링 및 관리
[클라이언트 브라우저]
↓
↓ HTTPS
↓
[Netlify - 프론트엔드]
studylink.store
↓
↓ API 요청
↓
[AWS EC2 - Spring Boot API]
api.studylink.store:6080
↓
↓ SQL 쿼리
↓
[AWS RDS MySQL]
Private Subnet
↓
↓ 비디오 토큰 발급
↓
[LiveKit Cloud - 비디오 서비스]
wss://livekit.cloud/...
구성 요소:
- 프론트엔드: Netlify (무료, React + Vite)
- 백엔드: AWS EC2 t3.micro (Ubuntu 22.04, Java 17, Spring Boot)
- 데이터베이스: AWS RDS MySQL 8.0 (db.t3.micro)
- 비디오 서비스: LiveKit Cloud (Starter Plan, 무료 50GB/월)
- 도메인: studylink.store, api.studylink.store
- SSL: Let's Encrypt (무료)
- AWS 콘솔 → VPC → VPC 생성
- 설정:
- 이름:
studylink-vpc - IPv4 CIDR:
10.0.0.0/16 - IPv6 CIDR: 없음
- 테넌시: 기본
- 이름:
Public Subnet (EC2용)
- 서브넷 생성 클릭
- 설정:
- 이름:
studylink-public-subnet - VPC:
studylink-vpc - 가용 영역:
ap-northeast-2a(서울) - IPv4 CIDR:
10.0.1.0/24
- 이름:
Private Subnet (RDS용)
- 서브넷 생성 클릭
- 설정:
- 이름:
studylink-private-subnet-1 - VPC:
studylink-vpc - 가용 영역:
ap-northeast-2a - IPv4 CIDR:
10.0.2.0/24
- 이름:
- 두 번째 Private Subnet 생성 (RDS는 최소 2개 AZ 필요):
- 이름:
studylink-private-subnet-2 - 가용 영역:
ap-northeast-2c - IPv4 CIDR:
10.0.3.0/24
- 이름:
- 인터넷 게이트웨이 → 인터넷 게이트웨이 생성
- 이름:
studylink-igw - 생성 후 VPC에 연결 →
studylink-vpc선택
Public Route Table
- 라우팅 테이블 → 라우팅 테이블 생성
- 이름:
studylink-public-rt - VPC:
studylink-vpc - 생성 후 라우팅 편집:
- 대상:
0.0.0.0/0 - 타겟:
studylink-igw
- 대상:
- 서브넷 연결 →
studylink-public-subnet연결
EC2 Security Group
- 보안 그룹 → 보안 그룹 생성
- 이름:
studylink-ec2-sg - VPC:
studylink-vpc - 인바운드 규칙:
유형 프로토콜 포트 범위 소스 SSH TCP 22 내 IP (보안상 관리자 IP만) HTTP TCP 80 0.0.0.0/0 HTTPS TCP 443 0.0.0.0/0 Custom TCP TCP 6080 0.0.0.0/0 - 아웃바운드 규칙: 모든 트래픽 허용 (기본값)
RDS Security Group
- 이름:
studylink-rds-sg - VPC:
studylink-vpc - 인바운드 규칙:
유형 프로토콜 포트 소스 MySQL/Aurora TCP 3306 studylink-ec2-sg (EC2 SG ID)
RDS를 생성하기 전에 DB Subnet Group을 먼저 만들어야 합니다.
- AWS 콘솔 → RDS → 왼쪽 메뉴에서 서브넷 그룹
- DB 서브넷 그룹 생성 클릭
- 설정:
- 이름:
studylink-db-subnet-group - 설명:
StudyLink RDS private subnets - VPC:
studylink-vpc선택 - 가용 영역:
ap-northeast-2a,ap-northeast-2c선택 - 서브넷:
studylink-private-subnet-1(10.0.2.0/24) 선택studylink-private-subnet-2(10.0.3.0/24) 선택
- 이름:
- 생성 클릭
-
AWS 콘솔 → RDS → 데이터베이스 생성
-
데이터베이스 생성 방식 선택:
- 표준 생성 선택 (Easy create가 아님!)
-
엔진 옵션:
- 엔진 유형: MySQL
- 에디션: MySQL Community
- 버전: MySQL 8.0.xx (최신 8.0 버전)
-
템플릿:
- 프리 티어 선택 (테스트 환경)
- 또는 개발/테스트 (프로덕션 환경)
-
설정:
- DB 인스턴스 식별자:
studylink-db - 마스터 사용자 이름:
admin - 마스터 암호:
<강력한-암호-설정>(16자 이상, 특수문자 포함) - 암호 확인: 동일하게 입력
⚠️ 암호를 안전한 곳에 기록하세요!
- DB 인스턴스 식별자:
-
인스턴스 구성:
- DB 인스턴스 클래스: 버스터블 클래스 →
db.t3.micro선택
- DB 인스턴스 클래스: 버스터블 클래스 →
-
스토리지:
- 스토리지 유형: 범용 SSD (gp3)
- 할당된 스토리지: 20 GiB
- 스토리지 자동 조정: 활성화 (선택사항)
-
연결:
- 컴퓨팅 리소스: EC2 컴퓨팅 리소스에 연결 안 함 선택
- 네트워크 유형: IPv4
- Virtual Private Cloud (VPC):
studylink-vpc선택 - DB 서브넷 그룹:
studylink-db-subnet-group선택 - 퍼블릭 액세스: 아니요 (중요!)
- VPC 보안 그룹:
- 기존 항목 선택 라디오 버튼 클릭
studylink-rds-sg선택default보안 그룹은 제거
-
추가 구성 (펼치기):
- 초기 데이터베이스 이름:
studylink입력 - 자동 백업: 활성화 (7일 보관 권장)
- 백업 기간: 새벽 시간대 선택
- 초기 데이터베이스 이름:
-
생성 클릭 (약 5-10분 소요)
-
생성 완료 후 엔드포인트 확인 및 기록:
- RDS → 데이터베이스 →
studylink-db클릭 - 연결 & 보안 탭에서 엔드포인트 복사
예시: studylink-db.xxxxxxxxx.ap-northeast-2.rds.amazonaws.com - RDS → 데이터베이스 →
- AWS 콘솔 → EC2 → 인스턴스 시작
- 설정:
- 이름:
studylink-backend - AMI: Ubuntu Server 22.04 LTS (64비트 x86)
- 인스턴스 유형: t3.micro (1 vCPU, 1GB RAM)
- 주의: 테스트 환경용. 프로덕션은 t3.small 이상 권장
- 키 페어: 새로 생성 또는 기존 선택 (
.pem파일 다운로드 및 안전 보관) - 네트워크 설정:
- VPC:
studylink-vpc - 서브넷:
studylink-public-subnet - 퍼블릭 IP 자동 할당: 활성화
- 보안 그룹:
studylink-ec2-sg
- VPC:
- 스토리지: 20GB gp3
- 이름:
- 인스턴스 시작 클릭
- Elastic IP → Elastic IP 주소 할당
- 할당 후 작업 → Elastic IP 주소 연결
- 인스턴스:
studylink-backend선택 - Elastic IP 주소 기록:
예시: 3.35.123.45
가비아(Gabia) 사용 시 (권장):
-
가비아 관리 콘솔 접속
- https://www.gabia.com 로그인
- My가비아 → 서비스 관리
-
도메인 선택
- 구매한 도메인 (예:
studylink.store) 클릭 - DNS 설정 또는 DNS 관리 메뉴 선택
- 구매한 도메인 (예:
-
네임서버 확인
- 가비아 기본 네임서버 사용 확인:
ns.gabia.co.kr ns1.gabia.co.kr - 외부 네임서버를 사용 중이라면 가비아 네임서버로 변경 (적용까지 최대 24시간 소요)
- 가비아 기본 네임서버 사용 확인:
-
DNS 레코드 추가
- 레코드 추가 또는 레코드 수정 버튼 클릭
백엔드 API용 A 레코드:
호스트(Host): api 타입(Type): A 값/위치(Value): <EC2-Elastic-IP> TTL: 3600 (1시간) 또는 기본값프론트엔드용 A 레코드 (Netlify 사용 시):
호스트: @ (또는 비워둠) 타입: A 값: <Netlify-IP-주소> TTL: 3600www 서브도메인 (선택사항):
호스트: www 타입: CNAME 값: studylink.store (또는 Netlify 도메인) TTL: 3600 -
저장 및 적용
- 저장 또는 적용 버튼 클릭
- DNS 전파 대기 (보통 10-30분, 최대 24시간)
-
DNS 전파 확인
# Windows (PowerShell) nslookup api.studylink.store # Mac/Linux dig api.studylink.store # 또는 온라인 도구 사용 # https://www.whatsmydns.net
Route 53 사용 시:
- Route 53 → 호스팅 영역 → 도메인 선택
- 레코드 생성:
레코드 이름: api 레코드 유형: A 값: <EC2 Elastic IP> TTL: 300
# Windows (PowerShell/WSL) 또는 Mac/Linux
ssh -i "your-key.pem" ubuntu@<EC2-Elastic-IP>
# 처음 접속 시 키 권한 설정 (Mac/Linux)
chmod 400 your-key.pem- https://cloud.livekit.io 접속
- Sign Up → GitHub 또는 Google 계정으로 가입
- 가입 완료 후 대시보드 진입
- 대시보드에서 Create Project 클릭
- 프로젝트 이름:
StudyLink - Region: Asia Pacific (Seoul) 또는 Asia Pacific (Tokyo) 선택
- Create 클릭
- 프로젝트 대시보드 → Settings → Keys 탭
- 다음 정보 기록:
LiveKit URL: wss://studylink-xxxxxxxx.livekit.cloud API Key: APIxxxxxxxxxxxxxxxx API Secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx⚠️ 중요: Secret은 다시 볼 수 없으므로 안전하게 보관!
- Settings → Webhooks 탭
- Add Webhook 클릭
- 설정:
Webhook URL: https://api.studylink.store/api/v1/video/livekit/webhook Events: room_started, participant_joined, participant_left 선택 - Save 클릭
- Billing → Plan 확인
- Starter Plan (무료):
- 50GB 트래픽/월
- 제한된 SLA
- 소규모 테스트에 적합
- 트래픽 초과 시 Developer Plan ($99/월) 업그레이드 고려
EC2에 SSH 접속 후 다음 명령어 실행:
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y
# Java 17 설치
sudo apt install openjdk-17-jdk -y
# Java 버전 확인
java -version
# 출력 예시: openjdk version "17.0.x"
# Git 설치 (코드 클론용, 선택사항)
sudo apt install git -y
# Nginx 설치
sudo apt install nginx -y
# Certbot 설치 (SSL 인증서)
sudo apt install certbot python3-certbot-nginx -y
# 방화벽 설정 (UFW)
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw allow 6080/tcp
sudo ufw enableWindows (PowerShell):
cd C:\Spring\studyLink\BE
# Gradle 빌드 (테스트 제외)
.\gradlew clean build -x test
# 빌드 성공 확인
ls build\libs\*.jar# SCP를 사용한 파일 전송
scp -i key_hojun.pem build/libs/*.jar ubuntu@43.200.105.80:/home/ubuntu/app.jar
# 전송 확인
ssh -i key_hojun.pem ubuntu@43.200.105.80 "ls -lh /home/ubuntu/app.jar"EC2에서 실행:
sudo mkdir -p /home/ubuntu/config
sudo nano /home/ubuntu/config/application-prod.yml내용 입력:
spring:
datasource:
url: jdbc:mysql://studylink-db.cd8qcimkew4w.ap-northeast-2.rds.amazonaws.com:3306/studylink?useSSL=true&serverTimezone=Asia/Seoul
username: admin
password: Xx9547029!
driver-class-name: com.mysql.cj.jdbc.Driver
security:
require-ssl: true
oauth2:
client:
registration:
google:
client-id: 43617860520-kkgru3jpp3te7daaj1mbnbikvrl27nuu.apps.googleusercontent.com
client-secret: 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
scope:
- email
- profile
naver:
client-id: WzP_38uKy7iK8_9_HUPV
client-secret: pkaZIVlxp8
scope:
- name
- email
client-name: Naver
authorization-grant-type: authorization_code
redirect-uri: https://api.studylink.store/login/oauth2/code/naver
kakao:
client-id: d65193931be25a11769f18dd073ab1f5
client-secret: lt2oWb0ZtOM9yJUJuGaNTvp7Pq8Q6wuR
redirect-uri: https://api.studylink.store/login/oauth2/code/kakao
authorization-grant-type: authorization_code
client-authentication-method: client_secret_post
client-name: Kakao
scope:
- profile_nickname
- account_email
provider:
naver:
authorization-uri: https://nid.naver.com/oauth2.0/authorize
token-uri: https://nid.naver.com/oauth2.0/token
user-info-uri: https://openapi.naver.com/v1/nid/me
user-name-attribute: response
kakao:
authorization-uri: https://kauth.kakao.com/oauth/authorize
token-uri: https://kauth.kakao.com/oauth/token
user-info-uri: https://kapi.kakao.com/v2/user/me
user-name-attribute: id
jpa:
hibernate:
ddl-auto: update
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate:
format_sql: true
default_batch_fetch_size: 1000
database-platform: org.hibernate.dialect.MySQL8Dialect
jwt:
secret: sjfhksdjhkdsjfalksdjfklasdjgjdsfhkjdhfjshdkjfhsdkjfhkjshdkjfhdafsdfasfas
redirect: https://studylink.store/
access-token:
expiration-time: 3600000
refresh-token:
expiration-time: 604800000
server:
port: 6080
livekit:
api:
host: https://studylink-4yf381df.livekit.cloud
key: APIz2UieYpgGzic
secret: fuc9qf2K38rQzHswo7afUWkO7DxnerAarXADmrxpyvbBJWT Secret 생성:
# 64자 랜덤 문자열 생성
openssl rand -base64 48파일 권한 설정:
sudo chmod 600 /home/ubuntu/config/application-prod.yml
sudo chown ubuntu:ubuntu /home/ubuntu/config/application-prod.ymlsudo nano /etc/nginx/sites-available/api.studylink.store내용 입력:
server {
server_name api.studylink.store;
location / {
proxy_pass http://localhost:6080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 지원 (필요 시)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 타임아웃 설정
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
listen 80;
}설정 활성화:
# 심볼릭 링크 생성
sudo ln -s /etc/nginx/sites-available/api.studylink.store /etc/nginx/sites-enabled/
# 기본 사이트 비활성화 (선택사항)
sudo rm /etc/nginx/sites-enabled/default
# 설정 테스트
sudo nginx -t
# Nginx 재시작
sudo systemctl restart nginx
sudo systemctl status nginx# Certbot으로 SSL 인증서 자동 발급
sudo certbot --nginx -d api.studylink.store
# 프롬프트에서 입력:
# - 이메일 주소 입력
# - 약관 동의 (Y)
# - 뉴스레터 구독 (선택사항, N 가능)
# - HTTP를 HTTPS로 리다이렉트? (2번 선택 권장)인증서 자동 갱신 설정 확인:
# 갱신 테스트
sudo certbot renew --dry-run
# Certbot timer 확인 (자동 갱신)
sudo systemctl status certbot.timersudo nano /etc/systemd/system/studylink.service내용 입력:
[Unit]
Description=StudyLink Backend API
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=/usr/bin/java -jar /home/ubuntu/app.jar --spring.profiles.active=prod --spring.config.location=/home/ubuntu/config/application-prod.yml
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
# JVM 옵션 (t3.micro용 메모리 최적화)
Environment="JAVA_OPTS=-Xms256m -Xmx768m -XX:MaxMetaspaceSize=256m"
[Install]
WantedBy=multi-user.target서비스 등록 및 시작:
# 데몬 리로드
sudo systemctl daemon-reload
# 서비스 활성화 (부팅 시 자동 시작)
sudo systemctl enable studylink
# 서비스 시작
sudo systemctl start studylink
# 상태 확인
sudo systemctl status studylink
# 로그 확인
sudo journalctl -u studylink -f- GitHub에서 프론트엔드 저장소 확인
- Netlify 대시보드 → Add new site → Import an existing project
- GitHub 선택 → 저장소 선택 (
StudyLink-SW-Project/FE) - 권한 허용
- 빌드 설정 확인:
Base directory: (비워둠) Build command: npm run build Publish directory: dist netlify.toml파일이 이미 있으므로 자동 인식됨
Netlify에서 환경변수를 설정하지 않으면 LiveKit 연결이 실패합니다!
-
Netlify 대시보드 → Site settings → Environment variables
-
Add a variable 클릭하여 다음 변수 추가:
변수 1: VITE_APP_SERVER
Key: VITE_APP_SERVER Value: https://api.studylink.store/ Scopes: Production, Deploy Previews, Branch deploys (모두 체크)변수 2: VITE_LIVEKIT_URL
Key: VITE_LIVEKIT_URL Value: wss://studylink-4yf381df.livekit.cloud Scopes: Production, Deploy Previews, Branch deploys (모두 체크) -
Save 클릭
- Deploys → Trigger deploy → Deploy site
- Domain settings → Add custom domain
- 도메인 입력:
studylink.store - DNS 레코드 설정 (Netlify 안내에 따라):
Type: A Name: @ (또는 studylink.store) Value: <Netlify IP 주소> Type: CNAME Name: www Value: <your-site>.netlify.app - HTTPS 자동 활성화 (Let's Encrypt)
- Deploys → Trigger deploy → Deploy site
- 빌드 로그 확인 (약 2-3분 소요)
- 배포 완료 후
https://studylink.store접속 테스트
- https://console.cloud.google.com 접속
- 프로젝트 선택
- API 및 서비스 → 사용자 인증 정보
- OAuth 2.0 클라이언트 ID 선택
- 승인된 리디렉션 URI 추가:
https://api.studylink.store/login/oauth2/code/google - 저장
- https://developers.naver.com/apps 접속
- 애플리케이션 선택
- API 설정 → 서비스 URL 및 Callback URL 수정:
서비스 URL: https://studylink.store Callback URL: https://api.studylink.store/login/oauth2/code/naver - 수정 클릭
- https://developers.kakao.com/console 접속
- 애플리케이션 선택
- 제품 설정 → 카카오 로그인
- Redirect URI 추가:
https://api.studylink.store/login/oauth2/code/kakao - 저장
# 헬스 체크 (Actuator 활성화된 경우)
curl https://api.studylink.store/actuator/health
# LiveKit 토큰 발급 테스트
curl -X POST https://api.studylink.store/api/v1/video/token \
-H "Content-Type: application/json" \
-H "Cookie: accessToken=<your-access-token>" \
-d '{
"roomName": "test-room-123",
"participantName": "test-user"
}'
# 예상 응답:
# {
# "isSuccess": true,
# "code": "OK",
# "message": "성공",
# "result": {
# "token": "eyJhbGc..."
# }
# }- https://studylink.store 접속
- 회원가입 → 로그인
- 스터디룸 생성
- 비디오 연결 테스트
- 스터디룸 입장
- 카메라/마이크 권한 허용
- 비디오 스트리밍 정상 작동 확인
- 다른 브라우저/기기에서 동일 룸 입장하여 P2P 연결 확인
백엔드 로그:
# EC2 SSH 접속 후
sudo journalctl -u studylink -f --lines=100Nginx 로그:
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.logLiveKit Cloud 로그:
- LiveKit Cloud 대시보드 → Logs 탭 확인
GitHub 저장소 → Settings → Secrets and variables → Actions → New repository secret
추가할 Secrets:
EC2_HOST=43.200.105.80
EC2_USER=ubuntu
EC2_SSH_KEY=<your-private-key-content> (전체 내용 복사)
C:\Spring\studyLink\BE\.github\workflows\deploy.yml:
name: Deploy Backend to EC2
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build -x test
- name: Create SSH key file
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > private_key.pem
chmod 600 private_key.pem
- name: Deploy to EC2
run: |
scp -i private_key.pem -o StrictHostKeyChecking=no \
build/libs/*.jar ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/home/ubuntu/app.jar
ssh -i private_key.pem -o StrictHostKeyChecking=no \
${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF'
sudo systemctl restart studylink
sudo systemctl status studylink
EOF
- name: Clean up
if: always()
run: rm -f private_key.pem
- name: Send deployment notification
if: success()
run: echo "Deployment successful!"Netlify는 GitHub 연동 시 자동 배포가 설정됩니다:
main브랜치에 푸시 시 자동 빌드 및 배포- PR 생성 시 Preview 배포 자동 생성
별도 설정 불필요!
백엔드 배포:
- 코드 수정 후
main브랜치에 push - GitHub Actions가 자동으로 빌드
- EC2에 JAR 파일 업로드 및 서비스 재시작
프론트엔드 배포:
- 코드 수정 후
main브랜치에 push - Netlify가 자동으로 빌드 및 배포
- EC2 t3.micro: ~$7-8/월 (테스트 환경)
- 프로덕션 환경에서는 t3.small (~$15/월) 권장
- RDS MySQL db.t3.micro: ~$15/월
- Elastic IP: 무료 (인스턴스에 연결된 상태)
- 데이터 전송: ~$2-5/월 (소규모 트래픽 기준)
- 총 AWS 비용: ~$24-28/월
- Starter Plan: 무료 (50GB 트래픽/월)
- 트래픽 초과 시 Developer Plan: $99/월
- Free Tier: 100GB 대역폭/월
- 비용: 무료
- 테스트 환경: $24-28/월
- 프로덕션 확장 시: $131-150/월 (EC2 업그레이드 + LiveKit Developer)
- AWS 콘솔 → CloudWatch → Log groups
- EC2에 CloudWatch Agent 설치
- 애플리케이션 로그 수집 설정
- RDS 콘솔 → DB 인스턴스 선택
- 자동 백업 활성화
- 백업 보존 기간: 7일
- 백업 시간: 새벽 시간대 설정
- LiveKit Cloud 대시보드 → Analytics
- 트래픽, 동시 접속자 수, 세션 기록 확인
- 50GB 한도 근접 시 알림 설정
- 주간: EC2 로그 확인, 오류 모니터링
- 월간: RDS 백업 스냅샷 확인, 비용 리뷰
- 분기: 보안 패치 적용, SSL 인증서 갱신 확인 (Certbot 자동)
- EC2 Security Group에서 SSH를 관리자 IP로만 제한
- RDS는 Private Subnet에 배치하고 EC2 SG에서만 접근
- JWT_SECRET은 64자 이상 랜덤 문자열 사용
- 모든 민감한 환경변수를 코드에 하드코딩하지 않음
- SSL 인증서 자동 갱신 설정 (Certbot)
- RDS 암호는 강력한 암호 사용 (최소 16자, 특수문자 포함)
- EC2 정기 보안 패치 적용 (
sudo apt update && sudo apt upgrade) - 불필요한 포트는 Security Group에서 차단
- IAM 사용자별 최소 권한 원칙 적용
- CloudWatch 알람 설정 (CPU, 메모리, 디스크 사용률)
# 키 권한 확인
chmod 400 your-key.pem
# Security Group 인바운드 규칙 확인 (SSH 22번 포트)
# Elastic IP가 인스턴스에 올바르게 연결되었는지 확인# 로그 확인
sudo journalctl -u studylink -n 100 --no-pager
# Java 버전 확인
java -version
# 포트 충돌 확인
sudo netstat -tulpn | grep 6080# EC2에서 RDS 연결 테스트
mysql -h <RDS-엔드포인트> -u admin -p
# Security Group 확인: RDS SG에 EC2 SG가 허용되어 있는지
# RDS 엔드포인트가 올바른지 확인# 백엔드 서비스 상태 확인
sudo systemctl status studylink
# Nginx 설정 테스트
sudo nginx -t
# Nginx 에러 로그
sudo tail -f /var/log/nginx/error.log- LiveKit Cloud URL이 정확한지 확인
- Webhook URL이 HTTPS로 설정되어 있는지 확인
- 백엔드 로그에서 토큰 발급 오류 확인
작성일: 2026-01-05 작성자: StudyLink 개발팀 버전: 1.0