AWS再入門 Amazon Elasticsearch Service編

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

当エントリはDevelopers.IOで弊社AWSチームによる2015年アドベントカレンダー 『AWS サービス別 再入門アドベントカレンダー 2015』の17日目のエントリです。昨日16日目のエントリは鈴木の『Amazoon Kinesis』でした。

このアドベントカレンダーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

本日18日目のテーマは『Amazon Elasticsearch Service』です。2015/10/1にリリースと約2ヶ月半前にリリースされたサービスなので再入門と呼ぶには少し微妙な感じはありますが。。。

目次

サービスの基本的な説明

Amazon Elasticsearch ServiceはElasticsearchのAWSマネージドサービスです。

Elasticsearchとは

Amazon Elasticsearch Serviceの説明に入る前に簡単にElasticsearchの概要をご紹介します。

Luceneベースの検索・分析エンジン

ApacheプロジェクトのLucene(全文検索エンジン)をベースとしたOSSの検索・分析ソフトウェアです。

高拡張性/高可用性

Elasticの名の通り、高い拡張性・可用性を提供します。

  • 拡張性
    ElasticsearchはデータをShardという単位でデータを保持します。このShardを複数のノードに分散して保持することで、分散処理により高負荷な環境でもスケールすることでボトルネックへの対策が可能です。
    またElasticsearchはMaster Node / Data Node / Client Node / Tribe NodeといったNodeTypeがあり、Elasticsearchの利用用途に応じて役割を分けることで負荷低減、パフォーマンス向上を行うことができます。

  • 可用性
    Shardはレプリカを持つことができ、異なるノードへレプリカを保持することで、ノードがダウンした場合もレプリカが昇格し、アプリケーションを継続することができます。

スキーマレス

ドキュメント指向のスキーマレスモデルが採用されています。JSON形式でデータを渡すことでElasticsearchが解釈し、スキーマ構造を定義します(Dynamic Mapping)。またテンプレート機能を利用すれば、事前にインデックス/タイプにスキーマ定義することも可能です。

RESTful APIによる操作

RESTfulに則ったAPIで操作が可能です。更にINPUT/OUTPUTがJSON形式ですのでシステムに組み込みやすいです。

豊富な検索オプション

Aggregationを利用した集計したり、IPアドレスから位置情報を取得したり、座標から距離を計算したり、非常に多くの検索オプションが用意されています。Search APIのドキュメントが一番ボリュームが多いです。

素敵な周辺ツール

Logstash

ログ処理ツールです。
下記、3つのステップに分けて、多種多様なプラグインからデータを処理することができます。

  • INPUT
  • FILTER
  • OUTPUT

任意の入力プラグインで色々なソースから取得したデータを、任意のフィルタープラグインでデータを処理し、任意の出力プラグインでデータを出力することができます。例えばアクセスログをファイルインプットプラグインでtailしながら、grokフィルタープラグインでメッセージをJSON形式に変換し、ElsticsearchアウトプットプラグインでElasticsearchに取り込む、といったことが可能です。フィルタープラグインは複数適用することも可能です。

Kibana

Elasticsearchのデータを可視化/分析するツールです。
Kibanaで可視化したいからElasticsearchを利用したい方もいるのではないでしょうか?
多様な表示形式で多次元にデータを可視化、分析することができます。

更にKibana 4.2からPluginにも対応し、更に豊富な可視化を実現できるようになりました。利用者によってPluginを実装することもできます。

Beats Platform

つい1ヶ月前ぐらいに、1.0GAがリリースされました。元々、Packetbeatというトラフィックを取得するツールがありました。それが様々な入力形式に対応したBeats Platformとして展開されました。Golangで書かれ、軽量なフットプリントが魅力です。

Amazon Elasticsearch Serviceの特徴

Elasticsearchの素敵な感じはなんとなくご理解いただけましたでしょうか。
続いて、Amazon Elasticsearch Serviceを利用することで得られる恩恵をご紹介します。

AWSマネージドサービス

なんといってもこれですね。構築、運用に関する多くのことが簡略化されています。

画面操作、APIによるデプロイ、スケール

マネジメントコンソールから数クリックするだけでデプロイできます。awscliなどのAPIを活用すればコマンドワンライナーでデプロイすることが可能です。そのためOS、アプリケーションのインストール、設定が不要です。また運用中にパフォーマンス、ディスク容量に不安を感じた場合も、インスタンスタイプ、インスタンス数、ディスクサイズの変更をマネジメントコンソールからの数クリック、APIによりスケールアップ、スケールアウトが可能です。

自由度の高い構成設定

ElasticsearchのMaster Node / Data Nodeを任意のインスタンスタイプ、インスタンス数で指定できます。またMaster Node / Data Nodeを分けずに同居させることも可能です。更にReplicaシャードをMultiAZで持つことができ、AZレベルの障害にもアプリケーションを継続できます。

障害の自動検出、ノード交換

ノードの監視はAWSが担当します。ノードに障害が発生した場合、AWSが新しいノードと差し替えてくれます。運用に手がかかりません。

自動スナップショット

毎日指定した時間にスナップショットを取得します。スナップショットはユーザー管理外の領域に取得され、ユーザーの操作ではリストアはできません。また手動スナップショットも可能です。ユーザーのS3バケットを対象にスナップショットリポジトリを作成することでき、SNAPSHOT APIをリクエストすることで任意のタイミングでスナップショットを取得でき、任意のタイミングでリストアできます。

CloudWatchによるリソースモニタリング、イベント監視

ElasticsearchにはコマーシャルプラグインのMervel(2.xはシングルクラスタの場合、無償利用可能)、Watcherによってリソースのモニタリング、および監視・通知を行うことができました。Amazon Elasticsearch ServiceはCloudWatchが対応しており、リソースのモニタリング、監視、通知をCloudWatchにより行うことができます。

IAMポリシーによるアクセス制御

AWS re:Invent 2015のAmazon Elasticsearch Serviceのセッションのスライドの一部です。

Elasticsearch APIはIAMを通して、Elasticsearchに届けられます。
それにより以下のアクセス制御が可能となっています。

  • IPアドレスによる制御
  • IAM User / IAM Roleによる制御
  • リソースベースの制御

CloudWatch Logsとの連携

AWSはログの集約・監視サービスとしてCloudWatch Logsがあります。CloudTrailやVPC Flow Logs、AWS LambdaなどのいくつかのAWSサービスはCloudWatch Logsへログ出力します。CloudWatch Logsへ出力されたログメッセージをCloudWatch LogsがLambda Functionへプッシュし、Amazon Elasticsearch ServiceへINPUTしてくれます。しかも、間のLambda FunctionのソースコードはAWSが用意していて、自動生成されるため、自ら実装する必要がありません。ただCloudTrailは元々JSON形式で出力されるので何も変換が必要ありませんが、VPC Flow LogsやAWS Lambdaなどはテキスト形式で出力されます。こちらに関しても、Amazon Elasticsearch Serviceへ転送するログにメッセージパターンを定義しておくことで、CloudWatch LogsがLambda Functionへプッシュする際にJSON形式に変換して渡すことが可能です。そのため、テキスト形式でもログのメッセージフォーマットが決まっていれば、CloudWatch LogsからAmazon Elasticsearch Serviceへ転送する上では一切のコーディングを必要としません。

デフォルトで利用可能なプラグイン

よく利用されるプラグインは最初から利用可能です。

  • Kibana 4 / Kibana 3
  • ICU
  • KUROMOJI
  • jetty
  • cloud-aws
# curl search-**************.ap-northeast-1.es.amazonaws.com/_cat/plugins
Thornn jetty             NA                 j
Thornn cloud-aws         ${project.version} j
Thornn analysis-kuromoji 2.5.1-SNAPSHOT     j
Thornn analysis-icu      2.5.0              j
Thornn kibana            NA                 s /_plugin/kibana/
Thornn kibana3           NA                 s /_plugin/kibana3/

従量制の課金体系

料金は初期費用は必要なく、インスタンスタイプ、インスタンス数などに応じた従量制の課金体系です。料金はこちらのサイトをご参照ください。まずElasticsearchやKibanaでやりたいことができるのかを触ってみたいという方には持ってこいのサービスです。

Amazon Elasticsearch Serviceの制限事項

ここまでメリットばかりで選択しない理由がないのではないか、となりますが、制限事項もあります。

  • Elasticsearchのバージョン選択
  • VPC対応
  • プラグインのインストール
  • Dynamic Script
  • ユーザー辞書
  • 全てのElasticsearch API
  • TCP Transport Support

Get Started

Launch

機能を説明したところでLaunchしてみましょう。

まずはAmazon Elasticsearch Serviceのサービス画面へ遷移してください。

Amazon_Elasticsearch_Service_Management_Console

Dashboardには現在作成されているAmazon Elasticsearch Serviceのドメインが表示されます。

「Create new a domain」を選択します。

Amazon_Elasticsearch_Service_Management_Console

まずElasticsearchのドメイン名前を設定します。 ドメイン名は文字数が3〜28、利用可能な文字は英小文字、数字、-(ハイフン)のみです。

Amazon_Elasticsearch_Service_Management_Console

次は全般設定です。 インスタンスタイプ、インスタンス数を指定します。
Master NodeとData Nodeを分けたい場合、「Enable dedicated master」をチェックし、Master Nodeのインスタンスタイプ、インスタンス数を指定します。なお、インスタンス数はスプリットブレインを回避するために3以上が推奨されます。
MultiAZ構成としたい場合、「Enable zone awareness」をチェックします。

Amazon_Elasticsearch_Service_Management_Console

ストレージタイプを選択します。Instance Store / EBSから選択可能です。
EBSを選択した場合、ボリュームタイプを選択、ディスクサイズを指定します。ボリュームタイプはMagnetic / General Purpose / Provisioned IOPSから選択可能です。Instance Storeを選択した場合、インスタンスタイプに応じたディスクサイズとなります。

自動スナップショットの取得時間を選択します。毎日指定した時間にスナップショットを取得します。

Amazon_Elasticsearch_Service_Management_Console

他にも詳細設定として、本来、ElasticsearchのYAMLファイルで設定可能な項目も2つ指定可能です。 rest.action.multi.allow_explicit_indexはサブリソースの指定を強制させたいのであれば、falseを選択してください。indices.fielddata.cache.sizeはfielddataに利用可能なヒープサイズを指定します。

続いて、アクセス制御です。

Amazon_Elasticsearch_Service_Management_Console

JSON形式でアクセスポリシーを記載します。Amazon Elasticsearch Serviceのアクセスポリシーはテンプレートが用意されています。

  • AWSアカウント、IAM Userによるアクセス制御
  • 送信元IPアドレスによるアクセス制御
  • フルオープン / フルクローズ

例えばIPアドレスによるアクセス制御の場合、IPアドレスレンジを指定すると、

Amazon_Elasticsearch_Service_Management_Console

自動でアクセスポリシーが生成されます。簡単です。

Amazon_Elasticsearch_Service_Management_Console

確認画面で設定内容を確認します。作成を実行します。

Amazon_Elasticsearch_Service_Management_Console

作成中です。数分待ちましょう

Amazon_Elasticsearch_Service_Management_Console

Elasticsearch Clusterの作成が完了すると、ElasticsearchのEndpointやKibanaのアクセスURLが表示されます。これだけで利用可能です。

API操作

EndpointへGETリクエストを投げてみます。

# curl search-test-domain-****************.ap-northeast-1.es.amazonaws.com
{
  "status" : 200,
  "name" : "Jerome Beechman",
  "cluster_name" : "*************:test-domain",
  "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"
}

バージョンは1.5.2が利用されています。Elasticsearchはnode.nameを指定しない場合、起動時にランダムなMarvelキャラクターが割り当てられます(豆)。

ドキュメント登録

まずはAPIでドキュメントを登録します。
POST /<INDEX>/<TYPE>[/<ID>]
リクエストボディにデータを与えます。

# curl -XPOST search-test-domain-**************.ap-northeast-1.es.amazonaws.com/my_index/my_type -d '{"name":"shinji","age":32}'
{"_index":"my_index","_type":"my_type","_id":"AVGrla3E7KG3ALhM98MA","_version":1,"created":true}

IDを指定しない場合、IDが生成されます。

ドキュメント取得

続いて、登録したドキュメントを取得します。
POST /<INDEX>/<TYPE>/<ID>

# curl search-test-domain-**************.ap-northeast-1.es.amazonaws.com/my_index/my_type/AVGrla3E7KG3ALhM98MA
{"_index":"my_index","_type":"my_type","_id":"AVGrla3E7KG3ALhM98MA","_version":1,"found":true,"_source":{"name":"shinji","age":32}}

登録したドキュメントが取得されました。

# curl "search-test-domain-****************.ap-northeast-1.es.amazonaws.com/my_index/my_type/_mapping?pretty"
{
  "my_index" : {
    "mappings" : {
      "my_type" : {
        "properties" : {
          "age" : {
            "type" : "long"
          },
          "name" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

今回、JSON形式で登録したので、Dynamic Mappingによりフィールドのデータ型を認識しています。
といったようにデータの操作がAPIによって簡単に行えます。

あわせて読みたい

公式情報

  • Webiner

  • AWS re:Invent 2015

Developers.IO関連エントリ

まとめ

いかがでしたでしょうか。
Amazon Elasticsearch Serviceは従量制の課金体系で初期費用不要、OSやアプリケーションのインストール・設定不要ということでElasticsearchを触ったことがない方がまず触ってみて機能検証したい方には持って来いのサービスです。もちろん機能検証でやりたいことが出来ると分かれば、そのままインスタンスサイズやインスタンス数などの構成を調整すればそのまま本番環境で稼働することも可能です。まずは立ち上げて、触ってみましょう!

最後に

以上、『AWS サービス別 再入門アドベントカレンダー 2015』の17日目のエントリ『Amazon Elasticsearch Service編』でした。

明日12/18(金)は藤村のAWS Lambdaです。お楽しみに!

  • すみません、書き出しの部分の、

    「Amazon Elasticsearch ServiceはElasticが提供するElasticsearchのAWSマネージドサービスです。」

    ですが、かなりの人が誤解をすると思うので訂正をお願いしたいです。

    ElasticはAmazon Elasticsearch Serviceは提供して「いません」。

    Elasticが提供しているものは別にFoundというものがあります。

    知らない人が読むと間違った認識を持ってしまうので、訂正をお願いいたします。

  • 佐々木大輔

    @johtani:disqus ご指摘ありがとうございます!「Elasticが提供する」を削除する形で修正しました。