読者です 読者をやめる 読者になる 読者になる

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Elasticsearchのデータを別のElasticsearchに入れるいくつかの方法

Elasticsearch

こんにちは、 @ です。

この記事は、Elastic stack Advent Calendar 2016の8日目です。
qiita.com

皆さんは、Elasticsearchのデータを、別のElasticsearchに入れたいことってありませんか?
私は実際に、

  1. 各自がアドホックに分析するため、個人用のElasticsearchを立てているので、そこにコピーしたい
  2. 遠隔地にあり、直接アクセスできないElasticsearchのデータを確認したい

ということをしたい場合があります。
今回は、このようなケースで使える方法をいくつか紹介します。

正攻法はsnapshot機能を利用することかもしれませんが、ちょっとしたコピーをしたいときには敷居が高いのではないかと思います。
ここでは、もう少し簡易に実行する方法を紹介します。

(方法1) Logstashでコピーする

まずは、

各自がアドホックに分析するため、個人用のElasticsearchを立てているので、そこにコピーしたい

のようなケースで使い勝手が良いコピー方法です。

コピー元とコピー先のElasticsearchが同一ネットワークにあることが前提になりますが、LogstashのElasticsearchプラグインを利用してコピーするのが便利です。
具体的な方法については、こちらを参考にすると良いと思います。
stackoverflow.com

(方法2) コピー元で取得したJSONをコピー先に入れる

次は、

遠隔地にあり、直接アクセスできないElasticsearchのデータを確認したい

のようなケースで使い勝手が良いコピー方法です。

遠隔地で別の人がKibanaを操作していて、見ているデータを自分でも確認したくなるケースがあります。
この場合、KibanaのDiscover機能でデータを取得し、コピー先に入れるのが便利です。
具体的には、次の方法でコピーすることができます。

コピー元でデータを取得する

まずは、コピー元でElasticsearchに入っているデータを次の手順で取得します。

1.メニューから「Discover」をクリックし、Discover画面を表示する
f:id:acro-engineer:20161208061505j:plain

2.コピーしたい時刻に合わせ、グラフ左下の上矢印をクリックする
f:id:acro-engineer:20161208061548j:plain

3.テーブルの上にある「Response」をクリックする
f:id:acro-engineer:20161208061653j:plain

4.表示されるJSONをコピーし、ファイルに保存する(ここでは、Response.jsonに保存するものとします)
f:id:acro-engineer:20161208061743j:plain

コピー先にデータを登録する

次に、コピー先のElasticsearchに入っているデータを登録します。
私はちょっとしたPythonスクリプトを使っています。

1.Pythonがインストールされていない場合は、以下のサイトからダウンロードし、インストールする
www.python.org

2.Python用Elasticsearchクライアントがインストールされていない場合は、インストールする

pip install elasticsearch

3.次のPythonスクリプトを実行する

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from elasticsearch import Elasticsearch

es = Elasticsearch('192.168.0.1')

file = open('Response.json', 'r')
json_data = json.load(file)

for data in json_data['hits']['hits']:
    es.index(index=data['_index'],
             doc_type=data['_type'],
             body=data['_source'],
             id=data['_id'])

※'192.168.0.1'のところには、コピー先のElasticsearchを指定してください。

これで、コピー先のElasticsearchにデータが入ります。


私の場合、遠隔地のデータを確認したいケースがあるため、これで重宝しています。
この方法が、同じような状況の方に役立てば幸いです。

Acroquest Technologyでは、キャリア採用を行っています。


  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
www.wantedly.com

大規模サーバ更改でServerspecを使ってみました

Serverspec

こんにちは、おじさん技術者の iga です。

とあるサーバ更改のプロジェクトで、「Serverspecを使った設定チェック」を実施しましたので、その時のノウハウを共有したいと思います。

設定チェックの対象となるサーバが全部で約600台あり、あるサーバ種別で最大282台と大規模なため、人力でのチェックはあきらめていました。
そこで利用したのが、Serverspecです。

f:id:acro-engineer:20161119145144j:plain

Serverspecとは

Serverspecは、サーバの状態をコードにより自動的にテストするためのツールです。
公式サイトはこちらです。
http://serverspec.org/

Ruby製のテストフレームワークRSpecがベースになっていて、抽象化したコードによってサーバの状態を確認するようになっています。

システム構成の概要

今回のテスト対象のシステム構成は、次の図のようになっています。

f:id:acro-engineer:20161120193702j:plain

メンテナンス端末にServerspecをインストールして、メンテナンス端末からテスト対象のサーバにsshで接続できるようになっています。

今回のカスタマイズ方針

サーバの台数は多いのですが、同じ役割のサーバが数十台で構成されるとなっているため、Serverspec標準のテスト方法だと、同じチェック内容を大量に複製する必要があります。
標準のフォルダ構成だと、以下の図のようになります。

f:id:acro-engineer:20161119150226j:plain

「websvr001」と「websvr002」に同じテストを適用していますが、台数が少ない間はファイルのコピーやシンボリックリンクで対応できますが、台数が増えると管理しきれなくなります。

そこで、複数サーバでテストを共有するため、公式サイトにも記述されている「How to share Serverspec tests among hosts」という手法を取りました。

f:id:acro-engineer:20161119150227j:plain

サーバ種別ごとにテスト対象を配置することで、同じサーバ種別で台数が増えても、管理できるようになりました。


ただ、サンプルで記述されている内容だと、以下のような問題があってそのまま適用できませんでした。
1) 対象サーバが固定で記述されている。
→台数が多いので、テスト時間短縮のためあるサーバ種別だけテストしたい、ということができない。
2) サーバ種別(Role)をサーバ名から取得するようになっている。
→サーバ名が命名規則に沿ってつけられているが、サーバ種別が分かりやすい名前になっていない。
→記述ミスがあると実行の無駄になってしまうので、分かりやすい記述にしたかった。

今回対応するカスタマイズ内容

今回の対応(以降、Role対応 と記載します)では、以下のことを行いました。
1) 対象サーバとサーバ種別は、JSON形式の外部ファイルに用意しておく。
2) サーバ種別は、分かりやすい名前にしておく。

具体的なカスタマイズ内容

Role対応するため、Rakefileを次のように修正しました。
Rakefileは、Serverspecが自動生成した、テストを実行する処理が記述されたファイルになります。

まずは実行対象のサーバ情報を取り出すところです。

標準のRakefile
  targets = []
  Dir.glob('./spec/*').each do |dir|
    next unless File.directory?(dir)
    target = File.basename(dir)
    target = "_#{target}" if target == "default"
    targets << target
  end

標準ではspecフォルダ配下のフォルダが実行対象サーバ名(またはIPアドレス)になっているので、それを読み込んで実行対象(target)に保存しています。

Role対応版Rakefile
  # 環境変数から使用するIPアドレスリストを取得
  rolePath = ENV['SERVERSPEC_ROLE']

  # specフォルダ配下のrole名を取得する
  roles = []
  Dir.glob('./spec/*').each do |dir|
    next unless File.directory?(dir)
    target = File.basename(dir)
    roles << target
  end

  # role別のIPアドレスリストをjsonファイルから読み込む
  all_addrs = []
  targets = []
  roles.each do |role|
    ip_addrs = get_ipaddr(rolePath, role)
    if ip_addrs
      all_addrs.concat(ip_addrs)

      ip_addrs.each do |ip_addr|
        targets << {:role => role, :addr => ip_addr}
      end
    end
  end


Role対応では、specフォルダ配下のフォルダがサーバ種別になっているので、それを読み込みます。
そして、JSONファイルからサーバ種別と実行対象サーバ名を読み込んで、specフォルダ配下にサーバ種別が定義されている場合に、サーバ種別と実行対象サーバ名をtargetに保存しています。
読み込むJSONファイル名は、環境変数「SERVERSPEC_ROLE」から取得しています。


JSONファイルのフォーマットは、次のようにしています。
サーバ種別をキーとして、実行対象サーバ名を配列として定義しています。

  {
    "websvr" : [
      "websvr001",
      "websvr002"
    ],
    "appsvr" : [
      "appsvr001"
    ],
    "dbsvr" : [
      "dbsvr001"
    ]
  }

テストの実行部分は次のようになります。

標準のRakefile
  targets.each do |target|
    original_target = target == "_default" ? target[1..-1] : target
    desc "Run serverspec tests to #{original_target}"
    RSpec::Core::RakeTask.new(target.to_sym) do |t|
      ENV['TARGET_HOST'] = original_target
      t.pattern = "spec/#{original_target}/*_spec.rb"
    end
  end

標準では、targetに入っているサーバ分、テストを実行しています。

Role対応版Rakefile
  targets.each do |target|
    original_role = target[:role]
    original_target = target[:addr]
    begin
      desc "Run serverspec tests to #{original_target}"
      RSpec::Core::RakeTask.new(original_target.to_sym) do |t|
        ENV['EXEC_TIME'] = Time.now.strftime("%Y%m%d_%H%M%S").to_s
        ENV['SERVER_KIND'] = original_role
        ENV['TARGET_HOST'] = original_target
        t.pattern = "spec/#{original_role}/*_spec.rb"
        t.fail_on_error = false
      end
    rescue => ex
      puts ex.message
    end
  end

Role対応では、標準と同じくtargetに入っているサーバ分、テストを実行しています。その際、specフォルダ配下のサーバ種別をtargetに格納したroleから決定するようにしています。

Role対応の結果、サーバ種別「websvr」に対してテストする場合、次のように実行します。

  $ export SERVERSPEC_ROLE=addr/websvr.json
  $ rake spec

まとめ

今回、初めてServerspecを利用しましたが、その威力に感動しました。
これまでは、サーバの設定確認といえば目視やdiffを使った差分確認など、人の注意力に頼った作業をやっていました。
それでは設定ミスを見落としたことが、後になって見つかって大変になる、ということをやってきました。

Serverspecを利用すると、設定のOK/NGが分かりやすく出てくるため、NG理由を確認するのも設定ミスなのかテスト内容のミスなのか、切り分けが容易になりました。


それでは!


Acroquest Technologyでは、キャリア採用を行っています。


  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
急増するDevOps案件の中でスキルを活かしたいエンジニア募集! - Acroquest Technology株式会社のインフラエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

「Jupyter Notebookを納品した話」で発表しました

Python Jupyter Notebook

こんにちは@です!
先日、社内勉強会がありました。
今回、私は「Jupyter Notebookを納品した話」で、発表しました。

普段、Jupyter Notebookをデータ分析や機械学習を取り組む中で使います。
このJupyter Notebookを案件の中で使ってみた時に感じたことを発表しました。

実際のスライドはSlide Shareにアップロードしました。


www.slideshare.net

Jupyter Notebook一つでドキュメンテーション、コード、図を書き、分析過程を見せられます。

実際の仕事で使うと自分の考えや分析の過程、そして、結果を説明する場面は必ず遭遇します。
そんな時に非常に重宝しました。

また、仕事を通してJupyter Notebookの良かった点、悪かった点、難しかった点、
そして、それをどう回避すればよかったのかといったことを話し、ディスカッションしました。

発表内容の詳細はスライドを見てください。

分析結果の共有やレポートの作成にぜひ、Jupyter Notebookを使ってみてください!
Jupyter Notebook 最高!

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、AWSHadoop、Storm、NoSQL、Elasticsearch、SpringBoot、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

Prelertでプログラミングレスな異常検知に挑戦!

Elasticsearch Prelert

こんにちは!
@です。

最近、データの中から特異点や異常な箇所を発見したいニーズが高まっています。

そんななか、先日、Elastic社が行動分析技術の大手プロバイダPrelertを買収したとのニュースがありました。

ちなみにPrelert社とは異常検知を自動化するため、データの知識が不要なアプリケーションをエンドユーザーに提供していた企業です。

Prelertのサイトを確認すると、Elasticsearchに入れたデータに対して異常検知することができそうです。
これは面白そう! ということで、Prelertを使って異常検知を行ってみました。

今回は、次の流れで説明していきます。

Prelertとは

PrelertはITセキュリティと運用チームのための行動分析ツールです。公式サイトは次のとおりです。

公式サイトに掲載されている特徴として、次の3つがあります。

  1. 脅威を早期に検出・・・リアルタイムに近いデータ処理でユーザがレポートを出す前に検知する。
  2. より高速な原因の発見・・・環境の学習を行い、より高速に原因を分析できる。
  3. 少ない偽陽性の検出・・・データのコンテキストを理解し、偽陽性の検出を減らす。

いくつか魅力的な特徴が上がっています。
しかし、私の考える最も良い点はプログラミングレスであり、かつ数式を意識する必要がない点だと思います。
そのため、なんとなく異常検知に取り組みたいと考えている人も、複雑な数式を学ぶ必要はなく、Prelertを使って異常検知できます。
また、Prelertは教師なし学習のため、予め教師データの異常をラベリングする必要がないことも特筆すべき点だと思います。

Prelertでは、次のような画面で異常を検知することができます。
後ほど詳細を記載しますが、白 → 青 → 黄 → オレンジ → 赤と、赤に近いほど異常度合いが高いことを示しています。

f:id:acro-engineer:20161029175822j:plain

Prelertのインストール

公式サイトからのダウンロード

PrelertのBeta版を公式サイトからダウンロードすることができます。
Prelert behavioral analytics platform: Home

今回はトップページにあった「Behavioral Analytics for the Elastic Stack Beta」のFree Trialを試します。
Free Trialを行なうにあたって登録が必要となります。登録するとインストーラがダウンロードでき、また14日間の試用ライセンスキーがメールで届きます。

f:id:acro-engineer:20161020232454p:plain

インストール

Prelertのインストールは、基本的にインストーラーに従うだけで完了しました。
途中ライセンスキーを求められるため、メールで届いているものを利用します。

このインストーラによりインストールされるプロダクトは次の通りです。

  • Prelert Engine API version: 2.1.2
  • Prelert analytics version: 6.3.1
  • Kibana version: 4.6.1
  • Elasticsearch version: 2.4.0

ちなみにPrelertをインストールすると、OS起動時にこれらのプロダクトが起動します。
私は別のElasticsearchを起動していて、うっかり同じポート番号を使ってしまっており、起動に失敗しました。
Windows環境では自動起動のサービスを「Shutdown Prelert Engine Service」でOFFにすることができます。

起動確認

Windows環境では「Start Prelert Engine Service」を実行すると、elasticsearch、kibanaが起動します。
kibanaの画面を見てみましょう。
http://localhost:5601/」へアクセスをすると、PluginにPrelertがあることが分かります。
f:id:acro-engineer:20161029175028j:plain

Prelertを開くと、次のような画面になります。
f:id:acro-engineer:20161029175035j:plain

無事にインストールできているようです。

実際に異常検知をやってみる。

データ投入

では実際に異常検知をやってみましょう。
今回は異常検知の対象データとして、Numenta Anomaly Benchmark(NAB)にある、CPU使用率のデータを利用しました。

次のようなデータです。時間とCPU使用率が列挙されています。

timestamp value
2014-05-14 01:14:00 85.835
2014-05-14 01:19:00 88.167
2014-05-14 01:24:00 44.595

このデータをKibanaで可視化すると、次のようになります。

f:id:acro-engineer:20161029175106j:plain

あぁなんか見るからに異常値が・・・みたいなことは、気づかないのが大人です。


NABのデータはcsv形式で提供されているため、logstash2.4.0を使ってElasticsearchに投入しました。
参考までに、Elasticsearch上に作ったマッピング定義と、Logstashの設定を掲載しておきます。

マッピング定義

データを投入する前に、Elasticsearch上でマッピング定義を作っておきました。

{
  "mappings": {
    "_default_": {
      "_all": {
        "enabled": true,
        "norms": {
          "enabled": false
        }
      },
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "YYYY-MM-dd HH:mm:ss"
        },
        "value": {
          "type": "double"
        }
      }
    }
  },
  "settings": {
    "index.refresh_interval": "5s"
  },
  "template": "cpu_utilization_asg_misconfiguration"
}
Logstashを使ったデータ投入

Logstashのconfファイルは次の通りです。

input {
   stdin{}
}

filter {
    csv {
        columns => ['timestamp', 'value']
    }

    date {
        match => [ "timestamp", "YYYY-MM-dd HH:mm:ss" ]
        timezone => "UTC"
    }
}

output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "cpu_utilization_asg_misconfiguration"
    }
}

この設定とtypeコマンドを使ってデータを流し込みました。

Prelertを使った異常検知の実行

ではPrelertで異常検知を行なってみます。

Jobの作成

まず異常検知するためのJobを作成します。最初にデータソースを選択します。
今回はElasticsearchにデータを保存しているので「Elasticsearch server」を選択しました。
f:id:acro-engineer:20161029175202p:plain

次にindexやtype、日付フォーマットなどを指定します。
f:id:acro-engineer:20161029175226j:plain
indexは一つしか選べませんば、typeは複数選べますね。

Jobの詳細設定

続いてJobの詳細を設定します。
タブの中から「Analysis Configuration」を選んで異常検知の設定をします。

f:id:acro-engineer:20161029175549j:plain

まずbucketSpanは「5minutes」とします。
bucketSpanは集約期間を示しており、たとえば5minutesとした場合は、5分間での平均や合計を用いて検知することになります。


次に「Add Detector」から、異常検知のルールを追加します。
今回はfunctionにmean(平均)、fieldNameにvalueを設定しました。

f:id:acro-engineer:20161022133715j:plain

それぞれのパラメータの意味は次の通りです

  1. function: 検知に用いる集計関数(平均や合計)
  2. fieldName: 検知の対象となるフィールド

これで、5分間の平均値が異常な値になった場合に検知できるようになります。
ここまでで、異常と判断する閾値や、アルゴリズム、パラメータなどを設定していないあたりがポイントですね。


これで、Saveを押すと異常検知アルゴリズムの設定は完了です。
保存時に「No Influencers」と警告が現れますが、今回は設定しないので、力強く「OK」を押しました。

そして「Start Scheduler」を押して、検知の対象とするデータの範囲(開始時間、流量時間)を指定します。

f:id:acro-engineer:20161029175721j:plain

これでStartを押すとJobが動き出し、異常検知のスコアが計算されます。
しばらく待って完了したら、異常検知の処理は完了です。

f:id:acro-engineer:20161029175856j:plain

今回のデータ量であれば、数秒程度で処理は終わりました。

Prelertの画面説明

それでは異常検知の結果を見てみましょう。

画面の上の方にタブがありますが、それぞれのタブでは次のような情報の閲覧、管理ができます。

画面 機能概要
Jobs 異常検知タスクを管理する画面
Summary View 異常検知の概要を見る画面
Explorer 詳細に異常検知の概要を見る画面
Connections Exploere画面に出ているアラート一覧を、influencerごとにまとめた画面
Supports ElasticsearchのVersion、サポート情報が書いてある画面

それぞれの画面を見ていきましょう。ただしConnectionsは今回は扱いません

Jobs

Jobsは、Jobに対する操作や情報を確認することができる画面です。

f:id:acro-engineer:20161029175856j:plain

それぞれのカラムは、次のことを示しています。

カラム 概要
Search Name 設定したJobの名前
Description 設定したJobの説明
Processed records どのくらいのデータを処理したか
Memory status メモリの状態
Job Status Jobの状態
Latest timestamp 処理完了したデータで最も遅い時間
Actions Jobに対するアクションが記載されています。
左から順番に、Jobの開始、結果確認、Exprolerの確認、Jobの編集、複製、削除となっています。
Summary View

Summary Viewは、結果の概要を色分けして示す画面です。
時間ごとの異常度合いを色で示しており、白 → 青 → 黄 → オレンジ → 赤 と、赤に近いほど異常度合いが高いことを示しています。

f:id:acro-engineer:20161029175822j:plain

Explorer

Explorerは詳細を確認する画面です。
Explorer画面のAnomaly timelineでは、Detectorの集約期間ごとの異常値を表示します。
また、Anomaliesは画面に表示されている異常検知の値をジャーナル形式で表示しています。
このジャーナル形式から具体的な値や検出位置を確認することができます。

f:id:acro-engineer:20161029175747j:plain

今回投入したデータは、NAB/known_labels_v1.0.json at master · numenta/NAB · GitHub の情報によると、「2014-07-12 02:04:00.000000」と「2014-07-14 21:44:00.000000」に異常があるようです。
さて、Prelertの実行結果はと言うと、Summary ViewやExplorerの図で分かる通り、2014年7月15日付近(右端)の色が変わっており、うまく検知できているようです。

このように、Prelertを使うと簡単な操作でデータから異常を検知することができます。

最後に

Prelert、いかがでしたでしょうか?
Prelertを使うと、Elasticsearchに入っているデータに対し、プログラミングレスで異常検知と可視化ができます。
これで、Elasticsearchがますます便利になりますね!

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、AWSHadoop、Storm、NoSQL、Elasticsearch、SpringBoot、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

SORACOM Beam のアノ機能追加に感動しました!

IoT SORACOM

これはSORACOMリリース1周年記念リレーブログ10/31分です。

blog.soracom.jp

山下@YamaHaruka925です。
10月に開催されたSORACOM UG#4に参加した、SORACOMさんのソリューションパートナーであるAcroquestで働く女性エンジニアで、IoTプラットフォーム開発やってます。
お酒をこよなく愛するリケジョです。(リケジョブログも書いてます^^)
SORACOM UGで熊崎さんとお話ししてたら、楽しくお酒を飲んで酔った勢いで、リレーブログ参戦が決定!

f:id:acro-engineer:20161028112855j:plain:w500

今回は、最近体験した「え!?こまった!」を解決してくれたSORACOMさんのアップデートについて書いてみようかなと。

SORACOM Beamがつながらないが原因不明。。。

AcroquestではIoTアプリケーションプラットフォーム「Torrentio」を提供してるわけですが、相談に来られる方々は、やっぱり、センサーからデータ分析・可視化まで一貫して提供してほしい!!という人が多いので、SORACOMさんやその他パートナー企業さんのお力を借りて、トータル提供する流れになります。


そんなある日。
SORACOMのBeamも使用した実証検証を実施することに。

いざ、設定も完了し、データ送信検証開始!

・・・つながらない。

通信できていないようすだけど、エラーも出力されない。
Beamの設定が悪いのか?
はたまたデータ受付側が悪いのか?
送っているデータに不備があるのか?

・・・さっぱりわからない。

手探りでデバッグ、、、なかなか大変でした(^^;

そんなとき、新機能追加の朗報が!

「新機能:SORACOM Beam / Funnel のエラーログが確認できるようになりました」

blog.soracom.jp


ということで、

SORACOM Beamでエラーログの確認、やってみた

構成

OpenBlocks IoT EX1に、SORACOM SIMを挿して、
SORACOM Beamを利用してAWS API Gatewayに転送します。
AWS API Gatewayからは、受け取ったデータをそのまま返却します。
f:id:acro-engineer:20161028133211p:plain:w600


AWS API Gatewayの設定は、POSTメソッドで簡単にするために認証なしを採用。
f:id:acro-engineer:20161031011935j:plain


AWS API Gatewayの後段には、Lambdaを置き、うけとったデータをそのまま返却するスクリプトを書く。
f:id:acro-engineer:20161031012119j:plain


設定ができたら、ステージにデプロイし、URLをgetします。
このURLが、SORACOM Beamの転送先に設定するURLになります。
f:id:acro-engineer:20161031011945j:plain


SORACOM Beamの設定はこんな感じ。
f:id:acro-engineer:20161031012014j:plain


エントリポイントは、「http://beam.soracom.io:8888/test
転送先には、上記で作成したAWS API GatewayのURLを指定しています。

エラーログ確認方法

エラーログは、SORACOMコンソールのサイドメニュー「ログ」から確認できます。
f:id:acro-engineer:20161031005309j:plain
f:id:acro-engineer:20161031005325j:plain

SIMのIMSIを入力することで、エラーログを絞り込んで表示することができます。


通信して検証

まずは、Beamを使って正常に通信。

$ curl -XPOST http://beam.soracom.io:8888/test -d '{"key":"value"}'
{"key":"value"}

API Gatewayから、送ったデータがそのまま返ってきます。
このとき、エラーは発生していないので、SORACOMコンソールのログ表示を見ても、空っぽ。



つぎに、誤ったURLで送信してみましょう。

$ curl -XPOST http://beam.soracom.io:8888/xxxx -d '{"key":"value"}'
{"message":"Beam configuration for http://beam.soracom.io:8888/xxxx is not found"}

エラーメッセージが返ってきて、「URLがみつからない」ということが一目瞭然。
SORACOMコンソールのログを確認してみると、
f:id:acro-engineer:20161031005913j:plain

エラーログが表示されている!!
これがあれば、リモートで実施している検証でも、エラーをトレースしてデバッグできる!

「便利!!!」



他のエラーも同様に、レスポンスでエラーメッセージが返ってくるとともに、
SORACOMコンソールからログが確認できます。

【メッセージのフォーマット謝り】

$ curl -XPOST http://beam.soracom.io:8888/test -d 'test message'
{"message":"Could not parse request body into json: Unrecognized token \'test|' was expecting\'null\',\'true\',\'false\' or NAN\n at [Source: [B@c9e04ec; line: 2, column: 6]"}

【認証不正】

$ curl -XPOST http://beam.soracom.io:8888/test -d '{"key":"value"}'
{"message":"Missing Authentication Token"}

SORACOMコンソールのログはこんな感じ。
f:id:acro-engineer:20161031005933j:plain

エラーコードがコンソールから確認できるので、リモートでも何が悪いかの推測が立ちますね。

要望に迅速に対応してもらえるのはありがたい!

このBeamのエラーログ取得機能も、ユーザーからの声を聞いて、
機能追加となったとのこと。

私自身、新機能追加の1週間ほど前に苦労していた内容でした。
実際にBeamを設定し、デバイスにSIMを挿して検証しましたが、実はデバイス側での送信先指定が誤っており、通信ができていなかった。。。
なんてミスをして、検証やり直し。。。なんて苦い思い出が。

なので、今回の機能追加はとてもとてもありがたい。

なので、メジャーなA~Gのサービス追加のような機能追加ではありませんが、このようなユーザの要望に迅速に対応して、サービスに反映している部分こそ、SORACOMさんの素晴らしさだと思いました。

バックエンドで対応してくださっているSORACOMのエンジニア/サポートのみなさん、ありがとうございます!!!

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、AWSHadoop、Storm、NoSQL、Elasticsearch、SpringBoot、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

Elastic Stack 5.0.0 GAリリース! 早速インストール!! #elasticsearch

Hello world, @ です。
少し肌寒い日が続きますが、皆さんいかがお過ごしでしょうか。
寒いのは決して僕のせいではないからね、そう周りに言い聞かせながら生き抜く日々です。


さて、
ついにElastic Stack 5.0.0のGA版がリリースされました!!
https://www.elastic.co/jp/blog/elastic-stack-5-0-0-released

既にリリースされたalpha版やRC版などを触っていますが、2.x系から新機能が追加されただけでなく、性能や安定性、またユーザビリティが向上している体感があり、積極的にこの新版を使っていきたいと思っているところです。

Elastic Stack 5.0.0の新機能

公式ブログでもいくつか紹介されていますが、2.xから5.0ではピックアップしきれないほどの変更点があります。私なりに重要だと思っている新機能をいくつか紹介します。

Elasticsearch

https://www.elastic.co/blog/elasticsearch-5-0-0-released

  • 大幅な性能改善
  • Ingest Nodeにより、これまでLogstashが行なってきた加工処理ができるようになった
  • Stringの代わりにText/Keywordという型が導入された

性能改善によりKibanaのレスポンスが体感で変わりました。またIngest NodeのおかげでLogstashを使わない構成も取れるようになりました。特に小さな規模で動かす時には、Logstashを外すことも検討できそうです。

また、TextとKeywordについて、Textは単語分割されたいわゆる「analyzed」なフィールド、Keywordは単語分割されていない「not_analyzed」なフィールドです。Elasticsearchにデータを入れると、デフォルトで、このTextとKeywordの両方が保存されるようになりました。
2.x系を使っていた頃には「not_analyzedにしてなかったせいで、上手く検索できない!」とか「後からnot_analyzedに変更するのが大変すぎる!」なんて絶望したことがありましたが、5.0ではそんな目に遭うこともありません!

Kibana

https://www.elastic.co/blog/kibana-5-0-0-released

  • UIが大幅に変更された
  • SenseとTimelionが最初から組み込まれるようになった

Kibanaは見た目が一新され、グラフの表示エリアが広がりました。またSenseが「Console」という名前になって、最初から入る「Dev Tools」のひとつになりました。ほぼ必須のプラグインだったので、これも助かります。

Logstash

https://www.elastic.co/blog/logstash-5-0-0-released

  • モニタリングAPIが追加され、プロセスの情報や、パイプラインの状態などを取得できるようになった
  • 設定ファイルの自動再読み込みができるようになった(オプション)

Logstashの設定を行なう際、これまでは、設定ファイルを書いて、Logstashを立ち上げ(数秒掛かる!)、動作確認して、間違ってたら設定ファイルを直して、またLogstashを立ち上げ直して(だから数秒掛かる!)、という作業を繰り返さなくてはいけませんでした。
バージョン5.0では、設定ファイルの再読み込み機能を有効にすることで、Logstashを再起動しなくとも、設定が反映できるようになりました。特に初期構築時などに嬉しい機能ですね。

またLogstashにモニタリングAPIが追加されたことで、リソース情報などが取れるようになり、今後、X-Packのモニタリング機能でLogstashもモニタリングできるようになりそうです。

Beats

https://www.elastic.co/blog/beats-5-0-0-released

  • Metricbeatが登場。Topbeatの機能を持つほか、Apache、nginx、MySQL、MongoDBなどのメトリクスを収集できる
  • データを直接Kafkaに送信できるようになった
  • 不要なデータを送らないようフィルタできるようになった
  • Kibanaのダッシュボードを作るためのスクリプトが同梱されるようになった

最も大きな変更は、Kafkaにデータを送信できるようになったことでしょう。Kafkaを用いて情報収集の仕組みを安定化する際、システム構成をシンプルにできるようになりました。
また、Metricbeatにも注目です。Metricbeatは情報をpullで取りに行くエージェントで、今後も情報の取得先が増える見込みですし、自分でプラグインを書いて拡張することもできます。

Elastic Stack 5.0.0のインストール方法

それではElasicスタックのインストール手順を紹介します
5.0になってインストール周りが改善され、yumやapt-getを使ったインストールを行ないやすくなりました。
ここではAWS上のAmazon Linuxにインストールする想定で、手順を説明します。

事前準備

まずJava8(OpenJDK)をインストールします。
Elasticsearch 5.0からはJava 8以上が必要となり、またOpenJDKも正式サポートされるようになりました。

sudo yum update -y
sudo yum remove -y java-1.7.0-openjdk
sudo yum install -y java-1.8.0-openjdk-devel
sudo yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*

なおOpenJDKは -devel を入れないとjinfoやjstatなどのコマンドが入りませんし、 -debuginfo を入れないとjinfoやjstatで情報を取れないので、これらをセットで入れておきましょう。これが入ってないと、トラブルシューターが激おこですよ。


続いて、yumでインストールできるようにするため、GPGキーのインポートと、リポジトリの定義を作成します。

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo vi /etc/yum.repos.d/elastic.repo

elastic.repo の内容は次の通りです。

[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

これまでのバージョンではyumリポジトリがElasticsearch、Kibanaなど、プロダクトごとに分かれていたのですが、5.0ではこれが一つに統合されたため、スタック全体のバージョンを統一しやすくなりました。
ここまで済めば、後は各プロダクトをyumでインストールしていきます。

ElasticsearchとKibanaのインストール

yumコマンドでElaticsearchとKibanaをインストールします。

sudo yum install -y elasticsearch
sudo yum install -y kibana

Kibanaはインストール直後の状態ではlocalhostからのみアクセスできる状態となっているため、AWSなど外部のサーバにインストールした場合には、publicアクセスできるように設定を変える必要があります。

sudo vi /etc/kibana/kibana.yml

次の設定を追加します。

server.host: "0.0.0.0"


また、Elasticsearchも同様にlocalhostからのみアクセスできる状態なので、もし別サーバにBeatsやLogstashを置いてアクセスする場合には、同一ネットワーク内からアクセスできるよう設定する必要があります。

sudo vi /etc/elasticsearch/elasticsearch.yml

次の設定を追加します

network.host: _local_, _site_

ローカルホスト(_local_)と、同一ネットワーク帯(_site_)からのアクセスを許可する設定です。


ここまで済んだら、ElasticsearchとKibanaを起動します。

sudo service elasticsearch start
sudo service kibana start

起動後にブラウザで http://(サーバのアドレス):5601/ にアクセスして、Kibanaの画面が出たら成功です。


ちなみに画面遷移時に「Index Patterns: Please specify a default index pattern」というエラーメッセージが出るので、とりあえず「.kibana」をデフォルトindexにしておけば警告はなくなります。
f:id:acro-engineer:20161027124719p:plain

4.x系のKibanaを使っていた人にとっては、ずいぶん変わったなぁという印象ではないでしょうか。

Beatsのインストール

続いて、Beatsをインストールします。
ここでは例としてMetricbeatによるリソース情報の収集と、PacketbeatによるKibanaへのアクセス情報の収集を行います。


yumコマンドでインストールします。

sudo yum install -y metricbeat
sudo yum install -y packetbeat


続いて、PacketbeatでKibanaに対するHTTPアクセスを収集できるよう設定します。
設定ファイルを書き換え、KibanaがHTTPアクセスに使うポート番号を指定します。

sudo vi /etc/packetbeat/packetbeat.yml

packetbeat.yml

packetbeat.protocols.http:
  ports: [5601]

これで5601ポートを通るパケットの情報が解析され、Elasticsearchに送信できるようになります。

なおMetricbeatはインストールした直後の状態で、サーバのリソース情報を取得できるようになっているため、今回はこのまま利用します。


ところで、Beatsで取得した情報を可視化するためにはKibanaでダッシュボードを作成する必要があるのですが、Beatsにはサンプルのダッシュボードを作るためのスクリプトが用意されており、これを使ってダッシュボードを作ることができます。
別に、情報を収集してからダッシュボードを作っても構いませんが、今回は先に作っておきます。次のコマンドでダッシュボードを作成します。

cd /usr/share/metricbeat
sudo ./scripts/import_dashboards
cd /usr/share/packetbeat
sudo ./scripts/import_dashboards


設定が終わったら、Beatsをそれぞれ起動します。

sudo service metricbeat start
sudo service packetbeat start


Beatsを起動した後、しばらくKibanaで操作などしていれば、アクセス情報やリソース情報などがElasticsearchに蓄積されます。
蓄積された情報を見るため、Kibanaにアクセスして「Dashboard」の「Open」から、ダッシュボードを開いてください。


MetricbeatのProcessダッシュボードは、こんな感じで閲覧できます。
f:id:acro-engineer:20161027124800p:plain


PacketbeatのHTTPダッシュボードは、こんな感じです。
f:id:acro-engineer:20161027124807p:plain


こういうダッシュボードがすぐに出来るのは、本当に手軽で強いなと思いますね。

Logstashのインストール

最後に、Logstashも試してみましょう。
Logstashを用いてKibanaのログを読み込み、Elasticsearchに転送します。


まずyumコマンドでLogstashをインストールします。

sudo yum install -y logstash


続いてLogstashの設定ファイルを作り、Kibanaのログファイルを読みこむようにします。

sudo vi /etc/logstash/conf.d/kibana.conf

このような内容にします。

input {
  file {
    codec => "json"
    path => "/var/log/kibana/kibana.stdout"
    start_position => "beginning"
    sincedb_path => "/var/log/logstash/since_kibana"
  }
}

output {
  elasticsearch {
    index => "kibana_access-%{+YYYY.MM.dd}"
    document_type => "%{type}"
  }
}

KibanaのログはJSON形式で出力されているため、codecにjsonを指定さえすれば、特にfilter処理を書く必要はありません。


設定が終わったら、Logstashを起動します。起動コマンドが他のサービスと少し異なっている点に注意してください。

sudo initctl start logstash


これで、Elasticsearchのkibana_access-(日付) というindexにアクセス情報が蓄積されます。
この情報を見るために、まずKibanaのメニューの「Management」からIndex patternを追加します。名前は「kibana_access-*」とすると良いでしょう。
f:id:acro-engineer:20161027124813p:plain


これでindexパターンを作成すると、Discoverからindexに蓄積された情報を確認することができるようになります。
f:id:acro-engineer:20161027124832p:plain


ここからさらに詳しい可視化をしたい場合には、Kibana上でグラフやダッシュボードを作る必要があります。

ちなみにここではLogstashで読み込む方法を紹介しましたが、実は今回のパターンではLogstashを使う必要はなく、Filebeatだけで済ませることができます。というのもKibanaのログはJSON形式で出力されており、Filebeat 5.0の「1行 1JSON」形式のファイルを読み込む機能を使えば、きちんと処理できるためです。
Logstashはもう少し複雑なログの解析や、転送先が複数ある時などに使うと良いでしょう。

まとめ

Elasticスタック5.0は、新機能追加に加え、性能や安定性、ユーザビリティなどが向上しています。
yumでのインストールもさらに簡単になり、導入しやすくなりました。

まだ使っていない人は、ぜひこの機会に挑戦してみてください。
とは言え、まだ出て間もないですからね、実案件への導入は計画的に!

告知

2016年11月18日(金) に、Spring Day 2016というイベントが東京で開催されます。
私も「Let's Visualize Your Spring Cloud Applications!」というタイトルで、Elasticスタックを使ったマイクロサービスの可視化について具体的な手法や、アーキテクチャなどを紹介する予定です。ぜひご参加ください!
springday2016.springframework.jp


それでは、
Enjoy elastic, see you!


AcroquestではElasticsearch、Logstash、Kibanaの無償ハンズオンセミナーを開催しています。


当社公認エンジニアがElasticsearchの基礎から、商用プラグインの利用、
実データを用いた可視化・分析までを、ハンズオン形式で説明致します。
ハンズオンでは最新バージョンであるElasticスタック5.0を利用します。


詳細・参加応募はこちらからお願いします。
www.acroquest.co.jp

Data Analytics Showcaseで登壇してきました!

Elasticsearch ENdoSnipe

こんにちは @です!

先日、恵比寿にて開催されたData Analytics Showcaseにて、私と弊社の@が登壇してきました。
www.db-tech-showcase.com


それぞれ、次のテーマで発表しました。
@ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」を用いた販売データの関連分析~
@:デジタルデータの可視化基盤「ENdoSnipe」を使った、システムトラブルの未然防止、経営判断につながる可視化の実践

ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」を用いた販売データの関連分析~

私(@)は、人気急上昇中の全文検索エンジンElasticsearchの機能を利用したデータ分析について、発表しました。
これまでこのブログでも多く取り上げているので皆さんご存知かと思いますが、
Elasticsearchは、ログ収集・加工ツールであるLogstash、データ可視化ツールであるKibanaと組み合わせて使うことで
ビッグデータを高速処理するデータ分析基盤として力を発揮します。

今回は、Kibana に追加された Graph というプラグインに特にフォーカスしてお話しさせていただきました。
Graphはデータ間の関連を可視化するためのプラグインになっていて、特徴的な関連を一目で見つけることができます。

今回はコンビニエンスストアの販売データを利用し、分析を行いました。
どのお菓子が、どの年代・性別に売れているのか等、すぐにわかります^^

詳細な内容については、発表資料をご覧ください。

www.slideshare.net


デジタルデータの可視化基盤「ENdoSnipe」を使った、システムトラブルの未然防止、経営判断につながる可視化の実践

この講演では、デジタルデータの可視化基盤であるENdoSnipeの紹介を行い、
KPI/KRIといった指標の相関関係、その関係を見つけるにはどうするか説明しました。
そして、ENdoSnipeの基盤をElasticsearchになぜおきかえたのか、
膨大な系列のデータから相関関係をどう発見していくのかについて説明しました。

興味ある方は、ぜひ発表資料をご覧ください。

www.slideshare.net


どちらのセッションも終了後に多くの質問があり、
Elasticsearchを用いたデータ分析に対する注目度の高さを感じた一日でした^^

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、AWSHadoop、Storm、NoSQL、Elasticsearch、SpringBoot、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com