背景
スクレイピングは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!
ソース抜粋
const puppeteer = require('puppeteer');
const os = require('os');
// firebaseのexport
// puppeteerの初期化処理 pageオブジェクトが外部サイトの構造を持っている
let item = await page.$(".outIp");
let outerIp = await (await item.getProperty('textContent')).jsonValue();
let innerIps = 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分間隔
8回目: 約3時間間隔
9回目: 約1日間隔
10回目: 約2日間隔
| 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 |
| 9回目 | 107.178.231.237 | 107.178.200.191 | 107.178.229.220 | 107.178.238.105 | 107.178.231.50 | 35.203.253.240 | 107.178.234.149 |
| 10回目 | 35.203.245.181 | 107.178.239.241 | 107.178.229.250 | 107.178.206.31 | 107.178.231.51 | 35.203.253.251 | 107.178.234.149 |
内部IP
とれませんでした。。理由はよくわからないです。
まとめ
ある程度IPレンジはあるもののちょいちょい変動していることがわかりました。
法則性は今回の検証だけではちょっとわからなかったです。googleの中の人しかわからないか..?
IPのレンジや変動するタイミングなどご存じの方いれば情報共有お願いします。
※ 曜日間隔も試したいので継続して更新します。