이 기사는 프로젝트 POC (Proof of Concept)을 EC2에서 LibreChat을 Terraform을 사용하여 인프라를 코드로서 오케스트레이션하고, User-Data Bash 스크립트를 사용하여 EC2에 컴포넌트를 설치하며, AWS Systems Manager를 사용하여 중앙 집중적으로 API 키를 관리하고 배포 진행 상황을 추적하는 방법을 소개합니다. 비용 최적화를 위해 Spot 인스턴스 사용에도 중점을 둡니다.
소개
LibreChat은 여러 인공지능 모델을 통합한 고급 채팅 애플리케이션으로, 대화 검색, 맞춤형 프리셋 생성, 메시지 편집 및 계속, 플러그인 통합 등의 기능을 제공합니다. 다국어 및 멀티모달 사용자 인터페이스, 다중 사용자 관리 및 보안 인증, 그리고 완전한 오픈 소스를 자랑합니다. 이 프로젝트는 고급 도구를 사용하여 AWS EC2에 이를 자동 배포하는 방법을 탐구합니다.
아키텍처
배포된 아키텍처에는 다음 요소가 포함됩니다:
Ubuntu Server
를 실행하는EC2
인스턴스.- LibreChat에 필요한 컴포넌트를 설치하고 구성하기 위한 bash 스크립트의
User-Data
. - LibreChat 배포에 필요한 AWS 인프라를 정의하고 프로비저닝하기 위한
Terraform
. - LibreChat에 필요한 API 키를 저장하고 검색하며 배포 진행 상황을 추적하기 위한
AWS Systems Manager (SSM)
.
자동화 및 인프라 코드로서의 접근
Terraform
Terraform은 인프라를 코드로서 정의하고 프로비저닝하는 도구입니다. 이 프로젝트에서는 EC2 인스턴스와 보안 그룹 및 IAM 역할과 같은 AWS 리소스를 생성하고 구성하기 위해 Terraform을 사용합니다.
User-Data
User-Data bash 스크립트는 EC2 인스턴스 첫 부팅 시 실행됩니다. 이 스크립트는 Docker, Docker Compose, Git, Node.js 및 NPM과 같은 LibreChat에 필요한 컴포넌트를 자동으로 설치하고 구성합니다. 또한, LibreChat에 필요한 OpenAI, MistralAI, Anthropic, Google API 및 Google CSE ID와 같은 API 키를 AWS Systems Manager (SSM)에서 가져와 설정합니다.
User-Data 스크립트에는 AWS SSM을 통해 배포 상태를 업데이트하기 위한 update_status
함수가 정의되어 있습니다. 이 함수는 배포 상태를 모니터링하고 잠재적인 문제를 신속히 감지할 수 있게 합니다. 또한, User-Data 스크립트는 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 키를 저장하고 검색하는 데 사용되며, 배포 진행 상황을 추적하는 데 사용됩니다.
또한, export.sh
스크립트 내에 정의된 check_deployment_status
함수를 사용하여 배포 상태를 AWS SSM을 통해 확인합니다. 이 기능은 배포 진행 상태를 실시간으로 추적하고 발생 가능한 문제를 신속하게 감지할 수 있게 해줍니다.
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 -e
및 trap 'error_handler' ERR
를 사용한 오류 처리
User-Data 스크립트에서는 set -e
및 trap '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 -e
및 trap 'error_handler' ERR
덕분에 배포 중 오류가 발생하면 즉시 중지되어 문제 해결 및 디버깅이 용이합니다. 또한, AWS SSM에서 배포 상태를 업데이트함으로써 배포 진행 상황을 추적하고 문제를 신속하게 감지할 수 있습니다.
스팟 인스턴스를 통한 비용 절감
스팟 인스턴스는 미사용 용량을 사용하여 주문형 인스턴스보다 저렴한 가격에 EC2 인스턴스를 제공합니다. 이 프로젝트에서는 스팟 인스턴스를 사용하여 애플리케이션 호스팅 비용을 절감합니다. User-Data 스크립트는 스팟 인스턴스 구성을 지원하여 성능을 저하시키지 않으면서 상당한 비용 절감을 누릴 수 있습니다.
AWS EC2에서 LibreChat 자동 배포에 export.sh
의 공동 사용
AWS EC2에서 LibreChat의 자동 배포를 위해, 배포 및 인프라 구성을 관리하기 위한 여러 작업을 쉽게 처리할 수 있도록 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
함수는 GitLab CI 파이프라인의 여러 단계에서 사용됩니다. export.sh
스크립트를 소싱하면, 스크립트에 포함된 함수들이 파이프라인 실행 환경에서 접근 가능해집니다.
로컬 작업 환경과 GitLab CI 간의 export.sh
공동 사용은 AWS EC2에서 LibreChat의 자동 배포 관리를 용이하게 합니다. 이 스크립트에 포함된 함수들은 작업을 간소화하고 인프라에서 수행되는 작업의 일관성을 보장합니다.
프로젝트에 대해 더 알고 싶거나 소스 코드를 확인하려면 GitLab 저장소를 방문하세요. 아래에서는 이 자동화된 배포 프로젝트의 아키텍처, 구성 및 구현된 모범 사례에 대한 자세한 정보를 찾을 수 있습니다.
인스턴스에 대해 기본적으로 SSM을 통한 연결
AWS Systems Manager (SSM)은 SSH를 사용하지 않고 기본적으로 EC2 인스턴스에 연결할 수 있도록 합니다. 이 기능은 인스턴스 접근을 단순화하고 SSH 포트를 인터넷에 노출하지 않아 보안을 강화합니다. 그러나 연관된 변수를 사용하여 적절한 흐름을 열면 여전히 SSH를 통해 인스턴스에 접근할 수 있습니다.
자기 서명된 SSL 인증서 및 보안
기본적으로 Librechat은 포트 80을 활성화하고 포트 443은 비활성화합니다. 이 프로젝트에서는 포트 443이 기본적으로 자기 서명된 인증서로 활성화되며, 포트 80은 포트 443으로 리디렉션됩니다. 비록 브라우저에서 HTTPS 경고가 나타날 수 있지만, HTTPS 프로토콜 사용은 네트워크에서 비밀번호 도난에 대해 보안을 제공합니다.
결론
이 프로젝트는 Terraform을 사용한 인프라, bash로 작성된 User-Data 스크립트를 통한 구성 요소 설치, 그리고 AWS Systems Manager를 사용하여 구성의 중앙 집중식 관리와 배포 진행 상황을 추적하는 방법으로 EC2 AWS 인스턴스에 LibreChat을 배포 및 구성하는 방법을 탐구합니다. 비용 절감을 위한 Spot Instances 사용과 자기 서명된 SSL 인증서 및 HTTP 보안 헤더를 구성하여 보안을 강화하는 것에도 중점을 둡니다.
이 프로젝트를 사용하면 효율적이고, 안전하며 경제적으로 EC2 AWS 인스턴스에 LibreChat을 배포하고 구성할 수 있습니다. 이 프로젝트는 자동화, 코드형 인프라 및 중앙 집중식 구성 관리를 위한 동일한 원칙을 사용하여 다른 웹 애플리케이션을 AWS에 배포하는 데 확장 및 적용할 수 있습니다.
GitLab 프로젝트로 탐색 확장하기
AWS EC2에서 LibreChat 배포에 대한 아키텍처 및 구성을 포함한 심층적인 이해와 기술적 세부 사항을 위해, GitLab의 프로젝트 README를 꼭 확인해보세요. 이 글은 프로젝트와 주요 개념 및 배포의 이점을 소개하지만, 프로젝트 링크에서 모든 세부 사항을 찾을 수 있습니다.
이 문서는 fr 버전에서 ko 언어로 gpt-4o 모델을 사용하여 번역되었습니다. 번역 프로세스에 대한 자세한 내용은 https://gitlab.com/jls42/ai-powered-markdown-translator를 참조하십시오.