概要
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 がやってくれるんだ。



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



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



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



Dashboards が標準搭載されているのは便利そうですね。Kinesis や Lambda からもデータを取り込めるんですか?
そうなんだ。例えばアプリケーションのログを Kinesis Data Firehose 経由でリアルタイムに OpenSearch に流し込んで、Dashboards でグラフにするなんてことが簡単にできるよ。



ログ分析の基盤としてすぐ使えるのはいいですね!
基本的な構成要素



OpenSearch Service を使ううえで知っておくべき用語はありますか?
いくつかの基本的な構成要素を押さえておくといいよ。リレーショナルデータベースと比較するとイメージしやすいんだ。
| 要素 | 説明 |
|---|---|
| ドメイン | OpenSearch クラスターの単位。1 つ以上のデータノードで構成される |
| インデックス | ドキュメントの集合。リレーショナルデータベースの「テーブル」に相当 |
| ドキュメント | JSON 形式のデータ単位。リレーショナルデータベースの「行」に相当 |
| シャード | インデックスを分割した単位。データの分散格納と並列処理に使用 |
| OpenSearch Dashboards | データの検索・可視化を行う Web UI |



インデックスがテーブルで、ドキュメントが行ということは、データベースに近い感覚で使えるんですね。シャードというのは何のためにあるんですか?
いい質問だね。シャードはインデックスを分割したもので、データを複数のノードに分散させて格納するための仕組みだよ。分散させることで並列処理ができるから、大量のデータでも高速に検索できるんだ。



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


アクセスポリシーの種類



OpenSearch Service のセキュリティはどうなっていますか?誰でもアクセスできちゃったら困りますよね。
もちろんアクセス制御の仕組みがしっかりあるよ。主に4つの方法があるんだ。
| 方式 | 説明 |
|---|---|
| きめ細かいアクセス制御 | OpenSearch 内部のユーザー・ロールでインデックスレベルの制御が可能 |
| IAM ベースのアクセスポリシー | IAM ユーザー・ロールの ARN でアクセスを制御 |
| IP ベースのアクセスポリシー | 送信元 IP アドレスでアクセスを制御 |
| VPC 内デプロイ | VPC のセキュリティグループでネットワークレベルのアクセスを制御 |



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



分かりました。インデックス単位で制御できるのは細かくて安心ですね!
実践
前提条件
- リージョン:
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 ストレージサイズ:
10GiB


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


アクセスポリシーの設定
- ドメインアクセスポリシー: 「きめ細かいアクセス制御のみを使用」を選択
- その他の項目はデフォルトのままにします
- 「作成」をクリックします
ドメインの作成には 15〜20 分程度かかります。ステータスが「アクティブ」になるまで待ちます。


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


ステップ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"}
_bulkAPI を使うと、複数のドキュメントを一括で投入できます。
- 右側の結果パネルに各ドキュメントの投入結果が表示されます。
"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"
}
}
}


集計: HTTP メソッド別のリクエスト数
GET web-logs/_search
{
"size": 0,
"aggs": {
"methods": {
"terms": {
"field": "method.keyword"
}
}
}
}
aggregationsセクションに 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」などに変更します)
- ドキュメントの一覧が表示されます


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











