Taste of Tech Topics

Taste of Tech Topics

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

Amazon SageMakerを使って機械学習モデルのエンドポイントをなるべく簡単に作成する

こんにちは。新人も終わりに差し掛かっている佐々木@です。

去年の12月、AWSの新サービスを発表するイベント「AWS re:Invent 2017」が行われました。
この中で発表されたサービスのひとつに、SageMakerがあります。
今回はこのSageMakerというサービスを使って、機械学習のモデルのエンドポイントを作成していきます。
この記事では機械学習自体にはあまり触れないので、機械学習をある程度やっているけど、
もっと楽にやりたいという人向けの記事となります。

Amazon SageMakerとは

簡単に言うと、AWS上で、データの前処理、学習、モデルの評価、公開を
今までよりも簡単に行えるようにできるサービスです。
aws.amazon.com

何が嬉しいのか

一通り触ってみましたが、SageMakerを使うと

  1. 環境構築の手間がいらない
  2. 作成したモデルをエンドポイントとして簡単に公開できる。

といったことがうれしいポイントとしてあります。
特に、個人的には1番目のポイントが大きいです。
SageMakerでは、前処理用、学習用、推論用の環境をそれぞれ別々に、
自動でセットアップして処理を行えるので、
エンジニアはアルゴリズムに集中できるようになります。

仮にオンプレでモデルの公開までしようとする場合は
f:id:acro-engineer:20180116232047p:plain:w700
という段階が必要になると思います。
それが、SageMakerを使うと、
f:id:acro-engineer:20180116232315p:plain:w400
というように簡単になります。

実際に使ってみる

それでは、SageMakerを実際に使ってみましょう。
今回はSageMakerにもともと用意されているノートブックを使って、
なるべく簡単にエンドポイントを作成していきます。

まずSageMakerにログインするとこのような画面になります。
f:id:acro-engineer:20180105163442p:plain

そしてここから、ノートブックインスタンスの作成を選択すると
f:id:acro-engineer:20180108161334p:plain

このようにインスタンスの設定が出てきます。
今回はすべてデフォルト設定で作成しました。
作成すると、ノートブックインスタンス一覧の画面に作成したインスタンスが追加されるので、
オープンを選択するとノートブックにアクセスすることができます。
f:id:acro-engineer:20180116071932p:plain
これで、tensorflowやMXNetが用意されているデータ分析用の環境が整いました。
面倒なインストール作業が全くなかったのでとても楽に始められます。

作成したインスタンスの中には、あらかじめサンプルのnotebookがいくつか用意されています。
f:id:acro-engineer:20180105175411p:plain

今回はtensorflowのMNISTのサンプルであるtensorflow_distributed_mnistという
notebookを使って、モデルを作成していきます。

まずはこのnotebookを順番に実行していくと、
f:id:acro-engineer:20180115063426p:plain
データセットがダウンロードされ、S3バケットが作成されてデータセットがアップロードされます。

実際に作成されたS3バケットの中を見てみると、
このようにデータセットがアップロードされていることが確認できます。
f:id:acro-engineer:20180116072848p:plain

その次に実際に学習していきます。
f:id:acro-engineer:20180115063833p:plain

このセルでは、あらかじめ用意された学習用のスクリプトを読み込んで、
SageMaker上で学習しています。
スクリプトの形式などの詳細は以下のWebページで解説されています。
docs.aws.amazon.com
また、学習用の環境はインスタンスの個数と種類が選べるので、自分の好きなようにスケールできます。

ここまでで、学習済みモデルの構築は完了しました。
SageMakerのダッシュボードからもモデルの構築が終わったことを確認できます。
f:id:acro-engineer:20180115064457p:plain

これをエンドポイントにデプロイします。
python-sdkにdeployメソッドが用意されているので、このセルを実行するとデプロイが完了します。
このデプロイの際にも、推論に使用するインスタンスの個数と種類を選ぶことができます。
f:id:acro-engineer:20180115064640p:plain

モデルのデプロイはジョブの画面からボタン操作でも行うことができるので、ノートブックを使用していなくても、
ジョブさえ登録してあればエンドポイントの設定は簡単に行えます。
デプロイが完了すると、このようにSageMakerのエンドポイント一覧の画面からデプロイしたエンドポイントが確認できます。
f:id:acro-engineer:20180108161330p:plain

以上がSageMakerのノートブックインスタンス上で行える、
データの準備、学習、エンドポイントの作成の流れです。
ほとんどノートブック上で完結していたので、
簡単に行えました。

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

それでは、次は作成したエンドポイントにアクセスしてみましょう。
AWSpython-sdkを使用します。

import sagemaker
from sagemaker import tensorflow
from sagemaker.tensorflow.predictor import _TFJsonDeserializer, _TFJsonSerializer
from boto3.session import Session
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

session = Session()

predictor = tensorflow.model.TensorFlowPredictor("sagemaker-tensorflow-py2-cpu-xxxxxxxxxx",
                                                 sagemaker_session=sagemaker.Session(boto_session=session))
predictor.serializer = _TFJsonSerializer()
predictor.deserializer = _TFJsonDeserializer()
predictor.content_type = "application/json"
predictor.accept = "application/json"

mnist = input_data.read_data_sets("./tmp", one_hot=True)
data = mnist.test.images[0].tolist()
tensor_proto = tf.make_tensor_proto(values=np.asarray(data), shape=[1, len(data)], dtype=tf.float32)

predictor.predict(tensor_proto)

このスクリプトではMNISTのテストデータを./tmpにダウンロードして、そこから読み込み、
そのうち一枚の画像が分類されるクラスをエンドポイントを使って推論しています。

今回はこのコードはノートブックインスタンス上で実行していますが、
もしローカルで実行する場合は、Sessionインスタンスを作成する際に、
access_keyなどの設定が必要になります。

結果としてこのようなレスポンスが得られます。

{u'outputs': {u'classes': {u'dtype': u'DT_INT64',
   u'int64Val': [u'2'],
   u'tensorShape': {u'dim': [{u'size': u'1'}]}},
  u'probabilities': {u'dtype': u'DT_FLOAT',
   u'floatVal': [3.631196159403771e-05,
    1.6551141015952453e-05,
    0.9999462366104126,
    1.1570033819907621e-08,
    9.113807664107298e-08,
    9.864007527449203e-11,
    1.1561480306454541e-07,
    4.915287621365394e-10,
    6.602479629691516e-07,
    4.94243757032109e-10],
   u'tensorShape': {u'dim': [{u'size': u'1'}, {u'size': u'10'}]}}}}

このレスポンスのoutput.classes.int64Valの値が実際の推論結果となります。
今回の例では、floatValの値が各クラスに所属する確率を表しています。
このレスポンスでは、floatVal[2]の値が最も大きいので、この画像はクラス2に分類するべきだと判断できます。

まとめ

今回はAWS SageMakerを画像分類のモデルとエンドポイントを作成し、
実際にリクエストを投げて推論してみました。
このようにSageMakerを使うと、環境構築いらずで機械学習のモデルを作成できて、
さらにそれを簡単にエンドポイントとしてデプロイできます。
これによって、アルゴリズムの構築に集中できるようになるので、とてもいいサービスだと思います。
それではまた。

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


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

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

データ分析案件で時系列データの異常検知に挑戦したいエンジニアWanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

社内の技術イベント「LTxRT」の振り返り会を行いました!!

皆さんこんにちは。
アドベントカレンダーの執筆を終えた@です。
兎にも角にも無事に遂行できたことにほっとしております。

本日は社内の技術イベント「LTxRT」の振り返り会を行いました。
LTxRTは、"Lightning Talk x Round Table"の略で、いわゆる社内LT大会のようなものです。
ただし、持ち時間は質疑やディスカッションも含めて、1人30分程度です。
プロジェクトで使った技術の共有や、発表者の興味があって伝えたい技術の共有をしています。

社内にはフロントエンドエンジニア、バックエンドエンジニア、機械学習エンジニアetcが
在籍し、各々が異なるプロジェクトで仕事をしているので、その分発表されるネタも様々です。

例えば、プロジェクトで取り組んだ性能改善の話や・・・

acro-engineer.hatenablog.com

最新のカンファレンスに行って面白かった話のフィードバック・・・

acro-engineer.hatenablog.com

そして、JUnitの新しい機能の紹介もありました。

acro-engineer.hatenablog.com

このように社内で多種多様な発表がLTxRTでされています。
※当ブログへのリンクですが、この内容はLTxRTでの発表もされています!

このLTxRTですが、面白い・最新の技術を共有すべく、毎週開催しています。
LTxRT以外にもいくつか社内勉強会があるのですが、
LTxRTだけでも、2017年は34回開催し、今年の発表者は34名(ユニーク発表者数)にも及びます。

正直、書いている私ですらここまで継続したのが凄いと思っています。
ある程度回数を重ね、年末といった季節柄もあり、振り返り会が企画されて、
技術が好きな社員が集まりました。

f:id:acro-engineer:20171226214918j:plain:w480,h320

今年までの良かった点・悪かった点を振り返り、来年からは新しく取り組むことも決まりました。
そのため、これまでの面白いLTxRTを更に面白く・良くして続けていくことを考えています。

え、これまでブログでLTxRTの紹介が殆どなかったって?
せっかくの面白い技術や内容がLTxRTで発表されているので、
ぜひ、皆様にお届けしたいといった意見が振り返り会の中でもありました。
そのため、今後はLTxRTの様子もこのブログでお届けしたいと思います。

ではまた、来年もT3ブログをよろしくお願いします!

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


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

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

世の中に誇れるサービスを作りたいエンジニアwanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

KubernetesをElastic Stackで可視化する。

皆さんこんにちは
あっという間に年末になってびっくりしている@です。

本記事は「Elastic Stack」のアドベントカレンダー19日目の記事です。

qiita.com

アドベントカレンダーで本日公開しようと思ったら、
偶然にも公式のアドベントカレンダーもKubernetesです。びっくりです。

discuss.elastic.co

さて、KubernetesのメトリックをElastic Stack 6.0から標準の機能で取得できるようになりました。
しかし、Kubenetes初心者である私が試しに使ってみると非常に苦労したので、その戦いの記録を掲載します!!!

Kubernetesを可視化することの利点

Kubernetesは複数のコンテナを操作するオーケストレーションツールです。
Elastic Stackを使うことで、Kubernetesから得られるメトリックを取得し、可視化できます。

利点としては、dockerコンテナをオーケストレーションするKubernetesでは
やっぱり、ログ収集をやりたくなりますよね?
それをElastic Stackで実現したら、さらにdockerコンテナの情報や、Kubernetes自身の情報(PodやServiceなど)などの
メトリクス情報を集めて、Kibanaで可視化されると便利ですよね?

そんな便利なことの実現の第一歩として、今回、Kubernetesの可視化に挑戦しました。

実際にやってみた。

Kubernetesの準備

KubernetesのElastic Stack監視をするために
minikube(0.23.0)、kubectl(1.8.0)、kube-state-metrics(1.1.0)のインストールが必要です。
OSによってインストール方法は異なりますが、まずはそれらをインストールしましょう。

インストール方法は次を参考にしてください。

■minikube
github.com

■kubectl
kubernetes.io

■kube-state-metrics
github.com

Elastic Stack 6.0による可視化

Elastic Stack6.0で可視化をします。
Kubernetesのメトリックの取得方法ですが、
MetricbeatのmoduleにKubenetesが標準で追加されたので、それを使用します。

まずは、設定ファイルをKubernetes用に書き換えます。

metricbeat.modules:
# Node metrics, from kubelet:
- module: kubernetes
  metricsets:
    - node
    - system
    - pod
    - container
    - volume
  period: 10s
  hosts: ["http://localhost:8001/api/v1/proxy/nodes/minikube:10255/stats/summary"]
# State metrics from kube-state-metrics service:
- module: kubernetes
  enabled: true
  metricsets:
    - state_node
    - state_deployment
    - state_replicaset
    - state_pod
    - state_container
  period: 10s
  hosts: ["http://localhost:8001/api/v1/namespaces/kube-system/services/kube-state-metrics:8080/proxy/metrics"]

Elasticsearch, Kibana, Metricbeatを起動します。Metricbeatの起動コマンドは次の通りです。

./metricbeat -e -c metricbeat.yml

Discoverを確認して、投入できているか確認しましょう。

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

非常にシンプルで簡単ですね。
しかし、Kubernetes初心者にとって、意外と正しく取得先を
設定することが難しかったので、その点をこれから紹介します。

hostsについて

意外なハマりポイントとして、「hostsに書くべき項目は何か」といったことです。
これがドキュメントにあまりに書かれておらず、
kubernetesをこれを機に勉強していた人間としてはかなり難しい要素でした。

Kubernetes moduleはkubeletとkube-state-metricsのAPIからメトリックを取得します。
そのため、どちらもAPIの然るべきURL(これを探すのが大変)にアクセスしなければなりません。

Kubernetesのコンテナへアクセスするために、プロキシが必要です。Kubernetesのプロキシの起動は次の通りです。

kubectl proxy

この後、kubeletとkube-state-metricsのurlの探し方を説明します。

kubelet

kubeletのURLは、次の通りです。
URL内のminikubeと記載されている箇所はnodeの名前(NAME)を示しています。

http://localhost:8001/api/v1/proxy/nodes/minikube:10255/stats/summary

$ kubectl get node --all-namespaces=true
NAMESPACE   NAME       STATUS    ROLES     AGE       VERSION
            minikube   Ready     <none>    22h       v1.8.0
kube-state-metrics

次にkube-state-metricsから取得します。

kube-state-metricsをインストールすると、podとserviceが起動します。
serviceの一覧の「kube-state-metrics」の/metricsへアクセスする必要があります。
プロキシを用いたアクセスするurlがKubernetesのバージョンで異なっているので
アクセス先を特定するのに苦労しました。

$ kubectl get service --all-namespaces=true
NAMESPACE     NAME                                  TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
default       banking-ladybird-kube-state-metrics   ClusterIP      10.0.0.201   <none>        8080/TCP            6h
default       edgy-camel-kube-state-metrics         ClusterIP      10.0.0.14    <none>        8080/TCP            6h
default       kubernetes                            ClusterIP      10.0.0.1     <none>        443/TCP             22h
default       snug-sasquatch-kube-state-metrics     ClusterIP      10.0.0.151   <none>        8080/TCP            6h
default       spark-master                          ClusterIP      10.0.0.20    <none>        7077/TCP,8080/TCP   22h
default       spark-ui-proxy                        LoadBalancer   10.0.0.192   <pending>     80:32499/TCP        22h
default       zeppelin                              LoadBalancer   10.0.0.117   <pending>     80:31618/TCP        22h
kube-system   kube-dns                              ClusterIP      10.0.0.10    <none>        53/UDP,53/TCP       22h
kube-system   kube-state-metrics                    ClusterIP      10.0.0.133   <none>        8080/TCP            7h
kube-system   kubernetes-dashboard                  NodePort       10.0.0.157   <none>        80:30000/TCP        22h
kube-system   tiller-deploy                         ClusterIP      10.0.0.237   <none>        44134/TCP           6h

この中からkube-state-metricsのserviceを発見し、urlを作成することで、アクセス可能です。
URLの作り方は次の通りです。
http://localhost:8001/api/v1/namespaces/[namespace]/services/[service:port]/proxy/metrics

■例
http://localhost:8001/api/v1/namespaces/kube-system/services/kube-state-metrics:8080/proxy/metrics

可視化

最後にデータをKibanaのダッシュボードで可視化しましょう。

Kubanetesのダッシュボードですが、Metricbeatのmodulesに標準で搭載されています。
標準ダッシュボードの準備方法ですが、Beatsのバージョン5系と6系でsetupの方法が少々異なっています。
「./scripts/import_dashboards」がなくなり、Metricbeatの実行ファイルを利用します。
metricbeatからindexとダッシュボードを次のコマンドで設定します。

./metricbeat setup

後はKibana上で「 [Metricbeat Kubernetes] Overview」へアクセスします。
アクセスすると次のダッシュボードが見られます。

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

おっ、なんだかそれっぽいですね!。

最後に

ログ集約していくとElasticに情報集めたくなり、
Kubernetesも一緒に簡単にみられるようになるのはよいですね!
どんどん使っていきたいです!

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

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

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

データ分析基盤Elasticsearchを使い倒したいエンジニア募集! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

Elastic{ON} TOUR Tokyo 2017に参加・出展しました

こんにちは、 @です。

昨日、Elastic{ON} TOUR Tokyo 2017に参加してきました。

会場は満員で、Elastic Stackに対する期待の高まりを感じます。
f:id:acro-engineer:20171214100139j:plain:w500

ちなみに、昨年の様子はこちらです。
acro-engineer.hatenablog.com

Elastic社のCountry Manager藤田さんからのご挨拶の後、CEOのShay Banonさんによる基調講演で開幕。
Elastic Stackの進化は速いと感じていたのですが、Elastic社は2012年に創設されて以来、現在700人を越えたそうです。
昨年から今年にかけて、Prelert社joinによるMachine Learning機能の追加、Opbeat社joinによるAPM機能の追加があり、すごい勢いで拡大しています。

そういった機能追加以外でも、使いやすさには力を入れているようです。
個人的には次の点に興味を惹かれました。

  • Kibana画面からlogstashのPipelineをコントロール
  • Kibanaの表現力向上(先日、CanvasのTechnology Previewが登場しました)
  • Machine Learning機能の充実化

特に、ユーザ事例に関する講演では、3つ中、2事例でMachine Learningを利用していて、実用性の高さを感じました。


Acroquestはスポンサーとして出展しました!
f:id:acro-engineer:20171215112559j:plain:w250
※並び順はアルファベット順だと思います^^;

こちらは、Shay Banonさんに当社のデモを見せて、ディスカッションしている様子です^^
f:id:acro-engineer:20171215100325j:plain:w500

Acroquestのブースでは、シャード設計に関するLTや、ENdoSnipe(https://www.endosnipe.com/)のデモを行いました。
以前は「Elasticsearchが何だが知りたい」という人が多かったと思いますが、もう少し突っ込んだ質問をする人が多くなっており、浸透してきているのを感じます。

今後も、この勢いでの発展に期待すると共に、私たちも頑張りたいと思います!

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

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

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

データ分析基盤Elasticsearchを使い倒したいエンジニア募集! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

Kibana Canvasを使ってみた

こんにちは。
@です😊

Elastic Stack 6.0 GAがリリースされて半月ほど経ちました。
皆さん既に使ってみたでしょうか?
このブログにも6.0の紹介記事(Elastic Stack 6.0GAがリリースされました。 - Taste of Tech Topics)があるので、是非そちらも読んでみてください。


さて、今回の記事の本題はKibana Canvasです!
3月にサンフランシスコで行われたElastic{ON}での発表から9ヶ月が経ち、
「これはお蔵入りコースか...😅」とも思いましたが、ついにtechnical preview版が公開されました!


....ということで、さっそく触ってみます!

バージョン情報など

  1. macOS High Sierra 10.13.1
  2. elasticsearch-6.0.1
  3. kibana-6.0.1
  4. logstash-6.0.1

目次

  1. 概要
  2. インストール
  3. ELKの起動
  4. データ投入
  5. Canvas作成
  6. まとめ

概要

今回は、logstashを使って、twitter上のつぶやきをelasticsearchに取り込み、Kibana Canvasを用いて可視化します。

インストール

まず手始めにELK(elasticsearch, logstash, kibana)をインストールします。

インストール手順はこの記事では割愛します。
基本的にはダウンロードしたものを解凍するだけなので簡単です。

私の環境では、拡張プラグインであるx-packもインストールしているので、同じ手順を試す場合はインストールすることをお勧めします。
(x-packが入っている場合のみ必要な手順には「x-pack時のみ」と書き添えます)

インストール手順がわからない方は、これらのリンクが参考になります。
Installation | Elasticsearch Reference [6.0] | Elastic
Installing X-Pack | X-Pack for the Elastic Stack [6.0] | Elastic


ちなみに私の環境では

sh elasticまわりの最新バージョンダウンロードして色んなプラグイン入れてくれる.sh 6.0.1

を実行すれば全てインストールが完了します。

ファイル名はさておき、Elastic Stackはバージョンアップの頻度が高いので自動化しておくと便利です。

ELKの起動

rpmやhomebrewなどでインストールした場合は、本記事と起動方法などが異なります。
適宜読み替えて実行するか、zipまたはtar.gzからのインストールをお試しください。
Windowsの方は以下コマンド内の "/" を "\"で読み替えて実行してください。

・elasticsearchの起動

さて、まずはelasticsearchの起動です。
解答したディレクトリ内で下記のコマンドを実行し、elasticsearchを起動します。

bin/elasticsearch

・デフォルトユーザーのパスワード設定(x-pack時のみ)

Elastic Stack 6.0以降では、
今までと異なりデフォルトユーザーのパスワードを自分で設定する必要があります。
elasticsearchを起動した状態でelasticsearchのディレクトリ内から下記のコマンドを実行します。
("auto"の部分を"interactive"にすると、自分でパスワードを決めることができます。)

bin/x-pack/setup-passwords auto

これで、"elastic"・"kibana"・"logstash_system" の3ユーザーのパスワードが設定されます。


Canvasのインストール

Canvasをインストールするには、kibanaのディレクトリ内で、下記のコマンドを実行します。
(最初のオプションをつけないとヒープのold領域が足りずにインストールに失敗するようです)

NODE_OPTIONS="--max-old-space-size=4096" ./bin/kibana-plugin install \
https://s3.amazonaws.com/download.elasticsearch.org/kibana/canvas/kibana_canvas-0.1.1653.zip

・kibanaの設定(x-pack時のみ)

kibanaの設定にelasticsearchの認証情報を登録します
kibanaディレクトリのconfig/kibana.ymlを下記のように書き換えます。

編集前

39 #elasticsearch.username: "user"
40 #elasticsearch.password: "pass"

編集後

39 elasticsearch.username: "kibana"
40 elasticsearch.password: "自分で設定したパスワード"

・kibanaの起動

kibanaディレクトリ内で下記のコマンドを実行します。

bin/kibana

起動したらブラウザでhttp://localhost:5601にアクセスしてみます。
(kibanaの起動時にプラグインの初期読み込みなどがあるので、起動に5分ほどかかる場合もあります。)

f:id:acro-engineer:20171211234945p:plain:w800
上の画像のような画面が表示されれば、正しく起動できています。
ユーザー名:elastic
パスワード:自分で設定したパスワード

でログインします。

f:id:acro-engineer:20171211235653p:plain:w800
ログインするとCanvasがインストールされているのがわかりますね😊

データ投入

Canvasは、サンプルのデータソースを提供しているため、機能を試すだけならデータを登録しなくてもすぐに試すことができますが、
それではつまらないので、今回は敢えてtwitterのデータをelasticsearchに取り込んでみます。


twitter applicationの登録

twitterAPIを使ってデータを取得するためには、Twitter Application Managementからアプリケーション登録をする必要があります(無料)。

登録に際してはこちらの記事を参考にさせていただきました。
yosiakatsuki.net


・indexの設定(mapping)

続いて、indexのデータ型などを定義します。
今回はKibanaのDev Toolsを使って下記の設定をしています。

PUT tweets
{
  "settings": {
    "index.mapping.total_fields.limit": 10000
  }, 
  "mappings": {
    "doc": {
      "properties": {
        "text":{
          "type": "text",
          "fielddata": true
        }
      }
    }
  }
}


ここで、

"index.mapping.total_fields.limit": 10000

はindexあたりのフィールド数上限を拡大するため

"fielddata": true

は、text型のデータをaggregationするために付与した設定です。

※両方とも、リソース消費や負荷などを抑えるための初期設定を解除する設定です。本来慎重に変更すべき設定値といえます。


・logstashの設定

logstash-6.0.1のフォルダ直下に、sample.confという名称で、下記の設定ファイルを作成します。

input{
  twitter{
    consumer_key => "xxxxxxxxxxxxxxxxxxxxx"
    consumer_secret => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    oauth_token => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    oauth_token_secret => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    keywords => "nowplaying"
    full_tweet => true
    languages => "ja"
  }
}
output{
  elasticsearch{
    hosts => "localhost:9200"
    index => "tweets"
    user => "elastic"       #x-pack時のみ
    password => "xxxxxx"    #x-pack時のみ
  }
}

この設定では、"nowplaying"という文字列を含む、日本語のツイートを取得し、elasticsearchに送信します。
index名は"tweets"になります。

それでは実際にlogstashを実行してみます。
logstash-6.0.1のフォルダ内で下記のコマンドを実行します。

bin/logstash -f sample.conf

(実はバージョン6.0からlogstashのpipeline管理が改善されたのでそちらも紹介したいのですが、それは別の機会に...)

※logstashを起動したコマンドラインツールのウィンドウはしばらくそのままにしておいてください。
(logstashを終了するとデータ投入が止まってしまいます)


・データの確認

logstashを起動したことで、elasticsearchにtweetが取り込まれているはずです。
kibana上で確認してみましょう。

まずはindex patternを作成します。
f:id:acro-engineer:20171212011823p:plain:w800

次にDiscoverで確認すると....
f:id:acro-engineer:20171212012641p:plain:w800
上手くツイートが取れています。
#JUDY AND MARYいいですねー😇(年齢がバレる)

これでようやくデータが入ったので、実際にCanvasを触ってみましょう!

Canvas作成

Canvasの構成

ざっとCanvasの作成画面を見てみると、
Canvasは基本的に3種類の要素で成り立っているようです。
f:id:acro-engineer:20171212013642p:plain:w800
粒度の大きい順に、「Workpad」「Page」「Element」となっています。
ちょうどMicrosoft Excelの「ブック」「シート」「オブジェクト」に対応しているイメージです。


elementsにも幾つか種類があるようですね。
作成時にはこれらのelementから必要な物を選択して、pageに追加することになります。
f:id:acro-engineer:20171212014454p:plain:w800

・elementを追加する

今回はまずMarkdownを例にとって試してみます。
Markdownを選択したところデフォルトのひな形となるelementが配置されました。
f:id:acro-engineer:20171212014740p:plain:w800

elementの内容を編集したい場合は、
画面右側のエディット画面から変更するか、
画面下部にある"Code"という部分をクリックして直接コードを編集します。
(画面の基本構成は他の種類のelementでも同様です)
f:id:acro-engineer:20171212015350p:plain:w800

フォントを変えたり背景色を変えたりもできます。
f:id:acro-engineer:20171212020204p:plain:w800


他のelementも追加してみます。
折角tweetを収集したのでdatatableを使ってみましょう。

datatableを追加すると、最初に表示されるデータはサンプルデータです。
indexしたデータを表示させたい場合は、
画面最下部の"Datasource"をクリック→"Change Datasource"→"elasticsearch"
と進んで、index名を設定してください。

f:id:acro-engineer:20171212020511p:plain:w800

f:id:acro-engineer:20171212020848p:plain:w800

tweetの内容が反映されました。
作ってて楽しくなってくるレベルですね。😁
f:id:acro-engineer:20171212021151p:plain:w800


従来のダッシュボードでは右上に固定されていたtime filterの配置も、
Canvasなら自由自在です!
f:id:acro-engineer:20171212021647p:plain:w600


特に驚いたのは散布図です。
今まではLine Chartで「散布図のような何か」を作るのがせいぜいでしたが、
下の写真にあるような散布図を簡単に作成できるようになりました。これは嬉しい😆
f:id:acro-engineer:20171212022122p:plain:w800


全画面表示やauto refreshもサポートしています。
f:id:acro-engineer:20171212023159p:plain:w800

こんな具合に、柔軟にelementを配置することができ、豊かな表現が可能になりました。
(@のデザインセンスについては何も言わないでください。)

まとめ

今までのKibana Dashboardはカスタマイズ性に乏しく、痒いところに手が届かないというのが正直な印象でした。
それだけに、Canvasの登場は多くのユーザーにとって大きな意味を持っていると思います。
デザインセンスがある人が使いこなせば、相当強力な可視化ツールとなるのではないでしょうか。

記事内で紹介できなかった機能も多々あります。
是非ご自分で一度触ってみてください😄

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

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

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

Elasticsearchを仕事で使いこみたいデータ分析エンジニア募集中! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

AWSサーバーレスを活用したAngularのWebアプリを作ってみた

こんにちは!エンジニア2年目、フロントエンドを勉強中のmiuraです。

この記事はAmazon Web Services Advent Calendar 2017の13日目の記事となります。

qiita.com

私は最近、Angularを使ったフロントエンド開発やAWSでのサーバーレス開発をしているのですが、
サーバーレスのWebアプリを構築するとなった際につまった部分がありました。

それは、
WebアプリをS3に、サーバーレスをAPI GatewayAWS Lambdaで構成すると双方のURLが違うため、
ブラウザではSame-Origin Policy (SOP)が適用されてエラーになってしまうことです。
これを回避するためにはCross-Origin Resource Sharing (CORS)の設定を行う必要があります。

今回は、そのCORSの設定を含めてAWS上で一通りの動きができるWebアプリを作っていきます。

全体構成

全体構成は以下の図のようなシンプルな構成を作ります。

f:id:acro-engineer:20171213020726p:plain:w500

サーバーレス

S3にWebアプリをアップロードし、静的ウェブホスティングを設定してWebアプリにアクセス出来るようにします。
そして、API Gatewayを通してAWS Lambdaから"Hello, World!"というメッセージを取得出来るようにします。

Angularを使ったWebアプリ

今回はサンプルとして、Angularの公式ページにあるQuick Startを引用します。

https://angular.io/guide/quickstart

このQuick Startはタイトルにある"Welcome to app!"の"app"部分がAngularによってinjectしているサンプルになっています。
そこで今回、この"app"の部分をAWS Lambdaから取得した"Hello, World!"に変えていきたいと思います。

ツール/ライブラリ

ツールとライブラリは以下のものを使います。

名前 バージョン
Node.js v6.5以上
Angular 5.0.0
AWS CLI 1.11.100
Serverless Framework 1.20.2
Python 3.6


それでは早速作っていきましょう。


サーバーレス

Serverless Frameworkのプロジェクト生成

Serverless FrameworkとはをYAMLファイルに簡単な記述を行えば、コマンド1つでAWS環境を構築できるツールです。
AWS CLIのセットアップが必要ですが、いろんなサイトで紹介されているので今回は割愛します。

以下のコマンドを実行すれば、簡単にPython3系用のサンプルプロジェクトが生成されます。

npm install -g serverless
serverless create --template aws-python3 --path my-serverless

AWS Lambda用ソースコードの作成

では、Serverless Frameworkで生成されたhandler.pyを編集して、
通信先としてのレスポンスを返すAWS Lambdaのソースコードを書いていきます。

このときに、注意すべきは冒頭でも書いたCORSの設定です。

CORSとは、データのアクセスを許可できるWebサイトに対してOriginを越えたアクセスを可能にするための仕組みで、
HTTPレスポンスヘッダに"Access-Control-Allow-Origin"として信頼するWebサイトのOriginを付与することでブラウザ側でアクセスが許可されます。

qiita.com

今回許可するWebサイトのOriginは後述するWebアプリを設置するS3のエンドポイントになります。

my-serverless/handler.py

import json

def hello(event, context):
    body = {
        "message": "Hello World!"
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body),
        "headers": {
            "Access-Control-Allow-Origin": "Webアプリを置いたS3のエンドポイント"  # CORS設定
        }
    }

    return response

API Gatewayの設定

次にHTTP通信の受け口であるAPI Gatewayの設定をします。

my-serverless/serverless.yml

service: my-serverless

provider:
  name: aws
  runtime: python3.6
  region: us-west-2
  apiKeys:             # APIキーを生成
    - api-key

functions:
  hello:
    handler: handler.hello
    events:
     - http:           # API Gatewayの設定
        path: hello
        method: get
        private: true  # APIキーを使用する
        cors: true     # API GatewayにCORSの設定をする

デプロイ

AWS Lambda, API Gatewayの設定ができたので、AWSにデプロイを行います。

cd my-serverless
sls deploy

上記のコマンドを実行するだけでAWSにデプロイが完了します。
AWSコンソールでAPI Gatewayを見ると、作成したAWS Lambda関数と紐付けて設定されていることが分かります。
またGETメソッドの他にOPTIONSが設定され、ここにCORSの設定が反映されます。

f:id:acro-engineer:20171213125802p:plain:w800


Angularを使ったWebアプリ

Angularプロジェクトの生成

以下のコマンドを実行して、Angularのサンプルプロジェクトを生成します。

npm i -g @angular/cli
ng new my-app

HTTP通信用サービスの作成

HTTP通信を行うためのAngularのサービスを作成します。
HTTP通信用のクラスとしてHttpClient, HttpHeadersをインポートして使用します。

my-app/src/app/app.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';

@Injectable()
export class AppService {
  constructor(private http: HttpClient) { }

  getMessage(callback: (msg: string) => void): void {
    // API GatewayとHTTP通信して、取得成功時にコールバックを行なう
    this.http.get('API GatewayのURL', {
      headers: new HttpHeaders().set('x-api-key', 'APIキー')
    }).subscribe(data => {
      callback(data['message']);
    });
  }
}

次にWebアプリのモジュールにサービスで使ったHttpClient, HttpHeadersのモジュールであるHttpClientModuleをインポートします。
また、作成したサービスAppService も登録します。

my-app/src/app/app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { AppService } from './app.service';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule        // HTTP通信モジュールをインポート
  ],
  providers: [AppService],  // 作成したサービスを登録 
  bootstrap: [AppComponent]
})
export class AppModule { }

そして、ページ表示の内容や動作を定義しているコンポーネントに作成したサービスを呼び出す処理と、
HTTP通信成功時の処理を記述します。

my-app/src/app/app.component.ts

import { Component } from '@angular/core';

import { AppService } from './app.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [AppService]
})
export class AppComponent {
  constructor(private appService: AppService) { }

  title = 'app';

  ngOnInit(): void {
    this.appService.getMessage(msg => {
      this.title = msg;  // HTTP通信成功時にタイトルに取得したメッセージを表示する
    })
  }
}

ビルド

以下のコマンドを実行すると本番環境用のビルドが行われます。
ビルド結果はmy-app/distフォルダに出力されます。

cd my-app
ng build --prod

S3の静的ウェブホスティング

AWSコンソールでS3を開き、バケットを作成します。
※今回はmy-web-applicationという名前で作成しています。

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

そして、その作成したS3バケットの中にビルド結果のmy-app/distフォルダ内のファイルをアップロードします。

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

次にバケットポリシーをブラウザから直接S3バケットの中のオブジェクトを取得出来るように設定します。
バケットのアクセス権限タブ内にあるバケットポリシーに以下を設定します。
Resourceには作成したバケットのARNを指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-web-application/*"
        }
    ]
}

最後にバケットのプロパティタブにあるStatic website hostingを選択します。
「このバケットを使用してウェブサイトをホストする」をチェックし、
インデックスドキュメントにindex.htmlを入力して保存します。

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

これにより、静的ウェブホスティングの設定画面の上部に表示されているエンドポイントにアクセスすると、
S3に保存されたWebアプリが表示されました。
また、表示される際にHTTP通信をして"Hello World!"が取得され、タイトルに表示されました。

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


まとめ

今回、ServerlessFrameworkやAngularを使ったサーバーレスのWebアプリの作成をしました。
その際、S3にあるWebアプリからAPI Gatewayを通してデータの受け渡しを行なうために、
サーバーレス側にCORS設定方法を紹介しました。

試しにサーバーレスの構成でWebアプリを作ってみたい人はぜひ参考にしてみてください。
それでは。

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


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

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

【データ分析】
データ分析案件で時系列データの異常検知に挑戦したいエンジニアWanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

分散システムとしての #Elasticsearch

こんにちは、 @ です。

こちらはDistributed computing Advent Calendarの12日目の記事となります。
qiita.com

Elasticsearch6.0も登場し、使っている方も増えつつあるのではないかと思います。
進化が速く、どんどん機能が増えていますが、基本的なところを押さえるのも重要と考えています。


先日、Acroquest社内勉強会で「Elasticsearch as a Distributed System ~分散システムとしてのElasticsearch~」と題して
Elasticsearchの分散システムとしての側面について話しました。

www.slideshare.net

資料の内容

  1. ノードの種類
  2. シャード
  3. インデクシングの流れ
  4. 検索の流れ
  5. Data nodeの障害検出
  6. Master nodeの障害検出


機能面ばかりに目が行ってしまうと、実運用しているクラスタでどのように大量データを処理するのか、耐障害性はどのように担保するのか、といった側面がおろそかになりがちです。
また、Elasticsearch以外にも分散システムは数多くありますが、当社の若手が最初に触れる分散システムはElasticsearchである事が多いです。こういった若手を対象に、分散システムの考え方を伝えたい。


そんな思いで作成した資料です。
単にインデクシング・検索するだけならオーバースペックな知識ですが、Elasticsearchの運用や問題解析等で必要となる知識で、分散システムを学ぶにも使えます。


「はじめて触る分散システムがElasticsearch」という方は是非、ご一読ください。
それでは、また~。

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
データ分析基盤Elasticsearchを使い倒したいエンジニア募集! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com