Amazon Web Services ブログ

Logstash を使用したAmazon OpenSearch Serverless へのインデックスの移行

この記事は、 Migrate your indexes to Amazon OpenSearch Serverless with Logstash を翻訳したものです。

先日、Amazon OpenSearch Service の新しいオプションである Amazon OpenSearch Serverless の一般提供を発表しました。これにより、OpenSearch クラスターを設定、管理、またはスケーリングを意識することなく、大規模な検索および分析ワークロードを簡単に実行できます。OpenSearch Serverless を使用すると、OpenSearch Service と同じミリ秒単位のインタラクティブな応答時間と、サーバーレス環境のシンプルさを実現できます。

この投稿では、Logstash を使用して既存のインデックスを OpenSearch Service マネージドクラスタードメインからサーバーレスコレクションに移行する方法を紹介します。

OpenSearch Service ドメインを使用すると、専用の安全なクラスターを数分で設定し、ワークロードに合わせて最適化できます。クラスター内のコンピューティング、メモリ、ストレージリソースの構成を完全に制御して、アプリケーションのコストとパフォーマンスを最適化できます。OpenSearch Serverless を使用すると、クラスターについて考える必要なく、検索と分析のワークロードをより簡単に実行できます。コレクションとインデックスのグループを作成するだけで、データの取り込みとクエリを開始できます。

ソリューションの概要

Logstash は、データの ETL 処理を提供するオープンソースソフトウェアです。Logstash は、入力プラグインと出力プラグインを介してソースとデスティネーションに接続するように設定できます。中間にデータを変換するためのフィルターを設定します。この記事では、OpenSearch Service のドメイン (入力) を OpenSearch Serverless コレクション (出力) に接続するように Logstash をセットアップするために必要な手順を説明します。

ソースプラグインとデスティネーションプラグインは Logstash の設定ファイルで設定します。設定ファイルには、InputFilterOutput のセクションがあります。設定が完了すると、Logstash は OpenSearch Serviceドメインにリクエストを送信し、input セクションに入力したクエリに従ってデータを読み取ります。OpenSearch Service からデータが読み込まれると、オプションで次のステージの Filter に送信して、入力データへのフィールドの追加や削除、異なる値でのフィールドの更新などの変換を行うことができます。今回の手順の例では、Filter プラグインは使用しません。Input プラグインの次は Output プラグインです。オープンソース版の Logstash (Logstash OSS) では、bulk API を使用してデータをコレクションにアップロードする便利な方法が提供されています。OpenSearch Serverless は logstash-output-opensearch output プラグインをサポートしています。このプラグインは、AWS Identity and Access Management (IAM) を使用したデータアクセスコントロールをサポートします。

次の図は、本ソリューションのワークフローを示しています。

事前準備

始める前に、次の前提条件を満たしていることを確認してください。

  1. OpenSearch Service ドメインの ARN、ユーザー名、パスワードを書き留めておきます。
  2. OpenSearch Serverless コレクションを作成します。OpenSearch Serverless が初めての場合は、コレクションの設定方法の詳細について、Amazon OpenSearch Serverless による手軽なログ分析を参照してください。

Logstash とOpenSearch 用の入出力プラグインのセットアップ

以下の手順を実行して Logstash とプラグインをセットアップします。

  1. logstash-oss-with-opensearch-output-plugin をダウンロードしてください。(この例では macos-x64 用のディストリビューションを使用しています。他のディストリビューションについては、アーティファクト を参照してください。
    wget https://artifacts.opensearch.org/logstash/logstash-oss-with-opensearch-output-plugin-8.4.0-macos-x64.tar.gz
  2. ダウンロードした tar ファイル を解凍します。
    tar -zxvf logstash-oss-with-opensearch-output-plugin-8.4.0-macos-x64.tar.gz
    cd logstash-8.4.0/
  3. logstash-output-opensearch プラグインを最新バージョンに更新してください。
    <path/to/your/logstash/root/directory>/bin/logstash-plugin update logstash-output-opensearch
  4. logstash-input-opensearch プラグインをインストールします。
    <path/to/your/logstash/root/directory>/bin/logstash-plugin install logstash-input-opensearch

プラグインのテスト

それでは、実際にプラグインがどのように機能するのか見てみましょう。以下の設定ファイルでは、OpenSearch Service ドメインの movies インデックスからデータを取得し、OpenSearch Serverless コレクション内に取りこんだそのデータを movies という同じインデックス名でインデックス化します。

新しいファイルを作成して次のコンテンツを追加し、そのファイルを opensearch-serverless-migration.conf という名前で保存します。input セクションの HOSTUSERNAMEPASSWORD に OpenSearch Service ドメインエンドポイントの値を、output セクションの HOST に OpenSearch Serverless コレクションエンドポイントの情報を、REGIONAWS_ACCESS_KEY_ID、および AWS_SECRET_ACCESS_ACCESS_KEY とともに入力します。

input {
    opensearch {
        hosts =>  ["https://<HOST>:443"]
        user  =>  "<USERNAME>"
        password  =>  "<PASSWORD>"
        index =>  "movies"
        query =>  '{ "query": { "match_all": {}} }'
    }
}
output {
    opensearch {
        ecs_compatibility => disabled
        index => "movies"
        hosts => "<HOST>:443"
        auth_type => {
            type => 'aws_iam'
            aws_access_key_id => '<AWS_ACCESS_KEY_ID>'
            aws_secret_access_key => '<AWS_SECRET_ACCESS_ACCESS_KEY>'
            region => '<REGION>'
            service_name => 'aoss'
            }
        legacy_template => false
        default_server_major_version => 2
    }
}

前述の config ファイルの input セクションでクエリを指定できます。match_all クエリは、movies インデックスのすべてのデータを照合します。データのサブセットを選択したい場合は、クエリを変更できます。クエリを使用して、異なるデータスライスを指定し複数の Logstash のプロセスを実行することで、データ転送を並列化することもできます。また、複数のインデックスがある場合は、Logstash プロセスを複数のインデックスに対して実行して並列化することもできます。

Logstash を起動する

以下のコマンドを使用して Logstash を起動します。

 <path/to/your/logstash/root/directory>/bin/logstash -f <path/to/your/config/file> 

コマンドを実行すると、Logstash はOpenSearch Service ドメインのソースインデックスからデータを取得し、OpenSearch Serverless コレクションのデスティネーションのインデックスに書き込みます。データ転送が完了すると、以下のログが示すように Logstash はシャットダウンします。


[2023-01-24T20:14:28,965][INFO][logstash.agent] Successfully
started Logstash API endpoint {:port=>9600, :ssl_enabled=>false}
…
…
[2023-01-24T20:14:38,852][INFO][logstash.javapipeline][main] Pipeline terminated {"pipeline.id"=>"main"}
[2023-01-24T20:14:39,374][INFO][logstash.pipelinesregistry] Removed pipeline from registry successfully {:pipeline_id=>:main}
[2023-01-24T20:14:39,399][INFO][logstash.runner] Logstash shut down.

OpenSearch Serverless でデータを検証する

Logstash がすべてのデータをコピーしたかどうかは、ドメインとコレクション内のドキュメント数を比較することで確認できます。Opensearch Dashboard の Dev tools タブから、または curlpostman、もしくは同様の HTTP クライアントを使用して、次のクエリを実行します。次のクエリは、movies インデックスからすべてのドキュメントを検索し、上位のドキュメントとカウントを返します。デフォルトでは、OpenSearch は最大で 10,000 件までのドキュメント数を返します。track_total_hits フラグを追加すると、ドキュメント数が 10,000 を超える場合でも正確なドキュメント数を取得できます。

GET movies/_search
{
  "query": {
    "match_all": {}
  },
  "track_total_hits" : true
}

結論

この投稿では、Logstash の OpenSearch input・output プラグインを使用して、OpenSearch ServiceドメインからOpenSearch Serverless コレクションにデータを移行しました。

OpenSearch Serverless を使用して効果的なログ分析および検索ソリューションを構築するために利用可能なさまざまなオプションに焦点を当てた一連の投稿にご期待ください。また、Amazon OpenSearch Serverless 入門ワークショップを参照して OpenSearch Serverless について詳しく知ることもできます。

この投稿について質問がある場合は、Amazon OpenSearch Service フォーラムで新しいスレッドを開始するか、AWS サポートにお問い合わせください。

翻訳は Solutions Architect 深見が担当しました。

TAGS: Amazon OpenSearch Service, Analytics