목차
목차
목차
체크 리스트
모든 서비스는 프라이빗영역에 구성
- 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> > 버킷 정책 편집
확인
s3 > <BUCKET_NAME> > 정적 웹 사이트 호스팅
- 엔드포인트 확인

nginx 구성
흐름 : AMI(선택) > 시작 템플릿 > 오토스케일링 > Target-group > Internal ALB
아키텍처 개요
시작 템플릿
| 항목 | 값 |
|---|---|
| 시작 템플릿 이름 | pista-template-web |
| AMI | Ubuntu |
| 인스턴스 유형 | 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) |
| VPC | pistachio-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 |
흐름
- 인스턴스 클릭
- 아래에 보류즁인 것으로 포함
- 확인 후 보류즁인 대상 등록
api server
시작 템플릿 (api)
| 항목 | 값 |
|---|---|
| 시작 템플릿 이름 | pista-template-api |
| ⭐️ Auto Scaling 지침 | 체크 해제 |
| AMI | Ubuntu |
| 인스턴스 유형 | 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) |
| VPC | pistachio-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단계 태그 추가
| 항목 | 값 |
|---|---|
| Name | pista-asg-instance |
| 7단계 검토 |
대상 그룹 (pista-target-web1)
EC2 > 대상 그룹 > pista-target-web1 > 대상 등록
| 항목 | 값 |
|---|---|
| 이름 | pista-target-web1 |
흐름
- 인스턴스 클릭
- 아래에 보류즁인 것으로 포함
- 확인 후 보류즁인 대상 등록
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 컴퓨팅 리소스에 연결 안 함 |
| 연결-VPC | pistachio-vpc |
| 연결-DB 서브넷 그룹 | defualt-vpc... |
| 연결-퍼블릭 액세스 | 예 |
| ⭐️연결-VPC 보안 그룹(방화벽) | 기존 보안 그룹을 추가 할것 |
| 연결-가용 영역 | ap-northeast-2a |
| 연결-인증 기관 | 기본값 |
| 모니터링 | 표준 |
| 추가 모니터링 설정 | NONE |
시작 템플릿 재구성
문제 해결 (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허용 추가.
- 해결: Inbound 규칙에
이슈 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 연결을 재시도하게 함.