본문으로 건너뛰기

목차

목차

목차

체크 리스트

모든 서비스는 프라이빗영역에 구성

  • VPC 1
  • zone 3 (public 3 / private 3)
  • s3 정적 웹사이트 구성

    image.png / index.css / index.js

  • nginx 구성

    오토스케일링: 2 ~ 3개 인스턴스 로드밸런스 구성

  • Fastapi 구성

    오토스케일링: 2 ~ 3개 인스턴스 로드밸런스 구성

  • mysql 데이터베이스 구성

    마스터 / 슬레이브 구성

vpc 네트워크 구성

정적 웹사이트 구축

S3 버킷을 이용하여 간단한 정적 웹사이트를 구축함 선행 :x

버킷 파일 추가

정적 웹 파일

버킷 호스팅

s3 > <BUCKET_NAME> > 정적 웹 사이트 호스팅

정적 웹 사이트 호스팅
정적 웹 사이트 호스팅활성화
호스팅 유형정적 웹 사이트 호스팅
인덱스 문서Index.html

정적 웹 사이트 호스팅 편집

버킷 권한

선행 : 모든 퍼블릭 액세스 차단 (비활성)

s3 > <BUCKET_NAME> > 버킷 정책 편집

bucket-get.json

확인

s3 > <BUCKET_NAME> > 정적 웹 사이트 호스팅

  • 엔드포인트 확인

my-cloud-image

nginx 구성

흐름 : AMI(선택) > 시작 템플릿 > 오토스케일링 > Target-group > Internal ALB

아키텍처 개요

시작 템플릿

항목
시작 템플릿 이름pista-template-web
AMIUbuntu
인스턴스 유형t3.micro
키 페어pista-key
네트워크 설정 - 서브넷pistachio-subnet-private1-ap-northeast-2a
네트워크 설정 - 가용영역ap-northeast-2a
네트워크 설정 - 방화벽web-sg: ssh, HTTP
사용자 데이터web.sh

Auto Scaling

1단계 시작 템플릿 구성

항목
Auto Scaling 그룹 이름pista-as-web
시작 템플릿pista-template-web
버전Latest(1)

2단계 인스턴스 시작 옵션 선택

항목
Auto Scaling 그룹 이름pista-as-web
시작 템플릿pista-template-web
버전Latest(1)
VPCpistachio-vpc
가영 영역 및 서브넷pistachio-subnet-private 3
(pistachio-subnet-private1-ap-northeast-2a) 10.0.128.0/20
(pistachio-subnet-private2-ap-northeast-2b) 10.0.144.0/2
(pistachio-subnet-private3-ap-northeast-2c) 10.0.160.0/20
가용 영역 배포균형 잡힌 최선 노력

3단계 다른 서비스와 통합

항목
로드 밸런싱새 로드 밸런서에 연결
로드 밸런서 유형Application Load Balancer
로드 밸런서 이름pista-alb-web1
로드 밸런서 체계Internet-facing
가용 영역 및 서브넷맞는지 확인
리스너 및 라우팅HTTP - 80 - pista-target-web1
VPC Lattice 통합 옵션없음
상태 확인 유예 기간15초

4단계 그룹 크기 및 크기 조정 구성

항목
그룹 크기2
크기 조정최소: 2 최대: 3
Automatic scaling크기조정 정책 없음
인스턴스 유지 관리 정책혼합 동작:정책 없음
추가 용량 설정기본값

5단계 알림 추가

6단계 태그 추가

7단계 검토

대상 그룹

EC2 > 대상 그룹 > pista-target-web1 > 대상 등록

항목
이름pista-target-web1

흐름

  1. 인스턴스 클릭
  2. 아래에 보류즁인 것으로 포함
  3. 확인 후 보류즁인 대상 등록

api server

시작 템플릿 (api)

항목
시작 템플릿 이름pista-template-api
⭐️ Auto Scaling 지침체크 해제
AMIUbuntu
인스턴스 유형t3.micro
키 페어pista-key
네트워크 설정 - 서브넷pistachio-subnet-private2-ap-northeast-2b
네트워크 설정 - 가용영역ap-northeast-2b
네트워크 설정 - 방화벽web-sg: ssh, HTTP
사용자 데이터web.sh

Auto Scaling (api)

1단계 시작 템플릿 구성

항목
Auto Scaling 그룹 이름pista-as-web
시작 템플릿pista-template-web
버전Latest(1)

2단계 인스턴스 시작 옵션 선택

항목
Auto Scaling 그룹 이름pista-as-web
시작 템플릿pista-template-web
버전Latest(1)
VPCpistachio-vpc
가영 영역 및 서브넷pistachio-subnet-private 3
(pistachio-subnet-private1-ap-northeast-2a) 10.0.128.0/20
(pistachio-subnet-private2-ap-northeast-2b) 10.0.144.0/20
(pistachio-subnet-private3-ap-northeast-2c) 10.0.160.0/20
가용 영역 배포균형 잡힌 최선 노력

3단계 다른 서비스와 통합

항목
로드 밸런싱새 로드 밸런서에 연결
로드 밸런서 유형Application Load Balancer
로드 밸런서 이름pista-alb-api1
로드 밸런서 체계Internet-facing
⭐️가용 영역 및 서브넷public으로 설정
⭐️리스너 및 라우팅HTTP - 80 - pista-target-api1
VPC Lattice 통합 옵션없음
상태 확인 유예 기간15초

4단계 그룹 크기 및 크기 조정 구성

항목
그룹 크기2
크기 조정최소: 2 최대: 3
Automatic scaling크기조정 정책 없음
인스턴스 유지 관리 정책혼합 동작:정책 없음
추가 용량 설정기본값

5단계 알림 추가

6단계 태그 추가

항목
Namepista-asg-instance
7단계 검토

대상 그룹 (pista-target-web1)

EC2 > 대상 그룹 > pista-target-web1 > 대상 등록

항목
이름pista-target-web1

흐름

  1. 인스턴스 클릭
  2. 아래에 보류즁인 것으로 포함
  3. 확인 후 보류즁인 대상 등록

unhealth가 뜰경우

위치: EC2 > 대상 그룹 > pista-target-api1 확인: 경로, 포트가 ec2에 설정한 포트 와 경로가 같아야함

WAS서버 rds 연결

RDS 구성

  • 보안 그룹 설정시 새 보안 그룹을 설정하지말고 무조건 기존 보안그룹으로 설정할 것
항목
전체 구성
데이터베이스 생성 방식 선택pista-target-web1
엔진 옵션MySQL
템플릿프리 티어
가용성 및 내구성프리 티어
가용성 및 내구성단일 AZ DB 인스턴스 배포
DB 인스턴스 식별자pista-db
마스터 사용자 이름pista
자격 증명 관리자체 관리
마스터 암호
인스턴스 구성db.t4g.micro
스토리지-유형SSD(gp2)
할당된 스토리지400
연결-컴퓨팅 리소스EC2 컴퓨팅 리소스에 연결 안 함
연결-VPCpistachio-vpc
연결-DB 서브넷 그룹defualt-vpc...
연결-퍼블릭 액세스
⭐️연결-VPC 보안 그룹(방화벽)기존 보안 그룹을 추가 할것
연결-가용 영역ap-northeast-2a
연결-인증 기관기본값
모니터링표준
추가 모니터링 설정NONE

시작 템플릿 재구성

rs-db.sh

문제 해결 (Troubleshooting)

이슈1: ALB 접속 타임아웃

  • 증상: curl 명령 시 응답 없음 (Timeout).
  • 원인 1 (서브넷): Internet-facing ALB가 Private Subnet에 위치함.
    • 해결: ALB를 Public Subnet(3개 영역)으로 이동 (EC2는 Private 유지).
  • 원인 2 (보안 그룹): ALB 보안 그룹의 Inbound 규칙이 닫혀있음.
    • 해결: Inbound 규칙에 HTTP (80) - 0.0.0.0/0 허용 추가.

이슈 2 Target Group Unhealthy (대상 그룹 비정상)

  • 증상: EC2 내부에서는 앱이 정상 실행 중인데, 대상 그룹 상태는 계속 Unhealthy로 표시됨.
  • 원인: 대상 그룹의 헬스 체크 포트가 기본값인 80으로 설정되어 있음 (실제 Axum 앱은 3000번 포트 사용).
  • 해결: 대상 그룹 > '상태 검사(Health checks)' 탭 > '편집' > '고급 상태 검사 설정'에서 포트를 Traffic port 또는 3000으로 변경.

이슈 3: ALB 접속 불가 (사이트에 연결할 수 없음)

  • 증상: 대상 그룹이 Healthy 상태인데도 브라우저에서 ALB 주소로 접속하면 응답이 없음.
  • 원인: ALB 리스너가 3000번 포트만 열려 있고, 브라우저가 기본으로 사용하는 80번(HTTP) 리스너가 없음.
  • 해결: 로드 밸런서 > '리스너 및 규칙' 탭 > HTTP : 80 리스너를 추가하고, 이를 API 대상 그룹으로 전달(Forward)하도록 설정.
  • 보안 체크: ALB 보안 그룹 인바운드 규칙에도 HTTP (80) 포트가 0.0.0.0/0으로 열려 있어야 함.

이슈 4: RDS 연결 실패 (Timeout)

  • 증상: /db 경로 접속 시 RDS Not Connected 또는 503 Service Unavailable이 뜨고, journalctl 로그에 pool timed out 에러 발생. nc 명령어로 RDS 3306 접근 불가.
  • 원인: RDS 보안 그룹(Security Group)이 EC2 인스턴스의 접근을 허용하지 않음. (설정은 했으나 RDS 인스턴스에 올바른 보안 그룹이 적용되지 않았거나, EC2의 Outbound가 막힘)
  • 해결 1 (보안 그룹 적용): RDS > 데이터베이스 > [연결 및 보안] 탭에서 현재 적용된 보안 그룹이 내가 만든(3306 허용된) 보안 그룹인지 확인하고 수정.
  • 해결 2 (서비스 재시작): 보안 그룹을 수정해 연결이 뚫려도, 앱이 이미 "DB 없는 모드"로 실행되었을 수 있음. sudo systemctl restart axum-api로 서비스를 재시작하여 DB 연결을 재시도하게 함.

관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: 목차
노드 클릭 → 이동 · 드래그 → 위치 조정