Hello! Amazon Elasticsearch Service

Kunihiko Kido
Hello! Elasticsearch.
10 min readOct 2, 2015

--

自前で構築してきたElasticsearchをAmazon ESに移行できるかという視点で、その特徴や機能的な制限などまとめてみました。

2015年10月1日にAmazon Elasticsearch Service(略称:Amazon ES)がリリースされました。AWSの全文検索サービスにはすでに、CloudSearchがありますが、Elasticsearchはそのリアルタイム性や柔軟性、強力な集計機能(Aggregations)、データの視覚化(Kibana)などCloudSearchにない様々な特徴があります。そのため、一般的な検索エンジンよりもその利用範囲は広く、サイト内検索、ログ分析、状態検知など検索エンジンの利用範囲を広げてきました。

Amazon ESの使い方は、他のブログですでにいろいろ公開されいますので、ここでは、EC2などで、自前で構築してきたElasticsearchをAmazon ESに移行できるかという視点で、その特徴や機能的な制限などまとめたいと思います。

※ ちょっと触ってみたい場合は下記のサイトが参考になるかと、さすが公開早いです!

Version

まず、Amazon ESのElasticsearchのバージョンは1.5です。本家Elasticsearchのカレントバージョンは1.7系ですから少し古めです。ただ、Elasticsearchのバージョンアップの頻度は高く、最近のバージョンアップでインパクトのあった、inner hits (親子関連の子の検索結果を返す機能)なども1.5時点でリリースされていますので、検索機能に限って言えば現在の最新バージョンに比べてもそれほど差はありません。

{
“status” : 200,
“name” : “Krystalin”,
“cluster_name” : “845875574259:test”,
“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”
}

Supported Elasticsearch APIs

マニュアルを参照すると以下のElasticsearchAPIがサポートされています。

/_alias
/_aliases
/_all
/_bulk
/_cat
/_cluster/health
/_cluster/settings
/_cluster/stats
/_count
/_flush
/_mapping
/_mget
/_msearch
/_nodes
/_plugin/kibana
/_plugin/kibana3
/_percolate
/_refresh
/_search
/_snapshot
/_stats
/_status
/_template

もちろん上記に乗っていないインデックスの作成(/<index>)や、ドキュメントのインデックス(/<index>/<type>/<id>)などのAPIもサポートされているので、APIを使用して、インデックスの作成やドキュメントのインデックス、更新、削除なども利用できます。

Kibana

Amazon ESを起動すると、Kibanaも標準で使用できてしまいます。バージョンは4です!

Region

CloudSearchリリース当初は、東京リージョンが含まれていなかったりしましたが、Amazon ESは初期リリースから東京リージョンも含まれています。検索エンジンはそのパフォーマンスを期待して利用するユーザーも多いでしょうから、国内で利用するにもレイテンシを気にせず利用できますね。

Availability

Elasticsearch Domain(多分Clusterのこと) を作成する際に、Enable zone awareness と言うオプションがあります。これを有効にすると2つのAvailability Zoneを使用して、Primary Shards と Replica Shards 分散して配置することができます。この設定をしておくと、例えば2つ以上のノード構成において、AZレベルの障害が発生しても、片側のAZで完全な検索サービスを継続して利用することが可能です。

Access Control

ElasticsearchのAPIに対して、IPベースユーザーベース(Amazon Accounts or IAM users)のアクセス制御が可能です。それ以外のアクセス制御が必要な場合、例えばAPIのパスベース、Tokenキーベースなどの認証方法が必要な場合は、別途ゲートウェイを用意する感じです。AWSならAmazon API Gatewayという選択肢も!

Plugins

カスタムプラグインは現在のところサポートされていないようです。現在Amazon ESに含まれているプラグインは、Kibana、ICU、Kuromojiです。なので、商用のMarvelとかShieldもまだ使えないってことです。

言語処理系のプラグインにはKuromojiも含まれているので、日本語は形態素解析を使用した単語ベースの検索もNGramベースの検索もできますね。

Custom Analyzer

Char FilterやToken Filter、Tokenizer、Analyzerのカスタマイズ設定はElasticsearchのAPIをこれまで通り使用して設定できるのですが、例えばKuromojiのユーザー辞書などファイルベースの辞書を使用する設定は現在のところ設定できませんでした。

ファイルベースの辞書を配置する方法などマニュアルにも見当たりませんでした。もしかしてS3のバケットに配置してファイルのパスの指定はS3のパスを指定すれば使えたりするのかなとも考えましたが、(Close Index API許可されていないようなので、設定できたとしても反映は無理かな?)?この辺りはもう少し調査が必要そうです。

カスタムアナライザーでファイルでルールや辞書を管理している場合は、事前に代替案を検討した法が良いかもしれません。

Scripting Module

ダイナミックスクリプトはサポートされていません(マニュアルにもしっかり書かれています。)。もちろんIndexed Scriptもダイナミックスクリプトなので使えません。と言うかファイルベースのスクリプトを配置する方法も見つからなかったので、スクリプトは現在のところ使えないと思った方が良さそうです。スクリプトは、script_fieldsとか、スコアの計算とか以外と使うことが多いのでちょっと辛いかも。

Index Template

インデックステンプレートは、インデックスを作成するときのルールを設定しておくテンプレートです。私がよく使用するのはマッピングルール定義とかでよく使ってます。ファイルベースで設定することはできなそうですが、APIを使用して登録できるので、これまでファイルで管理していた場合はAPIを使用して登録すればこれまで通り使用できそうです。

Search Template

サーチテンプレートは、複雑な検索条件をテンプレート化するためのテンプレートです。インデックステンプレート同様ファイルベースのサーチテンプレートは配置することはできなそうですが、APIを使用して登録できます。

Streaming Data to Amazon ES

データをインデックスする方法は、基本的にはElasticsearchのAPIやLogstashを使用してデータをインデックスする方法が提供されていますが、マニュアルにAmazonならではの方法も公開されているので紹介します。

Streaming Data to Amazon ES from Amazon S3

Amazon S3バケットのイベントをトリガーにAmazon Lambdaを使って、Amazon ESにデータをインデックスする方法です。Lambdaの処理をプログラミングする必要はありますが、S3に保存されたデータをサーバーレスでAmazon ESにインデックスできるのでいい感じです。

Streaming Data to Amazon ES from Amazon Kinesis

Amazon KinesisのイベントをトリガーにAmazon Lambdaを使って、Amazon ESにデータをインデックスする方法です。これもLambdaの処理をプログラミングする必要はありますが、Kinesisに流れてきたデータをサーバーレスでAmazon ESにインデックスできるのでいい感じです。

Streaming Data to Amazon ES from Amazon DynamoDB

Logstashを使って、DynamoDBのデータをAmazon ESにデータをインデックスする方法です。Logstashを動かすサーバーは別途用意する必要がありますが、プログラミングレスで実装可能です。DynamoDB Input用のLogstashプラグインは、AWS Labsから提供されています。

Streaming Data to Amazon ES from Amazon CloudWatch

最後にCloudWatch LogsのデータをAmazon ESにインデックスする方法です。こちらは、CloudWatch Logsの画面に[Subscribe to Lambda/Amazon ES]と言うアクションが追加されているので、ウィザードに従って設定するだけで簡単にデータをインデックスすることができます。

まとめ

Elasticsearchの良いところを生かしつつサービス化されている感じです。ログ分析など特殊な言語処理を必要としない要件であれば、素直に利用できる印象。CloudSearchと差別化するためのあえての制限なのか?まだリリースされたばかりのための制限なのか?、スクリプトが利用できなかったり、ファイルベースの辞書が使えなかったりするので、検索精度や集計、ランキングなどを独自のロジックでごにょごにょするような要件の場合は、EC2で個別にElasticsearchをインストールして使ったほうが良いと感じました。

※ ひとりごと:Elasticsearch Client for Atom からアクセスしたらエラーになってしまい使えなかったので、あとでAmazon ESに対応しなければw

--

--