Terraform으로 구축하는 서버리스 AI 배치 시스템

Terraform으로 구축하는 서버리스 AI 배치 시스템

API Gateway, Lambda, ECS Fargate를 활용한 비용 효율적인 AI 배치 처리 인프라 구축 실전 가이드

개요

AI 시스템을 운영 환경에 배포할 때 가장 큰 고민 중 하나는 인프라 비용입니다. 특히 배치 처리 특성의 AI 워크로드는 상시 서버가 필요 없지만, 작업 실행 시에는 충분한 컴퓨팅 리소스가 필요합니다.

이 글에서는 실제 프로젝트에서 구축한 서버리스 AI 배치 시스템의 아키텍처를 분석하고, Terraform을 활용한 인프라 관리의 장점을 살펴봅니다.

아키텍처 설계

전체 구조

graph TD
    A[Frontend] -->|HTTPS + API Key| B[API Gateway]
    B --> C[Lambda API Handler]
    C --> D[DynamoDB]
    C --> E[SQS FIFO Queue]
    E --> F[Lambda Task Launcher]
    F --> G[ECS Fargate Worker]
    G --> D
    G --> H[S3 Results]

핵심 컴포넌트

컴포넌트역할비용 특성
API GatewayREST API 엔드포인트요청당 과금
Lambda작업 생성/실행 트리거실행 시간당 과금
SQS FIFO작업 대기열 관리거의 무료
ECS FargateAI 워커 실행실행 시간당 과금
DynamoDB상태 관리On-Demand 과금
S3결과 저장저장 용량당 과금

Terraform의 장점

1. LLM과의 뛰어난 친화성

Terraform의 HCL(HashiCorp Configuration Language)은 선언적이고 구조화된 문법을 가지고 있어 LLM이 코드를 생성하고 이해하기 매우 쉽습니다.

# LLM이 생성하기 쉬운 명확한 구조
resource "aws_lambda_function" "api_handler" {
  function_name = "ai-batch-api-handler"
  runtime       = "python3.11"
  handler       = "main.lambda_handler"
  memory_size   = 256
  timeout       = 30

  environment {
    variables = {
      DYNAMODB_TABLE = aws_dynamodb_table.jobs.name
      SQS_QUEUE_URL  = aws_sqs_queue.tasks.url
    }
  }
}

2025년 현재, Claude나 GPT-4 같은 LLM들은 Terraform 코드 생성에서 거의 프로덕션 수준의 결과물을 만들어냅니다. 자연어로 요구사항을 설명하면 완성도 높은 IaC 설정을 얻을 수 있습니다.

2. 인프라 상태 관리

Terraform의 State 파일은 실제 인프라와 코드 사이의 정합성을 보장합니다.

# 현재 인프라 상태 확인
terraform show

# 변경 사항 미리보기
terraform plan

# 안전한 적용
terraform apply

3. 재현 가능한 환경

동일한 Terraform 코드로 개발/스테이징/프로덕션 환경을 일관되게 구축할 수 있습니다.

# variables.tf
variable "environment" {
  description = "배포 환경"
  type        = string
  default     = "dev"
}

variable "allowed_ips" {
  description = "허용할 IP 주소 목록"
  type        = list(string)
  default     = []
}

쉘 스크립트 기반 운영

배포 자동화

복잡한 배포 과정을 단일 스크립트로 추상화합니다.

#!/bin/bash
# deploy.sh
set -e

echo "=== AI System Deployment ==="

# 환경변수 로드
source .env

# 1. Docker 이미지 빌드 & 푸시
cd workers/image_alt_generator
docker build -t ai-batch-worker:latest .
aws ecr get-login-password --region ${AWS_REGION} | \
    docker login --username AWS --password-stdin ${ECR_REGISTRY}
docker push ${ECR_REGISTRY}/ai-batch-worker:latest

# 2. Terraform 인프라 배포
cd ../../terraform
terraform apply -auto-approve \
    -var="allowed_ips=${ALLOWED_IPS}" \
    -var="environment=prod"

# 3. 결과 출력
echo "API Endpoint: $(terraform output -raw api_endpoint)"
echo "API Key: $(terraform output -raw api_key)"

모니터링 스크립트

#!/bin/bash
# monitor.sh

# 실행 중인 ECS Task 확인
aws ecs list-tasks --cluster ai-batch-cluster

# CloudWatch 로그 실시간 확인
aws logs tail /ecs/ai-batch/worker --follow

# DynamoDB 작업 상태 조회
aws dynamodb scan --table-name ai-batch-jobs \
    --filter-expression "#s = :status" \
    --expression-attribute-names '{"#s": "status"}' \
    --expression-attribute-values '{":status": {"S": "RUNNING"}}'

비용 최적화 전략

서버리스 아키텍처의 비용 이점

시나리오EC2 상시 운영서버리스
월 10,000 작업~$150~$21
월 1,000 작업~$150~$5
월 100 작업~$150~$1

배치 작업 특성상 사용한 만큼만 과금되는 서버리스 모델이 압도적으로 유리합니다.

Fargate Spot 활용

resource "aws_ecs_service" "worker" {
  # ...

  capacity_provider_strategy {
    capacity_provider = "FARGATE_SPOT"
    weight           = 1
    base             = 0
  }
}

Fargate Spot을 사용하면 최대 70% 비용 절감이 가능합니다. AI 배치 작업은 대부분 재시도가 가능하므로 Spot 인스턴스에 적합합니다.

알림 및 Notion 연계

Slack 알림 통합

# lambda/notifier/main.py
import boto3
import requests

def notify_job_completion(job_id, status, result_url=None):
    webhook_url = os.environ['SLACK_WEBHOOK_URL']

    message = {
        "blocks": [
            {
                "type": "section",
                "text": {
                    "type": "mrkdwn",
                    "text": f"*작업 완료 알림*\n"
                           f"Job ID: `{job_id}`\n"
                           f"Status: {status}"
                }
            }
        ]
    }

    if result_url:
        message["blocks"].append({
            "type": "actions",
            "elements": [{
                "type": "button",
                "text": {"type": "plain_text", "text": "결과 다운로드"},
                "url": result_url
            }]
        })

    requests.post(webhook_url, json=message)

Notion 데이터베이스 연동

작업 결과를 Notion 데이터베이스에 자동 기록하여 프로젝트 관리와 통합합니다.

from notion_client import Client

def log_to_notion(job_data):
    notion = Client(auth=os.environ["NOTION_TOKEN"])

    notion.pages.create(
        parent={"database_id": os.environ["NOTION_DATABASE_ID"]},
        properties={
            "작업 ID": {"title": [{"text": {"content": job_data["job_id"]}}]},
            "상태": {"select": {"name": job_data["status"]}},
            "처리 시간": {"number": job_data["duration_seconds"]},
            "완료 시각": {"date": {"start": job_data["completed_at"]}}
        }
    )

확장성 고려

새로운 AI Worker 추가

workers/
├── image_alt_generator/    # 이미지 Alt Text 생성
├── meta_desc_generator/    # 메타 설명 생성
└── content_analyzer/       # 콘텐츠 분석

새로운 Worker 추가 시:

  1. Worker 디렉토리 생성 및 코드 작성
  2. terraform/ecs.tf에 Task Definition 추가
  3. terraform/sqs.tf에 전용 큐 추가
  4. Lambda 큐 매핑 업데이트
  5. ./deploy.sh 실행

Terraform의 모듈화 덕분에 새로운 서비스 추가가 매우 간단합니다.

실전 적용 결과

운영 지표

  • 배포 시간: 수동 30분 → 자동 5분
  • 인프라 비용: EC2 기준 대비 85% 절감
  • 장애 복구: State 파일 기반 즉시 재구축 가능
  • 코드 리뷰: IaC로 인프라 변경 사항 PR 리뷰 가능

교훈

  1. HCL은 학습 곡선이 낮다: JSON/YAML 대비 가독성이 뛰어남
  2. LLM 활용이 핵심: 복잡한 리소스 설정도 자연어로 요청 가능
  3. 쉘 스크립트로 추상화: 복잡한 명령어를 단순화
  4. State 관리 중요: S3 + DynamoDB Lock 필수

결론

Terraform을 활용한 서버리스 AI 배치 시스템은 다음과 같은 이점을 제공합니다:

  • 비용 효율성: 사용량 기반 과금으로 배치 작업에 최적
  • LLM 친화적: AI 도구로 인프라 코드 생성 및 관리 용이
  • 운영 편의성: 쉘 스크립트로 복잡한 작업 자동화
  • 확장성: 모듈화된 구조로 새로운 서비스 추가 간편

AI 시스템 구축 시 초기부터 IaC를 도입하면 장기적인 운영 효율성을 크게 높일 수 있습니다.

참고 자료

다른 언어로 읽기

글이 도움이 되셨나요?

더 나은 콘텐츠를 작성하는 데 힘이 됩니다. 커피 한 잔으로 응원해주세요! ☕

저자 소개

JK

Kim Jangwook

AI/LLM 전문 풀스택 개발자

10년 이상의 웹 개발 경험을 바탕으로 AI 에이전트 시스템, LLM 애플리케이션, 자동화 솔루션을 구축합니다. Claude Code, MCP, RAG 시스템에 대한 실전 경험을 공유합니다.