【AWSサービス 基礎編】Amazon OpenSearch Service で全文検索とログ分析を体験する

目次

概要

Amazon OpenSearch Service は、ログ分析、全文検索、アプリケーションモニタリングなどに活用できるマネージドサービスです。オープンソースの OpenSearch(Elasticsearch の派生プロジェクト)をベースとしており、大量のデータをリアルタイムに検索・分析できます。

アプリケーションのログを収集して障害調査に活用したり、Web サイトの検索機能を実装したり、セキュリティイベントの分析基盤として使用するなど、幅広いユースケースに対応しています。

本記事では、OpenSearch Service のドメイン(クラスター)を作成し、サンプルデータをインデックスに投入して、OpenSearch Dashboards から検索・可視化を体験します。

この記事のメリット

  • Amazon OpenSearch Service の基本的な仕組みとユースケースを理解できる
  • ドメイン(クラスター)の作成手順を習得できる
  • OpenSearch Dashboards を使ったデータの検索と可視化を体験できる
  • インデックス、ドキュメント、シャードといった基本概念を把握できる

キャラクター紹介

クラウド資格実践ラボの基礎学習記事では、ルクシーちゃんと代表の土肥が対話形式で AWS 認定試験で必要な知識をハンズオンとともに解説していくブログです。これからこのブログを案内する2人を紹介します。

ルクシーちゃん

クラウド資格に挑戦中の好奇心旺盛なナビゲーター。初学者目線で「これってなんだろう?」と素朴な疑問を投げかけ、知識を引き出していく役どころ。難しい内容も、ルクシーちゃんと一緒なら一歩ずつ理解できると思います!

土肥(とひ)

株式会社Luxyの代表であり同社の元エンジニア。これまでオンプレとAWS環境のインフラを担当。AWS認定資格の学習で得た知識をハンズオンとともに解説するのが得意。直近では新人の教育なども行っており、これから技術を学ぼうという方が納得できるように解説できることに喜びを感じているとのこと。

技術解説

Amazon OpenSearch Service とは

Luxyちゃん

とひさん、今回は Amazon OpenSearch Service を学ぶんですよね。名前に「検索」って入ってますけど、どういうサービスなんですか?

土肥

Amazon OpenSearch Service は、OpenSearch クラスターのデプロイ、運用、スケーリングを簡素化するマネージドサービスだよ。パッチ適用やバックアップ、モニタリングなんかの面倒な運用タスクは AWS がやってくれるんだ。

Luxyちゃん

OpenSearch というのは何なんですか?

土肥

OpenSearch は、全文検索エンジンと分析エンジンを組み合わせたオープンソースのソフトウェアだよ。JSON 形式のドキュメントを格納して、高速に検索・集計できるんだ。Elasticsearch の派生プロジェクトと言えばピンとくる人もいるかもね。

Luxyちゃん

なるほど、検索だけじゃなくて分析もできるんですね!

主な特徴

Luxyちゃん

OpenSearch Service にはどんな特徴がありますか?

土肥

大きく5つの特徴があるよ。まとめるとこんな感じだね。

  • マネージドサービス: クラスターの構築・運用・スケーリングを AWS が管理
  • OpenSearch Dashboards: ブラウザベースの可視化ツールが標準搭載
  • スケーラビリティ: データノードの追加やインスタンスタイプの変更でスケールアウト・スケールアップが可能
  • セキュリティ: VPC 内へのデプロイ、きめ細かいアクセス制御、保存時・転送時の暗号化に対応
  • 他の AWS サービスとの統合: Kinesis Data Firehose、Lambda、CloudWatch Logs などからデータを取り込み可能
Luxyちゃん

Dashboards が標準搭載されているのは便利そうですね。Kinesis や Lambda からもデータを取り込めるんですか?

土肥

そうなんだ。例えばアプリケーションのログを Kinesis Data Firehose 経由でリアルタイムに OpenSearch に流し込んで、Dashboards でグラフにするなんてことが簡単にできるよ。

Luxyちゃん

ログ分析の基盤としてすぐ使えるのはいいですね!

基本的な構成要素

Luxyちゃん

OpenSearch Service を使ううえで知っておくべき用語はありますか?

土肥

いくつかの基本的な構成要素を押さえておくといいよ。リレーショナルデータベースと比較するとイメージしやすいんだ。

要素説明
ドメインOpenSearch クラスターの単位。1 つ以上のデータノードで構成される
インデックスドキュメントの集合。リレーショナルデータベースの「テーブル」に相当
ドキュメントJSON 形式のデータ単位。リレーショナルデータベースの「行」に相当
シャードインデックスを分割した単位。データの分散格納と並列処理に使用
OpenSearch Dashboardsデータの検索・可視化を行う Web UI
Luxyちゃん

インデックスがテーブルで、ドキュメントが行ということは、データベースに近い感覚で使えるんですね。シャードというのは何のためにあるんですか?

土肥

いい質問だね。シャードはインデックスを分割したもので、データを複数のノードに分散させて格納するための仕組みだよ。分散させることで並列処理ができるから、大量のデータでも高速に検索できるんだ。

Luxyちゃん

データが増えても速度が落ちにくい仕組みになっているんですね!

インデックス・ドキュメント・シャードの関係図

アクセスポリシーの種類

Luxyちゃん

OpenSearch Service のセキュリティはどうなっていますか?誰でもアクセスできちゃったら困りますよね。

土肥

もちろんアクセス制御の仕組みがしっかりあるよ。主に4つの方法があるんだ。

方式説明
きめ細かいアクセス制御OpenSearch 内部のユーザー・ロールでインデックスレベルの制御が可能
IAM ベースのアクセスポリシーIAM ユーザー・ロールの ARN でアクセスを制御
IP ベースのアクセスポリシー送信元 IP アドレスでアクセスを制御
VPC 内デプロイVPC のセキュリティグループでネットワークレベルのアクセスを制御
Luxyちゃん

4つもあるんですね。どれを使えばいいんですか?

土肥

ユースケースによるけど、「きめ細かいアクセス制御」が一番柔軟だよ。OpenSearch 内部でユーザーやロールを作って、インデックス単位でアクセスを制御できるんだ。今回のハンズオンでもこの方式を使うよ。

Luxyちゃん

分かりました。インデックス単位で制御できるのは細かくて安心ですね!

実践

前提条件

  • リージョン: ap-northeast-1(東京)
  • OpenSearch Service を操作できる IAM 権限があること

作成するリソース一覧

リソース種別リソース名用途
OpenSearch Service ドメインhandson-domainサンプルデータの格納・検索用クラスター

ステップ1: OpenSearch Service ドメインの作成

  • AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します
  • 上部の検索バーに OpenSearch と入力し、表示された「Amazon OpenSearch Service」を選択します
  • 「ドメインの作成」をクリックします
  • 以下の設定を入力します

ドメイン名とエンジンの設定

  • ドメイン名: handson-domain
  • ドメイン作成方法: 「標準作成」を選択
  • デプロイオプション:「Domain without standby」を選択
  • アベイラビリティゾーン:「1-AZ」を選択
  • バージョン: 最新のバージョンを選択
ドメイン作成画面(ドメイン名、テンプレート、エンジンバージョンの設定)

データノードの設定

  • インスタンスファミリー:汎用
  • インスタンスタイプ: t3.small.search
  • ノードの数: 1
  • ストレージタイプ: EBS(汎用 SSD - gp3)
  • ノードあたりの EBS ストレージサイズ: 10 GiB
データノードの設定画面(インスタンスタイプ、ノード数、ストレージの設定)

ネットワーク設定

  • ネットワーク: 「パブリックアクセス」を選択

きめ細かいアクセス制御の設定

  • きめ細かいアクセス制御: 「有効」にチェック
  • マスターユーザーの作成: 「マスターユーザーの作成」を選択
  • マスターユーザー名: admin
  • マスターパスワード: 任意のパスワード(大文字・小文字・数字・記号を含む8文字以上)
きめ細かいアクセス制御の設定画面(マスターユーザー名とパスワードの入力)

アクセスポリシーの設定

  • ドメインアクセスポリシー: 「きめ細かいアクセス制御のみを使用」を選択
  • その他の項目はデフォルトのままにします
  • 「作成」をクリックします

ドメインの作成には 15〜20 分程度かかります。ステータスが「アクティブ」になるまで待ちます。

ドメイン一覧画面でステータスが「アクティブ」になった状態

ステップ2: OpenSearch Dashboards にアクセスする

  • ドメイン一覧から handson-domain をクリックします
  • 「一般的な情報」セクションの「OpenSearch Dashboards URL」に表示されたリンクをクリックします
  • ログイン画面が表示されたら、ステップ1 で設定したマスターユーザー名とパスワードを入力してログインします
  • 初回アクセス時にテナントの選択画面が表示された場合は、「Global」を選択して「Confirm」をクリックします
OpenSearch Dashboards のログイン後のホーム画面

ステップ3: サンプルデータを投入する

OpenSearch Dashboards の Dev Tools を使ってサンプルデータを投入します。

  • 左側ナビゲーションのメニューアイコンをクリックし、「Management」セクションの「Dev Tools」を選択します
  • コンソールに以下のリクエストを入力し、三角の実行ボタンをクリックします
POST _bulk
{"index": {"_index": "web-logs", "_id": "1"}}
{"timestamp": "2024-01-15T10:30:00", "method": "GET", "path": "/index.html", "status": 200, "response_time_ms": 45, "client_ip": "192.168.1.10"}
{"index": {"_index": "web-logs", "_id": "2"}}
{"timestamp": "2024-01-15T10:31:00", "method": "POST", "path": "/api/login", "status": 200, "response_time_ms": 120, "client_ip": "192.168.1.20"}
{"index": {"_index": "web-logs", "_id": "3"}}
{"timestamp": "2024-01-15T10:32:00", "method": "GET", "path": "/api/users", "status": 403, "response_time_ms": 15, "client_ip": "10.0.0.5"}
{"index": {"_index": "web-logs", "_id": "4"}}
{"timestamp": "2024-01-15T10:33:00", "method": "GET", "path": "/images/logo.png", "status": 200, "response_time_ms": 8, "client_ip": "192.168.1.10"}
{"index": {"_index": "web-logs", "_id": "5"}}
{"timestamp": "2024-01-15T10:35:00", "method": "POST", "path": "/api/orders", "status": 500, "response_time_ms": 3500, "client_ip": "192.168.1.30"}
{"index": {"_index": "web-logs", "_id": "6"}}
{"timestamp": "2024-01-15T10:36:00", "method": "GET", "path": "/products", "status": 200, "response_time_ms": 85, "client_ip": "192.168.1.40"}
{"index": {"_index": "web-logs", "_id": "7"}}
{"timestamp": "2024-01-15T10:37:00", "method": "DELETE", "path": "/api/sessions", "status": 401, "response_time_ms": 10, "client_ip": "10.0.0.8"}
{"index": {"_index": "web-logs", "_id": "8"}}
{"timestamp": "2024-01-15T10:38:00", "method": "GET", "path": "/api/products/123", "status": 200, "response_time_ms": 65, "client_ip": "192.168.1.50"}

_bulk API を使うと、複数のドキュメントを一括で投入できます。

  • 右側の結果パネルに各ドキュメントの投入結果が表示されます。"errors": false となっていれば成功です
Dev Tools でバルクインサートを実行した結果(errors: false が表示されている状態)

ステップ4: データを検索する

投入したデータに対して検索クエリを実行します。

全件取得

  • Dev Tools のコンソールに以下を入力し、実行します
GET web-logs/_search
{
  "query": {
    "match_all": {}
  }
}
  • 投入した全ドキュメントが返されることを確認します

条件検索: ステータスコード 200 のリクエスト

GET web-logs/_search
{
  "query": {
    "term": {
      "status": 200
    }
  }
}

全文検索: パスに「api」を含むリクエスト

GET web-logs/_search
{
  "query": {
    "match": {
      "path": "api"
    }
  }
}
条件検索クエリの実行結果(ステータスコード 200 のドキュメントが返されている状態)

集計: HTTP メソッド別のリクエスト数

GET web-logs/_search
{
  "size": 0,
  "aggs": {
    "methods": {
      "terms": {
        "field": "method.keyword"
      }
    }
  }
}
  • aggregations セクションに HTTP メソッド別のリクエスト件数が表示されます
集計クエリの実行結果(HTTP メソッド別のリクエスト数が表示されている状態)

ステップ5: インデックスパターンを作成する

Dashboards でデータを可視化するために、インデックスパターンを作成します。

  • 左側ナビゲーションのメニューアイコンをクリックし、「Management」セクションの「Dashboard Management」を選択します
  • 左側メニューの「Index patterns」を選択します
  • 「Create index」をクリックします
  • Index pattern name に web-logs* と入力します
  • 「Next step」をクリックします
  • Time field で timestamp を選択します
  • 「Create index pattern」をクリックします
インデックスパターンの作成完了画面(フィールド一覧が表示されている状態)

ステップ6: Discover でデータを確認する

  • 左側ナビゲーションのメニューアイコンをクリックし、「OpenSearch Dashboards」セクションの「Discover」を選択します
  • 左上のインデックスパターンが web-logs* になっていることを確認します
  • 右上の時間範囲を適切に設定します(サンプルデータの日付 2024-01-15 が含まれるように「Last 5 years」などに変更します)
  • ドキュメントの一覧が表示されます
Discover 画面でサンプルデータが表示されている状態

まとめ

  • Amazon OpenSearch Service は、全文検索・ログ分析・可視化に対応したマネージドサービスです
  • ドメイン(クラスター)を作成することで、データノード・OpenSearch Dashboards がセットアップされます
  • _bulk API を使って複数のドキュメントを一括投入できます
  • match(全文検索)、term(完全一致)、aggs(集計)など、多様なクエリで柔軟にデータを分析できます
  • OpenSearch Dashboards の Discover 画面でデータの検索・フィルタリングが可能です
  • きめ細かいアクセス制御により、ユーザー単位でインデックスレベルのアクセス制御が可能です

参照先

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社Luxy(https://luxy-inc.com)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した会社を引き継ぎ、代表に就任。

目次