検索

infrastructureblogia

AWS EC2上でのLibreChatの自動デプロイ

AWS EC2上でのLibreChatの自動デプロイ

この記事は、プロジェクトとして、Terraformを使ってインフラをコード化し、User-DataのBashスクリプトでEC2上のコンポーネントをインストールし、AWS Systems ManagerでAPIキーの集中管理とデプロイの進捗追跡を行う、LibreChatのAWS EC2への自動デプロイPOC(Proof of Concept)を紹介します。フォーカスは自動化と、スポットインスタンスの利用によるコスト最適化にあります。

Introduction

LibreChatは、Mistral AIを含む複数のAIモデルを統合し、会話内検索、カスタムプリセットの作成、メッセージの編集と継続、プラグイン統合などの機能を提供する高度なチャットボットアプリケーションです。多言語・マルチモーダルなユーザーインターフェース、多数ユーザーの管理とセキュアな認証を備え、完全にオープンソースで提供されています。本プロジェクトは、これをAWS EC2上にデプロイする方法を探り、完全自動化を実現するための高度なツール群を利用します。

Architecture

デプロイされるアーキテクチャには以下の要素が含まれます:

  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.

Automatisation et Infrastructure as Code

Terraform

Terraformはインフラをコードとして定義・プロビジョニングするツールです。本プロジェクトでは、Terraformを使用してEC2インスタンスやセキュリティグループ、IAMロールなどの関連AWSリソースを作成・設定します。

User-Data

User-DataのBashスクリプトは、EC2インスタンスの初回起動時に実行されます。このスクリプトは、Docker、Docker Compose、Git、Node.js、NPMなど、LibreChatに必要なコンポーネントのインストールと設定を自動化します。User-Dataスクリプトはまた、OpenAI、MistralAI、Anthropic、Google API、Google CSE IDなど、LibreChatが必要とするAPIキーをAWS Systems Manager(SSM)から取得して設定します。

スクリプト内には、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サービスを再起動して変更を反映させます。

Suivi de l’avancement du déploiement avec SSM

AWS Systems Manager(SSM)は、EC2インスタンスを集中管理・設定するためのサービスです。本プロジェクトでは、SSMを使用してLibreChatに必要なAPIキーを保存・取得し、デプロイの進捗を追跡します。

スクリプト export.sh 内には、SSM経由でデプロイの状態を確認するための関数 check_deployment_status も定義されています。この関数により、デプロイの進行状況をリアルタイムで追跡し、問題を迅速に特定できます。

関数 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のパラメータとして保存されるため、いつでもどこからでもデプロイ状態を確認できます。

Gestion des erreurs avec set -e et trap '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にデプロイの状態を更新することで、進捗の追跡と早期問題検出が可能になります。

Réduction des coûts avec Spot Instances

スポットインスタンスは未使用のキャパシティを割安で利用できるEC2インスタンスです。本プロジェクトでは、アプリケーションのホスティングコストを削減するためにスポットインスタンスを利用しています。User-Dataスクリプトはスポットインスタンスの設定にも対応しており、パフォーマンスを犠牲にせずに大きなコスト削減を実現します。

Utilisation commune de export.sh dans le déploiement automatisé de LibreChat sur AWS EC2

AWS EC2上でのLibreChat自動デプロイにおいて、export.sh という名前のシェルスクリプトが作成され、デプロイやインフラ設定に関連する様々なタスクの管理を容易にしています。このスクリプトはローカルのワークステーションとGitLab CIのパイプラインの両方から利用され、含まれる関数群を共通かつ一貫して使用できます。

スクリプト export.sh にはインフラ管理用の複数の便利な関数がまとめられています。例としては:

  • terraform_plan : インフラに加えられる変更を事前確認するためのTerraformプランを生成します。
  • terraform_apply : AWS上のインフラにTerraformの変更を適用します。
  • 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_planterraform_applyterraform_destroy の関数が使用されています。スクリプト export.sh をソースすることで、その中の関数がパイプラインの実行環境で利用可能になります。

ローカル作業環境とGitLab CI間で export.sh を共通利用することで、AWS EC2上のLibreChat自動デプロイの管理が容易になります。スクリプト内の関数はタスクを簡素化し、インフラ操作の一貫性を確保します。

プロジェクトの詳細やソースコードについては、GitLabのリポジトリを参照してください。アーキテクチャ、設定、運用上のベストプラクティスに関する詳しい情報が掲載されています。

Connexion par défaut avec SSM sur l’instance

AWS Systems Manager(SSM)を使うことで、SSHを使わずにデフォルトでEC2インスタンスに接続できます。この機能により、インスタンスへのアクセスが簡素化され、SSHポートをインターネットに公開する必要がなくなるためセキュリティが強化されます。ただし、必要に応じて関連する変数を使ってSSH接続用のフローを開放することで、従来通りSSHでのアクセスも可能です。

Certificat SSL auto-signé et sécurité

デフォルトでは、LibreChatはポート80を有効にし、ポート443を有効にしない設定となっています。本プロジェクトでは、デフォルトでポート443を自己署名証明書で有効にし、ポート80はポート443へリダイレクトするようにしています。ブラウザにはHTTPSの警告が表示されますが、HTTPSを使用することでネットワーク上でのパスワード盗難に対する保護が提供されます。

Conclusion

本プロジェクトは、Terraformによるインフラ管理、BashのUser-Dataスクリプトによるコンポーネントのインストール、AWS Systems Managerによる設定の集中管理とデプロイ進捗の追跡を組み合わせて、AWS EC2上にLibreChatをデプロイ・設定する方法を探求しています。スポットインスタンスを用いたコスト削減や、自己署名SSL証明書とHTTPセキュリティヘッダの設定によるセキュリティ向上にも重点を置いています。

このプロジェクトを利用することで、効率的かつ安全、かつ経済的にAWS EC2上へLibreChatをデプロイ・設定できるようになります。自動化、Infrastructure as Code、設定の集中管理という同じ原則を適用することで、他のウェブアプリケーションのデプロイにも容易に拡張・適用できます。

Poursuivre l’Exploration avec le Projet GitLab

詳細な技術情報やAWS EC2上へのLibreChatデプロイに関する構成・アーキテクチャについて深く理解したい場合は、ぜひGitLab上のプロジェクトREADMEを参照してください。本記事はプロジェクトと主要な概念、導入の利点を紹介するものであり、実装の全ての詳細はプロジェクトリンク内に記載されています。

このドキュメントは gpt-5-mini モデルを使用して fr バージョンから ja 言語に翻訳されました。翻訳プロセスの詳細については https://gitlab.com/jls42/ai-powered-markdown-translator をご参照ください。