ネットワーク設定の構成

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

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

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

上り(内向き)設定

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

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

制限事項

Cloud Functions(第 1 世代): 内部専用の HTTP でトリガーされた関数を呼び出せるのは、Kubernetes EngineCompute EngineApp Engine フレキシブル環境など、VPC ネットワーク内で作成された HTTP リクエストか、同じプロジェクトまたは VPC Service Controls 境界内の Cloud Scheduler、Cloud Tasks、Workflows、または BigQuery リソースによって作成された HTTP リクエストだけです。つまり、Pub/Sub や Eventarc によって作成または転送された HTTP リクエストでは、これらの関数をトリガーできません。イベント トリガーは常に「内部」とみなされ、上り(内向き)の設定に関係なく許可されます。

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

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

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

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

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

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

コンソール

  1. Google Cloud コンソールで Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. [関数を作成] をクリックします。または、既存の関数をクリックしてその詳細ページに移動し、[編集] をクリックします。

  3. [ランタイム、ビルド...] をクリックして詳細設定を表示します。

  4. [接続] セクションで、[上り(内向き)設定] の値を選択します。

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 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 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 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 コンソールまたは Google Cloud CLI を使用して関数をデプロイまたは更新する場合、下り(外向き)設定を利用できます。

コンソール

  1. Google Cloud コンソールで Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. [関数を作成] をクリックします。または、既存の関数をクリックしてその詳細ページに移動し、[編集] をクリックします。

  3. [ランタイム、ビルド...] をクリックして詳細設定を表示します。

  4. [接続] セクションの [下り(外向き)設定] で、サーバーレス VPC アクセス コネクタを選択します。

  5. コネクタを介してアウトバンド トラフィックをルーティングする方法に応じて、適切な下り(外向き)設定を選択します。

gcloud

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. 関数をデプロイし、内部トラフィックのみを許可します。Google Cloud コンソールまたは Google Cloud CLI を使用します。

    コンソール

    1. Google Cloud コンソールで Functions の概要ページを開きます。

      Cloud Functions の概要ページに移動

    2. [関数を作成] をクリックします。または、既存の関数をクリックしてその詳細ページに移動し、[編集] をクリックします。

    3. [ランタイム、ビルド...] をクリックして詳細設定を表示します。

    4. [接続] セクションの [上り(内向き)設定] で、[内部トラフィックのみを許可] をオンにします。

    gcloud

    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 Functions の下り(外向き)トラフィックが VPC ネットワークのファイアウォール、DNS、ルーティングなどのルールに従うようになります。Cloud NAT などのプロダクトが使用できます。

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

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

  3. コネクタを使用する関数をデプロイし、下り(外向き)のルーティングをすべてコネクタ経由で行います。Google Cloud コンソールまたは gcloud コマンドライン ツールを次のように使用します。

    コンソール

    1. Google Cloud コンソールで Functions の概要ページを開きます。

      Cloud Functions の概要ページに移動

    2. [関数を作成] をクリックします。または、既存の関数をクリックしてその詳細ページに移動し、[編集] をクリックします。

    3. [ランタイム、ビルド...] をクリックして詳細設定を表示します。

    4. [接続] セクションの [下り(外向き)設定] で、サーバーレス VPC アクセス コネクタを選択し、[すべてのトラフィックを VPC コネクタ経由でルーティングする] をオンにします。

    gcloud

    gcloud functions deploy コマンドを使用します。

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

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