(レポート) BDT209: リアルタイムデータ分析および可視化のためのAmazon Elasticsearch Service #reinvent

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

こんにちは、虎塚です。

re:Invent 2015で「BDT209 - NEW LAUNCH! Amazon Elasticsearch Service for Real-time Data Analytics and Visualization(日本語タイトル: リアルタイムデータ分析および可視化のためのAmazon Elasticsearch Service)」を聴講したのでレポートします。発表されたのは、Jon HandlerさんとPravin Pillaiさんで、いずれもAWSの方でした。

Amazon Elasticsearch Serviceは先日リリースされたばかりの新サービスです。

このセッションで扱うこと

  • 前提となるコンテキスト: 増大するデータを管理する
  • Amazon Elasticsearch Service (Amazon ES)の紹介
  • Amazon ESを利用する際の設定、セキュリティ強化、接続、モニタリング、スケーリングについて

Amazon Elasticsearch Service(以下、Amazon ES)は、クラスタのデプロイ、管理、スケールが簡単にできるサービスです。

背景: システムで扱うデータの増大

クラウドコンピューティングでは、データは増加し続けています。データを集めることは簡単になり、昔よりも安価に保存できるようになりました。

たとえば、プロダクトのデータ、システムのログデータ、顧客との会話(CSR)、マーケティングデータなどが増大して、テラバイト単位の量になることもあります。

これらの大量データに対してなにができるでしょうか。

ハーバード大学のGary King先生の「Big data is not about the data」という言葉があります。データが巨大になり、集めることが簡単になりましたが、本当の価値は分析の中にある、という意味です。

  • 情報を共有する
  • 洞察を引き出す
  • パターンを理解する
  • パフォーマンスを追跡する

などの用途がありますが、最終的に、ビジネス、技術、オペレーション上の意思決定が必要です。

シナリオ1: 全文検索

まず、ナレッジ共有システムでの全文検索について考えてみましょう。

  • チームは継続的にコンテンツを生み出しています
  • あなたはそれらのナレッジベースを検索しやすく、アクセスしやすくすることを担当しています
  • テキストマッチングを含むキー検索、ファセット検索、フィルタリング、ファジー検索、オートコンプリート、ハイライトなどの機能が必要です

シナリオ2: ストリーミングデータ分析

次に、侵入検知について考えてみます。ここでは、高速に生成されるデータを、高速に分析するタスクが重要です。

  • システムを攻撃から守らなければなりません
  • ほぼリアルタイムにセキュリティイシューを検知するためには、簡単に扱えてパワフルな分析と可視化のツールが必要です
  • 様々なキーデータソースから情報をキャプチャするには、簡単かつ柔軟にデータを取り込めることが重要です

シナリオ3: バッチデータ

最後に、ユーザの利用方法をモニタリングすることについて考えてみます。ユーザが生成する膨大なデータを扱います。

  • あなたはモバイルアプリの開発者です
  • アプリの複数バージョンにわたるユーザの操作を監視/管理しなければなりません
  • アプリの使用方法とバージョン間の移行について分析し、レポートしたくなるでしょう

オプションのツール群

これらのシナリオに取り組むにあたり、採用可能なオプションのツールとして、Cassandra、Hive、Hadoop、Mahout、MongoDB、Spark、Solr、そしてElasticsearchなどがあります。有名なオープンソーステクノジーがたくさんあります。

Elasticsearchは何をしてくれるツールか

Elasticsearchは、パワフルでリアルタイム性のあるオープンソースの分散検索/分析エンジンです。大規模なデータを検索できます。

  • Apache Luceneの上に作られています
  • スキーマフリー
  • 開発者にやさしいRESTfulなAPIがあります

また、LogstashKibanaといったリアルタイム分析とデータ可視化を提供する周辺ツールがあり、これらはELK stackと呼ばれています。

しかしながら、Elasticsearchの運用には手間がかかるのが問題でした。

そこで、Amazon ESが発表されました。このサービスを使えば、Elasticsearchクラスタのデプロイ、運用、スケールが、AWS上で簡単に操作できます。

Amazon ESの特長

  • クラスタの作成や管理設定が簡単で、すぐにはじめられます
  • ELKをサポートしています
  • セキュリティ対応
    • AWS IAMでクラスタへのアクセス制御ができます
    • CloudWatchでメトリックスを取得して監視できます
    • CloudTrailとも統合されているので監査に対応できます
  • CloudWatch Logs、DynamoDB、S3、KinesisなどのAWSサービスともつなぐことができます

デモ

クラスタ作成画面の解説

インスタンスタイプと個数、ストレージタイプなどを選ぶだけで、非常に簡単にクラスタを作成できます。

まず、データノードとマスターノードの設定をします。次に、ストレージの種別や容量を指定します。ストレージにはインデックスなどが格納されます。

また、オプションとして、チェックボックスにチェックするだけで、2つのAvailabilityZoneにクラスタが自動的に分散配置されます。

AWS CLIコマンド

ドメインの作成/削除、タグの追加/削除など、ごくシンプルなコマンドが用意されています。たとえば、ドメインに名前をつけて作成するesコマンドは、次のようになります。

aws es create-elasticsearch-domain --domain-name my-domain \
  --elasticsearch-cluster-config \
    InstanceType=m3.xlarge.elasticsearch,InstanceCount=3 \
  --ebs-options \
    EBSEnabled=true,VolumeType=gp2,VolumeSize=512

Amazon ES ドメインの概観

Amazon ESドメインの概観

  • (図右下のサーバ群) マスターノード管理下のデータノード上で、ElasticsearchやKibanaが動きます
  • (外部からのアクセスを受けるELB) REST APIのシングルエンドポイントです。Elasticsearch APIを介してElasticsearchへHTTPで接続できます
  • (IAM) クラスタへのアクセス制御をおこないます
    • ドメインレベル、インデックスレベルなどできめ細かく、ユーザ単位で権限を設定できます
  • (CloudWatchとCloudTrail) クラスタをモニタリングします

なお、負荷がかかったときのスケーリングの設定変更は、サービスを停止することなくオンラインで実行できます。

データパーティショニング

ドメイン内のインデックスの様子が、次の図に描かれています。各シャードがドキュメントを保持します。

データパーティショニングの図

  • Document: 検索の単位
  • ID: 一意のID(ドキュメントごとに1つ採番される)
  • Field: DocumentはFieldの集合で構成される
  • Shard: Luceneのインスタンス(インデックスの一部分を担う)
  • Index: データの集合

クラスタへのインデックスのデプロイ

スライドを参照ください(黄色の四角形がノードです。3個のノードで1個のクラスタを構成しています)。

クラスタへのインデックスデプロイ

プライマリの各Shardが、それぞれ別々のインスタンスに配置され、冗長性が確保されます。

インスタンスタイプの推奨設定

インスタンス 用途
T2 最初はこれで。開発とテスト用。dedicated masterにも利用できる
M3 読み出しと書き込みが大体同じくらいの用途に向く。5TBまでのEBSを利用できる
R3 メモリ最適化インスタンスなので、読み込みが多いかクエリ発行が多い用途に向く(Kibanaを使うならこちらを推奨)
I2 バックエンドが高速。16TBまでのSSDインスタンスストレージが利用できる

ドメインへセキュアにアクセスする

セキュリティポリシーに応じて、IAMポリシーでアクセス制御をおこないます。例を次に示します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam:123456789012:user/user-name"
      },
      "Action": [
        "es:ESHttpGet", "es:ESHttpPut", "es:ESHttpPost",
        "es:CreateElastisearchDomain", "es:ListDomainNames"    
      ],
      "Resource": "arn:aws:es:us-east-1:###:domain/logs-domain/<index>/*",
      "Condition": "IpAddress": {
        "aws:SourceIp": [ "xx.xx.xx.xx/yy" ]
      }
    }
  ]
}

どのユーザがアクセスできるか、何に対してアクセスできるかを、ユーザベースポリシーで設定します。アクセス制御は、ドメインレベル、インデックスレベルで可能です。上記ではインデックスレベルのアクセス制御をしています(arnで指定しています)。

また、Condition要素を記述して、IPアドレスベースのアクセス制御も可能です。IPアドレスをレンジで記述することもできます。

Elasticsearch APIへの直接アクセスの例

curlを使ってエンドポイントに対してHTTPリクエストを発行するコマンド例が紹介されました(省略)。

Amazon ESへのデータ読み込み

Logstashを使ったデータ読み込み

Logstashを使用して、Amazon ESのドメインへデータをpushできます。

Loading data using Logstash

AWS Lambdaを使ったデータ読み込み

S3、DynamoDB、KinesisなどからAWS Lambdaへデータを送って、Amazon ESへデータをアップロードできます。

CloudWatch LogsからESにログを出力するデモ

CloudWatch Logsで収集したログデータに対して、Elasticsearchのパワフルな検索を利用してみましょう。また、Kibanaを使った可視化も試してみましょう。

  1. EC2の上でJMeterを動かして、CloudWatch LogsにJMeterの動作ログを出力します
  2. CloudWatch LogsのActionメニューから、Amazon ESを選択してデータを送り込みます
  3. Elasticsearch Serviceに入ったデータをKibanaで可視化します

運用、管理

監視と監査

CloudWatchで監視に、CloudTrailで監査に対応します。CloudWatchでは17個のメトリックスにアクセスできます。その中で、特に監視したほうがよい項目は次のとおりです。

  • FreeStorageSpace
    • クラスタが空領域を使い切る前にアラームを上げます
  • CPUUtilization
    • 80%のCPU使用率になったら、スケールアップやインスタンスのサイズ増強をおこなうべきです
  • ClustrerStatus.yellow
    • レプリケーションが追加ノードを必要とするかどうかをチェックします
  • JVMMemoryPressure
    • インスタンスタイプと数が十分かをチェックします
  • MasterCPUUtilization
    • マスターノードの監視はデータノードと分離しておこなわれます

スナップショットとリストア

日次で自動スナップショットを取るように設定できます。また、手動でスナップショットを取ることもできます。作成されたスナップショットは、S3バケットに保存されます。

CLIから手動でスナップショットを取る際は、IAMでアクセス制御をおこなってください。S3バケットにもポリシーの設定が必要なことに注意します。

ビルトインのKibana

自分でKibanaを導入して運用する必要はなく、ビルトインのKibanaを利用できます。そのため、Logstash -> Amazon ES -> Kibanaという流れが簡単に実現できます。

LogstashとKibanaを使ったアプリケーションの概念図

収集したデータをKibanaで可視化、分析して、ビジネスに活用しましょう。

なお、Kibanaのセキュリティを確保するには、オプションでプロキシサーバを手前に置き、Amazon ESのアクセス制御でIPアドレスベースのIAMポリシーを適用する方法があります。

Kibanaのセキュリティ対策

従量課金

Amazon ESでは、使用したコンピューティングとストレージのサイズに対して課金されます。

Amazon ESは日本リージョンですでに利用可能です。

まとめ

  1. Elasticsearchは全文検索、分析、時系列データ可視化のためのツールで、増大するデータセットを扱うビジネスに有用です
  2. Amazon ESでは、elasticsearchクラスタのデプロイや管理が簡単になります
  3. Amazon ESは、既存のElasticsearchクラスタを置き換えることができます

おわりに

レポートで上手くお伝えできないのが残念ですが、デモがとても良かったです(セッション動画が公開されたら、この記事からもリンクします)。そのままでは見づらいCloudWatch Logsのログが、Amazon ESに取り込まれて検索可能になり、さらにKibanaで可視化された様子には感激しました。これが欲しかったんです! ほかのサービスとの連携で、さまざまな使い方が生まれそうですね。これからどんどん使っていきます。

それでは、また。