Amazon OpenSearch Service とは
Amazon OpenSearch Service とは? - Amazon OpenSearch Service
Amazon OpenSearch Service は、AWS クラウドにおける OpenSearch クラスターのデプロイ、オペレーション、スケーリングを容易にするマネージドサービスです。
オープンソースの OpenSearch をマネージドで提供している AWS のサービスです。
機能概要
- OpenSearch クラスターのリソースのプロビジョニング可能
- 障害が発生した OpenSearch Service ノードの自動置換が可能
- クラスターのスケーリングが可能
- 複数の AWS サービスと統合されている
- 保管時のデータの暗号化およびノード間の暗号化が可能
- IAM などと連携したアクセスコントロールが可能
ユースケース
Amazon OpenSearch Service AWS Black Belt Online Seminar
- 全文検索
- 自然言語
- 複雑な条件検索
- 関連検索
- 近似最近傍探索
- ストリーム処理
- 大量データの格納
- ニアリアルタイム処理
- 分散ストレージ
- 分析
- 時系列データの分析・可視化
- ドリルダウン分析
- データ集計・加工
- 異常検知・アラート通知
OpenSearch
OpenSearch とは? - オープンソース検索エンジンの説明 - AWS
- オープンソースの検索および分析ツール
- リアルタイムのアプリケーションモニタリング、ログ分析、ウェブサイト検索などで使用
- OpenSearch はデータストア、検索エンジン
- OpenSearch Dashboards は可視化、UI ツール
- セキュリティ、パフォーマンス分析、機械学習など様々なプラグインによる機能拡張が可能
- 様々なサードパーティ製品からの接続がサポートされている
OpenSearch と Amazon OpenSearch Service の比較
Amazon OpenSearch Service とは? - Amazon OpenSearch Service
詳細な比較については上記ドキュメントをご参照ください。
主な違いは以下の通りです。
- マネージドかどうか
- OpenSearch: 非マネージド
- Amazon OpenSearch Service: マネージド
- マルチクラウド戦略かどうか
- OpenSearch: マルチクラウド戦略
- Amazon OpenSearch Service: AWS に固有
- 新機能や拡張機能を自由に使用可能か
- OpenSearch: 使用可能
- Amazon OpenSearch Service: サポートバージョンなどに制限がある
主なコンポーネント
Amazon OpenSearch Service AWS Black Belt Online Seminar
- ドキュメント: JSON 形式で表現される単一のデータ
- 一般的なデータベースのレコードに相当
- 各フィールドは文字列型や数値型、Boolean 型など、特定の型を持つ
- インデックス: ドキュメントの格納先
- 一般的なデータベースのテーブルに相当
- シャード: インデックスの集合でありインデックスの実体
- 複数のデータノードに分散配置可能
- レプリカによるノード障害時のデータ欠損を防止、検索処理のスケールが可能
- ノード: クラスター内で機能する EC2 インスタンス
- 5 つの役割に分かれている
- 単一ノードで役割の兼任も可能
- ノードの種類はデータノード、専用マスターノード、UltraWarm ノード
- クラスター: ノードの集合
- ドメイン: クラスターおよびクラスターと連携する AWS サービスの総称
試してみた
チュートリアル: Amazon OpenSearch Service を用いて検索アプリケーションを作成する - Amazon OpenSearch Service
上記チュートリアルを参考に試してみました。
01. ドメインの作成
Amazon OpenSearch Service ドメインを作成する - Amazon OpenSearch Service
上記ドキュメントに沿って作成しました。
- ドメイン名: movies
- ドメイン作成方法: 標準作成
- テンプレート: 開発/テスト
- デプロイオプション: スタンバイありのドメイン
- バージョン: 最新バージョン
- ネットワーク: パブリックアクセス
- マスターユーザー: マスターユーザーを作成
上記以外はデフォルト設定で作成しました。







ドメイン作成後、ドメインアクセスポリシーを以下に変更しました。
- ドメインレベルのアクセスポリシーを設定
- アクセスポリシー: 以下の通り (アカウント ID はダミーです)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:ap-northeast-1:012345678901:domain/movies/*"
}
]
}
02. サンプルデータのインデックスを作成
CloudShell から以下のコマンドを実行します。
$ wget https://docs.aws.amazon.com/opensearch-service/latest/developerguide/samples/sample-movies.zip
$ echo "" >> sample-movies.bulk
$ unzip sample-movies.zip
# your-domain-endpoint は手順 01 で作成したドメインのエンドポイントに置換
# master-user は手順 01 で指定したマスターユーザー名に置換
# master-user-password は手順 01 で指定したパスワードに置換
$ curl -XPOST -u 'master-user:master-user-password' \
'your-domain-endpoint/_bulk' \
--data-binary @sample-movies.bulk \
-H 'Content-Type: application/x-ndjson'
03. Lambda 関数の作成
チュートリアル: Amazon OpenSearch Service を用いて検索アプリケーションを作成する - Amazon OpenSearch Service
以下の設定で作成しました。
- ランタイム: Python 3.14
- 実行ロール: AdministratorAccess 権限を付与したロール
関数作成後、CloudShell から以下のコマンドを実行します。
なお、region と host の値は環境にあわせて入力します。
$ cat > opensearch-lambda.py << 'EOF'
import boto3
import json
import requests
from requests_aws4auth import AWS4Auth
region = 'ap-northeast-1' # For example, us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'https://search-movies-ysytu5fnzwlb2n5xulswinqzti.ap-northeast-1.es.amazonaws.com' # The OpenSearch domain endpoint with https:// and without a trailing slash
index = 'movies'
url = host + '/' + index + '/_search'
# Lambda execution starts here
def lambda_handler(event, context):
# Put the user query into the query DSL for more accurate search results.
# Note that certain fields are boosted (^).
query = {
"size": 25,
"query": {
"multi_match": {
"query": event['queryStringParameters']['q'],
"fields": ["title^4", "plot^2", "actors", "directors"]
}
}
}
# Elasticsearch 6.x requires an explicit Content-Type header
headers = { "Content-Type": "application/json" }
# Make the signed HTTP request
r = requests.get(url, auth=awsauth, headers=headers, data=json.dumps(query))
# Create the response and add some extra content to support CORS
response = {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": '*'
},
"isBase64Encoded": False
}
# Add the search results to the response
response['body'] = r.text
return response
EOF
$ pip3 install --target ./package boto3
$ pip3 install --target ./package requests
$ pip3 install --target ./package requests_aws4auth
$ cd package
$ zip -r ../my-deployment-package.zip .
$ cd ..
$ zip my-deployment-package.zip opensearch-lambda.py
CloudShell の以下のパスから zip ファイルをダウンロードします。
- my-opensearch-function/my-deployment-package.zip
作成済みの Lambda 関数のコンソールから my-deployment-package.zip をアップロードします。

ハンドラー名を opensearch-lambda.lambda_handler に変更します。

04. API Gateway の作成
以下の設定で作成しました。
- API タイプ: REST
- API エンドポイントタイプ: リージョン
- メソッドタイプ: GET
- 統合タイプ: Lambda 関数
- Lambda プロキシ統合: オン
- Lambda 関数: 手順 03 で作成した Lambda 関数
- リクエストバリデーター: クエリ文字列パラメータ、およびヘッダーの検証
- URL クエリ文字列パラメータ: q (必須)
- ステージ名: opensearch-api-test


05. OpenSearch Dashboards でロールマッピングを設定
手順 01 で作成したドメインの OpenSearch ダッシュボード URL にアクセスします。

ウェルカム画面が表示された場合は Explore on my own をクリックします。

ホーム画面から Security のページにアクセスします。

Roles の all_access をクリックします。

Mapped users から Manage mapping をクリックします。

Backend roles に Lambda の実行ロール ARN を入力して Map をクリックします

05. 動作確認
Tutorial: Creating a search application with Amazon OpenSearch Service - Amazon OpenSearch Service
上記ドキュメントから sample-site.zip をダウンロードして解凍します。
scripts/search.js の apigatewayendpoint に手順 04 で作成した API のエンドポイントを末尾のスラッシュも含めて入力します。
// Update this variable to point to your domain.
var apigatewayendpoint = 'https://795sisqkz3.execute-api.ap-northeast-1.amazonaws.com/opensearch-api-test/';
index.html を開いて thor などの用語で検索し、結果が表示されれば成功です。


まとめ
今回は Amazon OpenSearch Service について紹介しました。
どなたかの参考になれば幸いです。
Discussion