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 ワークステーションがあるオンプレミスなど)から行われる場合、アクセスレベルは必要ありません。

このリファレンス アーキテクチャでは、企業の 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 を構成する

Private Service Connect を使用して Google API にアクセスすると、限定公開の Google アクセスまたは 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 ネットワークを構成する

Amazon Web Services(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 への直接ルートを確立し、パブリック インターネットをバイパスしてパフォーマンスを向上させることができます。

このリファレンス アーキテクチャでは、 Google Cloudを使用して VPN が確立されている 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 という名前の限定公開ホストゾーンを作成し、完全修飾ドメイン名 REGION-aiplatform-restricted.p.googleapis.com と IP アドレス 10.10.10.3(Private Service Connect Googleapis IP)を DNS A レコードとして追加します。Jupyter Notebook SDK が Vertex AI API の DNS ルックアップを実行して Gemini に到達すると、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-1.5-flash-002" # 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-1.5-flash-002"
    
  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'
    

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

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

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

次のステップ