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

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

Embed Size (px)

Citation preview

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

AWS Lambda Meetup #0

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

2014年12月22日 NRIネットコム 佐々木拓郎

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

✦ プロフィール

‣ NRIネットコム株式会社

‣ Twitter: @dkfj

‣ Facebook: takuro.sasaki

‣ blog: http://blog.takuros.net/

‣ 好きなAWSサービス: S3,SQS

自己紹介: 佐々木拓郎

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

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

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

宣伝!!

本業と全く関係ないですが、 Rubyのクローラー本を書きました。

http://amzn.to/1lsJ5id

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

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

NRIネットコム

✦NRIグループで主にWebビジネスを専門としている会社

‣ Webシステムの企画・設計・開発・運用 ‣ デザインも重視していて、ディレクター・デザイナーも一杯 ‣ スマホ/タブレットも得意 ‣ もちろんAWSをはじめとするクラウドにも力を入れている

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

AWS Lambda

サーバ不要で、イベントドリブンな プログラム実行基盤

イベントキック Lambdaで実行

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

インフラの在り方を根底から変える!!(かもしれない)

今、注目の アーキテクチャ

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

S3 Event Notifications

S3のオブジェクトに対してのイベントを検知し、 後続の処理を行う

イベントPut,Post, etc

通知

SQSキュー

SNSトピック

Lambda Function

()

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

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

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

クローラー/スクレイピング、 ご存知ですか?

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

クローラー

• Webを巡回するプログラムの総称 • ボット、スパイダー、ロボットなど様々な呼ばれ方がある • 巡回戦略を練るのが一番の仕事 • スクレイピングやストレージの機能を持つことが多い

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

スクレイピング

• 取得したHTMLなどから、データを抜き出すこと • 例えば、HTML中のAタグのリンク先を全て取得する • 正規表現派と構文解析派が存在する

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

巡回&ダウンロード

スクレイピング

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

Lambdaクローラー全体像

1. キック

2. http  リクエスト    &  ダウンロード 3. html保存 4. S3 Event Call

5. S3 getObject6. Scrape

LambdaCrawler parseHtml

インターネット

S3

クローリング部分とスクレイピング部分を実装

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

クローラーの実装

1. キック

3. html保存

LambdaCrawler

Node.jsの httpクラスを利用

AWSの s3 putObjectを利用

URL付与

2. http  リクエスト    &  ダウンロード

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

スクレイピングの実装

4. S3 Event Call

5. S3 getObject6. Scrape

parseHtml

S3 Eventで Lambdaファンクション

の呼び出し

引数から、 該当のファイルを取得

cheerioという スクレイピング用の ライブラリを利用

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

ソース

https://github.com/takuros/lambda-crawler

解説は、こちら http://blog.takuros.net/entry/2014/12/14/053606

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

実装のポイント• データダウンロード部とスクレイピング部の分離 ‣ Lambdaはタイムアウトがあり、一般のバッチと違う

   ⇒細かいエラー処理・例外処理をやってられない

‣ 単一処理に限定すると、エラー処理がし易い(はず)    ⇒成功/失敗のどちらかに倒す

• 処理間の連携方法が重要 ‣ S3 + Event Notificationだと比較的シンプルで良い ‣ Lambda ⇒ Lambda連携だと、失敗時の追跡が大変(そう)

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

いろいろ試してみた

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

実行元のサーバ

実行の度に、違うサーバが呼ばれるのか?

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

実験①

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. キック

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

実験②並行処理で、実験①のLambdaファンクションを呼び出し

10並列×10ループ ⇒ 100リクエスト

ParallelCall

1. キックHttpTest

HttpTest54.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(≒同一サーバ)

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

実験③さらに並行処理で、実験②のLambdaファンクションを呼び出し

(10並列×10ループ)×(10並列×10ループ)⇒ 10,000リクエスト

1. キック

ParallelCall

HttpTest

HttpTest

ParallelCall

HttpTest

HttpTest

ParallelChainCall

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

結果

結果として、高性能な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 "-" "-"

分散

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

考察

• Lambdaは、自動的にスケールアウトする • スケールアウトの時間は、数秒程度(?) • タスクの分割と追跡性を工夫すれば、Hadoop的な使い方もお手軽に出来るのでは?

• Phantomjsと併用で、負荷計測装置も作れそう

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

感想Lambdaを導入するにも、

• スケジュール/ジョブ制御システムが必要な場合が多い • その部分は、現状自前で構築する必要がある • AWSによるサービス化希望 • サードパーティのサービスが重要になるかも  Ex)

  サーバワークス Cloud Automator

  NRI mPLAT

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

おまけ

実験③の結果を、Google Analyticsで計測

Googleに怒られそう

一気に数千に跳ね上がり

北米からの攻撃

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

おまけ

実験③のLambda側は?

AWSに怒られました。

Rate Exceeded

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

教訓

• Lambdaは、簡単に暗黒面に陥る • 強力過ぎる仕組みなので、使い方にはご注意を • バグって無限循環したら、どうやって止めるなど?  ⇒Lambdaファンクションを消せば良いとのこと

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

免責

こちらは個人の意見で、 所属する企業や団体は関係ありません。

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

ご清聴ありがとうございました 後日の質問は、@dkfjまで