FastAPI 기반 Spin 애플리케이션 배포 도구입니다. Python Spin 애플리케이션을 WASM으로 빌드하고, AWS ECR에 푸시한 후, Kubernetes 환경에 SpinApp으로 배포하는 전체 파이프라인을 제공합니다.
- REST API: FastAPI 기반 REST API로 모든 작업 수행
- 코드 검증: MyPy를 통한 Python 코드 정적 타입 검사
- 유연한 업로드: 단일 .py 파일 또는 zip 아카이브 지원
- 백그라운드 작업: 빌드/푸시 작업을 백그라운드에서 실행하고 상태 조회
- AWS 통합: S3에 소스/아티팩트 저장, DynamoDB에 작업 상태 영속화
- IRSA 지원: IAM Roles for Service Accounts를 통한 안전한 AWS 인증
- Spot 인스턴스: 기본적으로 Spot 인스턴스 우선 스케줄링
- 오토스케일링: HPA/KEDA 연동을 위한 enableAutoscaling 지원
- Python 3.12+
- Spin 2.2+
- Kubernetes 클러스터 (SpinKube 설치됨)
- AWS ECR, S3, DynamoDB 접근 권한
# uv 사용 (권장)
uv sync
# 또는 pip 사용
pip install -e .
# 개발 의존성 포함
pip install -e ".[dev]"# 개발 서버 실행
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# 또는
python main.py| Method | Endpoint | Description |
|---|---|---|
GET |
/health |
헬스 체크 |
POST |
/api/v1/build |
파일 업로드 및 빌드 시작 |
POST |
/api/v1/push |
ECR에 이미지 푸시 |
POST |
/api/v1/build-and-push |
빌드 및 푸시 통합 |
POST |
/api/v1/scaffold |
SpinApp 매니페스트 생성 |
POST |
/api/v1/deploy |
K8s에 SpinApp 배포 |
GET |
/api/v1/tasks/{task_id} |
작업 상태 조회 |
GET |
/api/v1/workspaces/{workspace_id}/tasks |
워크스페이스별 작업 목록 |
# 빌드 요청
curl -X POST http://localhost:8000/api/v1/build \
-F "[email protected]" \
-F "workspace_id=my-workspace"
# 작업 상태 조회
curl http://localhost:8000/api/v1/tasks/{task_id}
# SpinApp 매니페스트 생성
curl -X POST http://localhost:8000/api/v1/scaffold \
-H "Content-Type: application/json" \
-d '{"image_ref": "123456789.dkr.ecr.ap-northeast-2.amazonaws.com/spin-app:v1.0.0"}'
# 배포 (Spot 인스턴스 + 오토스케일링 기본 활성화)
curl -X POST http://localhost:8000/api/v1/deploy \
-H "Content-Type: application/json" \
-d '{
"namespace": "default",
"image_ref": "123456789.dkr.ecr.ap-northeast-2.amazonaws.com/spin-app:v1.0.0",
"cpu_limit": "500m",
"memory_limit": "128Mi",
"function_id": "fn-12345"
}'.
├── main.py # FastAPI 애플리케이션 진입점
├── Dockerfile # 멀티스테이지 Docker 빌드
├── k8s/ # Kubernetes 매니페스트
│ ├── namespace.yaml
│ ├── serviceaccount.yaml # IRSA 설정
│ ├── configmap.yaml # 환경변수
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── hpa.yaml
│ ├── kustomization.yaml
│ └── iam-policy.json # IRSA용 IAM 정책
├── src/
│ ├── api/
│ │ └── routes.py # API 라우터
│ ├── models/
│ │ ├── api_models.py # Pydantic 요청/응답 모델
│ │ └── manifest.py # SpinApp 매니페스트 모델
│ ├── services/
│ │ ├── build.py # 빌드 서비스 (spin build)
│ │ ├── push.py # 푸시 서비스 (spin registry push)
│ │ ├── scaffold.py # 스캐폴드 서비스 (spin kube scaffold)
│ │ ├── deploy.py # 배포 서비스 (kubectl apply)
│ │ ├── manifest.py # 매니페스트 YAML 직렬화
│ │ ├── validation.py # MyPy 검증
│ │ ├── file_handler.py # 파일 처리 (zip, .py)
│ │ ├── task_manager.py # 백그라운드 작업 관리
│ │ ├── s3_storage.py # S3 저장소
│ │ ├── dynamodb.py # DynamoDB 영속화
│ │ └── core_service.py # Core Service 클라이언트
│ └── config.py # 설정 및 상수
└── tests/ # 테스트 코드
| 변수명 | 설명 | 기본값 |
|---|---|---|
DYNAMODB_TABLE_NAME |
DynamoDB 테이블명 | sfbank-blue-FaaSData |
S3_BUCKET_NAME |
S3 버킷명 | sfbank-blue-functions-code-bucket |
AWS_REGION |
AWS 리전 | ap-northeast-2 |
SPIN_PYTHON_VENV_TEMPLATE |
Spin Python venv 템플릿 경로 | /opt/spin-python-venv |
CORE_SERVICE_ENDPOINT |
Core Service 엔드포인트 (비어있으면 Mock 사용) | - |
ECR_REGISTRY_URL |
ECR 레지스트리 URL | 217350599014.dkr.ecr.ap-northeast-2.amazonaws.com/blue-final-faas-app |
# .env.example을 복사하여 .env 생성
cp .env.example .env
# 필요한 값 수정 후 실행
source .env
uvicorn main:app --reload# IAM Policy 생성
aws iam create-policy \
--policy-name blue-faas-policy \
--policy-document file://k8s/iam-policy.json
# IRSA 설정
eksctl create iamserviceaccount \
--name blue-faas-sa \
--namespace blue-faas \
--cluster YOUR_CLUSTER_NAME \
--attach-policy-arn arn:aws:iam::ACCOUNT_ID:policy/blue-faas-policy \
--approve# Kustomize로 배포
kubectl apply -k k8s/
# 상태 확인
kubectl -n blue-faas get pods
kubectl -n blue-faas logs -l app.kubernetes.io/name=blue-faas -f배포되는 SpinApp에는 다음 레이블이 자동으로 추가됩니다:
metadata:
labels:
app.kubernetes.io/managed-by: blue-faas
spec:
podLabels:
faas: "true"
function_id: "fn-12345" # deploy 요청 시 function_id 지정 시 추가FaaS Pod 조회:
# 모든 FaaS Pod 조회
kubectl get pods -l faas=true
# 특정 function_id로 조회
kubectl get pods -l function_id=fn-12345# 전체 테스트 실행
pytest tests/ -v
# 특정 테스트 실행
pytest tests/test_manifest_roundtrip.py -v# 이미지 빌드
docker build -t blue-faas:latest .
# ECR에 푸시
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ACCOUNT_ID.dkr.ecr.ap-northeast-2.amazonaws.com
docker tag blue-faas:latest ACCOUNT_ID.dkr.ecr.ap-northeast-2.amazonaws.com/blue-faas:latest
docker push ACCOUNT_ID.dkr.ecr.ap-northeast-2.amazonaws.com/blue-faas:latest-
function_id 지원:
/api/v1/deployAPI에function_id파라미터 추가- 배포 시
function_id를 지정하면 SpinApp의podLabels에function_id레이블이 추가됨 - 이를 통해 특정 함수의 Pod를 쉽게 조회하고 관리 가능
- 예:
kubectl get pods -l function_id=fn-12345
- 배포 시
-
ECR 레지스트리 URL 환경변수:
ECR_REGISTRY_URL환경변수 추가- 기본값:
217350599014.dkr.ecr.ap-northeast-2.amazonaws.com/blue-final-faas-app src/config.py,.env.example,k8s/configmap.yaml에 설정 추가
- 기본값:
MIT