🥵
サーバーレスVPCアクセスを利用してハマったこと
結論
Cloud RunでサーバーレスVPCアクセスを利用する時は、Traffic routingの設定に注意する。
起きたこと
- Cloud Run上で生成したファイルをGCSにアップロードする機能をGoで実装。(https://cloud.google.com/storage/docs/samples/storage-upload-file?hl=ja#storage_upload_file-go)
- ローカル環境でファイル生成と、GCSへのアップロードを試行したところ問題なく動作。
- Cloud Runにデプロイして実行したところ、ファイルのアップロードでエラー。
エラーメッセージ
retry failed with context deadline exceeded; last error: Post "https://storage.googleapis.com/upload/storage/v1/b/○○…..: context deadline exceeded
どうやらファイルをアップロードするときにタイムアウトが起きているらしい。
でも何で?
原因
- Cloud RunのサーバーレスVPCアクセスのルーティングの設定で「すべてのトラフィックを VPC コネクタ経由でルーティングする」と設定していた。
このため、コネクタとGCSが同じVPC上になくルーティングができない=タイムアウトエラーとなっていた。
サーバーレスVPCアクセスを使っている理由
- このプロジェクトではRDBとしてCloud SQLを利用しており、プライベートインスタンスにしている。
- そのためCloud RunからCloud SQLに接続できるようサーバーレスVPCアクセスコネクタを利用。
図で表すとこんな感じ。
すべてのトラフィックを VPC コネクタ経由でルーティング
プライベート IP へのリクエストだけを VPC コネクタ経由でルーティング
まとめ
- そもそもTraffic routingの設定項目があることを知らなかった。(いつの間にかすべてのトラフィックをVPCコネクタ経由でルーティングするようにしていたらしい)
- エラーメッセージからタイムアウトが起きていることは分かったが、何故タイムアウトが起きているか理由までは読み取れなかった。
→上記の理由からエラーを解消するのに時間がかかってしまった。
ローカル環境では成功、リモート環境では失敗しているので、ローカルとリモートの違い(リモートではDBはプライベートインスタンスにしている)を考えてみることによって最終的にエラーの原因に辿り着けた。
エラー内容をググってもヒットしなかったので、今後同じようなエラーに引っかかった際にどなたかの参考になれば嬉しいです!
Discussion