Taste of Tech Topics

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

自前の機械学習プログラムをSageMaker Python SDKを用いてAmazon SageMaker上で動かす

こんにちは。
3年目エンジニアの片岡@kamesansansansです。
最近AWS機械学習サービスであるSageMakerを使っています。
SageMakerは公式サンプルが充実していて、色々な機械学習を簡単に動かすことができます。
ただ、一通りサンプルを動かして、いざ自前の機械学習プログラムを動かそうと思うと、調べても資料があまりない!ということに気づきます。
試行錯誤しつつ自分で動かして、分からず結構苦労したので、そのノウハウをここにまとめました。

方法

SageMaker上で自前のモデルを作成する方法は2つあります。
①SageMaker Python SDKを使う
②自作のDockerコンテナを利用する

②は過去にこのブログで解説されているので、今回は①について解説します。
 http://acro-engineer.hatenablog.com/entry/2018/09/05/120000

①について、
PythonSDKを使って少しコードを変えることで自前のコードをSageMaker上で動かすことができます。
ChainerやTensorflowなど各フレームワークごとにやり方が決まっています。
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/frameworks.html
今回はChainerのコードをSageMaker上で動かしてみました。

大まかな流れ

下記の3つを準備して実行します。
1)学習させるデータ
2)学習を行うPythonソースコード
3)学習用のインスタンスを立ち上げ学習を起動するJupyter notebook

Chainerのexampleにあるimagenetを使った画像分類のソースコード(詳細は後述)を例に今回は説明します。
データセットはimagenetでは重いので、Caltech101を入力の型をあわせて使用しました。

1)学習させるデータ

まずはCaltech101のデータセットの準備です。ここはSageMaker関係ない一般的な部分ですね。
下記リンクの「画像の用意、教師データとテストデータ」を参考にデータのダウンロード、リサイズ、meanファイルの作成を行います。
https://qiita.com/rerere0101/items/fde1661df4a26f1d0626

下記のようなディレクトリ構成になるはずです。

(親ディレクトリ)   
 ├train.txt   
 ├test.txt 
 ├lobel.txt 
 └caltech101 
  ├accordion 
    image_0001.jpg 
    … 
  ├airplanes 
    image_0001.jpg 
     … 
  …


~~~
(下記は本データセットをSageMaker上で使用するときの特有の手順)
train.txt, test.txtは画像パスを下記のように変更します。
train.txtの中身

 /opt/ml/input/data/train/caltech101/accordion/image_0001.jpg 0 
 /opt/ml/input/data/train/caltech101/accordion/image_0002.jpg 0 

test.txtの中身

 /opt/ml/input/data/test/caltech101/accordion/image_0043.jpg 0 
 /opt/ml/input/data/test/caltech101/accordion/image_0044.jpg 0 

★注意点
 <画像のパス> <正解ラベル>
 という並びになりますが、データの呼び出しはS3からSageMakerインスタンスに呼び出された後に行われるため、パスはSageMakerインスタンスに置かれたときのパスを指定します。
 
 S3に置いた画像データセットは/opt/ml/input/data/以下にコピーされます。
 学習用の画像は/opt/ml/input/data/train, 評価用の画像は/opt/ml/input/data/test以下に置かれます。

 SageMakerインスタンスにどのようにコピーされるかの構成はこちらを参照ください。
  http://acro-engineer.hatenablog.com/entry/2018/09/05/120000
~~~


このセット(train.txt, test.txt, caltech101ディレクトリ)をS3に配置してください。

2)学習を行うPythonソースコード

Chainerのexampleにある下記のソースコードを使用してSageMaker対応を行いました。
https://github.com/chainer/chainer/blob/master/examples/imagenet/train_imagenet.py
名前はtrain_imagenet.pyですが、入力の型を合わせることによって、imagenet以外のデータセットでも使用することができます。
ただし、二箇所変更が必要です。

★変更箇所① S3のパスを学習を起動するJupyter Notebook側で指定するので受け口を作ります。
 下記をargparseで指定しているところに追記します。

    parser.add_argument('--output_data_dir', type=str, default=os.environ['SM_OUTPUT_DATA_DIR']) 
    parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR']) 
    parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAIN']) 
    parser.add_argument('--test', type=str, default=os.environ['SM_CHANNEL_TEST']) 

次の引数を指定できるようにします。
・output_data_dir グラフ等生成物の出力ディレクト
・model-dir モデルの出力ディレクト
・train train画像のディレクト
・test test画像のディレクト

これに伴い、ソースコード内で同様の働きをしているもの(元々ソースコード内にあるtrainやval等)は書き換えます。

★変更箇所② データセットを指定する部分を変更します。
最初にargs.trainを呼び出す前(165行目より前)、に下記を入れます。

    # data setting 
    train = args.train + "/train.txt" 
    test = args.test + "/test.txt" 

学習を起動するJupyter NotebookではS3のバケットまでしか指定できないので、それ以降のファイル指定・操作は ソースコード側で行う必要があります。
ソースコード内でargs.trainやargs.test(元々はargs.val)で渡しているものはそれぞれtrain, testに書き換えましょう。

3)学習用のインスタンスを立ち上げ学習を起動するJupyter notebook

 https://github.com/awslabs/amazon-sagemaker-examples/blob/master/sagemaker-python-sdk/chainer_cifar10/chainer_single_machine_cifar10.ipynb
 上記を参考に作成します。

学習用のノートブックインスタンスには、以下のように配置します。
呼び出される側のプログラムはすべてsrcフォルダの中に入れておいてください。

学習起動Jupyter notebook 
src/
 └学習を行うPythonのソースコード

学習起動Jupyter notebookには下記のように書いていき、順に実行していきます。

sagemaker.session()の作成と、ロールの取得を行います。

import sagemaker
from sagemaker import get_execution_role
sagemaker_session = sagemaker.Session()

# Get a SageMaker-compatible role used by this Notebook Instance.
role = get_execution_role()

バケットとその後のパスを指定します。
imagenet_sagemaker以下に学習用データを置きました。

bucket = '<your-bucket-name>'
prefix = 'sagemaker/imagenet-chainer'
S3_INPUT_PATH = 's3://{0}/{1}/'.format(bucket, prefix)
print(S3_INPUT_PATH)

estimaterの作成を行います。
呼び出すプログラムをentry_pointで、プログラムを入れたフォルダをsource_dirで指定しました。
source_dirで指定したフォルダがそのままSageMakerインスタンスにコピーされます。
(なので、ソースコード以外にもSageMakerインスタンスにコピーしたいものがあればsource_dirに入れておけば、一緒にコピーすることができます。)
train_imagenet.py内で元々指定するようになっている引数はhyperparametersで指定します。

import subprocess
from sagemaker.chainer.estimator import Chainer

instance_type = 'ml.c4.xlarge'

chainer_estimator = Chainer(entry_point='train_imagenet.py', role=role, 
                            source_dir="src", 
                            train_instance_count=1,  
                            train_instance_type=instance_type, 
                            framework_version='5.0.0', 
                            hyperparameters={'arch': "mobilenet"}) 

学習を実行します。

train_input = "s3://20190225-sagemaker/sagemaker/imagenet-chainer/" 
test_input = "s3://20190225-sagemaker/sagemaker/imagenet-chainer/" 
chainer_estimator.fit({'train': train_input, 'test': test_input}) 

これで自前の機械学習コードをSageMaker上で動かすことができました。

ポイント

①データはすべてS3にあげる。パスを指定する場合はSageMakerインスタンスにコピーされた後の構成を意識する
②学習を行うソースコードはSageMakerの仕様に合わせる。
③ノートブックインスタンスからSageMakerインスタンスに送る学習用ソースコードは別ディレクトリにまとめておく。

まとめ

自前のソースコードをSageMaker上でPython SDKを用いて動かしてみました。
SageMaker特有の仕様もあり、最初は分からない部分もありましたが、分かってしまえば簡単に実行できるものだな、と思います。
この記事ではChainerを例に説明しましたが、ポイントを押さえて書くことで、他のフレームワークでも応用できると思います。

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


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

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

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

Elastic{ON} TOUR Tokyo 2019に参加してきました!!

こんにちは。ノムラです。
昨日虎ノ門でおこなわれたElastic{ON} TOUR Tokyo 2019に参加してきました!
www.elastic.co

Elastic{ON} Tourは、世界各地を回って行われるElastic最大のカンファレンスで、
今回も様々な最新情報や、ユーザー事例など盛りだくさんでした。

また、アクロクエストはスポンサーとしてブース出展させていただきました!

イベント概要

大まかなコンテンツは下記の通りです。

  • 基調講演
  • 午前のセッション
    1. Elastic Stackの進化
    2. ロギング、メトリック、APM:The Operations Trifecta
    3. _searchをシンプルに:Elastic App Search
  • ランチ(LT)
  • 午後のセッション
    1. Elastic Stackを使ったエンドツーエンドのセキュリティ分析
    2. Canvasで作成するリアルタイムなインフォグラフィック
    3. アーキテクチャーのベストプラクティスと"落とし穴"
    4. 機械学習ディープダイブ
  • ユーザー事例紹介
    1. Elasticを利用したリコーグループのIT基盤の見える化
    2. 水環境の持続を支えるプラットフォーム Water Business Cloudにおける活用と今後展開
  • クロージング
    1. Elastic サポート徹底活用術
    2. 閉会&ハッピーアワー

この中から個人的に面白い!と思ったものをいくつか紹介していきたいと思います。

基調講演

このパートは大まかには下記の3点

  1. 各種ソリューションの話
  2. Cross Cluster Search(CCS)、Cross Cluster Replication(CCR)の話
  3. Security機能の一部がBASICライセンスで利用可能になった話

が中心でした。

各種ソリューションの話

ここでのソリューションとは、Elastic社が各ユースケース毎に提供している機能、または追加アプリケーションのことです。
Logs、Infra UI、APM等のViewをKibanaに一元化することで、Elasticsearchの主要なユースケースであるログ分析を統合的に可視化できるようになり、「Observability」が高くなったという話でした。
個人的には、以前Logs + Infra UIのソリューションがあれば、と思うことがあったためはやくバージョンアップして効果を実感してみたいと思いました。

Cross Cluster Search(CCS)、Cross Cluster Replication(CCR)の話

複数クラスタをまたいで検索することが可能なCross Cluster Search(CCS)と、別クラスタにデータをレプリケーションするCross Cluster Replication(CCR)についての話でした。

機能の概要や、想定するユースケースについて、Elasticsearchの松本氏がデモを交えてプレゼンしました。

CCRについては以下のブログが詳しいです。
www.elastic.co

今までは1つの大規模なクラスタですべてのユースケースに対応する必要がありました。
それがCCS、CCRの実現によりユースケース毎にクラスタを分割することが可能になります。

その中で、必要に応じてクラスタ間を横断で検索することもできるようになりました。

Security機能の一部がBASICライセンスで利用可能になった話

6.8または7.1以降ではSecurity機能の一部がBASICライセンスで利用可能になりました。
とくに認証機能はかなりニーズのある機能なので嬉しいです。

_searchをシンプルに:Elastic App Search

App Searchは、Elastic CloudのSaaS製品群のひとつで、検索エンジンをカスタマイズして簡単に実装することができます。
UIが非常に直感的で、同義語の設定を画面からおこなえるなど、拡張性も高い印象です。

この発表では特に検索スコアチューニングがGUI上から簡単に試行錯誤できるところに魅力を感じました。
検索アプリのシステム構成によってはスコアチューニングの度にアプリのビルドが必要になる場合があり、試行錯誤のハードルが高いことがあるためです。

LT

ランチ時間には、Elastic Certified Engineerである吉岡がLTをおこないました。
タイトルは「『Elastic Stack導入による検索高速化』~爆速を実現するための3つのポイント~」です。
[f:id:acro-engineer:20190530224149p:plain:w800

大盛況でした。やはり「検索を高速化する」というのは、課題感として持っているかたが多かったように思います。

Canvasで作成するリアルタイムなインフォグラフィック

Canvasの概要については、Kibana Canvasを使ってみた - Taste of Tech Topicsの記事をご参照ください。

Kibanaの創始者であるラシッドさんの発表でした。
f:id:acro-engineer:20190531075803p:plain:w600

Canvasは、チャートやマークダウン、画像などの要素を自在に配置・カスタマイズでき、
Kibanaで表現可能な幅が大きく広がります。(ラシッドさんのプレゼンテーションもCanvasで作られていました。)


ユーザ事例紹介

今回事例として

  1. Elasticを利用したリコーグループのIT基盤の見える化
  2. 水環境の持続を支えるプラットフォーム Water Business Cloudにおける活用と今後展開

の2つの発表がありました。

Elasticを利用したリコーグループのIT基盤の見える化

4TB/Dayの大量データを捌くデータ基盤を、少人数のチームで運用。
大企業であるほど、データ収集のハードルが高くなりがちですが、そこにチャレンジした面白い事例でした。

水環境の持続を支えるプラットフォーム Water Business Cloudにおける活用と今後展開

水回りの社会資本インフラシステムの監視・運用の話でした。

SLACanvasで可視化してエンドユーザからもサービスの状態を見ることができるところが面白いと思いました。
f:id:acro-engineer:20190531081632p:plain:w600

ハッピーアワー

AMAで質問したり、色々な方と話をさせてもらいました。
個人的にはAMAでApp Searchの仕組みの話を聞くことができて、良かったです。


集うElastic Certified Engineer


まとめ

EasticStackの各種ソリューションがかなりの速度で充実してきたことを改めて感じました。
今後も最新情報をキャッチアップし続けていきたいと思います。

(あとラシッドさんを生で見れたの嬉しかったです)
f:id:acro-engineer:20190530230209p:plain:w600

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

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

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


世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

JAWS-UG横浜にて「DevOps」をテーマに発表してきました。

こんにちは。クラウドサービス開発エンジニアの@kojiisdです。

先日私が所属するJAWS-UG横浜というAWSユーザグループの勉強会にて、DevOpsをテーマに発表してきました!

jawsug-yokohama.connpass.com

今回は、昨年のAWS re:Inventにて発表された新サービスAWS Amplify Consoleについて話をしてきました。

AWS Amplify Consoleは、継続的デリバリーを簡単に実現できるサービスとして注目を集めていますが、新しいサービス故まだまだ深堀りした紹介が少なく、実際に案件で利用することを前提とした際、開発者から見てどのくらい便利になるサービスなのか、という点に不明点が残ります。そこで、今回はAWS Amplify Consoleを実案件を見据えて利用してみた所感を共有させてもらいました。


テーマがDevOpsということもあり、運用やテストチームなどの方々の参加が多かったようですが、開発者の気持ちを盛り込んだ発表に共感を得られたようで、よかったです。
今後もこのような新サービスを試し、個人利用ではなく実際の開発案件を見据えた際の実際や、利用してみた所感、ノウハウなどを共有できたらと思います。


詳しくはぜひスライドをご覧ください。



それでは!

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

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

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

顧客のビジネスをインフラから加速するエンジニア募集! - Acroquest Technology株式会社のインフラエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com

KarateでElasticsearchの状態をチェックする

こんにちは、Elastic Certified Engineerのshin0higuchiです😊

みなさん、Elasticsearchの正常性確認はどうしていますか?

実際にサービスを運用するとなると、一口に「正常性確認」と言っても色々な観点でのチェックが必要です。
システムの死活、リソースの状態、パフォーマンス、検索queryの妥当性などなど......

Monitoring+Alertingで監視したり、その他の監視ツールやelasticのsupport-diagnosticsを使ったり、人によってはcurlコマンドで確認するシーンもあるのではないでしょうか?
ただ、個人的には、観点が多いと色々なツールを組み合わせたチェックが必要になり、多少手間を感じていました。


そこで、今回は上司に教えてもらったKarateというテスト自動化ツールが、Elasticsearchと相性が良さそうだったのでしてみました。

そもそもKarateとは?

Karateは、CucumberというBDD(ビヘイビア駆動開発)を行うためのフレームワークをJavaVM上に移植したもので、Gherkinの文法を自然言語に近い形で記述できるユニットテストツールです。

こちらの@takanorigさんのQiita記事を読めば大体わかります。
qiita.com

個人的に感じているメリットとしては、

  1. シナリオベースのテストが簡単にかける
  2. 学習コストが低い
  3. JSONが扱いやすい

といったところです。

実際にやってみる

KarateでElasticsearchのStatusなどをチェックしてみましょう。
今回は一例として

  1. 想定する設定と実際のクラスタ設定の差分がないか?
  2. indexの検索などが正常に行われるか?
  3. 操作が特定時間以上かかっていないか?

などを確認します。

細かい説明は前述のQiita記事を読んでもらうとして、
Karateでは*.featureというファイルにテストしたい内容を記述します。
フォルダ構成は下記のようになっています。

src
├── main
│   └── java
└── test
    ├── java
    │   ├── health
    │   │   ├── HealthRunner.java
    │   │   └── health.feature
    │   ├── karate-config.js
    │   └── logback-test.xml

テストケースはhealth.featureに記述していきます。

設定例

Feature: Health Test

Background: 
  * url 'http://localhost:9200'
  * def index_pattern = 'kibana_sample_data_logs'
  * def total_nodes_num = 1
  * def data_nodes_num = 1
  * def master_nodes_num = 1

Scenario: clusterのステータスがgreen
  Given path '_cat/health'
  When method get
  Then status 200
  And print response
  And match response contains "green"

Scenario: kibana_sample_data_logs が検索可能
  Given path index_pattern + '/_search'
  When method get
  Then status 200

Scenario: indexの検索レスポンスが100msec未満
  Given path index_pattern + '/_search'
  When method get
  And assert responseTime < 100
  And print responseTime 

Scenario: cluster statsの結果が正常
  Given path '/_cluster/stats'
  When method get
  Then status 200
  And match response.nodes.count.total == total_nodes_num
  And match response.nodes.count.data == data_nodes_num
  And match response.nodes.count.master == master_nodes_num
  And assert response.nodes.os.mem.free_percent > 10

ざっくり説明すると、
Backgroundというセクションで URLやその他の変数を定義しています。こちらは外部ファイルから読み込むことも可能なようです。
そして、各Scenario内で実際にAPIを叩いてその結果を検証しています。

今回はシンプルなケースにしていますが、Scenarioという名前の通り、連続した実行も可能です。
例えば _cat/indicesを叩いて、その結果を使って各indexのstatsを確認するなど。

実行コマンド

mvn clean test -Dtest=HealthRunner

結果

Karateの実行結果は、コンソール出力されるだけでなく、見やすいHTMLを生成してくれます。

例えば下の結果を見れば、StatusがGreenであることを確認するテストが失敗しています。
内容を見ると、クラスタのステータスがyellowになっていることがすぐにわかりますね。
f:id:acro-engineer:20190529100428p:plain:w800

まとめ

APIステータスコードを確認する他、レスポンスのJSONを扱うのが容易で、サクサクとテストケースがかけるのは非常に便利だと感じました。

設定が手軽であることにくわえ、柔軟なテストケースを作成できることが魅力の一つ。
登録→検索→削除のようなシナリオを試験したり、プラグインのバージョンチェックなどもできるので、定期実行させておくと便利そうです。

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

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

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

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

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

JJUG CCCにボランティアスタッフとして参加しました!!

皆さんこんにちは。機械学習エンジニアのBuzz@move_fastestです!

先日5/18(土)に開催されたJJUG CCC 2019 Spring にAcroquestの若手3人でボランティアスタッフとして参加してきました!

f:id:acro-engineer:20190522001133p:plain
Acroquestの若手3人

JJUG CCCは日本Javaユーザグループ主催する国内最大のJavaコミュニティイベントです。
今回はなんと一般参加が1000人を超えたようです!!

f:id:acro-engineer:20190522001044p:plain
会場入り口

ボランティアに応募した経緯

社内活動に留まらず、社外活動も活発に行っていきたいと考えていた最中、社内SNSにてJJUGのボランティアスタッフの募集が流れてきました。

Javaは社会人になってから1年間学んできた馴染みのある言語でもあり、自分自身も外部のコミュニティを経験してみたいという思いから応募しました。

ボランティアの活動内容

・当日までの流れ
 基本的にやり取りは全てslackで行いました。
 自身が行うべき役割や当日の動きが事前に決められており、スレッドを確認するのみでした。

・当日の朝
 会場の設営準備を行いました。
 設営準備時間は1時間程度でしたが、事前に準備する項目が決められていたため、効率よく準備ができたと思います。

・セッション中
 セッション会場にて、イスが足りない会場にひたすらイスを分配しました。
 特に今年は来場者が多く、複数のセッション会場で同時にイスが枯渇するという事態が多発したため、大変でした。(でも楽しかったですw)
 
・セッション後
 会場の片付けし、懇親会の準備を行いました。

JJUG基調講演

今回のJJUG総会にて、弊社の谷本が JJUGのリーダーに就任しました。
就任直後でしたがすぐにJJUGの体制見直しを行ったりと、新リーダーとしてやりたいことがたくさんあり、うずうずしているようでした。
そして、総会後には今後JJUGをどんなコミュニティにしていきたいかを熱く語ってくれました!


このようなユーモアな発言をしておりますが、本当に凄い人です・・・・

f:id:acro-engineer:20190522152230p:plain
基調講演

懇親会

JJUG終了後の懇親会では、スポンサーであるLINE様よりお寿司を頂きました。

f:id:acro-engineer:20190522002316p:plain
懇親会のお寿司

お、おいしかった・・・・・

その他にも星野リゾート様によなよなエールの差し入れを頂くなど、このコミュニティの規模の大きさに驚きました。。。。

参加してみた感想

今回このような外部コミュニティにボランティアスタッフとして初めて参加しましたが、非常に楽しかったです。
なぜならば、ボランティアスタッフとして参加することで、「JJUG を自分達で創り上げる」という共通目標を持った仲間と活動をすることができ、当事者意識が生まれ、それらが会終了後の達成感を生んだからです。
このような達成感は講演を聞くだけの参加者には味わうことができない感覚だと思います。
今後もこのような会の運営に携わっていくような、運営側の活動をしていこうと思えた経験でした。

最後に

今回はボランティアスタッフとして運営に注力し、イベントを創り上げることに貢献することができ、Javaコミュニティを盛り上げるという達成感を味わうことができました。
しかしそれと同時に、私も一人のエンジニアとしてこのような大きな舞台で登壇したいという思いが芽生えました。

今後もこのような外部コミュニティで活動することを継続していくのに加え、登壇できるように技術のアウトプットを活発に行っていきます!!

f:id:acro-engineer:20190518202632j:plain
JJUG終了後

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

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

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

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com

JMeterでCSRF対策を突破して負荷をかける方法

こんにちは。QAエンジニアの@yuki_shiro_823です。

QAでなかなか難しいのが性能の検証ですね。私はJMeterをよく使っているのですが、JMeterシナリオを作成する際、シナリオの記録(※)を使うと記録時のcookieやtokenがそのまま使用され、シナリオの実行に失敗します。地味にはまるところなので、今回はそれを回避するための方法を紹介します。
※シナリオの記録については、こちらのサイトが参考になります。
mislead.jp

解決したい問題

JMeterでシナリオ記録を用いてシナリオ作成した際に、そのまま再生するとPOSTリクエストが失敗することがあります。cookie用の対策は入れているのになぜだと思って、ブラウザの開発者機能を使って該当リクエストを見てみました。すると、cookieの他にCSRF Tokenがヘッダーに含まれており、それがJMeterのPOSTリクエストには含まれていないのが原因でした。POSTリクエストが失敗するため、かけたい負荷がかかりません。

CSRFとは何ぞや

CSRFとはCross Site Request Forgeliの頭文字をとったものです。対象のサイトにログインしているユーザが、悪意を持って貼られたリンク等を踏むと、その気がないのに勝手に他のサイトの操作を強制されてしまうことです。詳しくはIPAのこちらのサイトをどうぞ。
www.ipa.go.jp

CSRFの対策としては、「フォームを表示するプログラムによって他者が推定困難なランダム値を hiddenフィールドとして埋め込み送信し、フォームデータを処理するプログラムによってそのランダム値がフォームデータ内に含まれていることを確認する(上記サイトより引用)」ことが行われます。ただ、JMeterのシナリオ記録では、このhiddenフィールドで埋め込まれたtoken情報は拾えませんでした。

解決方法

CSRF対策のtoken情報を取得し、POSTリクエストで送れるようにするには、
1. JMeter正規表現抽出機能を使って変数でtoken情報を保持
2. 保持した変数をPOSTリクエスト時にパラメータに追加
という手順を行います。
JMeterのシナリオは記録済み、という前提で説明します。また使用したJMeterのバージョンは5.0です。

1.JMeter正規表現抽出機能を使って変数でtoken情報を保持

まず、JMeterにてCSRF tokenが発行される画面のHTTPリクエストを選択します。該当のリクエストを右クリックし、追加→後処理→正規表現抽出を選択します。
追加された、正規表現抽出画面で以下のように設定します。

設定項目名
Apply to Main sample only
Field to check Body
参照名 csrf_token ※任意の名称を付けます。後ほど使います。
正規表現 <input name="token" value="(.*?)" type="hidden" />
※inputタグに含まれるtokenの値を抽出できるような正規表現を書きます。
例としてかいたものなので、正しい形式は対象サイトを開発者ツールなどで確認してください。
テンプレート $1$
一致番号(0でランダム) ー (特に設定の必要なし)
初期値 ー (特に設定の必要なし)

設定すると、このようになります。
f:id:acro-engineer:20190501193015p:plain:w600

2.保持した変数をPOSTリクエスト時にパラメータに追加

前の手順で、変数csrf_tokenにtokenの値を格納できたので、今度はそれをPOSTリクエスト時のパラメータに設定します。POSTリクエストを送っているHTTPリクエストを表示し、「リクエストで送るパラメータ」の「追加」ボタンを押下→行が追加されるので、ダブルクリックで編集します。

設定項目名
名前: _csrf
値: csrf_token ※正規表現抽出で設定した参照名を使います
URL Encode? チェックなし
Content-Type text/plain

設定すると、このようになります。
f:id:acro-engineer:20190501194918p:plain:w600

これで、CSRF対策で埋め込まれたtokenにも対応できるシナリオになりました!

自分がはまったので、回避する方法をまとめてみました。参考になりましたら幸いです。

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


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

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

mockmock Data Recorderを使って異常検知を試してみた!

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

こんにちは、IoTエンジニアのHaruka Yamashita (@YamaHaruka925) | Twitterです。

2019年4月にプレビュー版がリリースされた、mockmock DataRecorderを使ってみて、IoT PoCを担当する者としてグッときたポイントをご紹介します!

■mockmock DataRecorderとは

f:id:acro-engineer:20190412105107p:plain:w240

mockmockは、クラウド上に仮想デバイスを作成し、開発中のサーバーに疑似データを届けられるサービスです。

これまでは、
 ・データの階層構造や、値の型・生成方法などをコンソール上で入力するだけで、簡単に疑似データを設定することができる。
 ・仮想デバイスは、瞬時に動作や台数を変更できる。
 ・欲しいデータを、欲しいタイミングで、欲しい量だけ受け取ることができる。
という特徴がありました。

さらに、新たにリリースされたDataRecorderでは、人工的に作成した疑似データではなく、実際のデバイスから収集されるリアルなデータを用いて仮想デバイスを生成することができます。

1. mockmock DataRecorderを使えば、IoT PoCのよくある困った!を解決できるのでは?

1-1. IoT PoCでよくある困った!ポイント

PoCを実施する中では、次のような課題が発生することが多くあります。
私自身、IoT担当エンジニアとして、以下のような点を毎度自分で作成・加工するのに時間を取られています。。。

  • センサー/エッジデバイスの選定から始めると、分析までたどり着くまで時間がかかる
  • データを蓄積するのに、時間がかかる。
  • PoCの期間内に、想定する異常(部品の消耗など)が発生するとは限らない
  • データの取得間隔やデータ量、送信頻度など、パラメータを変更するのが大変
  • PoCで実施した数台での試行だけでは、最終的な可視化や分析の効果まで予測できない
1-2. mockmock DataRecorderを利用することで、IoT開発の「困った」を解決!

1-1. のような課題に対し、mockmock DataRecorderを利用すれば、データ収集や実データを基にした想定される異常波形を作成・加工する部分を簡単にできる!

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

  • 実際に測定したデータをmockmock DataRecorderに登録することで、疑似波形ではなく実際のデータをもとに、パラメータの試行錯誤ができる。
  • 通信方式が決定していなくても、csvファイルからmockmock DataRecorderに登録することができる。
  • 実際のデータをベースに波形加工をできるため、想定される異常波形など作りこむことができる。
  • 実際のデータをベースに仮想デバイスの台数を増やすことができるため、対象機器の種類や台数が増えた場合のシステム全体を想定できる。

2. mockmock DataRecorderを利用して実際のデータから想定される異常データを作成してみる

2-1. mockmock DataRecorderにデータを登録する

f:id:acro-engineer:20190412105741p:plain:w600

まずは、mockmock DataRecorderに実際のデータを登録します。
そのためには、
 ①mockmock DataRecorderにMQTTSでデータを送信する
 ②csvファイルをアップロードする
という二つの方法があります。
詳しくは、mockmockのドキュメントをご覧ください。

実際のデータを登録することで、仮想デバイスから送るデータを疑似データではなく実際のデータをそのまま利用することができるようになります。

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

2-2. 実際のデータをもとに、異常波形をつくりこむ

mockmockに登録した実際のデータを基に、異常波形をつくりこんでみましょう。
mockmock DataRecorderには、データ変換タイプとして以下の4種類が用意されています。

  • 無変換(コピー)
  • ノイズを付与する
  • ピーク値を付与する
  • データを間引く

今回は、「ピーク値を付与する」を利用して、異常データを作りこんでみました。

もともとの波形に対し、データの途中からピーク値をのっけることで想定外の振動が発生した状態を模擬します。
元データに対し、「どのデータ位置から、どのようなピーク値を、どれくらいの点数分、どれくらいの間隔をあけて」付与するかをJsonでパラメータ定義してあげます。

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

これだけで、もともとのデータに対し、ピーク値を付与することができます。
今回は、以下のように波形を変化させました。
mockmock DataRecorderにはデータ可視化機能も付いており、登録/変形させたデータをすぐに可視化して確かめることができます!

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

2-3. Torrentioへのデータ送信

今回、データ分析部分は当社Torrentioを利用しています。
mockmockからTorrentioにデータを送るための設定は簡単です。
mockmockのデータ送信先設定にTorrentioのMQTTエンドポイント設定を記入するだけ。

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

mockmockから送信するデータのリプレイヤー定義にて、2-1. で登録したDataRecorderのデータセットを選択します。

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

mockグループ設定にて、上で定義したデータリプレイヤーを利用するよう設定し、TorrentioのTopic名、MQTTクライアントIDを設定して準備完了。

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

あとは好きな台数の仮想デバイス(mock)を作成し、起動するだけ!
今回は、もともと1台から収集したデータを3台に増幅して送っています。

2-4. 異常検知してみる

mockmockから送信されたデータをTorrentioで異常検知してみます。

PoCとしてセンサーによりデータを測定しているのは1台ですが、mockmockにより実データを送信できる仮想デバイスを増やすことで、複数台で実施した場合の分析の見え方なども検討することができます。

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

※ここでは異常検知を実施しましたが、Torrentioでは、他にもIoTダッシュボードでのリアルタイム可視化やルールエンジンによる制御なども実施することができます。
 詳しくは、Torrentio Cloudについてをご覧ください。

3. まとめ

小さく始めることで、実施しようとしているIoTシステム開発が有効かどうかを見極めるためのPoC(実証実験)ですが、IoTシステムにはセンサー/ネットワーク/分析プラットフォームなど必要なステップが多く試行錯誤に時間がかかることや、監視対象の機器台数がスケールした場合の想定が難しいなどの課題がありました。
mockmock DataRecorderを利用することにより、「測定した実際のデータをもとに」仮想デバイスの台数を増やせたり、異常波形を創りこむことができます。
PoCでの試行錯誤がぐんとやりやすくなりますね!

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


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

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

www.wantedly.com