Taste of Tech Topics

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

Elastic{ON} 2018 San Francisco 始まります! #elasticonjp

みなさん、こんばんは。@です。

今は、Elastic社の年間通して最大のイベント、Elastic{ON} 2018 San Franciscoに参加すべく、社員4名でサンフランシスコに来ています!
今日はKeynoteが夕方16時から開催され、興奮冷めやらぬまま先ほどホテルに帰ってきたところです。

そんなKeynoteの内容は@に任せるとして、私はKeynote開始前までの様子をレポートします。

REGISTRATION

会場の入り口と受付からしてカッコイイ感じで、テンションが上がってきました。

f:id:acro-engineer:20180228160435j:plain:w400

受付でチェックインをしていると、スタッフの方が「Acroquestの人?会えて嬉しいわ♪」とEQの高い対応をしてもらいました ( w

f:id:acro-engineer:20180228160215j:plain:w400

受け取った名札がこちら。

f:id:acro-engineer:20180228160917j:plain:w400

いよいよ始まる、という感じです!!!

AMA(Ask Me Anything)

今日のメインはKeynoteなのですが、会場の方ではお昼からAMAとランチあるからおいでよ!という流れになっており、
私たちも早速会場に行ってみました。

開始早々だったので、まだこんな感じですが、この時間帯が終わる頃には人がいっぱいになっていました。

f:id:acro-engineer:20180228161205j:plain:w700

会場の中ではスポンサーブースやデモ、そしてAMAブースがあり、かなり賑わっていましたね。

f:id:acro-engineer:20180228161506j:plain:w400

こちらはつい先日公開されたVegaのデモ。こちらは特に人だかりができていました!

f:id:acro-engineer:20180228161401j:plain:w400


私の本命はAMAブースです。

Kibanaのある手法について質問したかったので、Kibanaのエキスパートいますか?とカウンターで訪ねて紹介してもらい、ノートPC片手に、実現方法について教えてもらいました。

英語の不安はありましたし、実際に話す中で、半分も(英語は)理解できていませんが、コードとホワイトボードメモを使えばなんとかなる、という感じです。
無事に目的の内容について教えてもらえたので、早速試してみよう!と良いスタートが切れました。

その後も構築面で聞きたかった話も教えてもらえました。

普段保守サポートでお世話になっているElasticのスタッフの方にも「困っていることありませんか?」と声をかけてもらい、助けて頂きました。
ありがとうございます!

そんなわけで、明日からは複数のセッションが開始になりますので、またその様子をお届けします!
Stay tuned!

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


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

 

Elastic APM + ML(Machine Learning) でwebアプリの異常検知をしてみる

こんにちは。
今年もバレンタインチョコがもらえなかった
新人エンジニアの佐々木@です。

Elasticsearch 6.0で Elastic APM が追加され、前回(※)6.0の時点で alpha 版の概要やセットアップ方法を説明しました。
(※前回については当社、樋口の記事を参照ください)

APMはアプリケーションのパフォーマンス状況を収集して、分析するソフトウェアです。
収集対象は、nodejs,flask,Django,Ruby on rails(beta),Rack(beta),Javascript(alpha)が今はサポートされています。

2018/02/10 時点の最新である 6.2では、Elastic APMもGA になり、
画面が改善されパフォーマンスの分析がしやすくなっています。

そこで、今回も動かして試してみたいのですが、樋口と同じでは芸がないので、
Elastic ML(Machine Learning)と組み合わせて異常検知を試してみたいと思います。

後でも説明しますが、APMで取得するデータは Elasticsearch の index に入っているので、
APMの結果を Alerting や Elastic ML の対象にすることが可能です。

今回の対象Webアプリは去年悔しい思いをしたISUCONの参照実装を使用したいと思います。
(※ISUCONについてはこちらを参照してください)
構成イメージとしてはこのようになります。
f:id:acro-engineer:20180211234231p:plain

今回はあくまで異常検知ですので、Webアプリのリクエスト数を見て
「いつものパターンと異なる場合」に検知させたいと思います。
(使用する題材はISUCONでも、チューニング目的ではありませんので、あしからず)

そこで、今回はElastic APMとMLを組み合わせて、Webアプリの異常検知をしてみます。

ISUCONのwebアプリにElastic APMを適用する

ISUCONの参照実装にElastic APMを適用させます。
まず、この環境ですが、Vagrantが配布されているので簡単にセットアップすることができます。
github.com

ISUCON7予選1台構成を今回使用します。
APMのagentを適用するためには、ソースコード(webapp/nodejs/index.js)の先頭に次のコードを挿入します。

var apm = require('elastic-apm-node').start({
  appName: 'isubata',

  secretToken: '',
})

試しに、Webアプリを起動させてベンチマークを回してみます。
Kibanaからこのようにリクエストの頻度やレスポンスにかかった時間などが見ることができます。

f:id:acro-engineer:20180129081415p:plain
f:id:acro-engineer:20180129081405p:plain

また、それぞれのパスへのリクエストの詳細を、トランザクションとしてみることができます。

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

KibanaからWebアプリのパフォーマンス情報を見ることができます。
冒頭で説明したように、APMで取得したデータは、 Elasticsearch の index に入っています。
デフォルトの設定の場合、apm-<バージョン番号>-<日付>という形の index で登録されています。

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

そのため、APMの結果にAlertingやMachineLearningを実行することが可能です。
次の章では、実際にElastic MLを使って、APMのデータに対して異常検知を行います。

Elastic MLで異常検知

まず、Elastic MLの対象にするために、Kibanaのindex-patternにapm-*を追加する必要があります。
そして、Elastic MLの設定としては、Single Metricの
 aggregation: high count
 bucket span: 15m
としました。

その次に、Elastic MLで異常検知するために、まずは正常なパターンを学習させます。
今回は、一定周期でアクセス数が増減するようなクライアントを用意して、
一定時間Webアプリにリクエストを発行します。
すると、こんな感じに正常な値の範囲を学習してくれます。

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

青い部分が正常な値の範囲です。本当は周期も学習させたかったんですが、学習データが足りなかったですね。
それでも、正常なリクエスト数の範囲を学習して収束するしていることがわかります。

それでは、大量にリクエストを発行して異常を起こしてみましょう。
するとElastic MLからは以下のように急増したアクセスを検知している様子が見えます。
f:id:acro-engineer:20180210115828p:plain

まとめ

Elastic APMとElastic MLを使って、Webアプリの異常検知にチャレンジしてみたところ、
無事大量のリクエストを検知することができました。

今回は、アクセス数から異常検知をしてみましたが、
レスポンスタイムなど、別の観点からでも異常検知できそうですね。
それではまた。

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


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

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

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

Elastic Stack 6.2がリリースされました

こんにちは@です。

ついにElastic Stack 6.2.0がリリースされました。
マイナーバージョンアップとは思えないほど、非常に多くの追加機能があったのでまとめ記事を書いてみます😊
また、このバージョンからJava9に対応しました!

6.2.0のリリースについては、Elastic社公式のブログも出ています。
英語の記事とはなりますが、是非読んでみてください。
Elastic Stack 6.2.0 Released | Elastic

概要

さて、今回の記事では追加機能を全て紹介することはできないので、
下記の項目に絞って紹介しようと思います。

  • APM
  • Machine Learning
  • Kibanaの新ビジュアライゼーション「Vega」
  • BeatsシリーズのMonitioring
  • Add Data Tutorial

APM

f:id:acro-engineer:20180207233341p:plain:w700

APM (Overview | Getting Started with APM [6.2] | Elastic)
は以前からbeta版として公開されていましたが、ついにGA版として公開されました。

今回のリリースで、利用できるエージェントの種類が増加し、RubyJavaScriptへの対応を開始しました。
もともとpythonとNode.jsに対応していましたが、より多くの言語で利用できるようになりました。
JavaScriptは使う機会は何かと多いので、なかなか嬉しい発表です。
RubyJavaScriptのエージェント自体はα版のようです。ご注意ください。
 
また、APMサーバおよびエージェントはオープンソースなので、自分でカスタマイズすることも可能です。
今後対応する言語やフレームワークが増えていくことでしょう。

APMの詳細な紹介は別の記事に譲ろうと思います。
α版を試した記事を過去に書いていますので、そちらもご覧いただければと思います。
acro-engineer.hatenablog.com

Machine Learning

こちらは、個人的には一番嬉しい機能かもしれません😇
 
これまでのMachine Learningは、
「特定の期間を検知の対象外とする」機能を備えていませんでした。
 
そのため下記のようなニーズが発生した時に、とても困りました。

  • 機器の異常を検知するjobで、メンテナンスのタイミングを対象外としたい。
  • 祝日を検知の対象外にしたい。

 
バージョン6.2からは、あらかじめ期間を指定して検知の対象から除外することが出来るので、より柔軟に運用することが可能になります。
後ほど試して別途記事にするかもしれません。

f:id:acro-engineer:20180207214453p:plain
(Elasticの投稿より)

Kibanaの新ビジュアライゼーション「Vega」

Kibanaに新しいビジュアライゼーションが追加されました。その名もVega
厳密には以前からプラグインとして存在していたのですが、6.2.0から標準として取り込まれました。
JSONで定義することで、棒グラフや散布図など、色々なビジュアライズが可能です。

f:id:acro-engineer:20180207204655p:plain:w700

特に散布図に関しては、現状リリースされている機能では実現が難しい部分なので、便利かもしれません。

※Kibana Canvasでも散布図の作成ができますが、そちらはまだtechnical preview版です。
 Canvasに関するブログも過去に書いたので、是非ご一読ください。
acro-engineer.hatenablog.com


Vegaに関しては既に試している方がいらっしゃるので、
こちら↓の記事をご覧ください。
qiita.com

BeatsシリーズのMonitioring

これも長らく待ち望んでいた機能です。
MonitoringはElastic Stack自身の稼働状況を監視するためのプラグインです。
既にElasticsearch, Kibana, Logstashには対応していたMonitoringでしたが、
Beatsだけは監視することができませんでした。

システムを運用するうえで、
データ収集ツールのスループットやリソースを監視するのは非常に重要です。
Beatsは多くの端末にインストールされるケースが多いので、
状態をKibana上で一括管理できる機能は重宝することと思います。

その他

ここまで書いた内容以外にも、
紹介しきれなかった機能改善が盛りだくさんです。
是非インストールして触ってみてください。

また、Elastic APMのWebinarが金曜日にあるようです。
Application Performance Monitoring with Elasticsearch | Elastic

これは見逃せませんね😊
興味のある方は是非ご視聴ください。

以上です。ご覧いただきありがとうございました。

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


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

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

 

Elasticsearch 6.1から追加されたMachine Learningの新機能を使ってみた。予測機能が面白いっ!

皆さんこんにちは。
@です。
最近、1年1年が早く感じられて、びっくりしています。

本題ですが、Machine Learningにバージョン6.1から追加された新機能を試してみました。
気がついたら様々な機能が追加されており、面白そうだったので、試した記録でブログを書いてみました!

本記事で、試した機能は次の4点です。

  1. Data Visualizer
  2. 予測機能
  3. Machine Learningのテンプレート設定
  4. Population Wizard

※本記事で利用しているElastic Stackのバージョン6.1.1です。

Data Visualizer

Machine Learningで適切に異常を検知するためにはデータの特性を
ある程度把握することが必要になります。
例えば、どのようなデータが少ないのか、データの分布がどうなっているかがあげられます。

従来のバージョンでは、データの特性を把握するために
KibanaのVisualizeやDashboardを手動で作成することもありました。
ちょっとした手間だったのですが、6.1の新機能「Data Visualizer」により、簡単にデータの概況を掴めるようになりました。

まず、Machine Learningに遷移し、「Create New Job」をクリックすると、処理の選択ができます。
この処理の中から「Data Visualizer」を選択します。

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

この「Data Visualizer」を選択した結果は次の通りです。

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

①のSearchでドキュメントを条件により絞り、②のFilterでKibana上で表示する項目を絞れます。
Filterを使うことで、ドキュメントの中から特定のデータの場合の調査も可能です。

表示されているグラフは、自動生成されています。
Metricsの他にFieldがありますが、このFieldは数値表現ができないデータ(文字列など)が該当します。

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

Machine Learningのテンプレート設定

バージョン6.1より、特定のデータであればジョブを簡単に設定できるようになっています。
現在はNginxのMachine Learning用のテンプレートが設定できます。
このテンプレートの設定は非常に簡単で、FilebeatのNginxモジュールを使えば、使用可能です。

Machine Learningの初期画面から「Create New Job」をクリックします。
処理を選択する画面に遷移しますが、この設定ができる場合に「Filebeat Nginx」が追加で表示されます。
(利用できない場合はそもそも表示されない。)

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

そして、job名のprefixとグループの指定をすれば、Machine LearningのJobを構築できます。
「Jobs」にJobが5種類含まれいます。「Create Jobs」をクリックすることで、作成されます。

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

実際に試した結果は次の通りです。ここまで、何も考えずにお手軽に作成できるところが良いですね。
※投入データはランダムデータです。

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

このテンプレート作成時にKibana Dashboardも作られます。便利ですね!
これらのDashboardはデータを詳細に確認したい場合に使えます。

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

予測機能

従来のMachine Learningでは、異常検知ができました。
バージョン6.1から異常検知で学習したモデルを使って、未来予測もできるようになりました。
過去のデータから、将来どのような傾向になりそうか、目視で確認できるようになりました。

予測には、公式サイトのTaxiのサンプルを試します。

ニューヨーク市のタクシー乗降データでMachine Learningを体験する | Elastic

まずは、サイトの手順通りにTaxiのサンプルを動かします。

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

従来までのバージョンと異なっているのは、画面の右上に「forecast」のボタンが追加されています。
この「forecast」をクリックし、予測の設定を開始します。

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

この設定画面ですが、Durationの設定が可能です。
Durationはどれだけ未来を予測するかといったパラメータです。

試しにDurationを「1w」に入力し、最後に、「➡」をクリックします。
予測の結果は次の通りです。黄色い部分が予測部分を示しています。

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

Population Wizard

最後にPopulation Wizardの紹介です。

かつての分析方法はSingle MetricとMulti Metricの2種類でした。(Advancedは除く)
Advancedで設定ができたPopulation Analysisの設定が簡単にできるようになりました。

Population Analysisは他とは違う傾向のデータを検知することができます。

例えば、複数のユーザがWebサイトにアクセスする場合に
大体のユーザは同じ傾向のアクセス(回数etc)になると思います。
このPopulationを利用した分析では、どのユーザが普通のユーザの傾向から異なるかを検出できます。

Population Wizardですが、Population対象のデータと
それを検出するための値(CPUの利用率など)の設定が基本です。
例えば、アクセス回数、もしくは、データ量が異なる市を発見する例は次の通りです。

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

後は通常のJobと同じようにCreate Jobをクリックすれば、実行します。
実行した結果は次の通りです。

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

とりあえず、出力しましたが、この解析結果が正しいのかが不明です。
そこでデータ側を確認するため、次のVisualizeを作成しました。

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

Jobの結果通り、他と大きくかけ離れたデータが存在します。
このJobは系列単体で異常検知ができません。
しかし、他と比較して異なるデータを検知できるので、今までと別の使い方により、より有効に活用できそうです。

最後に

お試しで触ってみたところ、意外に便利だなぁと思う機能が増えています。
サービス自体、どんどん簡単に面白い機能を使えるよう進化しているので、使っていきます!

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


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

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

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

社内技術イベントLTxRT紹介 ~Elasticsearch障害事例の共有を行いました~

こんにちは。本ブログには初登場のQAエンジニア@yuki_shiro_823です。

当社では、毎週木曜に社内で技術イベントを開いています。
昨日は、今年に入って初めてのLT形式でのイベント「LTxRT」を行いました!
昨年の振り返りなどの様子はこちら
acro-engineer.hatenablog.com


今回のテーマは「Elasticsearchクラスタ運用障害事例紹介」!
f:id:acro-engineer:20180201185956j:plain:w480
Elasticsearchは手元で簡単に使えますが、
クラスタを組んで運用しようとすると、設定やアーキテクチャに一工夫必要です。
もちろん、当社でも様々な調査や検証を行っています。

そこで今回は、実際のプロジェクトで起こった障害事例をもとに、
プロジェクトメンバから、
どのようにして原因を調査し、どう対処したかを紹介してもらいました。

参加した社員から
「この場合だとどうなるの?」とか
「うちのプロジェクトでもこういう問題があって、こう解消したよ」とか
質問や類似例の紹介があり、議論が盛り上がりました!
当初3人が発表予定だったのが、議論が盛り上がって2人分の発表になってしまったのはご愛敬。。
1人は別日程を設けることになりました。

障害事例や失敗事例を共有すると良い点は、
今後同じようなことをやるプロジェクトで参考にできて助かることですね!
一方、聞けば色々な知見が出てくるものの、
それらを一か所にまとめきれてないなど、課題も見えてきました。
こうして課題が見えてくると、対応も考えやすくなります。

今後も色々な社員が発表する予定なので、楽しみです。
それでは。

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


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

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

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

AWS CloudWatchのログキーワード監視ツールを作ってみた。

こんにちは。ブログは書くのは久しぶりの上田です。
今日は、AWS Lamdaを使ったCloudWatchのログのキーワード監視ツールを作成したので、
その紹介をしたいと思います。

GitHub - acroquest/aws-cloudwatch-logwatcher

モチベーション

唐突ですが、皆さんAWS Lambdaがメインロジックのアプリ監視はどうしているでしょうか?
私はLambdaアプリログの監視をしたいと考えたときに、
ちょうど良いサービス/ツールがなくて悩みました。

私の場合、以下のようなツールがほしいと考えていました。

  1. 予期せぬエラーログが出ているかどうか、定期的にメール通知したい。
  2. 指定するエラーログは正規表現で書きたい。
  3. 複数のロググループをまとめて1つの設定で監視したい。
  4. メール通知には、エラーログの内容を含めたい。

自作LambdaのアプリログはCloudWatchに出力され、
CloudWatchにはメトリクスフィルタやエラーを拾ってサブスクリプションで通知する機能があるのですが、
以下条件が目的に合いませんでした。

メトリクスフィルタの場合
  1. 通知するエラーログを正規表現で指定できない。
  2. 各ロググループ単位でしかエラー通知の設定ができない。
  3. エラーログの内容を通知の文面に含められない。
サブスクリプションでLambdaに通知した場合
  1. 通知するエラーログを正規表現で指定するには、ログ出力ごとに通知を処理する必要がある。
  2. 各ロググループ単位でしかエラー通知の設定ができない。
  3. 手間がかかる上に料金がかさむ(正確には計算していませんが、CloudWatch,Lambdaの値段と頻度を考えると)。

(もしかしたら私の勉強不足で、方法はあるかもしれません。)

結局、自作ツールでLambda上にPythonロジックを書き、
下記構成のツールを作成することで、
自分のほしかった監視機能を実現しました。

f:id:acro-engineer:20180130210813j:plain
AWS構成図

構成のためのServerless定義はこちらを参照。
※Serverless定義にメール通知先のSNSは記載されていないため、ツールを使うためには事前にSNSを手動で設定しておく必要があります。

ツールの動き

ツールはこんな流れで動くようにしました。

  1. Cronから呼び出されたParent Lambdaが、S3から前回実行時刻を取得する。
  2. Parent Lambdaが指定したprefixごとに子Lambdaを呼びだす。
  3. 呼び出された子Lambdaが指定prefixグループのログを収集し、前回実行時刻以降のログに絞り込む。
  4. ログ内容を整形し、SNSへ通知。

今回作製してみて、Lambdaのバッチ起動~他AWS機能の連携は、
非常に作りやすいと感じました。

今回はLambdaからS3、Lambda、CloudWatch、SNSAPIを呼び出して実現しています。
参考までにそれぞれ連携に使用したPythonAPIコール例を載せます。

LambdaからS3

        // S3バケット読み込み
        s3 = boto3.session.Session().resource('s3')
        bucket_name = os.environ['ALERT_LOG_BUCKET']
        bucket = s3.Bucket(bucket_name)
        key = os.environ['ALERT_LOG_KEY']
        object = bucket.Object(key)
        last_updated_time_str = object.get()['Body'].read().decode('utf-8')
        result = int(last_updated_time_str)
...
        // S3バケット書き込み
        object = bucket.Object(key)
        object.put(
            Body=str(last_exec_time).encode('utf-8'),
            ContentEncoding='utf-8',
            ContentType='text/plain'
        )

Dynamoに入れようか迷いましたが、
S3の方が安そうなので。。。
'text/plain'でepoc形式の時刻を素のテキストとして読み書きしています。
普段は'application/json'でjsonで扱うほうが多いかもしれません。

LambdaからLambda

        function_name = os.environ['FILTERED_ALERT_LOGS']
        lambda_client = boto3.session.Session().client('lambda')
        lambda_client.invoke(
            FunctionName=function_name,
            InvocationType='Event',
            LogType='Tail',
            Payload=json.dumps(request)
        )

InvocationTypeを'RequestResponse'にすることで同期、'Event'にすることで非同期処理になります。
今回は非同期並列処理がしたかったので'Event'に設定しました。

LambdaからCloudWatch

    // ロググループの取得
    client = boto3.session.Session().client('logs')
    response = client.describe_log_groups(
        logGroupNamePrefix=prefix
    )
...
    // ログストリームの取得
    response = client.describe_log_streams(
        logGroupName=group_name,
        orderBy='LastEventTime',
        descending=True,
        limit=limit
    )
...
    // ログイベントの取得
    logs = client.get_log_events(
        logGroupName=group_name,
        logStreamName=stream_name,
        startTime=start_time,
        endTime=end_time,
        startFromHead=True
    )

CloudWatchは実行Lambdaごとにロググループを、
ロググループの中にコンテナのライフサイクルごとにログストリームを、
ログ出力ごとにイベント情報を階層的に保持しています。

'logGroupNamePrefix'を指定してロググループを取得することで取得対称の分類を、
ログストリーム取得後にPython側で時刻のフィルタリングを、
イベント取得後にPython側で時刻のフィルタリングと正規表現での内容絞込みを行っています。

LambdaからSNS

    message = '整形したCloudWatchログ'
    topic_arn = os.environ['ALERT_LOG_TOPIC_ARN']
    subject = os.environ['ALERT_LOG_SUBJECT']

    sns_request_params = {
        'TopicArn': topic_arn,
        'Message': message,
        'Subject': subject
    }
    sns_client = boto3.session.Session().client('sns')
    sns_client.publish(**sns_request_params)

環境変数から取得したタイトルをつけて通知しています。

以上、自分で欲しかったツールを作成し、
目的とするLambdaのアプリログ監視をできるようになりました。

ここで作製したツールは、GitHubで公開しています。

もしかしたらもっと良い方法/サービスがあるかもしれません、
こうしたほうがいい、とかあればぜひコメントください。

ではでは

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWeb エンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

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