概要
Webアプリなどを作る際に、バックエンドのAPIサーバーとフロントエンドをそれぞれ別のCloud Runサービスにデプロイし、フロントエンドからAPIにアクセスする場合、APIサーバーが公開状態だとURLを知っていると誰でもアクセスできてしまいます。
そこでCloud Runサービス間の通信をGoogle Cloudプロジェクト内で閉じたセキュアな通信にしたいと思い試してみました!
やりたいこと

今回は、APIサーバーへアクセスする際にCloud RunのデフォルトのURLを使用します。
フロントエンドからAPIサーバーにアクセスする際に、そのままの設定でアクセスするとインターネットを経由した通信になるので、誰でもアクセスできてしまいます。この間をできるだけ閉じた通信にしたいです。
今回はDirect VPC EgressというVPCネットワークを経由して通信させる方法を試してみます。
手順
バックエンドのIngress設定
まずは、外部から直接アクセスさせないために、APIサーバーをホストしているCloud RunのIngress(内向きの通信)を「内部」に限定します。

これを設定することで、ブラウザ等でURLを叩いてもアクセスができなくなります。

VPCの作成
続いて、フロントエンドがトラフィックを送信する宛先のVPCネットワークおよびサブネットを作成します。
サブネットを作成する際に「プライベート Google アクセス」をオンにします。これにより、外部IPを持たないインスタンスがGoogle APIとサービスへのアクセスが可能になります。

フロントエンドのEgress設定
次に、フロントエンドのCloud Runサービスの設定をします。
ネットワーキング設定で、「アウトバウンド トラフィック用のVPCに接続する」を選択し、先ほど作成したVPCネットワークとサブネットを指定します。

これでCloud RunサービスからVPCにトラフィックを送信することが可能になります。
しかしこれだけではインターネット経由で通信が出ていく可能性があります。
すぐ下のトラフィック ルーティングの設定で「すべてのトラフィックを VPC にルーティングする」を選択します。

これを設定することで、フロントエンドのCloud Runの外向き通信は全て、作成したVPC経由で出ていくことになります。フロントから外部APIを叩く場合にも全てVPC経由になってしまうので、注意が必要です。
内部通信の確認
これで設定は終わりです。内部で通信できているかを確認します。
バックエンド側のCloud Runのログを確認してみます。アクセス元のremoteIpが「0.0.0.0」になっていれば内部アクセスができています。

終わりに
今回はDirect VPC Egressを利用してCloud Run間の内部通信を試してみました。組織内向けのWebアプリなど外部に公開したくないサービスで、Cloud Runを利用した構成を検討する場合、利用してみるのも良いかしれません。Cloud ArmorやIAP(Identity-Aware Proxy)などと組み合わせるとより強固な構成にできそうです。
