ようへいの日々精進XP

よかろうもん

(ショロカレ 4 日目)2015 年のうちにやっておきたい Amazon Elasticsearch Service 入門

これは「初老丸の独り Advent calendar 2015」の四日目の記事です。

tl;dr

ちゃんと Elasticsearch そのものをを使えていないこともあるが、Amazon Elasticsearch Service に入門したのでメモ。


うんちく

参考

aws.typepad.com

aws.amazon.com

Elasticsearch とは

speakerdeck.com

上記の資料の三ページ目に簡潔に纏まっているのが解りやすいが、抜粋させて頂く。

Amazon Elasticserch Service とは

上記の Elasticsearch が AWS 上にマネージドサービスとして提供されている、従来 Elasticsearch は AWS のサービスと間違えられることがあったか無かったは、今となっては分からないものの名実ともに AWS のサービスとなったことでより手軽に利用できるようになったのではと考えている。

で、Amazon Elasticsearch Service(以下、Amazon ES)の特徴としては...

  • 簡単デプロイ
  • 管理(可用性の確保、パッチ管理、障害検出、ノードの交換、バックアップ、モニタリング等)は AWS にある程度お任せ
  • CloudWatch と連携した高いスケーラビリティ
  • Kibana 入り(はじめから Kibana 入ってます)
  • IAM ポリシーによって安全にクラスタにアクセス出来る

Amazon ES のサポートされている API

サポートされている API に関しては以下に記載されている。

一般的に利用する API はサポートされているように見える。ただし、プラグイン系のエンドポイントについてはサポートされているプラグインに依存するので事前に確認しておく必要がありそう。

Amazon ES のサポートされているプラグイン

以下のプラグインが導入済みとのこと。

オープンソースプラグインをどのようにインストールするのかドキュメントをザクッとななめ読みしたところ読み取ることができなかった...もし、その方法があるなら教えて欲しい...。

Amazon ES のスナップショット

  • 自動的にスナップショットを取得(スナップショットは時間指定可能)
  • 14 日間保存される
  • Elasticsearch の Snapshot API を利用して S3 バケットに保存することが可能
  • S3 に保存されたスナップショットを利用して Amazon ES や自分で管理している Elasticsearch へレストアすることができる

で、なんぼ?

以下の要素で課金される。

詳細はこちらの料金表をご覧ください...。

お楽しみの無料枠は以下の通り。

AWS 無料利用枠をご利用のお客様は、Amazon Elasticsearch Service で単一アベイラビリティーゾーンの t2.micro.elasticsearch インスタンス最大 750 時間/月、およびオプションの Amazon EBS ストレージ (マグネティックまたは汎用) 10 GB/月を利用できます。

とのことなので、今回はこの無料枠の範囲で試してみたい。


Amazon ES クラスタ構築入門

まずはドメインを作るところから始める

Amazon Elasticsearch Service(以下、Amazon ES)はクラスタドメインという名前で管理する。1 クラスタ = 1 ドメインと覚えておくことにする。

f:id:inokara:20151203235252p:plain

Elasticsearch インスタンスタイプやドメインのノード数、ストレージを設定する

f:id:inokara:20151203235342p:plain

インスタンスタイプは以下の通り。(※こちらより抜粋。)

  • T2 開発およびテスト(dedicated masterノードにも適してる)
  • R3 Read-heavyもしくは複雑なクエリ(例えばnested aggregations)
  • I2 High-write、Large-scaleなデータの格納
  • M3 一般的なreadとwrite

また、Enable dedicated master と Enable zone awareness については以下の通り。

  • Enable dedicated masterクラスタ管理用のマスタノードを構築する(マスタノードにはデータは保持せずクラスタ管理のみを受け持つ、最低三つのマスタノードの指定を推奨、スプリットブレインを回避する為にマスタノードは常に奇数を設定すること)
  • Enable zone awareness はリージョン内の複数の AZ にノードを分散して構築する

f:id:inokara:20151203235404p:plain

  • T2 シリーズ以外は Instance Store を選択することができる
  • EBS は Magnetic / GP2 / PIOPS から選択することが出来る
  • EBS のサイズは最低 10GB から最大 35GB まで指定することが出来る
  • スナップショットの時間を指定する(今回は特に指定せずデフォルトのまま)

アクセスポリシーの設定

IAM ユーザーや IP アドレスを設定してアクセスのポリシーを設定する。

f:id:inokara:20151204000643p:plain

今回は接続元の IP を設定するので以下のように IP アドレスを入力する。

f:id:inokara:20151204093231p:plain

IP アドレスを入力すると以下のような JSON が自動生成される。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "xxx.xxx.xx.xxx"
          ]
        }
      },
      "Resource": "arn:aws:es:ap-northeast-1:12345678901234567890:domain/oreno-es/*"
    }
  ]
}

設定を確認してクラスタを作成する

最後に設定を確認してクラスタの作成を開始する。

f:id:inokara:20151204000933p:plain

10 分程お待ちください...

f:id:inokara:20151204000954p:plain

クラスタ作成完了

10 分後....クラスタの出来上がり。

f:id:inokara:20151204002013p:plain

エンドポイントや Domain ARN や Kibana の URL も合わせて表示されている。

Kibana にアクセスする

Kibana にアクセスしてみる。

f:id:inokara:20151204002548p:plain

当然、インデックスが無いので何の面白みも無い。

エンドポイントにアクセスする

一応 curl を利用してエンドポイントにもアクセスする。

$ curl https://search-oreno-es-xxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/
{
  "status" : 200,
  "name" : "Steel Spider",
  "cluster_name" : "12345678901234567890:oreno-es",
  "version" : {
    "number" : "1.5.2",
    "build_hash" : "62ff9868b4c8a0c45860bebb259e21980778ab1c",
    "build_timestamp" : "2015-04-27T09:21:06Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

Amazon ES をちょっと使ってみる

PM2.5 のデータを突っ込んでみる

以下を利用して Amazon ES に昨日の九州地方の各観測地点の PM2.5 データを突っ込んでみる。

github.com

詳しい使い方は README を。

突っ込んだら Kibana で可視化する

  • まずは Index の設定

f:id:inokara:20151204090648p:plain

  • 次に Search オブジェクトを作る

観測地点毎に見たいので 205 地点分の Search オブジェクトを一気に作成。

$ cd kibana
$ kibana_search.rb.sample kibana_search.rb
$ sed -i 's/YOUR_AMAZON_ES_ENDPOINT/search-xxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/g' kibana_search.rb
$ ruby kibana_search.rb
  • そして Visualize

Visualize オブジェクトも 205 地点分を一気に作成。

$ cd kibana
$ mv kibana_visualize.rb.sample kibana_visualize.rb
$ sed -i 's/YOUR_AMAZON_ES_ENDPOINT/search-xxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/g' kibana_visualize.rb
$ ruby kibana_visualize.rb
  • 最後に Dashiboard

ポチポチ...

f:id:inokara:20151204091823p:plain

一応、完成。

f:id:inokara:20151204091841p:plain

PM2.5 の観測データが無い観測地点もあるので歯抜けな状態になっているのはすいません。


ということで

Amazon ES は...

  • はじめから Kibana も付いてる、簡単セットアップ Elasticsearch
  • お手軽に運用出来るかもしれない Elasticsearch
  • AWS サービスともシームレスに連携出来そうな Elasticsearch

だと思うので引き続き触ってみたいと思う。

次回は...

以下をやってみる。

  • S3 へのスナップショット、レストア
  • CloudWatch Logs との連携
  • Fluentd との連携

ということで、2015 年のうちにやっておきたい Amazon Elasticsearch Service 入門の第一回目でした。