[실패] AWS Lambda 환경에서 Ollama를 이용한 코드 리뷰 봇 만들기

( 추가 )
Lamda의 이미지로 만드는 것은 용량이 크고 실행시간이 길어 안 될 것이라 판단,
GPU를 사용할 수 있는 ECS + Fargate를 사용해보기로 했습니다. (사용 예정)
후에 구축하게 된다면 구축기로 다시 찾아오겠습니다.

 

 


 

기존에 홈서버에 구축 되어있던 ollama-github-code-review-bot을 구동할 때 ollama가 구동되면서 홈서버(미니PC)가 매우 뜨거워져서 따로 서버가 필요할 것 같다고 생각했다.

 

Lambda로 동작 가능하다면 거의 무료의 가격으로 만들 수 있을 것 같아 쉽게 보고 도전했으나...

Ollama를 사용했을 때 아래와 같은 부분이 필요하다.

  1. Ollama가 구동 될 서버가 필요함
  2. 해당 서버로 POST 요청을 보내서 AI에게 지시

1번 서버, 2번 서버 이렇게 두 개가 필요한 것이다.

 

하지만 컨테이너 환경으로서 Ollama를 사용할 수 있게 한다면 해당 방법도 한 서버에서 사용할 수 있지 않을까? 라는 생각으로 컨테이너 환경을 구축 해 보았다.

 

Ollama에 대한 무지한 지식 때문인지, 아니면 Ollama가 동작하는 데 많은 리소스가 필요해서 그런진 모르겠지만... 만드는 데는 실패 했다.


나중에 다시 도전 해봐야겠다. 나중에라도 다시 보고 고칠 수 있지 않을까 싶어 기록용으로 아래에 남겨 둠.

 

github/workflows는 PR의 git diff를 사용해서 API로 요청을 날리고, 그에 따른 결과를 의견으로 남겨두는 로직이다.

 

## 파일 구조
.
├── Dockerfile
├── app.py
├── requirements.txt
└── start_ollama.sh

Dockerfile

# AWS Lambda용 Amazon Linux 2 ARM64 베이스 이미지 사용
FROM public.ecr.aws/lambda/python:3.9-arm64

# 작업 디렉토리 설정
WORKDIR /var/task

# 필요한 도구 설치
RUN yum update -y && yum install -y wget tar gzip

# Ollama 설치 (ARM64 버전)
RUN wget https://github.com/jmorganca/ollama/releases/download/v0.1.16/ollama-linux-arm64 -O /usr/local/bin/ollama \
    && chmod +x /usr/local/bin/ollama

# Python 패키지 설치
COPY requirements.txt .
RUN pip3 install -r requirements.txt

# 애플리케이션 파일 복사
COPY app.py .
COPY start_ollama.sh .

# 실행 권한 부여
RUN chmod +x start_ollama.sh

# Lambda 핸들러 설정
CMD ["app.lambda_handler"]

app.py

import json
import subprocess
import requests
import time
import os

def start_ollama_server():
    process = subprocess.Popen(["/bin/bash", "/var/task/start_ollama.sh"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    print(f"Ollama server start stdout: {stdout}")
    print(f"Ollama server start stderr: {stderr}")

# 전역 변수로 서버 시작 여부를 체크
ollama_server_started = False

def wait_for_ollama_server(max_retries=5, delay=5):
    for _ in range(max_retries):
        try:
            response = requests.get('http://localhost:11434/api/health')
            if response.status_code == 200:
                print("Ollama server is ready")
                return True
        except requests.exceptions.RequestException:
            print(f"Waiting for Ollama server... (retry in {delay} seconds)")
            time.sleep(delay)
    print("Failed to connect to Ollama server")
    return False

def lambda_handler(event, context):
    global ollama_server_started

    # Ollama 서버가 아직 시작되지 않았다면 시작
    if not ollama_server_started:
        print("Starting Ollama server...")
        start_ollama_server()
        ollama_server_started = True
        if not wait_for_ollama_server():
            return {
                'statusCode': 500,
                'body': json.dumps({'review': 'Ollama 서버 시작 실패.'})
            }

    # 이벤트 구조 확인 및 데이터 추출
    if 'body' in event:
        # API Gateway를 통한 호출
        body = json.loads(event['body'])
    elif 'Records' in event:
        # S3 이벤트 등을 통한 호출
        body = event['Records'][0]
    else:
        # 직접 테스트 호출 등
        body = event

    # 필요한 데이터 추출 (없으면 기본값 사용)
    diff_content = body.get('diff', 'No diff content provided')
    pr_number = body.get('pr_number', 'Unknown PR number')
    repo = body.get('repo', 'Unknown repository')

    print(f"Processing PR #{pr_number} for repo: {repo}")

    # Ollama를 사용해 Spring Boot 코드 리뷰 생성
    prompt = f"""
    Spring Boot 전문가로서 다음 코드 변경사항에 대해 모범 사례, 잠재적 버그, 개선사항을 검토해주세요:

    {diff_content}
    """

    try:
        print("Sending request to Ollama API...")
        response = requests.post('http://localhost:11434/api/generate', 
                                json={'model': 'llama2', 'prompt': prompt})
        response.raise_for_status()
        ai_comment = response.json()['response']
        print("Received response from Ollama API")
    except Exception as e:
        print(f"Ollama API 오류: {str(e)}")
        return {
            'statusCode': 500,
            'body': json.dumps({'review': 'AI 댓글 생성 실패.'})
        }

    # 리뷰 결과 반환
    return {
        'statusCode': 200,
        'body': json.dumps({'review': ai_comment})
    }

requirements.txt

requests

start_ollama.sh

#!/bin/bash

# Ollama 서버를 백그라운드에서 실행
/usr/local/bin/ollama serve &

# 서버가 시작될 때까지 잠시 대기
sleep 10

# Ollama 모델 다운로드 (Lambda 함수 실행 시 수행)
/usr/local/bin/ollama pull llama2

# Lambda 핸들러 실행
exec python3 -m awslambdaric app.lambda_handler