サーバーレス(cloud functions)のIPアドレスがどうなっているのか気になったので検証


背景

スクレイピングはEC2などのインスタンスからやるのが通常かと思っていましたが、それ以外にも、サーバーレス(cloud functions)からpuppeteer+headless chromeを使用してスクレイピングが可能なのことを最近知りました。
サーバーレスだと固定IPが付けられなく、IPも変動するのが通常のような感じがします。疑問に感じたので、サーバーレスのIPアドレス変動の実態について検証します。

cloud functionsから外部サイトへのアクセスは無料のsparkプラン以外からでないとできません。

IPを調べる方法

外部IPだけで十分ですが、せっかくなので外部IP内部IPの両方を確認してcloud functionsのことをもっと知りたい!
内部IPはosモジュール、外部IPはIPアドレスを表示してくれるWEBサイトを叩いて表示されたIPを取得します。

構成とソースをちょっと解説

構成とか

  1. firebase init --only functionsfunctionsを作成
  2. npm install --save puppeteer osで今回使用するモジュールをインストール
  3. puppeteerWEBサイトをスクレイピングして.outIpクラス=IPアドレスを取得する

  4. osモジュールを利用して内部IPを取得

  5. console.logosモジュールの結果と.outIpの出力を入れる

  6. functions.region('foo')でマルチリージョンに展開

  7. 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のレンジや変動するタイミングなどご存じの方いれば情報共有お願いします。

※ 曜日間隔も試したいので継続して更新します。