📝

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 のエンドポイントを末尾のスラッシュも含めて入力します。

scripts/search.js
// 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