アプリのロギングスクリプトのサンプル with Opensearch
Studio上で動作するアプリケーションのログを収集する仕組みとして、OpenSearchとOpenSearch Dashboardsのセットをデプロイするサンプルです。
また、このログ収集サーバに対して、ログを送信するサンプルのアプリ(Python)も付属しています。
OpensearchのスナップショットをAmazon S3へバックアップし、リストアすることも可能です(Amazon S3のアクセスキーが必要)。
紹介動画
概要
想定ユーザー
- ロギングを実装したいユーザー。
- PythonアプリケーションのログをOpenSearchに保存したいユーザー。
- OpenSearchに保存したログをOpenSearchダッシュボードで確認したいユーザー。
テンプレート動作
- 入力
- シークレット (スナップショットをAmazon S3に保存する場合に設定する)
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN(任意。一時的な認証情報を使用する場合に設定する。)
- Injection機能による初期設定
DashboardのSideAppにInjectionファイル/usr/share/opensearch-dashboards/config/opensearch_dashboards.ymlのserver.basePathの{namespace-id}をCanvasのネームスペースIDに置き換える。
- ログの保存
appワークスペースのDummy log generation appSideAppのInjectionファイル/app/src/app.pyに、ログを送信するためのコードが記載されている。本アセット単体で動作確認する場合は変更不要。
- シークレット (スナップショットをAmazon S3に保存する場合に設定する)
- Output
- 保存されたログをOpenSearchダッシュボードから確認できる。
- Function
- PythonアプリケーションのログをOpenSearchに保存する。
- OpenSearchダッシュボードでログを表示する。
利用方法
単体での動作確認
- スナップショットをAmazon S3に保存する場合、Canvasでシークレットとして下記を設定する。
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN(任意。一時的な認証情報を使用する場合に設定する。)
- Canvasで
DashboardのSideAppにInjectionファイル/usr/share/opensearch-dashboards/config/opensearch_dashboards.ymlのserver.basePathの{namespace-id}をCanvasのネームスペースIDに置き換える。

- デプロイボタンを押し、デプロイの完了を待つ。完了すると、
appワークスペースのDummy log generation appSideAppが、30秒おきにログを出力する。 DashboardのSideAppに接続されたEndpointのURL (https://studio.{env-id}.studio.exabase.ai/{namespace-id}/log/dashboard/) から、OpenSearchダッシュボードにアクセスする。- OpenSearchダッシュボードのメニューから "Discover" を開き、 "Create index pattern" から
python-logs-*というインデックスパターンを作成する。Time fieldとしては、基本的には@timestampを用いる。 - 再度OpenSearchダッシュボードのメニューの "Discover" を開くと、ログを確認できる。
- スナップショットをAmazon S3に保存する場合は、OpenSearchダッシュボードから以下の設定を行う。
- メニューの "Snapshot Management" -> "Repositories" を開き、 "Create repository" から、下記のように入力してスナップショットリポジトリを登録する。
- Repository name:
{任意の名称} - Repository type:
Custom configuration - Custom configuration:
{
"type": "s3",
"settings": {
"bucket": "{bucket_name}",
"base_path": "{bucket_base_path}"
}
}
- Repository name:
- 自動的なスナップショット保存の設定をするために、 "Snapshot Management" -> "Snapshot policies" を開き、 "Create policy" から、表示されるフォームに入力する。
- メニューの "Snapshot Management" -> "Repositories" を開き、 "Create repository" から、下記のように入力してスナップショットリポジトリを登録する。
- スナップショットからログをリストアする場合、OpenSearchダッシュボードから以下のように操作する。
- "Snapshot Management" -> "Repositories" を開き、スナップショット設定時に設定したリポジトリがなければ、設定時と同様にス ナップショットリポジトリを登録する。
- "Snapshot Management" -> "Snapshots" を開くと、保存していたスナップショットが表示される。リストアしたいスナップショットのチェックボックスをチェックし、 "Restore" を押す。表示に従ってリストアの設定を行い、 "Restore snapshot" を押す。
- メニューから "Discover" を開き、インデックスパターンがなければ、リストアしたログのインデックスにマッチするインデックスパターンを "Index pattern name" に入力し、インデックスパターンを作成する。
- 再度メニューの "Discover" を開くと、リストアしたログを確認できる。
他のアセットとの連携
-
本アセットは、PythonアプリケーションのログをOpenSearchとOpenSearch Dashboardsにより扱うための機能を、Studioで構築するアプリケーションに導入するために活用されることを想定されています。
-
方法は以下の通りです。
-
ロギング関連機能を導入したいCanvasに本アセットの
logワークスペースと同様のものを配置する。 -
アプリケーションのコードのログを取りたい箇所に、ロギングのコードを記述する。例えば、下記のように記述する。
import os
import logging
from opensearch_logger import OpenSearchHandler
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)
openSearchHandler = OpenSearchHandler(
index_name="python-logs",
hosts=[f"{os.environ['LOG_ADDRESS']}:{os.environ['LOG_PORT']}"],
use_ssl=False,
raise_on_index_exc=True,
)
logger.addHandler(openSearchHandler)
logger.info("log message")なお、 opensearch-logger を、
pip install opensearch-logger等により使用できるようにする必要がある。また、 上記コード中の
LOG_ADDRESSとLOG_PORTを、該当のSideApp等でEnvironment variablesとして設定する必要がある。それぞれの内容は下記。LOG_ADDRESS:{OpenSearch SideAppが存在するワークスペース名}-{OpenSearch SideAppのID}。logワークスペースの内容を変更していない場合は、値をlog-opensearchとする。LOG_PORT: OpenSearchのSideAppで該当プロセスが待ち受けているポート。logワークスペースの内容を変更していない場合は、値 を8080とする。
その他、必要に応じて
appワークスペースのDummy log generation appSideAppに設定されたEnvironment variablesとInjectionされた/app/src/app.pyを参考にする。 -
デプロイ後、 単体での動作確認 と同様に、OpenSearchダッシュボードからインデックスパターンやスナップショットの設定を行う。
-
再度OpenSearchダッシュボードのメニューのDiscoverを開くと、ログを確認できる。
-
関連情報
- OpenSearch
- OpenSearchは、ログ分析などの機能を有する検索エンジンです。
- OpenSearchにログを送信するPythonスクリプト中では、 opensearch-logger を使用しています。
- opensearch.org
- OpenSearch GitHub リポジトリ
- OpenSearch-Dashboards GitHub リポジトリ