
はじめに
2022年 にコロナ禍を経て3年ぶりにラスベガスで通常開催されたAWS re:Invent にて Amazon OpenSearch Serverless の発表がありました。
https://aws.amazon.com/jp/blogs/aws/preview-amazon-opensearch-serverless-run-search-and-analytics-workloads-without-managing-clusters/
これまでもAmazon OpenSearchのサービスはありましたが、ドメイン(クラスター) を管理する必要がありました。Amazon OpenSearch Serverlessが登場したことによりドメインを管理する必要がなくなりました。
2023年1月31日(火) に参加したAPN AWS Top Engineers限定のセキュリティワークショップでは、Amazon OpenSearchを使用して、AWSではお馴染みのAWS CloudTrailやVPC フローログ、Amazon GuardDuty等のセキュリティ系サービスのログの分析を行いました。
ワークショップでは提供された環境に既にデータが投入されていましたが、通常は環境を設定するために自分でデータの投入やデータベースへの連携等を行わなければなりません。
Amazon OpenSearch Serverlessはまだプレビュー版ですが、今回はデータ投入も含めて検証してみたいと思います。
https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/createupdatedomains.html

概要
今回はAWS re:Invent 2022にてアナウンスされたAmazon OpenSearch Serverlessを用いてログ分析パイプライン(コレクションの作成>データ投入>クエリの実行)を構築する方法を実施します。まだプレビュー版の機能とはなりますが、実際に触ってみて感じたことを記載したいと思います。
参考
https://aws.amazon.com/jp/blogs/news/log-analytics-the-easy-way-with-amazon-opensearch-serverless/
Amazon OpenSearchとは?
Amazon OpenSearchとはドキュメントやメッセージ、ログ等の様々なデータソースに対してDashboards Query Language(DQL)を使用することでデータの分析や可視化ができるサービスです。

コレクション作成
Amazon OpenSearch Serverlessではインデックスのグループを「コレクション」と表現しています。ServerlessではないAmazon OpenSearchでは「ドメイン」という表現をしていました。
Amazon OpenSearch Serviceコンソールに移動し[サーバレス – preview] > [コレクション] > [コレクションの作成] をクリックします。

コレクションの作成画面では[コレクション名]の欄に任意のコレクション名を入力します。

ネットワークアクセスの設定では[パブリック]にチェックを入れ、その他の設定はデフォルト値のまま、[作成]をクリックします。

下記は作成中の画面です。

作成が完了するとステータスが「アクティブ」になります。

【ここからはAmazon Web Servicesの公式サイトにも載っていない手順です】
この手順を実施しないとAmazon OpenSearch Serverlessに対してサンプルデータを投入する際に権限不足のエラーが発生します。
画面をスクロールしてData accessの設定に移動し、[データアクセスを管理]をクリックします。

最初はアクセスポリシーが存在しないので[アクセスポリシーを作成]をクリックします。

Definition methodの設定で[アクセスポリシー名]を入力します。
ポリシーの定義方法は[ビジュアルエディタ]を選択します。(デフォルト設定)

ルール1で[ルール名]を入力します。

プリンシパルを選択では[IAMユーザーとロール]を選択します。

今回利用するIAMユーザー名を選択して[保存]をクリックします。

リソースと許可を付与の[付与]をクリックします。

以下のチェックボックスにチェックを入れて[保存]をクリックします。

設定が反映されていることを確認して[作成]をクリックします。

作成ができたらポリシーが適用されていることを確認します。

データ取り込みパイプラインの構築
Amazon OpenSearch Serverlessに対して logstash-oss-with-opensearch-output-plugin プラグインを使用してデータを送信します。
以下のURLより logstash-oss-with-opensearch-output-plugin をダウンロードします。
https://opensearch.org/artifacts#
※この例ではLinux 64bit版を使用しています。
$ wget https://artifacts.opensearch.org/logstash/logstash-oss-with-opensearch-output-plugin-8.4.0-linux-x64.tar.gz
ダウンロードしたファイルを展開し、logstash-output-opensearchプラグインを最新バージョンに更新します。
$ tar -zxvf logstash-oss-with-opensearch-output-plugin-8.4.0-linux-x64.tar.gz
$ cd logstash-8.4.0
$ ./bin/logstash-plugin update logstash-output-opensearch
Amazon OpenSearch Serverlessに投入するサンプルデータを用意します。
sample.logというファイル名で作成します。
$ vi sample.log
サンプルデータの中身
{"deviceId":2823605996,"fleetRegNo":"IRV82MBYQ1","oilLevel":0.92,"milesTravelled":1.105,"totalFuelUsed":0.01,"carrier":"AOS Van Lines","temperature":14,"tripId":6741375582,"originODC":"ODC Las Vegas","originCountry":"United States","originCity":"Las Vegas","originState":"Nevada","originGeo":"36.16,-115.13","destinationODC":"ODC San Jose","destinationCountry":"United States","destinationCity":"San Jose","destinationState":"California","destinationGeo":"37.33,-121.89","speedInMiles":18,"distanceMiles":382.81,"milesToDestination":381.705,"@timestamp":"2022-11-17T17:11:25.855Z","traffic":"heavy","weather_category":"Cloudy","weather":"Cloudy"} {"deviceId":2823605996,"fleetRegNo":"IRV82MBYQ1","oilLevel":0.92,"milesTravelled":1.105,"totalFuelUsed":0.01,"carrier":"AOS Van Lines","temperature":14,"tripId":6741375582,"originODC":"ODC Las Vegas","originCountry":"United States","originCity":"Las Vegas","originState":"Nevada","originGeo":"36.16,-115.13","destinationODC":"ODC San Jose","destinationCountry":"United States","destinationCity":"San Jose","destinationState":"California","destinationGeo":"37.33,-121.89","speedInMiles":18,"distanceMiles":382.81,"milesToDestination":381.705,"@timestamp":"2022-11-17T17:11:26.155Z","traffic":"heavy","weather_category":"Cloudy","weather":"Heavy Fog"} {"deviceId":2823605996,"fleetRegNo":"IRV82MBYQ1","oilLevel":0.92,"milesTravelled":1.105,"totalFuelUsed":0.01,"carrier":"AOS Van Lines","temperature":14,"tripId":6741375582,"originODC":"ODC Las Vegas","originCountry":"United States","originCity":"Las Vegas","originState":"Nevada","originGeo":"36.16,-115.13","destinationODC":"ODC San Jose","destinationCountry":"United States","destinationCity":"San Jose","destinationState":"California","destinationGeo":"37.33,-121.89","speedInMiles":18,"distanceMiles":382.81,"milesToDestination":381.705,"@timestamp":"2022-11-17T17:11:26.255Z","traffic":"heavy","weather_category":"Cloudy","weather":"Cloudy"} {"deviceId":2823605996,"fleetRegNo":"IRV82MBYQ1","oilLevel":0.92,"milesTravelled":1.105,"totalFuelUsed":0.01,"carrier":"AOS Van Lines","temperature":14,"tripId":6741375582,"originODC":"ODC Las Vegas","originCountry":"United States","originCity":"Las Vegas","originState":"Nevada","originGeo":"36.16,-115.13","destinationODC":"ODC San Jose","destinationCountry":"United States","destinationCity":"San Jose","destinationState":"California","destinationGeo":"37.33,-121.89","speedInMiles":18,"distanceMiles":382.81,"milesToDestination":381.705,"@timestamp":"2022-11-17T17:11:26.556Z","traffic":"heavy","weather_category":"Cloudy","weather":"Heavy Fog"} {"deviceId":2823605996,"fleetRegNo":"IRV82MBYQ1","oilLevel":0.92,"milesTravelled":1.105,"totalFuelUsed":0.01,"carrier":"AOS Van Lines","temperature":14,"tripId":6741375582,"originODC":"ODC Las Vegas","originCountry":"United States","originCity":"Las Vegas","originState":"Nevada","originGeo":"36.16,-115.13","destinationODC":"ODC San Jose","destinationCountry":"United States","destinationCity":"San Jose","destinationState":"California","destinationGeo":"37.33,-121.89","speedInMiles":18,"distanceMiles":382.81,"milesToDestination":381.705,"@timestamp":"2022-11-17T17:11:26.756Z","traffic":"heavy","weather_category":"Cloudy","weather":"Cloudy"}
Amazon OpenSearch Serverlessにデータを投入するためのconfig(設定ファイル)を作成します。
名前は logstash-output-opensearch.conf として保存します。
赤字部分を自分の環境に合わせて書き換えます。
$ vi logstash-output-opensearch.conf
configファイルの中身
input {
file {
path => "<sample.logのファイルパス>"
start_position => "beginning"
}
}
output {
opensearch {
ecs_compatibility => disabled
index => "logstash-sample"
hosts => "<OpenSearchエンドポイントのURL:443>"
auth_type => {
type => 'aws_iam'
aws_access_key_id => '<AWS_ACCESS_KEY_ID>'
aws_secret_access_key => '<AWS_SECRET_ACCESS_KEY>'
region => '<利用するAWSリージョン>'
service_name => 'aoss'
}
legacy_template => false
default_server_major_version => 2
}
}
以下のコマンドを実行してLogstashを起動します。
$ ./bin/logstash -f logstash-output-opensearch.conf
Amazon OpenSearchのダッシュボードから、以下のクエリを実行して検索できるかを確認します。
コレクションの一覧からOpenSearch DashboardsのURLをクリックします。

Amazon OpenSearchのダッシュボードが表示されますので、アクセスキーとシークレットキーを入力してログインします。

ログインしたら左上の[≡(ハンバーガーアイコン)]をクリックして[Dev Tools]に移動します。

以下のクエリを入力して実行します。
GET logstash-sample/_search
{
"query": {
"match_all": {}
},
"track_total_hits" : true
}
再生マーク[▷]をクリックするとクエリが実行されます。

クエリ結果が「200-OK」となったことが分かります。

まとめ
今回はAWS re:Invent 2022で新しく発表された Amazon OpenSearch Serverlessに対してコレクションの作成からサンプルデータの投入、投入したデータに対してのクエリまでを実施してみました。サーバレスということもあり、事前準備が必要なインスタンスタイプの設定やインスタンス数、ストレージの確保等を気にすることなく気軽に利用できる点がいいと思いました!
次回はプログラミング言語を使用して分析してみたいと思います。
関連ブログ
【速報:AWS re:Invent現地レポート】Analytics関連サービス
富士ソフトのAWS関連サービスについて、詳しくはこちら
アマゾンウェブサービス(AWS)