サーバーレス(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サイト](https://www.cman.jp/network/support/go_access.cgi)を叩いて表示されたIPを取得します。

# 構成とソースをちょっと解説
## 構成とか
1. `firebase init --only functions`で`functions`を作成
2. `npm install --save puppeteer os`で今回使用するモジュールをインストール
3. `puppeteer`で[WEBサイト](https://www.cman.jp/network/support/go_access.cgi)をスクレイピングして`.outIp`クラス=IPアドレスを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194356/b031770f-645a-dd63-4222-fff039f77116.png)

4. `os`モジュールを利用して内部IPを取得
5. `console.log`で`os`モジュールの結果と`.outIp`の出力を入れる
6. `functions.region('foo')`でマルチリージョンに展開
7. `firebase deploy`! 

## ソース抜粋
```javascript

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

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