본문 바로가기
카테고리 없음

Rust + WASM 실전 프로젝트 시리즈 7

by rachel414 님의 블로그 2025. 8. 2.
반응형

 

WASM 기반 추론 서비스의 CI/CD 자동 배포 및 클라우드 모니터링 연동

앞선 시리즈에서는 Rust로 작성한 AI 추론 로직을 WASM으로 빌드하고, WASI 기반 서버리스 환경에서 실행하는 과정을 살펴보았습니다. 이제 실제 서비스를 운영하려면, 이 WASM 모듈을 자동으로 배포하고, 실행 상태를 모니터링할 수 있는 체계를 갖춰야 합니다.

이번 글에서는 WASM 기반 추론 서비스를 자동으로 빌드 및 배포(CI/CD)하고, 클라우드 환경에서 실시간으로 로그 및 성능 지표를 수집하는 방법을 실전 사례 중심으로 소개하겠습니다.

Rust + WASM 실전 프로젝트 시리즈 7

1. CI/CD 구조 개요

본 구조는 다음과 같이 구성됩니다.

  • GitHub Actions를 이용해 Rust → WASM 빌드 자동화
  • Spin 앱(또는 WasmEdge 앱)으로 패키징
  • Fermyon Cloud 또는 OCI 레지스트리에 자동 배포
  • 각 배포 환경에서 로그/모니터링 수집

예제 환경

  • 언어: Rust
  • 런타임: Spin (Fermyon), Wasmtime
  • CI/CD: GitHub Actions
  • 모니터링: Prometheus + Grafana 또는 Datadog 연동

2. CI 빌드 파이프라인

Rust → WASM 빌드 과정을 자동화하려면, 먼저 CI 파이프라인에서 WASI 타겟을 추가해야 합니다.

# .github/workflows/build.yaml
name: Build and Deploy WASM

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Install Rust
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        target: wasm32-wasi

    - name: Build WASM
      run: cargo build --release --target wasm32-wasi

    - name: Upload artifact
      uses: actions/upload-artifact@v3
      with:
        name: wasm-artifact
        path: target/wasm32-wasi/release/infer.wasm

이 파이프라인은 코드를 커밋할 때마다 자동으로 WASM 바이너리를 빌드하고, 아티팩트로 저장합니다.

3. 자동 배포: Fermyon Spin 활용

Spin은 WebAssembly 앱을 서버리스로 실행할 수 있는 프레임워크입니다. CLI만 있으면 배포가 매우 간단하며, GitHub Actions에도 쉽게 통합됩니다.

- name: Deploy to Fermyon Cloud
  run: |
    curl -fsSL https://developer.fermyon.com/downloads/install.sh | bash
    spin login --token ${{ secrets.FERMYON_TOKEN }}
    spin deploy --yes

위 스크립트는 GitHub Secrets에 등록한 API 토큰으로 Spin 앱을 Fermyon Cloud에 자동 배포합니다. 만약 자체 호스팅 Spin 인프라를 쓴다면, 내부 endpoint에 배포하는 방식도 유사합니다.

OCI 레지스트리에 WASM Push

OCI 레지스트리(Docker Hub, GHCR 등)도 Spin 모듈 배포를 지원합니다.

spin registry push ghcr.io/your-org/infer-service:latest

이 방법은 다양한 클라우드 플랫폼과 연동이 쉬워, 복잡한 워크플로우에서 유용하게 활용됩니다.

4. 클라우드 로그 및 모니터링 연동

WASM 모듈은 로그 출력도 stdout/stderr로 제한되기 때문에, 이를 수집하여 외부 로그 시스템으로 전달해야 합니다.

1) 로그 연동 (stdout 기반)

Spin이나 WasmEdge는 WASM 실행 중의 로그를 stdout으로 출력합니다. 이 로그를 CloudWatch, Stackdriver, or Datadog Agent가 수집할 수 있도록 구성할 수 있습니다.

println!("infer_time: {:?}", infer_time);
eprintln!("error: {:?}", err);

로그를 JSON 형식으로 표준화하면 필터링 및 대시보드 구성에 더 유리합니다.

2) Prometheus 지표 노출

Spin 앱에서 Prometheus 포맷의 메트릭을 노출할 수 있도록 내부 HTTP 경로를 구성할 수 있습니다.

GET /metrics
Content-Type: text/plain

wasm_infer_latency_seconds 0.043
wasm_infer_requests_total 15

이 경로를 Prometheus가 스크래핑하도록 구성하면 실시간 메트릭 수집 및 Grafana 시각화가 가능합니다.

3) Datadog 로그 및 메트릭 전송

Datadog Agent는 stdout 로그를 자동 수집할 수 있으며, WASM 내부에서 DogStatsD나 HTTP API를 통해 지표도 전송 가능합니다. Rust에서는 datadog-client 같은 crate로 연동할 수 있습니다.

5. 운영 Tips 및 주의 사항

  • 빌드 캐시 활용: Rust 빌드 속도를 줄이기 위해 캐시를 설정하는 것이 좋습니다.
  • 테스트 자동화: WASM 모듈 테스트도 CI에서 headless로 진행 가능하도록 구성합니다.
  • 릴리즈 분리: main 브랜치 자동 배포는 위험하므로, staging → production 워크플로우를 나누는 것이 안전합니다.
  • 모델 사이즈 최적화: 매 배포 시 WASM 크기를 줄이면 로딩 시간도 줄어듭니다.

마무리

이번 글에서는 WASM 기반 AI 추론 서비스를 운영하기 위한 CI/CD 구성과 클라우드 로그/모니터링 연동 방법을 살펴보았습니다. 서버리스 구조가 유연한 만큼, 자동화된 배포와 실시간 관측 체계가 중요합니다.

반응형