Successfully reported this slideshow.
Your SlideShare is downloading. ×

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

Ad

AWS Lambda Meetup #0
Lambdaで作る
クローラー/スクレイピング
2014年12月22日
NRIネットコム 佐々木拓郎

Ad

✦ プロフィール
‣ NRIネットコム株式会社
‣ Twitter: @dkfj
‣ Facebook: takuro.sasaki
‣ blog: http://blog.takuros.net/
‣ 好きなAWSサービス: S3,SQS
自...

Ad

主にJAWSUG大阪で活動していました
(東京、初進出)

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Upcoming SlideShare
はじめてのAWS Lambda
はじめてのAWS Lambda
Loading in …3
×

Check these out next

1 of 31 Ad
1 of 31 Ad
Advertisement

More Related Content

Slideshows for you (19)

More from Takuro Sasaki (20)

Advertisement

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まで

×