검색

infrastructureblogia

AWS EC2에서 LibreChat 자동 배포

AWS EC2에서 LibreChat 자동 배포

이 글은 프로젝트 POC(Proof of Concept)로, Terraform을 사용해 인프라를 코드로 정의하고 EC2에서 구성 요소를 설치하는 Bash User-Data 스크립트 및 API 키의 중앙 관리를 위한 AWS Systems Manager를 활용하여 LibreChat을 AWS EC2에 자동으로 배포하는 방법을 소개합니다. 초점은 자동화와 Spot 인스턴스 사용을 통한 비용 최적화에 있습니다.

소개

LibreChat은 Mistral AI 등을 포함한 여러 AI 모델을 통합한 고급 챗봇 애플리케이션으로, 대화 내 검색, 맞춤 프리셋 생성, 메시지 편집 및 이어쓰기, 플러그인 통합 등의 기능을 제공합니다. 다국어 및 다중 모달 사용자 인터페이스, 안전한 인증을 통한 다중 사용자 관리 기능을 제공하며 완전한 오픈 소스입니다. 이 프로젝트는 AWS EC2에 대한 배포를 탐구하며 완전 자동화된 구현을 위해 고급 도구들을 사용합니다.

아키텍처

배포된 아키텍처는 다음 요소들을 포함합니다:

  1. Une instance EC2 exécutant Ubuntu Server.
  2. Un script User-Data en bash pour automatiser l’installation et la configuration des composants nécessaires à LibreChat.
  3. Terraform pour définir et provisionner l’infrastructure AWS nécessaire au déploiement de LibreChat.
  4. AWS Systems Manager (SSM) pour stocker et récupérer les clés d’API nécessaires à LibreChat et suivre l’avancement du déploiement.

자동화 및 코드로서의 인프라(Infrastructure as Code)

Terraform

Terraform은 인프라를 코드로 정의하고 프로비저닝하는 도구입니다(Infrastructure as Code). 이 프로젝트에서는 Terraform을 사용해 EC2 인스턴스와 보안 그룹, IAM 역할 등 관련 AWS 리소스를 생성하고 구성합니다.

User-Data

User-Data에 포함된 Bash 스크립트는 EC2 인스턴스의 첫 부팅 시 실행됩니다. 이 스크립트는 Docker, Docker Compose, Git, Node.js 및 NPM 등 LibreChat에 필요한 구성 요소의 설치 및 구성을 자동화합니다. 또한 User-Data 스크립트는 AWS Systems Manager(SSM)에서 OpenAI, MistralAI, Anthropic, Google API 및 Google CSE ID와 같은 LibreChat에 필요한 API 키를 가져와 설정하도록 구성할 수 있습니다.

User-Data 스크립트에는 배포 상태를 AWS SSM을 통해 업데이트하는 update_status 함수가 정의되어 있습니다. 이 함수는 배포 상태를 모니터링하고 문제를 신속하게 감지할 수 있게 해줍니다. 스크립트는 또한 update_registration.sh 함수를 푸시하고 cron에 등록하여 등록 활성화/비활성화를 제어합니다.

예시: update_status 함수:

update_status() {
  STATUS_MESSAGE=$1
  aws ssm put-parameter --name "/librechat/deployment-status" --type "String" --value "$STATUS_MESSAGE" --overwrite --region $AWS_DEFAULT_REGION
}

예시: update_registration.sh 함수:

#!/bin/bash
set -e

# Update registration status in SSM Parameter Store
aws ssm put-parameter --name "/librechat/registration_enabled" --type "String" --value "$1" --overwrite --region $AWS_DEFAULT_REGION

# Update LibreChat configuration file
if [ "$1" == "true" ]; then
  sed -i 's/enabled: false/enabled: true/g' /opt/librechat/config.yaml
else
  sed -i 's/enabled: true/enabled: false/g' /opt/librechat/config.yaml
fi

# Restart LibreChat service
systemctl restart librechat

update_registration.sh 함수는 SSM Parameter Store와 LibreChat 구성 파일에서 등록 활성화 상태를 업데이트하는 데 사용됩니다. 변경 사항을 반영하기 위해 LibreChat 서비스를 재시작합니다.

SSM을 통한 배포 진행 추적

AWS Systems Manager(SSM)는 EC2 인스턴스를 중앙에서 관리하고 구성할 수 있게 해주는 서비스입니다. 이 프로젝트에서는 SSM을 사용해 LibreChat에 필요한 API 키를 저장 및 조회하고, 배포 진행 상황을 추적합니다.

User-Data 스크립트 내에는 배포 상태를 AWS SSM을 통해 확인하는 check_deployment_status 함수가 export.sh에 정의되어 있습니다. 이 함수는 배포 진행 상태를 실시간으로 추적하고 문제를 빠르게 감지할 수 있게 해줍니다.

예시: check_deployment_status 함수:

check_deployment_status() {
  LAST_STATUS=""
  INSTANCE_ID=$(terraform output -raw instance_id)  # Récupère l'ID de l'instance Terraform.
  if [ -z "$INSTANCE_ID" ]; then
    echo "Aucune instance EC2 n'est actuellement déployée ou terraform output n'est pas configuré correctement."
    return 1
  fi
  IP_ADDRESS=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query "Reservations[*].Instances[*].PublicIpAddress" --output text --region $AWS_DEFAULT_REGION 2>/dev/null)
  URL="https://$IP_ADDRESS/"
  echo "Vérification de l'état de déploiement..."
  ATTENTE_STATUS=true  # Utilisée pour contrôler l'affichage du message d'attente.
  while true; do
    STATUS=$(aws ssm get-parameter --name "/librechat/deployment-status" --query "Parameter.Value" --output text --region $AWS_DEFAULT_REGION 2>/dev/null)
    if [ $? -ne 0 ]; then
      if [ "$ATTENTE_STATUS" = true ]; then
        echo -ne "\rEn attente des informations de statut de déploiement.\n"
        ATTENTE_STATUS=false  # Empêche la répétition du message.
      fi
      sleep 1
      continue
    else
      ATTENTE_STATUS=true  # Réinitialise pour le prochain cycle.
    fi
    if [[ "$STATUS" != "$LAST_STATUS" ]]; then
      if [[ "$LAST_STATUS" != "" ]]; then
        echo -e " \e[32m✓\e[0m"  # Affiche une coche verte pour le statut précédent.
      fi
      echo -ne "\rÉtat actuel du déploiement : $STATUS"
      LAST_STATUS="$STATUS"
      if [[ "$STATUS" == "100% - Installation terminée" ]]; then
        echo -e "\n\e[32m✓ Installation terminée avec succès\e[0m"
        echo -e "Accédez à l'instance Librechat via : $URL"
        break
      elif [[ "$STATUS" == "Echec de l'installation" ]]; then
        echo -e "\n\e[31m✗ Échec de l'installation\e[0m"
        exit 1
      fi
    fi
    sleep 1
  done
}
}

배포 상태는 SSM 파라미터에 저장되므로 언제든지, 어디서든 배포 상태를 확인할 수 있습니다.

set -etrap 'error_handler' ERR를 이용한 오류 처리

User-Data 스크립트에서는 set -etrap 'error_handler' ERR을 사용해 강력한 오류 처리 메커니즘을 구현했습니다. 이 접근 방식은 오류 발생 시 스크립트를 즉시 중단하고 문제에 대한 상세 정보를 제공합니다.

다음은 오류 처리가 통합된 User-Data 스크립트 일부입니다:

#!/bin/bash
set -e
trap 'error_handler' ERR

error_handler() {
  local error_message=$1
  echo "Error occurred: ${error_message}"
  update_status "ERROR: ${error_message}"
  exit 1
}

update_status() {
  STATUS_MESSAGE=$1
  aws ssm put-parameter --name "/librechat/deployment-status" --type "String" --value "$STATUS_MESSAGE" --overwrite --region $AWS_DEFAULT_REGION
}

error_handler 함수는 스크립트에서 오류가 발생할 때마다 호출됩니다. 이 함수는 오류 메시지를 인수로 받아 콘솔에 출력하고, update_status 함수를 사용해 AWS SSM을 통해 배포 상태를 업데이트한 뒤 오류 코드와 함께 스크립트를 종료합니다.

set -etrap 'error_handler' ERR 덕분에 오류 발생 시 배포가 즉시 중단되어 디버깅과 문제 해결이 용이해집니다. 또한 AWS SSM에 배포 상태를 업데이트하면 배포 진행 상황을 모니터링하고 문제를 빠르게 감지할 수 있습니다.

Spot 인스턴스를 통한 비용 절감

Spot 인스턴스는 사용되지 않는 EC2 용량을 온디맨드 인스턴스에 비해 저렴한 가격에 제공하는 인스턴스 유형입니다. 이 프로젝트에서는 애플리케이션 호스팅 비용을 절감하기 위해 Spot 인스턴스를 사용합니다. User-Data 스크립트는 Spot 인스턴스 구성도 지원하므로 성능을 크게 저하시키지 않으면서 중요한 비용 절감을 실현할 수 있습니다.

AWS EC2에서 LibreChat 자동 배포에 공통으로 사용되는 export.sh

이 프로젝트에서는 배포 및 인프라 구성과 관련된 여러 작업을 용이하게 하기 위해 export.sh라는 셸 스크립트를 작성했습니다. 이 스크립트는 로컬 워크스테이션과 GitLab CI 파이프라인 양쪽에서 사용되어 포함된 함수들을 일관되게 활용할 수 있게 합니다.

export.sh 스크립트는 배포 및 AWS 인프라 관리를 위한 여러 유용한 함수를 포함합니다. 예를 들어 다음과 같은 함수들이 있습니다:

  • terraform_plan : 인프라 변경사항을 미리보기 위한 Terraform 플랜 생성.
  • terraform_apply : Terraform 변경사항을 AWS 인프라에 적용.
  • terraform_destroy : 배포 시 생성된 Terraform 리소스 삭제.
  • check_deployment_status : AWS SSM을 조회하여 현재 배포 상태 확인.

다음은 GitLab CI 파이프라인에서 이러한 함수들을 사용하는 예시입니다:

stages:
  - Vérifications
  - Déploiements
  - Suppressions

Vérification Terraform:
  stage: Vérifications
  script:
    - /bin/bash -c "source export.sh && terraform_plan"

Déploiement Terraform:
  stage: Déploiements
  script:
    - /bin/bash -c "source export.sh && terraform_apply && check_deployment_status"

Suppression Terraform:
  stage: Suppressions
  script:
    - /bin/bash -c "source export.sh && terraform_destroy"

이 예시에서는 terraform_plan, terraform_apply, 및 terraform_destroy 함수들이 파이프라인의 여러 단계에서 사용됩니다. export.sh 스크립트를 소싱하면 그 안에 정의된 함수들을 파이프라인 실행 환경에서 사용할 수 있습니다.

로컬 워크스테이션과 GitLab CI 간에 export.sh를 공통으로 사용하면 LibreChat의 AWS EC2 자동 배포 관리를 용이하게 할 수 있습니다. 이 스크립트에 포함된 함수들은 작업을 단순화하고 인프라 작업의 일관성을 보장합니다.

프로젝트에 대해 더 알고 소스 코드를 확인하려면 GitLab 저장소를 방문하세요. 해당 링크에서 이 자동 배포 프로젝트의 아키텍처, 구성 및 적용된 모범 사례에 대한 자세한 정보를 찾을 수 있습니다.

인스턴스에서의 기본 연결(SSM)

AWS Systems Manager(SSM)는 SSH를 사용하지 않고도 기본적으로 EC2 인스턴스에 연결할 수 있게 해줍니다. 이 기능은 SSH 포트를 인터넷에 노출하지 않아 접근을 단순화하고 보안을 강화합니다. 필요에 따라 관련 변수를 통해 SSH 접근을 허용하여 인스턴스에 접속할 수도 있습니다.

자체 서명 SSL 인증서 및 보안

기본적으로 LibreChat은 443 포트를 활성화하지 않고 80 포트를 통해 접근을 허용합니다. 이 프로젝트에서는 기본적으로 443 포트를 자체 서명된 인증서로 활성화하고 80 포트는 443으로 리디렉션되도록 구성합니다. 브라우저에 HTTPS 경고가 표시될 수 있지만, HTTPS를 사용하면 네트워크 상에서의 비밀번호 도용으로부터 보호할 수 있습니다.

결론

이 프로젝트는 Terraform을 통한 인프라 관리, 구성 요소 설치를 위한 Bash User-Data 스크립트, 그리고 중앙 설정 관리 및 배포 진행 추적을 위한 AWS Systems Manager를 사용해 AWS EC2 인스턴스에 LibreChat을 배포하고 구성하는 방법을 탐구합니다. 또한 Spot 인스턴스를 통한 비용 절감과 자체 서명 SSL 인증서 및 HTTP 보안 헤더 구성을 통한 보안 강화에도 중점을 두었습니다.

이 프로젝트를 활용하면 AWS EC2에서 LibreChat을 효율적이고 안전하며 경제적으로 배포하고 구성할 수 있습니다. 동일한 자동화 원칙, 코드로서의 인프라 및 중앙 설정 관리를 적용하여 다른 웹 애플리케이션의 배포에도 확장하고 적응할 수 있습니다.

GitLab 프로젝트로 더 깊이 탐구하기

LibreChat을 AWS EC2에 배포하는 아키텍처와 구성 등 기술적 세부사항을 더 깊이 이해하려면 GitLab 프로젝트 README를 꼭 확인해 보시기 바랍니다. 이 글은 프로젝트와 핵심 개념 및 배포의 장점들을 소개하지만, 모든 세부사항은 프로젝트 링크에서 확인할 수 있습니다.

이 문서는 gpt-5-mini 모델을 사용하여 fr 버전에서 ko 언어로 번역되었습니다. 번역 과정에 대한 자세한 내용은 https://gitlab.com/jls42/ai-powered-markdown-translator 를 참조하십시오.