本投稿は TECOTEC Advent Calendar 2020 の6日目の記事です。
ブロックチェーン事業部の飯田です。
昨年から携わっていたプロジェクトのサービスを今年の春リリースしました。
リリースしたサービスは Firebase で稼働するWebアプリになります。
弊社では珍しくフロントもバックエンドも Node.js を使用した構成になっています。
今回は Firebase でサービスを運用してきた中でのあれこれをご紹介したいと思います。
Node10対応
2021年2月までに対応すればいいかと思っていたら、2020年9月頃に頻繁にエラーが発生するようになり、少なからずサービスに影響が出るようになってきました。
まったく動かなくなったわけではなかったのですぐに気付くことができませんでした。
2020年6月に非推奨になってたのですが、まさかそんなにすぐにエラーが出たりするようになるとは思ってませんでした。
なお、本サービスのローンチ前後ぐらいには情報を得ていたので Node10 への移行準備はしていました。
さすがにローンチ直後にはできなかったので、年末ぐらい(ちょうど今ぐらい)にリリースするつもりでいましたが、あわてて準備してリリースしました。
2年後ぐらいにまた次の Node12 への移行対応を行う必要があるので、今度は早めに対応したいですね。
ファンクションのデプロイエラー
しばらくサービスを運用していて、ファンクション数が100を超えた辺りで Cloud Functions をデプロイする時に「too many functions are being deployed, cannot poll status.」と表示されて進捗が表示されなくなることが多くなりました。
進捗が表示されなくなるだけでデプロイは行われていたのであまり気にしていなかったのですが、そのうちファンクションのデプロイも失敗するようにもなりました。
デプロイに失敗するファンクションは毎回同じではなかったので原因を調査していたところ、割り当て(Quota)が足りなくなっていたからのようでした。
対象は「Cloud Functions API : Write requests per 100 seconds」で、80ファンクション/100秒が最大でした。
(拡張できない!サポートにも確認しましたができないとのことでした。)
デプロイが失敗することの対策としては、ファンクションを一括でデプロイしていたのを分割してデプロイするようにしました。
分割したことで進捗が表示されるようになり、デプロイも失敗しないようになりました。
ただ、その分デプロイ時間が長くなってしまったので、なんとかできないものかと考えているところです・・・。
プロキシが負荷に耐えられない
Cloud Functions から外部サービスを利用する際にIPアドレスを固定する必要があったので、VPCコネクタの先にプロキシを立てていました。
運用して数ヶ月たった頃にたまに外部サービスを利用しているファンクションでエラーが発生するようになりました。
調査していったところ外部サービスやファンクションでエラーが発生しているわけではなく、途中のプロキシが負荷に耐えきれなくて停止し再起動するまでの間、外部サービスへのリクエストがエラーになっているようでした。
サービスのユーザ数が順調に増えていっている証拠でうれしくもありましたが、負荷に耐えられない設計になっていたのは問題でした。
(負荷分散やスケールアウトする構成になっていませんでした・・・)
そこでプロキシの代わりにちょうどGAとなっていた Cloud NAT を利用することで対応することにしました。
導入当初いきなりポート数が足りなくなるなどありましたが、今の所安定して稼働しています。
最後に
開発段階からあしかけ2年ほど Firebase を利用してきましたが、機能拡張もどんどんされているのでなかなか使いごたえのあるサービスになってきていると思います。
今回は紹介できませんでしたが Google Analytics や BigQuery との連携などもできるので、また機会があればご紹介できればと思います。