オンライン予測に Private Service Connect を使用する

Private Service Connect を使用すると、パブリック IP アドレス、パブリック インターネット アクセス、明示的にピアリングされた内部 IP アドレス範囲を必要とせずに、複数のコンシューマ プロジェクトと VPC ネットワークから Vertex AI オンライン予測に安全にアクセスできます。

オンライン予測のユースケースで、次の要件がある場合は、Private Service Connect の使用をおすすめします。

  • プライベートかつセキュアな接続を必須にする
  • 低レイテンシを必要とする
  • 一般公開する必要はありません

Private Service Connect は、VPC ネットワークの転送ルールを使用して、Vertex AI オンライン予測サービスにトラフィックを単方向に送信します。転送ルールは、Vertex AI サービスを VPC ネットワークに公開するサービス アタッチメントに接続します。詳細については、Private Service Connect を介した Vertex AI サービスへのアクセスについてをご覧ください。Private Service Connect の設定の詳細については、Virtual Private Cloud(VPC)ドキュメントの Private Service Connect の概要をご覧ください。

オンライン予測エンドポイントを作成する

Private Service Connect が有効なオンライン予測エンドポイントを作成するには、次のいずれかの方法を使用します。

コンソール

  1. Google Cloud コンソールで、Vertex AI の [オンライン予測] ページに移動します。

    [オンライン予測] に移動

  2. [作成] をクリックします。

  3. エンドポイントの表示名を指定します。

  4. [非公開] を選択します。

  5. [Private Service Connect] を選択します。

  6. [プロジェクト ID を選択] をクリックします。

  7. エンドポイントの許可リストに追加するプロジェクトを選択します。

  8. [続行] をクリックします。

  9. モデルの仕様を選択します。詳細については、エンドポイントにモデルをデプロイするをご覧ください。

  10. [作成] をクリックします。エンドポイントを作成してモデルをデプロイします。

  11. レスポンスのエンドポイント ID をメモします。

API

REST

リクエストのデータを使用する前に、次のように置き換えます。

  • VERTEX_AI_PROJECT_ID: オンライン予測エンドポイントを作成する Google Cloud プロジェクトの ID。
  • REGION: Vertex AI を使用するリージョン。
  • VERTEX_AI_ENDPOINT_NAME: オンライン予測エンドポイントの表示名。
  • ALLOWED_PROJECTS: Google Cloud プロジェクト ID のカンマ区切りリスト。各 ID は引用符で囲みます(例: ["PROJECTID1", "PROJECTID2"])。プロジェクトがこのリストに含まれていない場合、そのプロジェクトから Vertex AI エンドポイントに予測リクエストを送信することはできません。このリストに VERTEX_AI_PROJECT_ID を含めて、同じプロジェクトからエンドポイントを呼び出せるようにします。

HTTP メソッドと URL:

POST https://REGION-aiplatform.googleapis.com/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints

リクエストの本文(JSON):

{
  "displayName": "VERTEX_AI_ENDPOINT_NAME",
  "privateServiceConnectConfig": {
    "enablePrivateServiceConnect": true,
    "projectAllowlist": ["ALLOWED_PROJECTS"]
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "name": "projects/VERTEX_AI_PROJECT_NUMBER/locations/REGION/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateEndpointOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-11-05T17:45:42.812656Z",
      "updateTime": "2020-11-05T17:45:42.812656Z"
    }
  }
}
ENDPOINT_ID をメモしておいてください。

Python

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Python の設定手順を完了してください。詳細については、Vertex AI Python API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

PROJECT_ID = "VERTEX_AI_PROJECT_ID"
REGION = "REGION"
VERTEX_AI_ENDPOINT_NAME = "VERTEX_AI_ENDPOINT_NAME"

from google.cloud import aiplatform

aiplatform.init(project=PROJECT_ID, location=REGION)

# Create the forwarding rule in the consumer project
psc_endpoint = aiplatform.PrivateEndpoint.create(
display_name=VERTEX_AI_ENDPOINT_NAME,
project=PROJECT_ID,
location=REGION,
private_service_connect_config=aiplatform.PrivateEndpoint.PrivateServiceConnectConfig(
    project_allowlist=["ALLOWED_PROJECTS"],
    ),
)

次のように置き換えます。

  • VERTEX_AI_PROJECT_ID: オンライン予測エンドポイントを作成する Google Cloud プロジェクトの ID。
  • REGION: Vertex AI を使用するリージョン。
  • VERTEX_AI_ENDPOINT_NAME: オンライン予測エンドポイントの表示名。
  • ALLOWED_PROJECTS: Google Cloud プロジェクト ID のカンマ区切りリスト。各プロジェクト ID は引用符で囲みます。例: ["PROJECTID1", "PROJECTID2"]プロジェクトがこのリストに含まれていない場合、そのプロジェクトから Vertex AI エンドポイントに予測リクエストを送信することはできません。このリストに VERTEX_AI_PROJECT_ID を追加して、同じプロジェクトからエンドポイントを呼び出せるようにします。

返されたエンドポイント URI の末尾にある ENDPOINT_ID をメモします。

INFO:google.cloud.aiplatform.models:To use this PrivateEndpoint in another session:
INFO:google.cloud.aiplatform.models:endpoint = aiplatform.PrivateEndpoint('projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID')

モデルをデプロイする

Private Service Connect を有効にしてオンライン予測エンドポイントを作成した後は、エンドポイントにモデルをデプロイするの手順に沿って、モデルをデプロイします。

サービス アタッチメントの URI を取得する

モデルをデプロイすると、オンライン予測エンドポイントのサービス アタッチメントが作成されます。このサービス アタッチメントは、VPC ネットワークに公開されている Vertex AI オンライン予測サービスを表します。gcloud ai endpoints describe コマンドを実行して、サービス アタッチメント URI を取得します。

  1. エンドポイントの詳細の serviceAttachment 値のみを一覧表示します。

    gcloud ai endpoints describe ENDPOINT_ID \
    --project=VERTEX_AI_PROJECT_ID \
    --region=REGION \
    | grep -i serviceAttachment
    

    次のように置き換えます。

    • ENDPOINT_ID: オンライン予測エンドポイントの ID
    • VERTEX_AI_PROJECT_ID: オンライン予測エンドポイントを作成した Google Cloud プロジェクトの ID
    • REGION: このリクエストのリージョン。

    出力は次のようになります。

    serviceAttachment: projects/ac74a9f84c2e5f2a1-tp/regions/us-central1/serviceAttachments/gkedpm-c6e6a854a634dc99472bb802f503c1
    
  2. serviceAttachment フィールドの文字列全体をメモします。これはサービス アタッチメント URI です。

転送ルールの作成

内部 IP アドレスを予約し、予約したアドレスで転送ルールを作成できます。転送ルールを作成するには、前のステップで取得したサービス アタッチメント URI が必要です。

  1. 転送ルールの内部 IP アドレスを予約するには、gcloud compute addresses create コマンドを使用します。

    gcloud compute addresses create ADDRESS_NAME \
    --project=VPC_PROJECT_ID \
    --region=REGION \
    --subnet=SUBNETWORK \
    --addresses=INTERNAL_IP_ADDRESS
    

    次のように置き換えます。

    • ADDRESS_NAME: 内部 IP アドレスの名前
    • VPC_PROJECT_ID: VPC ネットワークをホストする Google Cloud プロジェクトの ID。オンライン予測エンドポイントと Private Service Connect 転送ルールが同じプロジェクトでホストされている場合は、このパラメータに VERTEX_AI_PROJECT_ID を使用します。
    • REGION: Private Service Connect 転送ルールを作成する Google Cloud リージョン
    • SUBNETWORK: IP アドレスを含む VPC サブネットの名前
    • INTERNAL_IP_ADDRESS: 予約する内部 IP アドレス。このパラメータは省略可能です。

      • このパラメータを指定する場合、IP アドレスはサブネットのプライマリ IP アドレス範囲内にする必要があります。IP アドレスには、RFC 1918 アドレス、または RFC 以外の範囲を持つサブネットを指定できます。
      • このパラメータを省略すると、内部 IP アドレスが自動的に割り振られます。
      • 詳細については、新しい静的内部 IPv4 または IPv6 アドレスを予約するをご覧ください。
  2. IP アドレスが予約されていることを確認するには、gcloud compute addresses list コマンドを使用します。

    gcloud compute addresses list --filter="name=(ADDRESS_NAME)" \
    --project=VPC_PROJECT_ID
    

    レスポンスで、IP アドレスに RESERVED ステータスが表示されていることを確認します。

  3. 転送ルールを作成してオンライン予測サービス アタッチメントにポイントするには、gcloud compute forwarding-rules create コマンドを使用します。

    gcloud compute forwarding-rules create PSC_FORWARDING_RULE_NAME \
        --address=ADDRESS_NAME \
        --project=VPC_PROJECT_ID \
        --region=REGION \
        --network=VPC_NETWORK_NAME \
        --target-service-attachment=SERVICE_ATTACHMENT_URI
    

    次のように置き換えます。

    • PSC_FORWARDING_RULE_NAME: 転送ルールの名前
    • VPC_NETWORK_NAME: エンドポイントを作成する VPC ネットワークの名前
    • SERVICE_ATTACHMENT_URI: 先ほどメモしたサービス アタッチメント
  4. サービス アタッチメントがエンドポイントを受け入れることを確認するには、gcloud compute forwarding-rules describe コマンドを使用します。

    gcloud compute forwarding-rules describe PSC_FORWARDING_RULE_NAME \
    --project=VPC_PROJECT_ID \
    --region=REGION
    

    レスポンスで、pscConnectionStatus フィールドに ACCEPTED ステータスが表示されていることを確認します。

省略可: 内部 IP アドレスを取得する

転送ルールの作成時に INTERNAL_IP_ADDRESS の値を指定しなかった場合は、gcloud compute forwarding-rules describe コマンドを使用して、自動的に割り振られたアドレスを取得できます。

gcloud compute forwarding-rules describe PSC_FORWARDING_RULE_NAME \
--project=VERTEX_AI_PROJECT_ID \
--region=REGION \
| grep -i IPAddress

次のように置き換えます。

  • VERTEX_AI_PROJECT_ID: プロジェクト ID
  • REGION: このリクエストのリージョン名

オンライン予測を取得する

Private Service Connect を使用してエンドポイントからオンライン予測を取得する方法は、公開エンドポイントからオンライン予測を取得する方法と似ていますが、次の点に注意してください。

  • リクエストは、オンライン予測エンドポイントの作成時に projectAllowlist で指定されたプロジェクトから送信する必要があります。
  • グローバル アクセスが有効になっていない場合は、同じリージョンからリクエストを送信する必要があります。
  • REST を使用して予測を行うには、内部 IP アドレスの DNS レコードを作成しない限り、エンドポイントの静的 IP アドレスを使用して接続する必要があります。たとえば、predict リクエストを次のエンドポイントに送信する必要があります。

    https://INTERNAL_IP_ADDRESS/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict
    

    INTERNAL_IP_ADDRESS は、前に予約した内部 IP アドレスに置き換えます。

  • Python を使用して predict リクエストを送信する方法の例を以下に示します。

    REQUEST_FILE = "PATH_TO_INPUT_FILE"
    import json
    
    import urllib3
    
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
    with open(REQUEST_FILE) as json_file:
        data = json.load(json_file)
        response = psc_endpoint.predict(
            instances=data["instances"], endpoint_override=INTERNAL_IP_ADDRESS
        )
    print(response)
    

    PATH_TO_INPUT_FILE は、リクエスト入力を含む JSON ファイルのパスに置き換えます。

省略可: 内部 IP アドレスの DNS レコードを作成する

内部 IP アドレスを指定することを必要とせずにエンドポイントからオンライン予測を取得できるように、DNS レコードを作成することをおすすめします。

詳細については、DNS を構成するその他の方法をご覧ください。

  1. gcloud dns managed-zones create コマンドを使用して、限定公開 DNS ゾーンを作成します。このゾーンは、転送ルールが作成された VPC ネットワークに関連付けられています。

    DNS_NAME_SUFFIX="prediction.p.vertexai.goog."  # DNS names have "." at the end.
    gcloud dns managed-zones create ZONE_NAME \
    --project=VPC_PROJECT_ID \
    --dns-name=$DNS_NAME_SUFFIX \
    --networks=VPC_NETWORK_NAME \
    --visibility=private \
    --description="A DNS zone for Vertex AI endpoints using Private Service Connect."
    
    

    次のように置き換えます。

    • ZONE_NAME: DNS ゾーンの名前
  2. ゾーンに DNS レコードを作成するには、gcloud dns record-sets create コマンドを使用します。

    DNS_NAME=ENDPOINT_ID.REGION-VERTEX_AI_PROJECT_NUMBER.$DNS_NAME_SUFFIX
    gcloud dns record-sets create $DNS_NAME \
    --rrdatas=INTERNAL_IP_ADDRESS \
    --zone=ZONE_NAME \
    --type=A \
    --ttl=60 \
    --project=VPC_PROJECT_ID
    

    次のように置き換えます。

    • VERTEX_AI_PROJECT_NUMBER: プロジェクトの VERTEX_AI_PROJECT_ID プロジェクト番号このプロジェクト番号は、Google Cloud コンソールで確認できます。詳細については、プロジェクトの識別をご覧ください。
    • INTERNAL_IP_ADDRESS: オンライン予測エンドポイントの内部 IP アドレス

    predict リクエストを次の場所に送信できるようになりました。

    https://ENDPOINT_ID.REGION-VERTEX_AI_PROJECT_NUMBER.prediction.p.vertexai.goog/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict
    

Python を使用して DNS ゾーンに predict リクエストを送信する方法の例を以下に示します。

REQUEST_FILE = "PATH_TO_INPUT_FILE"
import json

import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

with open(REQUEST_FILE) as json_file:
    data = json.load(json_file)
    response = psc_endpoint.predict(
        instances=data["instances"], endpoint_override=DNS_NAME
    )
print(response)

DNS_NAME は、gcloud dns record-sets create コマンドで指定した DNS 名に置き換えます。

制限事項

Private Service Connect を使用する Vertex AI エンドポイントには、次の制限があります。

  • エンドポイント内からのプライベート下り(外向き)はサポートされていません。Private Service Connect の転送ルールは単方向のルールであるため、他のプライベート Google Cloud ワークロードはコンテナ内からアクセスできません。
  • エンドポイントの projectAllowlist 構成は変更できません。
  • アクセス ロギングはサポートされていません。
  • リクエストとレスポンスのロギングはサポートされていません。
  • Vertex Explainable AI はサポートされていません。

プレビュー版の制限

プレビュー版では、次の制限が追加で適用されます。

  • すべての Private Service Connect モデルをデプロイ解除して再デプロイする場合は、サービス アタッチメント名が同じであっても、転送ルールを再作成する必要があります。
  • すべてのエンドポイントで同じ projectAllowlist 構成を使用する必要があります。

次のステップ