G-gen の堂原です。本記事では Google Cloud(旧称 GCP)の Cloud Run functions(旧 Cloud Functions)から、VPC Service Controls 境界の中のリソースへアクセスさせる方法について紹介します。
はじめに
本記事の趣旨
本記事では、Cloud Run functions から、VPC Service Controls で保護された Google Cloud プロジェクトのリソースにアクセスする方法や、どのような設定でアクセスが成功または失敗するのかについて解説します。
VPC Service Controls
VPC Service Controls は Google Cloud が提供するセキュリティサービスです。 「サービス境界(service perimeter)」という論理的な境界を作成し、境界をまたぐ API リクエストを制限します。
VPC Service Controls については、以下の記事で解説していますのでご参照ください。
なお本記事は Ingress rules(内向きルール)など、VPC Service Controls の基本的な設定項目については理解している前提で書かれています。
Cloud Run functions
Cloud Run functions は、Google Cloud が提供するサーバレスコンピューティングサービスです。インフラの構築や管理をすることなく、プログラムを実行することができます。
こちらも以下の記事で解説していますので、ご参照ください。
ポイント
本記事で最も伝えたいポイントは、以下のとおりです。
VPC Service Controls の Ingress rule(内向きルール)でソースプロジェクトを指定する場合、Cloud Run functions は VPC 経由でリクエストを送信する必要がある。
アクセスの成否
以下のような検証環境を用意しました。
- VPC Service Controls で保護された Google Cloud プロジェクト
- プロジェクト内に Cloud Run functions と BigQuery テーブルを用意
- Cloud Run functions には「サービスアカウント A」を紐づけ
- Cloud Run functions から BigQuery テーブルにアクセスする状況を想定
この環境で、VPC Service Controls と Cloud Run functions の各設定値を変更しながら、様々なパターンでアクセスの成否を検証しました。検証結果は、以下のようになりました。
No. | VPC Service Controls | Cloud Run functions | アクセス結果 | |||
---|---|---|---|---|---|---|
制限付きサービス | VPC のアクセス可能なサービス | 「Ingress rules」の「API クライアントの FROM 属性」 | ネットワークの下り設定 | |||
ID | ソース | |||||
1 | BigQuery API | すべての制限付きサービス | サービスアカウント A | すべてのソース | なし | OK |
2 | BigQuery API | すべての制限付きサービス | サービスアカウント A | プロジェクト | なし | NG |
3 | BigQuery API | すべての制限付きサービス | サービスアカウント A | プロジェクト | すべてのトラフィックを VPC コネクタ経由でルーティングする | OK |
4 | BigQuery API | すべての制限付きサービス | サービスアカウント A | プロジェクト | プライベート IP へのリクエストだけを VPC コネクタ経由でルーティングする | NG |
5 | BigQuery API | なし | サービスアカウント A | プロジェクト | すべてのトラフィックを VPC コネクタ経由でルーティングする | NG |
6 | なし | なし | サービスアカウント A | プロジェクト | すべてのトラフィックを VPC コネクタ経由でルーティングする | NG |
7 | なし | なし | サービスアカウント A | プロジェクト | なし | OK |
VPC 経由でのリクエストが必要な理由
VPC Service Controls では、境界を超えるようなアクセスは、原則的に全てブロックされます。
Ingress rules(内向きルール)を用いると、特定のソース(特定の IP アドレスや Google Cloud プロジェクト)を接続元とする特定の ID(Google アカウントやサービスアカウント)によるアクセスを例外的に許可することが出来ます。
そのため、Ingress rules で ID を Cloud Run functions に紐づけた「サービスアカウント A」に、ソースを Cloud Run functions が所属する Google Cloud プロジェクトにすれば、境界内へのアクセスは成功するかのように考えられます。
しかし上記の場合、Cloud Run functions からのアクセスは失敗します。
これは、Google Cloud の公式ドキュメントには明言されていませんが、Cloud Run functions の実行基盤がユーザが管理する Google Cloud プロジェクトとは別だからだと推測できます。
そのため、当該プロジェクトからのアクセスとなるように、Cloud Run functions を VPC に接続させる必要があるのです。
このことは以下の公式ドキュメントでも触れられています。
VPC のアクセス可能なサービス
また Cloud Run functions に VPC 経由で VPC Service Controls の境界内へアクセスさせる場合は、「VPC のアクセス可能なサービス(VPC Accessible services)」という設定項目の値にも気をつける必要があります。この設定項目は境界内の VPC ネットワークからアクセスできるサービスを制御する項目です。
この項目で明示的にアクセス先のサービスが許可されていない場合、Cloud Run functions からのアクセスは失敗します。
前掲の表の No. 6は、VPC 内部からのアクセスだが「VPC のアクセス可能なサービス」で許可されていない API にリクエストしようとしているため、リクエストが失敗しています。反対に No.7 は、VPC 外部からのリクエストであり、かつ BigQuery API は境界で保護されていないため、リクエストが成功します。
- 参考 : VPC のアクセス可能なサービス
堂原 竜希(記事一覧)
クラウドソリューション部データアナリティクス課。2023年4月より、G-genにジョイン。
Google Cloud Partner Top Engineer 2023, 2024, 2025に選出 (2024年はRookie of the year、2025年はFellowにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。
Follow @ryu_dohara