VPC Service Controls の境界外のプライベート エンドポイントから保護されたリソースへのマルチクラウド アクセスを許可する

リファレンス アーキテクチャ

次のリファレンス アーキテクチャでは、サービス プロジェクト ph-fm-svc-project(基盤モデル サービス プロジェクト)に Gemini モデルを含む共有 VPC がデプロイされ、サービス ポリシー属性により AWS から Vertex AI API へのプライベート アクセスが許可されています。

  • 単一の VPC Service Controls 境界
  • プロジェクト定義のユーザー ID

VPC Service Controls を使用してサービス境界を作成するアーキテクチャ図。

省略可: アクセスレベルを作成する

エンドユーザーが Google Cloud コンソールから Vertex AI にアクセスする必要がある場合は、このセクションの手順に沿って VPC Service Controls アクセスレベルを作成します。ただし、API へのプログラムによるアクセスが限定公開のソース(プライベート Google アクセスまたは Cloud Workstations を使用したオンプレミスなど)からのものである場合、アクセスレベルは必要ありません。

このリファレンス アーキテクチャでは、企業 CIDR 範囲 corp-public-block を使用して、企業の従業員のトラフィックが Google Cloud コンソールにアクセスできるようにしています。

Access Context Manager を使用すると、 Google Cloud 組織管理者は、Google Cloudのプロジェクトとリソースに対してきめ細かい属性ベースのアクセス制御を定義できます。

アクセスレベルは、リクエストに対応するために要件を示します。次に例を示します。

  • デバイスの種類とオペレーティング システム(Chrome Enterprise Premium ライセンスが必要)
  • IP アドレス
  • ユーザー ID

組織で Access Context Manager を初めて使用する場合は、管理者がアクセス ポリシーを定義する必要があります。これは、アクセスレベルとサービス境界のコンテナです。

  1. Google Cloud コンソールの上部にあるプロジェクト セレクタで、[すべて] タブをクリックし、組織を選択します。

  2. ベーシック アクセスレベルを作成するの手順に沿って、ベーシック アクセスレベルを作成します。次のオプションを指定します。

    1. [条件を作成] で、[基本モード] を選択します。
    2. [アクセスレベルのタイトル] フィールドに、「corp-public-block」と入力します。
    3. [条件] セクションの [条件を満たしている場合に返される値:] オプションで、[TRUE] を選択します。
    4. [IP サブネットワーク] で [パブリック IP] を選択します。
    5. IP アドレス範囲には、VPC Service Controls の境界へのアクセスを必要とする外部 CIDR 範囲を指定します。

VPC Service Controls のサービス境界を構築する

サービス境界を作成するときに、保護されたプロジェクトを指定することで、境界外から保護されたサービスへのアクセスを許可します。共有 VPC で VPC Service Controls を使用する場合、ホスト プロジェクトとサービス プロジェクトの両方を含む大きな境界を 1 つ作成します(境界内でサービス プロジェクトのみを選択した場合、サブネットはホスト プロジェクトにのみ関連付けられているため、サービス プロジェクトに属するネットワーク エンドポイントは境界外にあるように見えます)。

新しい境界の構成タイプを選択する

このセクションでは、ドライラン モードで VPC Service Controls のサービス境界を作成します。ドライラン モードでは、境界が適用されているかのように違反がログに記録されますが、制限されたサービスへのアクセスは阻止されません。自動適用モードに切り替える前にドライラン モードを使用することを、ベスト プラクティスとして推奨します。

  1. Google Cloud コンソールのナビゲーション メニューで [セキュリティ]、[VPC Service Controls] の順にクリックします。

    [VPC Service Controls] ページに移動

  2. [VPC Service Controls] ページで、[ドライラン モード] をクリックします。

  3. [新しい境界] をクリックします。

  4. [新しい VPC サービス境界] タブの [境界名] ボックスに、境界の名前を入力します。それ以外の場合は、デフォルト値を受け入れます。

    境界名の最大長は 50 文字で、先頭は英字にする必要があります。ASCII ラテン文字(a~z、A~Z)、数字(0~9)、アンダースコア(_)のみを使用できます。境界名では大文字と小文字が区別され、アクセス ポリシー内で一意である必要があります。

保護するリソースを選択する

  1. [保護するリソース] をクリックします。

  2. 境界内で保護するプロジェクトまたは VPC ネットワークを追加する手順は次のとおりです。

    1. [リソースの追加] をクリックします。

    2. 境界にプロジェクトを追加するには、[リソースの追加] ペインで [プロジェクトを追加] をクリックします。

      1. プロジェクトを選択するには、[プロジェクトを追加] ダイアログでプロジェクトのチェックボックスをオンにします。このリファレンス アーキテクチャでは、次のプロジェクトを選択します。

        • infra-host-project
        • aiml-host-project
        • ph-fm-svc-project
      2. [Add selected resources] をクリックします。追加されたプロジェクトが [プロジェクト] セクションに表示されます。

制限付きサービスを選択する

このリファレンス アーキテクチャでは、制限付き API のスコープが制限され、Gemini に必要な API のみが有効になります。ただし、ベスト プラクティスとして、Google Cloud サービスからデータが引き出されるリスクを軽減するため、境界を作成するときはすべてのサービスを制限することをおすすめします。

境界内で保護するサービスを選択するには、以下のようにします。

  1. [制限付きサービス] をクリックします。

  2. [制限付きサービス] ペインで [サービスを追加] をクリックします。

  3. [制限するサービスを指定] ダイアログで、[Vertex AI API] を選択します。

  4. [Vertex AI API を追加] をクリックします。

省略可: VPC でアクセス可能なサービスを選択する

VPC でアクセス可能なサービスの設定は、サービス境界内のネットワーク エンドポイントからアクセス可能なサービスのセットを制限します。このリファレンス アーキテクチャでは、[すべてのサービス] のデフォルト設定を維持しています。

省略可: アクセスレベルを選択する

前のセクションで企業 CIDR アクセスレベルを作成した場合は、次の操作を行って、境界の外部から保護されたリソースへのアクセスを許可します。

  1. [アクセスレベル] をクリックします。

  2. [アクセスレベルを選択します] ボックスをクリックします。

    境界が作成された後にアクセスレベルを追加することもできます。

  3. アクセスレベルに対応するチェックボックスをオンにします(このリファレンス アーキテクチャでは corp-public-block です)。

上り(内向き)ポリシーと下り(外向き)ポリシー

このリファレンス アーキテクチャでは、[上り(内向き)ポリシー] ペインまたは [下り(外向き)ポリシー] ペインで設定を指定する必要はありません。

境界を作成する

上記の構成手順を完了したら、[境界を作成] をクリックして境界を作成します。

AWS と Google API 間のネットワーク接続を構成する

Google API 用の Private Service Connect を構成する

プライベート Google アクセスまたは Google API のパブリック ドメイン名を使用する代わりに、Private Service Connect で Google API にアクセスできます。この場合、Google がプロデューサーになります。

Private Service Connect を使用すると、次のことができます。

  • さまざまなユースケースで、1 つ以上の内部 IP アドレスを作成して Google API にアクセスできます。
  • Google API にアクセスするときに、オンプレミス トラフィックを特定の IP アドレスとリージョンに転送できます。
  • Google API の解決に使用されるカスタム エンドポイント DNS 名を作成できます。

リファレンス アーキテクチャでは、IP アドレス 10.10.10.3, を持つ restricted という名前の Private Service Connect Google API エンドポイントがターゲット VPC-SC にデプロイされ、VPC-SC 境界で構成された制限付きサービスにアクセスするための仮想 IP(VIP)として使用されます。VIP を使用して制限されていないサービスをターゲットにすることはできません。詳細については、Vertex AI API へのアクセスについて | Google Cloud をご覧ください。

AWS VPC ネットワークを構成する

アマゾン ウェブ サービス(AWS)と Google Cloud間のネットワーク接続は、高可用性バーチャル プライベート ネットワーク(HA VPN)トンネルを使用して確立されます。この安全な接続により、2 つのクラウド環境間のプライベート通信が容易になります。ただし、AWS のリソースと Google Cloud間のシームレスなルーティングと通信を可能にするために、Border Gateway Protocol(BGP)が使用されます。

Google Cloud 環境では、カスタムルート アドバタイズが必要です。このカスタムルートは、Private Service Connect Google API の IP アドレスを AWS ネットワークにアドバタイズします。この IP アドレスをアドバタイズすることで、AWS はパブリック インターネットをバイパスして Google API への直接ルートを確立し、パフォーマンスを向上させることができます。

リファレンス アーキテクチャでは、VPN が Google Cloudで確立されている AWS VPC との関連付けで Sagemaker インスタンスがデプロイされます。Border Gateway Protocol(BGP)は、AWS と Google Cloud ネットワーク間の HA VPN 全体でルートをアドバタイズするために使用されます。その結果、Google Cloud と AWS は VPN 経由で双方向トラフィックをルーティングできます。HA VPN 接続の設定の詳細については、 Google Cloud と AWS の間に HA VPN 接続を作成するをご覧ください。

Route 53 の更新を構成する

AWS Route 53 に p.googleapis.com という名前のプライベート ホストゾーンを作成し、IP アドレス 10.10.10.3(Private Service Connect Googleapis IP)を使用して完全修飾ドメイン名 REGION-aiplatform-restricted.p.googleapis.com を DNS A レコードとして追加します。Jupyter Notebook SDK が Gemini にアクセスするために Vertex AI API の DNS ルックアップを実行すると、Route 53 は Private Service Connect Google API の IP アドレスを返します。Jupyter Notebook は、Route 53 から取得した IP アドレスを使用して、HA VPN を介して Google Cloudにルーティングされた Private Service Connect Google API エンドポイントへの接続を確立します。

SageMaker の更新を構成する

このリファレンス アーキテクチャでは、Amazon SageMaker Notebook インスタンスを使用して Vertex AI API にアクセスします。ただし、Amazon EC2AWS Lambda など、VPC をサポートする他のコンピューティング サービスでも同じ設定を実現できます。

リクエストを認証するには、 Google Cloud サービス アカウント キーを使用するか、Workload Identity 連携を使用します。Workload Identity 連携の設定については、オンプレミスまたは別のクラウド プロバイダをご覧ください。

Jupyter Notebook インスタンスは、カスタム Private Service Connect Google API の完全修飾ドメイン名 REGION-aiplatform-restricted.p.googleapis.com への DNS 解決を実行して、デフォルトの完全修飾ドメイン名(REGION-aiplatform.googleapis.com)をオーバーライドすることで、Google Cloud でホストされている Gemini モデルへの API 呼び出しを行います。

Vertex AI API は、Rest、gRPC、SDK を使用して呼び出すことができます。Private Service Connect の顧客の完全修飾ドメイン名を使用するには、Jupyter Notebook の API_ENDPOINT を次のように更新します。

Vertex AI SDK for Python の使用手順

  1. SDK をインストールします。

    pip install --upgrade google-cloud-aiplatform
    
  2. 依存関係をインポートします。

    from google.cloud import aiplatform
    from vertexai.generative_models import GenerativeModel, Part, SafetySetting
    import vertexai
    import base64
    
  3. 次の環境変数を初期化します。

    PROJECT_ID="ph-fm-svc-projects" # Google Cloud Project ID
    LOCATION_ID="us-central1" # Enter Vertex AI Gemini region such a s us-central1
    API_ENDPOINT="us-central1-aiplatform-restricted.p.googleapis.com" # PSC Endpoint
    MODEL_ID="gemini-2.0-flash-001" # Gemini Model ID
    
  4. Vertex AI SDK for Python を初期化します。

    vertexai.init(project=PROJECT_ID,api_endpoint=API_ENDPOINT, api_transport="rest")
    
  5. Vertex AI Gemini API に次のリクエストを行います。

    import base64
    from vertexai.generative_models import GenerativeModel, Part, SafetySetting
    
    def generate(model_id, prompt):
        model = GenerativeModel(
            model_id,
        )
        responses = model.generate_content(
            [prompt],
            generation_config=generation_config,
            safety_settings=safety_settings,
            stream=True,
        )
    
        for response in responses:
            print(response.text, end="")
    
    generation_config = {
        "max_output_tokens": 8192,
        "temperature": 1,
        "top_p": 0.95,
    }
    
    safety_settings = [
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
    ]
    
    prompt = "which weighs more: 1kg feathers or 1kg stones"
    generate(MODEL_ID,prompt)
    

    この時点で、Jupyter ノートブックから Gemini に API 呼び出しを行い、 Google Cloudでホストされている Gemini にアクセスできます。呼び出しが成功すると、次のような出力が表示されます。

    They weigh the same. Both weigh 1 kilogram.
    

Vertex AI REST API の使用手順

このセクションでは、プロセス全体で使用される重要な変数を設定します。これらの変数には、リソースのロケーション、特定の Gemini モデル、使用する Private Service Connect エンドポイントなど、プロジェクトに関する情報が格納されます。

  1. Jupyter ノートブック内でターミナル ウィンドウを開きます。

  2. 次の環境変数を初期化します。

    export PROJECT_ID="ph-fm-svc-projects"
    export LOCATION_ID="us-central1"
    export API_ENDPOINT="us-central1-aiplatform-restricted.p.googleapis.com" export MODEL_ID="gemini-2.0-flash-001"
    
  3. テキスト エディタ(vimnano など)を使用して、次の形式の Vertex AI Gemini API リクエストを含む request.json という名前の新しいファイルを作成します。

    {
       "contents": [
          {
             "role": "user",
             "parts": [
                 {
                     "text": "which weighs more: 1kg feathers or 1kg stones"
                 }
             ]
          }
       ],
       "generationConfig": {
          "temperature": 1,
          "maxOutputTokens": 8192,
          "topP": 0.95,
          "seed": 0
       },
       "safetySettings": [
          {
             "category": "HARM_CATEGORY_HATE_SPEECH",
             "threshold": "OFF"
          },
          {
             "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
             "threshold": "OFF"
          },
          {
             "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
             "threshold": "OFF"
          },
          {
             "category": "HARM_CATEGORY_HARASSMENT",
             "threshold": "OFF"
          }
       ]
    }
    
  4. Vertex AI Gemini API に次の cURL リクエストを行います。

    curl -v \
    -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://$API_ENDPOINT/v1/projects/$PROJECT_ID/locations/$LOCATION_ID/publishers/google/models/$MODEL_ID:streamGenerateContent" -d '@request.json'
    

ドライラン モードで境界を検証する

このリファレンス アーキテクチャでは、サービス境界はドライラン モードで構成されているため、アクセス ポリシーの効果を適用せずにテストできます。つまり、ポリシーが有効になった場合に環境にどのような影響を与えるかを確認できますが、正当なトラフィックが中断されるリスクはありません。

ドライラン モードで境界を検証したら、自動適用モードに切り替えます

次のステップ