この記事は、インフラストラクチャをコードとして定義するTerraformを利用し、EC2上にLibreChatを自動デプロイするためのPOCプロジェクトを紹介します。EC2にコンポーネントをインストールするためのBashスクリプトUser-Dataを使用し、APIキーの集中管理およびデプロイの追跡にはAWS Systems Managerを使用しています。スポットインスタンスの使用を通じて、自動化とコストの最適化に重点を置いています。

はじめに

LibreChatは、複数のAIモデル(Mistral AIを含む)を統合し、会話の検索、カスタムプリセットの作成、メッセージの編集および継続、プラグインの統合などの機能を提供する先進的なチャットボットアプリケーションです。多言語対応のUI、多モダリティサポート、ユーザー認証によるマルチユーザー管理、完全オープンソースを特徴としています。本プロジェクトでは、AWS EC2上での完全自動デプロイを目指しています。

アーキテクチャ

デプロイされるアーキテクチャは以下の要素で構成されます:

  1. Ubuntu Serverを実行するEC2インスタンス
  2. LibreChatに必要なコンポーネントのインストールおよび設定を自動化するためのbashによるUser-Dataスクリプト
  3. LibreChatのデプロイに必要なAWSインフラストラクチャを定義およびプロビジョニングするためのTerraform
  4. LibreChatに必要なAPIキーを保存・取得し、デプロイの進行状況を追跡するためのAWS Systems Manager (SSM)

自動化とInfrastructure as Code

Terraform

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

User-Data

BashによるUser-Dataスクリプトは、EC2インスタンスの初回起動時に実行され、Docker、Docker Compose、Git、Node.jsやNPMなどのLibreChatに必要なコンポーネントのインストールと設定を自動化します。また、AWS Systems Manager (SSM)からOpenAI、MistralAI、Anthropic、Google API、Google CSE IDといった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キーの保存・取得を行い、デプロイの進行状況を追跡します。

また、スクリプトexport.shには、AWS 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パラメータに格納されており、いつでもどこからでも展開状況を確認することができます。

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での展開ステータスの更新により、展開の進行状況を追跡し、問題を迅速に検出することができます。

スポットインスタンスによるコスト削減

スポットインスタンスは、オンデマンドインスタンスに比べて低価格で未使用の容量を利用できるEC2インスタンスです。このプロジェクトでは、アプリケーションのホスティングコストを削減するためにスポットインスタンスを使用しています。User-Dataスクリプトはスポットインスタンスの設定に対応しており、アプリケーションのパフォーマンスを損なうことなく、コスト削減を実現します。

LibreChat の AWS EC2 での自動展開におけるexport.shの共通利用

AWS EC2上でLibreChatを自動展開するために、export.shという名前のシェルスクリプトが作成されており、展開およびインフラ管理に関連するさまざまなタスクの管理を容易にします。このスクリプトはローカル作業環境とGitLab CIパイプラインの両方で使用され、その関数を一貫して利用できます。

export.shスクリプトは、AWSインフラの展開と管理に役立ついくつかの機能をまとめています。その中には以下が含まれます:

  • 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_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を使用して設定管理とデプロイメントの進捗を追跡することで、AWS EC2インスタンス上にLibreChatをデプロイおよび構成する方法を探ります。スポットインスタンスを使用してコストを削減し、自己署名SSL証明書を使用してセキュリティを強化することにも重点を置いています。

このプロジェクトを使用することで、効率的、安全、かつ経済的にAWS EC2インスタンス上にLibreChatをデプロイおよび構成することができます。このプロジェクトは他のWebアプリケーションをAWS上にデプロイするために、同じ自動化の原則、インフラストラクチャのコードとしての原則、および集中管理の原則を使用して拡張および適応させることができます。

GitLabプロジェクトでさらなる探求

AWS EC2上にLibreChatをデプロイする詳細な情報や技術的な詳細、アーキテクチャおよび設定についての深い理解を得るには、GitLabのプロジェクトのREADMEを参照することを強くお勧めします。この文章ではプロジェクトの紹介、主要なコンセプト、およびこのデプロイメントの利点が紹介されていますが、プロジェクトのリンクの中で全ての詳細を見つけることができます。

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