GCPとCloudflareを行ったり来たりしているメモ

ドクセルをGCPからCDNまわりのみCloudflareに変えて、また戻した。その顛末をメモ。

もともとの課題感
- WAFいれたいがドクセルは大半が無料だしどこまでWAFを入れるべきか、そもそもAppEngineだしだいたいの攻撃は防いでくれるし。(上位サービスはセキュリティチェックシートの絡みもありCloudArmorいれてる)
- 画像の読み込みを早くしてできるだけキャッシュに乗せたい
- ページもキャッシュさせたい。Cloud CDNはパス単位、かつキャッシュのクリアに分単位必要、かつ同時に複数のPurgeリクエスト出せない。
Cloudflareを前段に入れればいいじゃん!とおもった

Cloudflareを前段にいれた結果
- おそい。GoogleのネットワークとCloudflareの相性がめちゃくちゃ悪いっぽくて、どうもAppEngineもStorageもasia-northeastにあり、CoudflareもNRTなのに米国をルーティングしてるっぽい。
- キャッシュコントロールはおおむね思った通り
- WAFもめちゃいい感じ。Fake Googlebotとかオリジナルのルールが良い
- Zarazを利用して高速なGoogle Tag Managerみたいなことができる。
遅いだけが課題。

仕方ないので、Cloudflae WorkersとKVを使って、画像だけ強制キャッシュさせるようにしてみた。Page ruleだといまひとつキャッシュhit率が40%程度までしか上がらないので。
これで、1アクセス目は遅い(2000ms程度)だけど2アクセス目からは早くなった。
ただこれも、半年ちょっと経って、KVが50GBくらい超えてきたくらいから挙動がおかしくなった。たまにタイムアウトする画像が出るようになった。
ログを追うにも現象が安定せず、原因究明もむずかしかったので、さっさと損切りして元に戻すことにした。おそらくエッジキャッシュから高速に呼び出せるKVの容量には限度があるのかもしれない。エッジに1利用者が50GBも置くなよって話もある。CFさんの安さにフリーライドしてはいけない(有料プランだけど)

というわけで、CloudflareをDNS Onlyにもどした。さよならオレンジアイコン。
GCPに戻してからは以下の施策を実施した。
- AppEngineからCloudRunのnginx+php-fpmのサイドカー構成にしてキャッシュを扱いやすく
- その際にAPCを導入してアプリケーションレイヤでのキャッシュを追加
- WAFをCloudArmorに、ただしこっちはルールがシンプルなのでCFみたいにアクティブにはできないかも。
これで、体感のページ速度はかなり上がりつつ、キャッシュがクリアできない問題もページレベルでのキャッシュを行わないことで何とか対処できた気がする。各種メトリクスをみても安定しているので、いったんこれで様子を見てみよう。

なおZaraz+Workersは現在も利用している。オリジナルのアクセス解析を作ったためだ。こちらは最終的にBigQueryに流し込んでるので、うまく動いているように見える。
Zarazはオレンジアイコンではなくなる場合自動Injectionしてくれないので、サブドメインを切ってJSを手動で設置することで対応した。

その後Zarazでも不具合が出たのでGoogle Tag Managerにもどした。