背景
スクレイピングはEC2などのインスタンスからやるのが通常かと思っていましたが、それ以外にも、サーバーレス(cloud functions
)からpuppeteer
+headless chrome
を使用してスクレイピングが可能なのことを最近知りました。
サーバーレスだと固定IPが付けられなく、IPも変動するのが通常のような感じがします。疑問に感じたので、サーバーレスのIPアドレス変動
の実態について検証します。
※ cloud functions
から外部サイトへのアクセスは無料のspark
プラン以外からでないとできません。
IPを調べる方法
外部IP
だけで十分ですが、せっかくなので外部IP
と内部IP
の両方を確認してcloud functions
のことをもっと知りたい!
内部IPはos
モジュール、外部IPはIPアドレスを表示してくれるWEBサイトを叩いて表示されたIPを取得します。
構成とソースをちょっと解説
構成とか
firebase init --only functions
でfunctions
を作成npm install --save puppeteer os
で今回使用するモジュールをインストールpuppeteer
でWEBサイトをスクレイピングして.outIp
クラス=IPアドレスを取得するos
モジュールを利用して内部IPを取得console.log
でos
モジュールの結果と.outIp
の出力を入れるfunctions.region('foo')
でマルチリージョンに展開firebase deploy
!
ソース抜粋
constpuppeteer=require('puppeteer');constos=require('os');// firebaseのexport// puppeteerの初期化処理 pageオブジェクトが外部サイトの構造を持っているletitem=awaitpage.$(".outIp");letouterIp=await(awaititem.getProperty('textContent')).jsonValue();letinnerIps=os.networkInterfaces();console.log("============================");console.log("Outer Ip Adress is"+outerIp);console.log("Inner Ip Adress is"+innerIps);// マルチリージョンに展開する
これでcloud functions
のURLを叩けば、ログに外部IPと内部IPが出力される関数ができました。ローカルで動作確認をして、firebase deploy
を実行。
※ 256MBだと実行時にmemory error
になってしまうので、functions.runWith({memory: '512MB'}).
を追加しました。
結果
外部IP
1-4回目: 約2分間隔
5回目: 約5分間
6回目: 約10分間隔
7回目: 約30分間隔
7回目: 約3時間間隔
us-central1 | us-east1 | us-east4 | europe-wast1 | europe-west2 | asia-east2 | asia-northeast1 | |
---|---|---|---|---|---|---|---|
1回目 | 107.178.239.204 | 107.178.239.245 | 107.178.229.223 | 107.178.238.124 | 107.178.231.62 | 35.203.253.255 | 107.178.234.88 |
2回目 | 107.178.232.166 | 107.178.200.177 | 107.178.229.254 | 107.178.238.124 | 107.178.231.62 | 35.203.253.255 | 107.178.234.28 |
3回目 | 107.178.239.204 | 107.178.200.177 | 107.178.229.254 | 107.178.238.124 | 107.178.231.95 | 35.203.253.255 | 107.178.234.28 |
4回目 | 107.178.232.166 | 107.178.200.177 | 107.178.229.254 | 107.178.238.124 | 107.178.231.95 | 35.203.253.255 | 107.178.234.28 |
5回目 | 107.178.232.166 | 107.178.200.177 | 107.178.229.254 | 107.178.238.124 | 107.178.231.62 | 35.203.253.255 | 107.178.234.28 |
6回目 | 107.178.232.166 | 107.178.239.245 | 107.178.229.223 | 107.178.238.105 | 107.178.231.19 | 35.203.253.255 | 107.178.234.150 |
7回目 | 107.178.200.231 | 107.178.239.245 | 107.178.229.223 | 107.178.238.105 | 107.178.231.19 | 35.203.254.16 | 107.178.234.150 |
8回目 | 35.203.245.117 | 107.178.239.245 | 107.178.229.220 | 107.178.238.105 | 107.178.231.19 | 35.203.253.240 | 107.178.234.146 |
内部IP
とれませんでした。。理由はよくわからないです。
まとめ
ある程度IPレンジはあるもののちょいちょい変動していることがわかりました。
法則性は今回の検証だけではちょっとわからなかったです。googleの中の人しかわからないか..?
IPのレンジや変動するタイミングなどご存じの方いれば情報共有お願いします。
※ 曜日間隔も試したいので継続して更新します。