Post

[AWS] 3-tier 만들기

3-tier 구축

EC2 인스턴스로 각각 nginx, fastapi을 구축하고, RDS로 데이터베이스를 연결하여 3-tier 아키텍처를 만드는 과정이다.

순서는 VPC → FastAPI → Nginx → RDS 순이다.

VPC

VPC 등 선택 후 IPv4 CIDR 블록 설정을 해준다.

기본 10.0.0.0/16 으로 되어있는데 20으로 변경

가용 영역 수 3으로 변경 후 NAT 게이트웨이는 Zonal로 변경 후 생성

FastAPI (EC2)

OS : Ubuntu

위에서 생성한 VPC 선택 후 퍼블링 서브넷에 선택 후 퍼블릭 IP 자동 할당 활성화

보안그룹 생성해놓고 나중에 8000번 포트 열기

인스턴스 생성 후 ssh연결

필요 패키지 설치

1
2
3
4
sudo apt update
sudo apt upgrade
sudo apt install python3 python3-pip python3-venv -y
sudo apt install net-tools telnet -y

가상환경 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
python3 -m venv venv
source venv/bin/activate
pip install fastapi uvicorn gunicorn

# 앱 코드
cat &lt;<EOF &gt; main.py
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from FastAPI Backend!"}

@app.get("/health")
@app.head("/health")
def health_check():
    return {"status": "healthy"}
EOF

# 인스턴스 시작 시 fastapi 자동 구동되게
sudo bash -c 'cat &lt;<EOF &gt; /etc/systemd/system/fastapi.service
[Unit]
Description=Gunicorn instance to serve FastAPI
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu
# gunicorn 경로 확인 필수 (보통 /usr/local/bin/gunicorn 또는 ~/.local/bin/gunicorn)
ExecStart=/home/ubuntu/venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000
Restart=always

[Install]
WantedBy=multi-user.target
EOF'

완료 후 해당 인스턴스로 AMI 만들기

AMI 만들어지면 시작 그룹 템플릿 생성

인스턴스 유형은 인스턴스와 동일하게. 여기서는 t3.micro 사용

서브넷 설정 x

대상그룹 만든 후 로드밸선서 생성

Application Load Balancer 선택 후, “내부” 로 선택해야함

만들어지면 Auto Scaling Group 만들기

시작 그룹은 위에 만든걸로 선택

VPC도 같은걸로 선택 후 서브넷 선택

기존 로드밸런서 연결 선택 후 생성한 로드밸런서 선택

이번 실습에서는 그룹 크기 2, 최소 용량 2, 최대 용량 3으로 설정

대상 추적 크기 조정 정책은 평균 CPU 사용률로 하고 60에 30초로 설정

Nginx (EC2)

FastAPI 인스턴스 만든것과 같이 인스턴스 생성

보안그룹은 새로 만들고 80번 포트 열기

ssh 연결

1
2
3
4
5
sudo apt update && sudo apt upgrade -y
sudo apt install nginx
sudo systemctl enable nginx
sudo systemctl restart nginx
sudo apt update

/etc/nginx/sites-available 들어가서 default 수정하거나 삭제 후 새로 생성 본인은 삭제 후 fastapi_proxy로 새로 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
    listen 80;
    server_name _; # 모든 호스트 이름에 대해 응답

    # 외부 ALB가 NGINX의 상태를 확인할 경로
    location /health.html {
        root /var/www/html;
    }

    # 모든 요청을 내부 FastAPI ALB로 전달
    location / {
        proxy_pass http://internal-lee-fastapi-alb-538446856.ap-northeast-2.elb.amazonaws.com;
        
        # 실제 클라이언트의 IP 정보를 전달하기 위한 헤더 설정
        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;
    }
}

파일 저장 후 서비스 재시작 및 연결

1
2
3
4
5
6
7
8
sudo ln -s /etc/nginx/sites-available/fastapi_proxy /etc/nginx/sites-enabled/

# 헬스 체크용 빈 파일
sudo touch /var/www/html/health.html

# 문법 검사용
sudo nginx -t
sudo systemctl restart nginx

AMI 이미지 생성

AMI 만들어지면 시작 그룹 템플릿 생성

인스턴스 유형은 인스턴스와 동일하게. 여기서는 t3.micro 사용

서브넷 설정 x

대상그룹 만든 후 로드밸선서 생성

Application Load Balancer 선택 후, “인터넷 경계” 로 선택해야함

만들어지면 Auto Scaling Group 만들기

시작 그룹은 위에 만든걸로 선택

VPC도 같은걸로 선택 후 서브넷 선택

기존 로드밸런서 연결 선택 후 생성한 로드밸런서 선택

이번 실습에서는 그룹 크기 2, 최소 용량 2, 최대 용량 3으로 설정

대상 추적 크기 조정 정책은 평균 CPU 사용률로 하고 60에 30초로 설정

!!! 필수 알아야 하는거

FastAPI 보안그룹은 8000번만 열면 된다

Nginx와 FastAPI Lb는 80번만 열면 된다

이때 FastAPI LB 보안그룹을 FastAPI 보안그룹하고 같이 사용하는 경우가 있는데 그러면 안되고 다 따로 만들어 줘야한다

This post is licensed under CC BY 4.0 by the author.