【初心者向け】Elastic StackのElasticsearchを触ってみよう

2020.11.30

【初心者向け】Elastic Stackについて知ろうで紹介したElastic StackのコアプロダクトであるElasticsearch(Amazon Elasticsearch Service)の立ち上げ、サンプルデータ登録、検索等を行ってみたいと思います。

※本記事は、あくまでElasticsearchに触ったことがないという方向けに紹介する記事のため、仕様等の説明はある程度省いています。

Elasticsearch, データの準備

まずは、Elasticsearchドメインの作成、サンプルデータの登録を行います。

ドメインの立ち上げ

簡単にAWSコンソールを用いて、Amazon Elasticsearch Serviceで新規のElasticsearchを立ち上げる手順を説明します。
今回は検証用のためインスタンスタイプやセキュリティについては最小限の設定となっていることに注意してください。

AWSコンソールからElasticsearch Serviceを選択して、「新しいドメインの作成」を選択します。

Step 1:デプロイタイプの選択

  • デプロイタイプを「開発およびテスト」を選択して「次へ」を押下します。

Step 2:ドメインの設定

  • 任意のElasticsearchドメイン名を入力します。
  • インスタンスタイプにt3.small.elasticsearchを選択して「次へ」を押下します。

Step 3:アクセスとセキュリティの設定

  • ネットワーク構成で「パブリックアクセス」に設定します。
  • 「細かいアクセスコントロールを有効化」のチェックを外します。
  • カスタムアクセスポリシーに自身のIPアドレスを許可する設定を行い、「次へ」を押下します。

Step 4:確認

設定内容が問題ないことを確認して、「確認」を押下します。

ドメインの起動

作成したドメインの起動が行われるので15分程度待機します。

以下のような情報が表示されればElasticsearchの立ち上げが完了して、アクセス可能になります。

この情報の中で重要なのは、「エンドポイント」に書かれているElasticsearchのREST APIのエンドポイントと「Kibana」に書かれているKibanaへのURLです。

サンプルデータの登録

先ほど確認したKibanaへのURLをブラウザで初めて開くと、サンプルデータを登録するか問われるのでSample eCommerce orders, Sample flight data, Sample web logsをそれぞれ登録しましょう。 このサンプルデータは、ドキュメントだけでなく後述するDashboardまで付随するのでとても参考になります。

REST APIを叩いてみる

データの登録が行えたので実際にREST APIを叩いてみます。 REST APIsで一覧になっているように、様々な機能がAPIとして提供されています。 今回は、CAT APIsSearch APIsの中から簡単なものを紹介します。

CAT APIs

Elasticsearchは基本的にJSONのレスポンスを返します。プログラム等からは操作しやすいですが人間が目でみて理解しやすいとは言えません。
そこで、人間にも理解しやすい形式のレスポンスを返すCAT APIsが存在します。

まずは、ヘルスチェックを行ってみましょう。cat health APIで確認してみます。

$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/_cat/health?v" 
epoch      timestamp cluster                       status node.total node.data discovered_master shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1606686770 21:52:50  0000000000:cm-yokoyama-test green           1         1              true      4   4    0    0        0             0                  -                100.0%

ElasticsearchのClusterのstatusはgreenのため問題なく動作しているようです。

Elasticsearchは分散型エンジンのためクラスタやノードという概念が存在します。実際に運用するとなると複数ノードで1つのクラスタとなるように動作させるため各ノードの情報についても確認したくなります。cat nodes APIで確認してみます。

$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/_cat/nodes?v" 
ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
x.x.x.x           48          88   3    0.00    0.00     0.00 dimr      *      7d9c2bf81f04e64ac6323213484ceb78

起動しているノードの情報が簡単なリソース情報と共に確認できました。(今回は検証のため1ノード構成)

次に、先ほどKibanaのUIから登録したサンプルデータが正しく登録されているかインデックス一覧をcat indices APIで確認してみます。

$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/_cat/indices?v" 
health status index                        uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   kibana_sample_data_ecommerce hF3A0CB3T8SxxuATXo_ebQ   1   0       4675            0      4.2mb          4.2mb
green  open   kibana_sample_data_logs      RF6suhpeQEaGCUr2lhrTdQ   1   0      14074            0     11.6mb         11.6mb
green  open   kibana_sample_data_flights   EgiYk54mTrmRNZly2HnomA   1   0      13059            0      6.3mb          6.3mb
green  open   .kibana_1                    tPOvos6KTsClXhxwFVVpwA   1   0        155            5    150.4kb        150.4kb

下記のインデックスが登録されていることが確認できました。.kibana_1というインデックスは登録した覚えはありませんが、Kibana自体の内部設定インデックスなので気にしなくてよいです。

  • kibana_sample_data_ecommerce
  • kibana_sample_data_logs
  • kibana_sample_data_flights
  • .kibana_1

Search APIs

ではSearch APIsを用いて実際に登録したサンプルデータkibana_sample_data_logsに対して簡単な検索を行ってみましょう。

まずは条件を全く指定しないで検索してみます。返却されるドキュメントの数は指定していないためデフォルトで10件となります。

$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/kibana_sample_data_logs/_search?pretty"
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "kibana_sample_data_logs",
        "_type" : "_doc",
        "_id" : "9_huFXYBlzqvYqwIWQNp",
        "_score" : 1.0,
        "_source" : {
          "agent" : "Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1",
          "bytes" : 6219,
          "clientip" : "223.87.60.27",
          "extension" : "deb",
          "geo" : {
            "srcdest" : "IN:US",
            "src" : "IN",
            "dest" : "US",
            "coordinates" : {
              "lat" : 39.41042861,
              "lon" : -88.8454325
            }
          },
          "host" : "artifacts.elastic.co",
          "index" : "kibana_sample_data_logs",
          "ip" : "223.87.60.27",
          "machine" : {
            "ram" : 8589934592,
            "os" : "win 8"
          },
          "memory" : null,
          "message" : "223.87.60.27 - - [2018-07-22T00:39:02.912Z] \"GET /elasticsearch/elasticsearch-6.3.2.deb_1 HTTP/1.1\" 200 6219 \"-\" \"Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1\"",
          "phpmemory" : null,
          "referer" : "http://twitter.com/success/wendy-lawrence",
          "request" : "/elasticsearch/elasticsearch-6.3.2.deb",
          "response" : 200,
          "tags" : [
            "success",
            "info"
          ],
          "timestamp" : "2020-11-22T00:39:02.912Z",
          "url" : "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.deb_1",
          "utc_time" : "2020-11-22T00:39:02.912Z",
          "event" : {
            "dataset" : "sample_web_logs"
          }
        }
      },
      ★以下9件については割愛
    ]
  }
}

サンプルデータとしてkibana_sample_data_logsインデックスに登録されたドキュメントが取得できていますね。

次に条件を指定してみましょう。Elasticsearchでは検索条件を指定する場合にQuery DSLと呼ばれるJSONベースのクエリ言語を用います。 ipフィールドが175.187.90.174であるドキュメントを検索したい場合は以下のように指定を行います。

curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/kibana_sample_data_logs/_search?pretty&size=1" -H 'Content-Type: application/json' -d'
{
    "query": {
        "term": {
            "ip": {
                "value": "175.187.90.174"
            }
        }
    }
}'

複数条件で、responseフィールドが200かつagentフィールドにWindowsが含まれているドキュメントを検索したい場合は以下のように指定を行います。

$ curl -XGET "https://search-XXXXX.ap-northeast-1.es.amazonaws.com/kibana_sample_data_logs/_search?pretty&size=1" -H 'Content-Type: application/json' -d'{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "response": {
                            "value": 200
                        }
                    }
                },
                {
                    "match": {
                        "agent": "Windows"
                    }
                }
            ]
        }
    }
}'
{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3674,
      "relation" : "eq"
    },
    "max_score" : 1.3600241,
    "hits" : [
      {
        "_index" : "kibana_sample_data_logs",
        "_type" : "_doc",
        "_id" : "-vhuFXYBlzqvYqwIWQNp",
        "_score" : 1.3600241,
        "_source" : {
          "agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)",
          "bytes" : 14113,
          "clientip" : "99.74.118.237",
          "extension" : "deb",
          "geo" : {
            "srcdest" : "LK:IN",
            "src" : "LK",
            "dest" : "IN",
            "coordinates" : {
              "lat" : 48.31140472,
              "lon" : -114.2550694
            }
          },
          "host" : "artifacts.elastic.co",
          "index" : "kibana_sample_data_logs",
          "ip" : "99.74.118.237",
          "machine" : {
            "ram" : 11811160064,
            "os" : "ios"
          },
          "memory" : null,
          "message" : "99.74.118.237 - - [2018-07-22T03:34:43.399Z] \"GET /beats/metricbeat/metricbeat-6.3.2-amd64.deb_1 HTTP/1.1\" 200 14113 \"-\" \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\"",
          "phpmemory" : null,
          "referer" : "http://www.elastic-elastic-elastic.com/success/charles-camarda",
          "request" : "/beats/metricbeat/metricbeat-6.3.2-amd64.deb",
          "response" : 200,
          "tags" : [
            "success",
            "info"
          ],
          "timestamp" : "2020-11-22T03:34:43.399Z",
          "url" : "https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.3.2-amd64.deb_1",
          "utc_time" : "2020-11-22T03:34:43.399Z",
          "event" : {
            "dataset" : "sample_web_logs"
          }
        }
      }
    ]
  }
}

このようにElasticsearchでは、Query DSLを用いて検索条件を指定することで様々な検索を行うことができます。

おわりに

Elasticsearchには他にも様々なAPIが存在しますが、今回はElasticsearchの立ち上げ、サンプルデータの登録、簡単な検索について紹介しました。 Elasticsearchを用いてどのようにデータを検索するのかがすこし掴めたのではないかと思います。

この記事でElastic Stackを触ったことがないという方が少しでも興味を持っていただければ幸いです。

以上になります。ドキュメントは英語で機能も膨大ですがみなさんも是非触ってみてください。