ネットワーク設定の構成

Cloud Run functions のネットワーク設定によって、個々の関数の上り(内向き)と下り(外向き)のネットワークを制御できます。たとえば、次のようなユースケースにネットワーク設定を使用できます。

  • ネットワーク ベースのアクセス制御を実装して関数を保護する。
  • 関数の下り(外向き)トラフィックを、VPC ネットワーク関連のファイアウォール、DNS、ルーティングのルールに従わせる。
  • 関数の下り(外向き)トラフィックと静的 IP アドレスを関連付ける。

ユースケースの詳細については、サンプル ユースケースをご覧ください。

上り(内向き)設定

上り(内向き)設定により、Google Cloud プロジェクトまたは VPC Service Controls サービス境界の外部にあるリソースが関数を作成できるかどうかを制御します。

VPC Service Controls 境界のポリシーの対象となるには、リソースが制限するサービスに属している必要があります。Cloud Run functions の場合、制限ありサービスは Cloud Run Admin API です。

上り(内向き)設定を構成する

プロジェクトまたは境界の外部からリソースを制限するには、次のいずれかの上り(内向き)設定値を指定します。

  • すべてのトラフィックを許可する: デフォルト。インターネットおよび同じプロジェクト内のリソースの両方からの関数へのインバウンド リクエストをすべて許可します。
  • 内部トラフィックのみを許可: 同じプロジェクトか VPC Service Controls 境界内の Cloud Scheduler、Cloud Tasks、Eventarc、合成モニター(稼働時間チェックを含む)、Workflows、BigQuery、VPC ネットワークからのトラフィックのみを許可します。他のすべてのリクエストは、404 エラーで拒否されます。

    共有 VPC からのリクエストの場合は、次の点を考慮してください。

    • 関数が共有 VPC ホスト プロジェクトにデプロイされている場合、トラフィックは内部とみなされます。
    • 共有 VPC ホストとすべてのサービス プロジェクトを同じ VPC Service Controls の境界内に配置してある場合、トラフィックは内部とみなされます。
    • 関数が同じ共有 VPC ネットワークに接続されている場合、関数へのトラフィックは内部とみなされます。
    • 共有 VPC ネットワークからの他のすべてのトラフィックは拒否されます。
  • 内部トラフィックと Cloud Load Balancing からのトラフィックを許可する: 同じプロジェクトか VPC Service Controls 境界内の Cloud Scheduler、Cloud Tasks、Eventarc、合成モニター(稼働時間チェックを含む)、Workflows、BigQuery、VPC ネットワークからのトラフィックを許可します。Cloud Load Balancing からのトラフィックは許可されます。

Google Cloud CLI または Terraform を使用して関数をデプロイまたは更新する場合、上り(内向き)設定を指定できます。

gcloud

gcloud functions deploy コマンドを使用して関数をデプロイまたは更新し、次の --ingress-settings フラグを指定します。

gcloud functions deploy FUNCTION_NAME \
--trigger-http \
--ingress-settings INGRESS_SETTINGS \
FLAGS...

ここで

  • FUNCTION_NAME は、関数の名前です。
  • INGRESS_SETTINGS は、上り(内向き)設定のサポートされている値のいずれかです。使用できる値は次のとおりです。

    • all
    • internal-only
    • internal-and-gclb: 内部トラフィックと、Cloud Load Balancing によって公開されるパブリック IP に送信されるトラフィックを許可します。cloudfunctions.net に送信されるトラフィック、または Cloud Run functions で設定されたカスタム ドメインをブロックします。ユーザーが Cloud Load Balancing で設定したアクセス制御(Cloud Armor、IAP)を回避できないようにします。
  • FLAGS...deploy コマンドに渡す他のフラグを参照します。

Terraform

省略可。Terraform リソースmain.tf ファイルの上り(内向き)設定フィールドを更新するには、デプロイまたは更新する ingress_settings 引数を含めます。上り(内向き)設定を変更すると、関数が再作成されます。

  1. main.tf ファイルから、上り(内向き)設定を制限するリソースを見つけ、必要な設定に更新します。次に例を示します。

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }

    INGRESS_SETTINGS は、上り(内向き)設定のサポートされている値のいずれかです。使用できる値は次のとおりです。

    • ALLOW_ALL(デフォルト): インターネットおよび同じプロジェクト内のリソースの両方からの関数へのインバウンド リクエストをすべて許可します。
    • ALLOW_INTERNAL_ONLY: 同じプロジェクトか VPC Service Controls 境界内の Cloud Scheduler、Cloud Tasks、Eventarc、Workflows、VPC ネットワークからのトラフィックのみを許可します。
    • ALLOW_INTERNAL_AND_GCLB: 内部トラフィックと、Cloud Load Balancing によって公開されるパブリック IP に送信されるトラフィックを許可します。cloudfunctions.net に送信されるトラフィック、または Cloud Run functions で設定されたカスタム ドメインをブロックします。ユーザーが Cloud Load Balancing で設定したアクセス制御(Cloud Armor、IAP)を回避できないようにします。

Google Cloud Armor と Cloud Load Balancing を併用する場合は、受信リクエストの IP アドレス、IP 範囲、リージョン コード、リクエスト ヘッダーなどのトラフィック ベースの条件をフィルタするセキュリティ ポリシーを作成できます。詳細については、Google Cloud Armor セキュリティ ポリシーの概要をご覧ください。

下り(外向き)設定

下り(外向き)設定によって、関数からのアウトバウンド HTTP リクエストのルーティングを制御します。下り(外向き)設定を指定するには、サーバーレス VPC アクセス コネクタを使用して、関数を VPC ネットワークに接続する必要があります。下り(外向き)設定では、VPC ネットワーク内のコネクタ経由でトラフィックがルーティングされるタイミングを制御します。

制限事項

  • サーバーレス VPC アクセスは、IPv4 トラフィックのルーティングのみをサポートします。VPC ネットワークに IPv6 ルートがある場合でも、IPv6 トラフィックはサポートされません。

  • セキュリティを強化するため、 Google Cloud は TCP 宛先ポート 25 で外部 IP アドレスへの下り(外向き)パケットをブロックします。

  • VPC ネットワークで保護されている関数やサービスを呼び出すユーザー関数またはサービスは、そうした呼び出しを VPC コネクタ経由でルーティングする必要があります。

下り(外向き)設定を構成する

下り(外向き)設定では、次の項目を指定できます。

  • プライベート IP へのリクエストだけを VPC コネクタ経由でルーティングする: デフォルト。トラフィックを伝送するパケットの宛先が次の場合にのみ、VPC ネットワーク経由でトラフィックがルーティングされます。

    他の宛先へのパケットは、VPC ネットワーク経由ではなく、Cloud Run functions からインターネットにルーティングされます。

  • すべてのトラフィックを VPC コネクタ経由でルーティングする: パケットの宛先に関係なく、トラフィックはコネクタに関連する VPC ネットワーク経由でルーティングされます。このオプションは、次の状況で使用する必要があります。

    • プライベートで使用される外部 IP アドレス範囲を使用して VPC サブネット範囲にトラフィックを送信する必要がある場合。VPC サブネット範囲の詳細については、サブネットの概要の有効な IPv4 範囲をご覧ください。
    • アドレスがプライベートで使用される外部 IP アドレスである Google API の Private Service Connect エンドポイントにトラフィックを送信する必要がある場合。Google API の Private Service Connect エンドポイントの詳細については、エンドポイント経由で Google API にアクセスするをご覧ください。
    • コネクタの VPC ネットワーク内でルーティング可能で、プライベートで使用される他の外部 IP アドレスにトラフィックを送信する必要がある場合。プライベートで利用される外部 IP アドレスを対象とする宛先としては、ピアリング サブネット範囲、サービスに割り振られた IP アドレス範囲から作成されたピアリング サブネット範囲、VPC ネットワークのカスタムルートを使用してアクセスできる宛先などが含まれます。

    VPC ネットワークにデフォルト ルートが含まれている場合でも、コネクタで使用されたサブネットに NAT サービスを提供するように Cloud NAT ゲートウェイを構成すると、コネクタによって処理された後にパケットをインターネットにルーティングできます。これらのパケットは、VPC ネットワーク内のルートと、VPC ネットワークに適用されるファイアウォール ルールの対象になります。ルートとファイアウォールの構成を使用すると、サーバーレス VPC アクセス コネクタ経由で関数から送信されるすべてのアウトバウンド リクエストのインターネット下り(外向き)を制御できます。

Google Cloud CLI を使用して関数をデプロイまたは更新する場合、下り(外向き)設定を指定できます。

  • 関数をデプロイまたは更新するには、gcloud functions deploy コマンドを使用して --egress-settings フラグを指定します。

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings EGRESS_SETTINGS \
    FLAGS...
    

    ここで

  • FUNCTION_NAME は、関数の名前です。

  • CONNECTOR_NAME は、使用するサーバーレス VPC アクセス コネクタの名前です。詳細については、gcloud のドキュメントをご覧ください。

  • EGRESS_SETTINGS は下り(外向き)設定でサポートされる値のいずれかになります。gcloud のドキュメントをご覧ください。

  • FLAGS...deploy コマンドに渡す他のフラグを参照します。

サンプル ユースケース

次の例は、いくつかの一般的なシナリオでネットワーク アクセスを構成する方法を示しています。

外部クライアントから呼び出せない関数を作成する

同じ Google Cloud プロジェクトまたは VPC Service Controls サービス境界内のリソースからの呼び出しのみを許可することで、HTTP 関数を保護できます。

  1. 関数をデプロイし、内部トラフィックのみを許可します。gcloud functions deploy コマンドを使用します。

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

関数をデプロイすると、Google Cloud プロジェクトの外部からのリクエストはブロックされ、関数に接続できなくなります。VPC Service Controls を使用すると、サービス境界外からのリクエストはブロックされます。プロジェクト内またはサービス境界内の VM インスタンスは、HTTPS エンドポイントにリクエストを送信することで、引き続き関数にアクセスできます。

この制限付き関数を別の関数から呼び出す場合、呼び出し側の関数は VPC ネットワーク経由で下り(外向き)のルーティングを行う必要があります。

下り(外向き)と上り(内向き)の設定を使用してアクセスを制限する

サービスに上り(内向き)と下り(外向き)の両方を設定することで、制限をさらに強化できます。

  1. cloud-run-sample リポジトリのクローンを作成して、vpc-sample ディレクトリに移動します。

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample

  2. Python 依存関係をインストールします。

    pip3 install -r requirements.txt

  3. vpc-sample ディレクトリにある main.py ファイルを開くと、デプロイしている関数を確認できます。

    def hello_world(request):
        return "Hello World!"

  4. 関数をデプロイします。

    gcloud functions deploy restricted-function \
    --runtime=python38 \
    --trigger-http \
    --no-allow-unauthenticated \
    --ingress-settings=internal-only \
    --entry-point=hello_world
  5. サーバーレス VPC アクセス コネクタを設定します。

    gcloud compute networks vpc-access connectors create serverless-connector \
      --region=SERVICE_REGION \
      --range=10.8.0.0/28

    ここで、SERVICE_REGION はコネクタのリージョンです。サーバーレス サービスのリージョンと一致する必要があります。サービスが us-central または europe-west リージョンにある場合は、us-central1 または europe-west1 を使用します。

  6. コンテナ イメージをビルドします。

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .

    ここで、PROJECT_ID はプロジェクト ID です。

    これにより、main.py ファイルからデプロイされたときに get_hello_world を呼び出すコンテナ イメージがビルドされます。

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. gcloud run deploy run-function コマンドを使用して Cloud Run コンテナをデプロイします。

    gcloud run deploy run-function \
    --image gcr.io/PROJECT_ID/restricted-function-caller \
    --no-allow-unauthenticated \
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller \
    --vpc-egress=all \
    --vpc-connector=serverless-connector \
    --region=SERVICE_REGION

    ここで

    • PROJECT_ID は、プロジェクト ID です。
    • SERVICE_REGION はコネクタのリージョンです。これは、サーバーレス サービスのリージョンと一致する必要があります。サービスが us-central または europe-west リージョンにある場合は、us-central1 または europe-west1 を使用します。

    これで、Cloud Run run-function サービスが、ネットワーク制限のある関数に VPC コネクタから GET リクエストを送信するように設定されました。

VPC ネットワーク経由で関数の下り(外向き)のルーティングを行う

Google Cloud の VPC ネットワークは、豊富な構成とネットワーク機能をサポートしています。関数から VPC ネットワークへの下り(外向き)トラフィックをルーティングすることで、Cloud Run functions の下り(外向き)トラフィックが VPC ネットワークのファイアウォール、DNS、ルーティングなどのルールに従うようになり、Cloud NAT などのプロダクトが使用できます。

  1. VPC ネットワークを設定します。既存の VPC ネットワークを構成するか、VPC ネットワークの使用のガイドに沿って新しい VPC ネットワークを作成してください。

  2. サーバーレス VPC アクセス コネクタを設定します。Cloud Run functions が VPC ネットワークにトラフィックをルーティングするには、サーバーレス VPC アクセス コネクタが必要です。VPC ネットワークへの接続の手順に沿って、コネクタを作成して適切な権限を設定します。

  3. コネクタを使用する関数をデプロイし、下り(外向き)のルーティングをすべてコネクタ経由で行います。gcloud functions deploy コマンドを使用します。

    gcloud functions deploy FUNCTION_NAME \
      --vpc-connector CONNECTOR_NAME \
      --egress-settings all \
      FLAGS...
    

関数をデプロイすると、関数からのトラフィックがすべて VPC ネットワーク経由でルーティングされ、VPC ネットワークで設定されたルールに従います。Cloud NAT を構成しない限り、関数は公共のインターネットにアクセスできません。マッピングにコネクタのサブネットを含めるには、すべてのサブネットのすべてのプライマリ IP 範囲とセカンダリ IP 範囲を NAT ゲートウェイにマッピングする必要があります。

関数の下り(外向き)と静的 IP アドレスを関連付ける

場合によっては、関数からのトラフィックと静的 IP アドレスを関連付けすることもあります。たとえば、明示的に指定された IP アドレスからのリクエストのみを許可する外部サービスを呼び出す場合に便利です。

  1. 関数の下り(外向き)を VPC ネットワーク経由でルーティングします。前のセクションの VPC ネットワーク経由で関数の下り(外向き)のルーティングを行うをご覧ください。

  2. Cloud NAT を設定し、静的 IP アドレスを指定します。NAT のサブネット範囲を指定するNAT の IP アドレスを指定するのガイドの手順に沿って、関数のサーバーレス VPC アクセス コネクタに関連付けられたサブネットの Cloud NAT を設定します。Cloud NAT は、マッピングにコネクタのサブネットを含めるために、すべてのサブネットのすべてのプライマリ IP 範囲とセカンダリ IP 範囲を NAT ゲートウェイにマッピングする必要があります。

マルチリージョンのロード バランシング

関数を別のリージョンにデプロイし、リクエストを最も近い正常なリージョンに送信できるようになります。これを実現するには、サーバーレス NEG を使用して HTTP(S) ロードバランサを設定するの説明に沿って、サーバーレス ネットワーク エンドポイント グループ(NEG)をセットアップし、ロードバランサに接続する必要があります。