Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
AWS Lambda Meetup #0
Lambdaで作る
クローラー/スクレイピング
2014年12月22日
NRIネットコム 佐々木拓郎
✦ プロフィール
‣ NRIネットコム株式会社
‣ Twitter: @dkfj
‣ Facebook: takuro.sasaki
‣ blog: http://blog.takuros.net/
‣ 好きなAWSサービス: S3,SQS
自...
主にJAWSUG大阪で活動していました
(東京、初進出)
宣伝!!
本業と全く関係ないですが、
Rubyのクローラー本を書きました。
http://amzn.to/1lsJ5id
Rubyによるクローラー開発技法
巡回・解析機能の実装と21の運用例
NRIネットコム
✦NRIグループで主にWebビジネスを専門としている会社
‣ Webシステムの企画・設計・開発・運用
‣ デザインも重視していて、ディレクター・デザイナーも一杯
‣ スマホ/タブレットも得意
‣ もちろんAWSをはじめとするク...
AWS Lambda
サーバ不要で、イベントドリブンな
プログラム実行基盤
イベント
キック Lambdaで実行
インフラの在り方を根底から変える!!
(かもしれない)
今、注目の
アーキテクチャ
S3 Event Notifications
S3のオブジェクトに対してのイベントを検知し、
後続の処理を行う
イベント
Put,Post, etc
通知
SQSキュー
SNSトピック
Lambda Function
()
Lambdaで
クローラー/スクレイピング
クローラー/スクレイピング、
ご存知ですか?
クローラー
• Webを巡回するプログラムの総称
• ボット、スパイダー、ロボットなど様々な呼ばれ方がある
• 巡回戦略を練るのが一番の仕事
• スクレイピングやストレージの機能を持つことが多い
スクレイピング
• 取得したHTMLなどから、データを抜き出すこと
• 例えば、HTML中のAタグのリンク先を全て取得する
• 正規表現派と構文解析派が存在する
巡回&ダウンロード
スクレイピング
Lambdaクローラー全体像
1. キック
2. http
 リクエスト
   &
 ダウンロード 3. html保存
4. S3 Event Call
5. S3 getObject
6. Scrape
LambdaCrawler parse...
クローラーの実装
1. キック
3. html保存
LambdaCrawler
Node.jsの
httpクラスを利用
AWSの
s3 putObjectを利用
URL付与
2. http
 リクエスト
   &
 ダウンロード
スクレイピングの実装
4. S3 Event Call
5. S3 getObject
6. Scrape
parseHtml
S3 Eventで
Lambdaファンクション
の呼び出し
引数から、
該当のファイルを取得
cheerioという
...
ソース
https://github.com/takuros/lambda-crawler
解説は、こちら
http://blog.takuros.net/entry/
2014/12/14/053606
実装のポイント
• データダウンロード部とスクレイピング部の分離
‣Lambdaはタイムアウトがあり、一般のバッチと違う
    細かいエラー処理・例外処理をやってられない
‣ 単一処理に限定すると、エラー処理がし易い(はず)
    成功/失...
いろいろ試してみた
実行元のサーバ
実行の度に、違うサーバが呼ばれるのか?
実験①
Httpリクエストを行う処理を複数作成し、
手動で複数回実行
HttpTest
HttpTest2
1. キック
54.172.104.205 - - [21/Dec/2014:13:24:12 +0000] "GET /hoge.ht...
実験②
並行処理で、実験①のLambdaファンクションを呼び出し
10並列 10ループ  100リクエスト
ParallelCall
1. キック
HttpTest
HttpTest
54.173.132.200 - - [21/Dec/201...
実験③
さらに並行処理で、実験②のLambdaファンクションを呼び出し
(10並列 10ループ) (10並列 10ループ) 10,000リクエスト
1. キック
ParallelCall
HttpTest
HttpTest
ParallelCa...
結果
結果として、高性能なDDosツールが出来ました
※悪用激禁!!
IPアドレスの分散( 複数のサーバで実行)
54.172.104.205 - - [21/Dec/2014:16:08:31 +0000] "GET /hoge.html H...
考察
• Lambdaは、自動的にスケールアウトする
• スケールアウトの時間は、数秒程度(?)
• タスクの分割と追跡性を工夫すれば、Hadoop的な使
い方もお手軽に出来るのでは?
• Phantomjsと併用で、負荷計測装置も作れそう
感想
Lambdaを導入するにも、
• スケジュール/ジョブ制御システムが必要な場合が多い
• その部分は、現状自前で構築する必要がある
• AWSによるサービス化希望
• サードパーティのサービスが重要になるかも
 Ex)
  サーバワークス...
おまけ
実験③の結果を、Google Analyticsで計測
Googleに怒られそう
一気に数千に跳ね上がり
北米からの攻撃
おまけ
実験③のLambda側は?
AWSに怒られました。
Rate Exceeded
教訓
• Lambdaは、簡単に暗黒面に陥る
• 強力過ぎる仕組みなので、使い方にはご注意を
• バグって無限循環したら、どうやって止めるなど?
  Lambdaファンクションを消せば良いとのこと
免責
こちらは個人の意見で、
所属する企業や団体は関係ありません。
ご清聴ありがとうございました
後日の質問は、@dkfjまで
Upcoming SlideShare
Loading in …5
×

AWS Lambdaで作るクローラー/スクレイピング

18,256 views

Published on

AWS Lambdaで作るクローラー/スクレイピング

AWS Lambdaで作るクローラー/スクレイピング

  1. 1. AWS Lambda Meetup #0 Lambdaで作る クローラー/スクレイピング 2014年12月22日 NRIネットコム 佐々木拓郎
  2. 2. ✦ プロフィール ‣ NRIネットコム株式会社 ‣ Twitter: @dkfj ‣ Facebook: takuro.sasaki ‣ blog: http://blog.takuros.net/ ‣ 好きなAWSサービス: S3,SQS 自己紹介: 佐々木拓郎
  3. 3. 主にJAWSUG大阪で活動していました (東京、初進出)
  4. 4. 宣伝!! 本業と全く関係ないですが、 Rubyのクローラー本を書きました。 http://amzn.to/1lsJ5id Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
  5. 5. NRIネットコム ✦NRIグループで主にWebビジネスを専門としている会社 ‣ Webシステムの企画・設計・開発・運用 ‣ デザインも重視していて、ディレクター・デザイナーも一杯 ‣ スマホ/タブレットも得意 ‣ もちろんAWSをはじめとするクラウドにも力を入れている
  6. 6. AWS Lambda サーバ不要で、イベントドリブンな プログラム実行基盤 イベント キック Lambdaで実行
  7. 7. インフラの在り方を根底から変える!! (かもしれない) 今、注目の アーキテクチャ
  8. 8. S3 Event Notifications S3のオブジェクトに対してのイベントを検知し、 後続の処理を行う イベント Put,Post, etc 通知 SQSキュー SNSトピック Lambda Function ()
  9. 9. Lambdaで クローラー/スクレイピング
  10. 10. クローラー/スクレイピング、 ご存知ですか?
  11. 11. クローラー • Webを巡回するプログラムの総称 • ボット、スパイダー、ロボットなど様々な呼ばれ方がある • 巡回戦略を練るのが一番の仕事 • スクレイピングやストレージの機能を持つことが多い
  12. 12. スクレイピング • 取得したHTMLなどから、データを抜き出すこと • 例えば、HTML中のAタグのリンク先を全て取得する • 正規表現派と構文解析派が存在する
  13. 13. 巡回&ダウンロード スクレイピング
  14. 14. Lambdaクローラー全体像 1. キック 2. http  リクエスト    &  ダウンロード 3. html保存 4. S3 Event Call 5. S3 getObject 6. Scrape LambdaCrawler parseHtml インターネット S3 クローリング部分とスクレイピング部分を実装
  15. 15. クローラーの実装 1. キック 3. html保存 LambdaCrawler Node.jsの httpクラスを利用 AWSの s3 putObjectを利用 URL付与 2. http  リクエスト    &  ダウンロード
  16. 16. スクレイピングの実装 4. S3 Event Call 5. S3 getObject 6. Scrape parseHtml S3 Eventで Lambdaファンクション の呼び出し 引数から、 該当のファイルを取得 cheerioという スクレイピング用の ライブラリを利用
  17. 17. ソース https://github.com/takuros/lambda-crawler 解説は、こちら http://blog.takuros.net/entry/ 2014/12/14/053606
  18. 18. 実装のポイント • データダウンロード部とスクレイピング部の分離 ‣Lambdaはタイムアウトがあり、一般のバッチと違う     細かいエラー処理・例外処理をやってられない ‣ 単一処理に限定すると、エラー処理がし易い(はず)     成功/失敗のどちらかに倒す • 処理間の連携方法が重要 ‣ S3 + Event Notificationだと比較的シンプルで良い ‣ Lambda   Lambda連携だと、失敗時の追跡が大変(そう)
  19. 19. いろいろ試してみた
  20. 20. 実行元のサーバ 実行の度に、違うサーバが呼ばれるのか?
  21. 21. 実験① Httpリクエストを行う処理を複数作成し、 手動で複数回実行 HttpTest HttpTest2 1. キック 54.172.104.205 - - [21/Dec/2014:13:24:12 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.172.104.205 - - [21/Dec/2014:13:24:20 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.172.104.205 - - [21/Dec/2014:13:24:23 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.172.104.205 - - [21/Dec/2014:13:24:28 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.172.104.205 - - [21/Dec/2014:13:25:24 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-"  基本的には、同一のサーバで実行される模様 2. キック
  22. 22. 実験② 並行処理で、実験①のLambdaファンクションを呼び出し 10並列 10ループ  100リクエスト ParallelCall 1. キック HttpTest HttpTest 54.173.132.200 - - [21/Dec/2014:15:57:32 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.132.200 - - [21/Dec/2014:15:57:32 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.132.200 - - [21/Dec/2014:15:57:32 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.132.200 - - [21/Dec/2014:15:57:32 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.132.200 - - [21/Dec/2014:15:57:32 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" やはり同一IP( 同一サーバ)
  23. 23. 実験③ さらに並行処理で、実験②のLambdaファンクションを呼び出し (10並列 10ループ) (10並列 10ループ) 10,000リクエスト 1. キック ParallelCall HttpTest HttpTest ParallelCall HttpTest HttpTest ParallelChainCall
  24. 24. 結果 結果として、高性能なDDosツールが出来ました ※悪用激禁!! IPアドレスの分散( 複数のサーバで実行) 54.172.104.205 - - [21/Dec/2014:16:08:31 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.73.201 - - [21/Dec/2014:16:08:31 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.132.200 - - [21/Dec/2014:16:08:31 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.132.200 - - [21/Dec/2014:16:08:31 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.73.201 - - [21/Dec/2014:16:08:31 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 54.173.132.200 - - [21/Dec/2014:16:08:31 +0000] "GET /hoge.html HTTP/1.1" 200 5 "-" "-" 分散
  25. 25. 考察 • Lambdaは、自動的にスケールアウトする • スケールアウトの時間は、数秒程度(?) • タスクの分割と追跡性を工夫すれば、Hadoop的な使 い方もお手軽に出来るのでは? • Phantomjsと併用で、負荷計測装置も作れそう
  26. 26. 感想 Lambdaを導入するにも、 • スケジュール/ジョブ制御システムが必要な場合が多い • その部分は、現状自前で構築する必要がある • AWSによるサービス化希望 • サードパーティのサービスが重要になるかも  Ex)   サーバワークス Cloud Automator   NRI mPLAT
  27. 27. おまけ 実験③の結果を、Google Analyticsで計測 Googleに怒られそう 一気に数千に跳ね上がり 北米からの攻撃
  28. 28. おまけ 実験③のLambda側は? AWSに怒られました。 Rate Exceeded
  29. 29. 教訓 • Lambdaは、簡単に暗黒面に陥る • 強力過ぎる仕組みなので、使い方にはご注意を • バグって無限循環したら、どうやって止めるなど?   Lambdaファンクションを消せば良いとのこと
  30. 30. 免責 こちらは個人の意見で、 所属する企業や団体は関係ありません。
  31. 31. ご清聴ありがとうございました 後日の質問は、@dkfjまで

×