[TIL] FastAPI 서비스를 Oracle Always Free VM에 올리기(1)

RE_BROTHER·7일 전

FastAPI-migration

목록 보기
4/7

FastAPI 마이그레이션을 진행하면서 애플리케이션을 어디에서 실행할지 결정해야 했다.

처음에는 Cloudflare에서 FastAPI까지 실행하는 방법을 검토했다. Cloudflare Container를 사용하면 Docker 기반 FastAPI를 실행할 수 있지만, 현재 기준으로 Container는 Workers Paid 플랜이 필요하다. 무료 티어를 유지하면서 FastAPI를 실행하려면 애플리케이션 실행 서버와 Cloudflare의 저장소 서비스를 분리하는 편이 더 적합했다.

이번 글에서는 Oracle Cloud의 Always Free VM을 생성하고, 이후 Docker 기반 FastAPI 서버를 올릴 수 있는 네트워크 환경을 구성하는 과정을 정리한다.

1. 선택한 운영 구조

이번에 선택한 구조는 다음과 같다.

사용자 브라우저
    -> Cloudflare DNS / Proxy
    -> Oracle Always Free VM
    -> Docker
    -> Uvicorn
    -> FastAPI
    -> Cloudflare D1 / R2

FastAPI 애플리케이션은 특정 Cloudflare 런타임에 맞춰 작성하지 않는다. 일반적인 Docker 컨테이너로 실행하기 때문에 로컬, Oracle Cloud, 다른 VM, 다른 클라우드 환경에서도 같은 이미지를 사용할 수 있다.

Cloudflare는 계속 다음 역할을 담당한다.

  • D1: 운영 데이터베이스
  • R2: 파일 저장소
  • DNS 및 필요한 경우 Proxy

즉, 애플리케이션 실행 환경과 저장소 서비스를 분리한다. 이 구조를 선택하면 무료 실행 환경을 사용할 수 있고, 나중에 서버를 옮길 때 FastAPI 코드와 Dockerfile을 그대로 재사용할 수 있다.

Oracle 공식 문서 기준 Always Free 리소스에는 Ampere A1 Compute가 포함되어 있다. 전체 한도는 월 기준 2 OCPU, 12GB 메모리 수준이며, 계정과 리전에 따라 실제 생성 가능 여부는 달라질 수 있다.

참고: Oracle Always Free 리소스

2. 리전 확인

Oracle Cloud Console에 로그인한 뒤 우측 상단의 리전을 확인한다.

Always Free VM은 기본적으로 계정의 Home Region에서 생성하는 것이 안전하다. 특정 리전에서 Always Free 인스턴스의 호스트 용량이 부족하면 생성 시 Out of host capacity 오류가 발생할 수 있다. 이 경우 같은 리전의 다른 Availability Domain을 선택하거나 잠시 후 다시 시도한다.

3. VCN과 Public Subnet 만들기

VM 생성 화면에서 네트워크를 한 번에 만들 수도 있지만, Public Subnet이 제대로 선택되지 않으면 공인 IPv4를 할당할 수 없다. 그래서 먼저 VCN을 별도로 생성한다.

  1. 좌측 상단 메뉴를 연다.
  2. Networking을 선택한다.
  3. Virtual cloud networks로 이동한다.
  4. Start VCN Wizard를 클릭한다.
  5. Create VCN with Internet Connectivity를 선택한다.
  6. Start VCN Wizard를 클릭한다.

다음 값을 입력한다.

VCN Name: fastapi-vcn
IPv4 CIDR Block: 10.0.0.0/16
Public Subnet CIDR Block: 10.0.1.0/24
Private Subnet CIDR Block: 기본값

VCN 이름은 원하는 이름을 사용해도 된다. CIDR 값은 새 VCN을 만드는 경우 사용할 수 있는 예시값이다.

Create를 클릭하면 Oracle이 다음 네트워크 구성요소를 함께 만든다.

  • Virtual Cloud Network
  • Internet Gateway
  • Route Table
  • Public Subnet
  • Private Subnet

생성이 끝나면 VCN 상세 화면의 Subnets에서 Public Subnet이 생성되었는지 확인한다. 이후 VM에는 이 Public Subnet을 선택해야 한다.

Oracle에서는 Private Subnet의 리소스에 공인 IPv4 주소를 할당할 수 없다. 공인 IP를 사용하려면 반드시 Public Subnet을 선택해야 한다.

참고: Oracle 인스턴스 생성 문서

4. Compute Instance 생성

  1. 좌측 상단 메뉴를 연다.
  2. Compute를 선택한다.
  3. Instances로 이동한다.
  4. Create instance를 클릭한다.

4.1 기본 정보

Name: fastapi-server
Compartment: 기본 Root compartment
Availability Domain: 기본값
Capacity Type: On-demand capacity
Fault Domain: 기본값

Availability Domain은 Always Free Eligible로 표시되는 항목을 우선 선택한다. 화면에 표시되는 항목은 리전마다 다를 수 있으므로 기본 선택값이 Always Free 대상인지 확인한다.

4.2 Image and shape

Image and shape 영역에서 Edit를 클릭한다.

Image는 다음 중 하나를 선택한다.

Ubuntu 24.04
또는
Ubuntu 22.04

그다음 Change shape를 클릭하고 다음처럼 설정한다.

Shape type: Virtual machine
Shape series: Ampere
Shape: VM.Standard.A1.Flex
OCPU: 1
Memory: 6 GB

VM.Standard.A1.FlexAlways Free-eligible로 표시되는지 확인한 뒤 Select shape를 클릭한다.

이 서비스는 Docker 기반으로 실행할 예정이므로 ARM 기반인 Ampere 인스턴스를 사용해도 된다. 현재 Dockerfile의 Python 기본 이미지는 ARM 환경에서 사용할 수 있는 이미지를 제공한다.

4.3 Primary VNIC 및 네트워크

Primary VNIC 또는 Networking 영역에서 다음과 같이 선택한다.

Virtual cloud network: Select existing virtual cloud network
VCN: fastapi-vcn
Subnet: Select existing subnet
Subnet: Public Subnet
Private IPv4 address: Automatically assign private IPv4 address
Public IPv4 address assignment: Automatically assign public IPv4 address

여기서 가장 중요한 값은 Subnet이다. 반드시 앞에서 만든 Public Subnet을 선택해야 한다.

다음과 같은 경고가 나오면 현재 Subnet이 Public Subnet으로 선택되지 않은 상태다.

You must select a public subnet to assign a public IPv4 address.

이 경우 Private Subnet을 선택했는지 확인하고, Select existing subnet에서 Public Subnet을 다시 선택한다.

Automatically assign public IPv4 address는 인스턴스 생성 시 외부에서 접속 가능한 공인 IPv4 주소를 자동으로 할당하는 옵션이다. SSH 접속과 웹 서비스 공개를 위해 체크한다.

4.4 SSH 키

Add SSH keys 영역에서 다음을 진행한다.

  1. Generate a key pair for me를 선택한다.
  2. Save Private Key를 클릭한다.
  3. 다운로드된 .key 파일을 안전한 위치에 보관한다.
  4. 필요하다면 Save Public Key도 함께 저장한다.

Private Key는 분실하면 안 된다. 공개 저장소에 올리거나 다른 사람에게 전달해서도 안 된다.

4.5 Boot Volume

Boot volume 영역은 우선 기본값을 사용한다.

별도 디스크 구성이나 사용자 지정 부트 볼륨은 초기 배포에 필요하지 않다. 나중에 로그, 업로드 파일, 백업 정책을 정리할 때 별도로 검토한다.

5. 인스턴스 생성 및 확인

모든 설정을 확인한 뒤 하단의 Create를 클릭한다.

생성이 끝나면 인스턴스 상세 화면에서 다음 항목을 확인한다.

State: Running
Public IPv4 address: 숫자 형태의 공인 IP
Private IPv4 address: 숫자 형태의 사설 IP

Public IPv4 address가 비어 있다면 다음을 다시 확인한다.

  • Subnet이 Public Subnet인지
  • Automatically assign public IPv4 address가 체크되어 있는지
  • VCN에 Internet Gateway와 Route Table이 생성되어 있는지

6. 80, 443 포트 열기

VCN의 보안 목록에서 웹 접속 포트를 허용한다.

  1. VM 상세 화면에서 Primary VNIC를 클릭한다.
  2. 연결된 Subnet을 클릭한다.
  3. Default Security List를 클릭한다.
  4. Add Ingress Rules를 클릭한다.

HTTP 규칙을 추가한다.

Source CIDR: 0.0.0.0/0
IP Protocol: TCP
Destination Port Range: 80

HTTPS 규칙도 추가한다.

Source CIDR: 0.0.0.0/0
IP Protocol: TCP
Destination Port Range: 443

SSH 접속용 22번 포트가 이미 존재하는지도 확인한다. 없다면 다음 규칙을 추가한다.

Source CIDR: 0.0.0.0/0
IP Protocol: TCP
Destination Port Range: 22

운영 환경에서는 SSH를 0.0.0.0/0으로 열어두기보다 본인의 고정 IP로 제한하는 것이 안전하다. 초기 접속 확인 후 보안 규칙을 다시 좁히는 것이 좋다.

7. 다음 작업

VM 생성이 끝났다고 FastAPI가 바로 실행되는 것은 아니다. 다음 순서로 서버를 구성해야 한다.

  1. SSH로 Oracle VM 접속
  2. Docker 설치
  3. 저장소를 VM으로 가져오기
  4. 운영용 환경변수 설정
  5. Docker 이미지 빌드
  6. FastAPI 컨테이너 실행
  7. Nginx 또는 Caddy로 80/443 연결
  8. Cloudflare DNS에 도메인 연결
  9. /health 엔드포인트로 운영 상태 확인

현재 애플리케이션은 Dockerfile에서 uvicorn asgi:app으로 FastAPI를 실행하도록 구성되어 있다. 따라서 Oracle VM에 배포할 때도 Cloudflare Worker 전용 코드가 아니라 일반 Docker 실행 절차를 사용한다.

마무리

이번 단계에서는 애플리케이션을 실행할 무료 인프라를 마련했다. Cloudflare Container는 무료 티어에서 사용할 수 없었지만, Oracle Always Free VM을 사용하면 FastAPI를 특정 클라우드 런타임에 종속시키지 않고 Docker 애플리케이션으로 운영할 수 있다.

이 구조에서는 실행 서버를 다른 VM이나 클라우드로 옮겨도 FastAPI 코드와 Dockerfile을 그대로 재사용할 수 있다. Cloudflare D1과 R2는 저장소 계층으로만 사용하기 때문에 애플리케이션 실행 환경과의 결합도 줄어든다.

다음 글에서는 생성한 Oracle VM에 SSH로 접속하고, Docker를 설치한 뒤 FastAPI 컨테이너를 실행하는 과정을 정리할 예정이다.

profile
@github https://github.com/jhpark-jarvis

0개의 댓글