Private Service Connect でベクトル検索を設定する

Private Service Connect を使用すると、異なるグループ、チーム、プロジェクト、組織に属する VPC ネットワーク全体でサービスをプライベートに利用できます。VPC ネットワーク内部で定義した IP アドレスを使用してサービスを公開し、使用できます。また、ベクトル検索エンドポイントでは、ベクトル類似性検索を実行できます。

ベクトル検索エンドポイントで Private Service Connect を有効にするのは、次のようなユースケースに適しています。

  1. ベクトル検索サービスのバックエンドに、低レイテンシかつ安全に接続する必要がある。
  2. 排他的 VPC ピアリング予約用の IP 空間が限られている。
  3. 複数のユーザー VPC ネットワークから、サービスを提供するバックエンドにアクセスする必要がある。

Private Service Connect の設定の詳細については、Virtual Private Cloud(VPC)ドキュメントの Private Service Connect の概要をご覧ください。

インデックス エンドポイントを作成する

エンドポイントを作成するときに Private Service Connect を有効にする必要があります。この手順は、Vertex AI で他のエンドポイントを作成するときと同様です。

REST

  • PROJECT: Vertex AI リソースを作成するサービス プロジェクトの ID。

  • REGION: ネットワーク リージョン。

  • DISPLAY_NAME: エンドポイントに付ける表示名。この名前はエンドポイントの ID の作成に使用され、後で更新することはできません。

  • VPC_PROJECTS: 共有 VPC の設定では、VPC ホスト プロジェクトのカンマ区切りリストです。スタンドアロン VPC 設定の場合、これは PROJECT と同じです。

PROJECT=PROJECT_ID
VPC_PROJECT=VPC_PROJECT_ID
REGION=us-central1
VERTEX_ENDPOINT=REGION-aiplatform.googleapis.com
curl -H "Content-Type: application/json" \
  -H "Authorization: Bearer `gcloud auth print-access-token`" \
  https://REGION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/REGION/indexEndpoints \
  -d '{
     "displayName": "DISPLAY_NAME",
     "privateServiceConnectConfig": {
       "enablePrivateServiceConnect": true,
       "projectAllowlist": [ "VPC_PROJECT_1", "VPC_PROJECT_2", "VPC_PROJECT_N"]
     }
   }

コンソール

エンドポイントを作成するには:

  1. 次のボタンをクリックして、 Google Cloud コンソールのベクトル検索に移動します。アクティブなインデックスのリストが表示されます。

    [ベクトル検索] に移動

  2. [インデックス エンドポイント] タブを選択します。インデックス エンドポイントが表示されます。

  3. [Create new endpoint] をクリックします。[Create a new index endpoint] パネルが開きます。

  4. [表示名] に、インデックス エンドポイントの表示名を入力します。この名前はエンドポイントの ID の作成に使用され、後で更新することはできません。

  5. [リージョン] プルダウンからリージョンを選択します。

  6. [アクセス] で [Private Service Connect(プレビュー)] をクリックします。

  7. 使用する VPC プロジェクトを指定できるテキスト フィールドが表示されます。使用する VPC プロジェクトの ID または番号を追加します。

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

インデックスのデプロイ オプションについて

インデックスは、自動または手動のサービス接続でデプロイできます。

  • Private Service Connect の自動化でデプロイする: サービス接続ポリシーを設定し、インデックスをデプロイします。サービス接続ポリシーを設定すると、コンピューティング アドレスと転送ルールを毎回作成しなくても、特定のネットワークにデプロイできます。
  • 手動接続でデプロイする: インデックスをデプロイし、コンピューティング アドレスと転送ルールを手動で作成します。同じサービス アタッチメント URI に複数の IP アドレスを使用する必要がある場合は、このオプションを選択します。これは一般的なユースケースではありません。

Private Service Connect の自動化でデプロイする

サービス接続ポリシーを設定すると、各インデックスのデプロイ後にコンピューティング アドレスと転送ルールを手動で作成する必要がなくなります。

  1. まず、インデックスをデプロイするネットワーク、サービスクラス、リージョンを指定するサービス接続ポリシーを作成します。これは、1 回限りの設定です。すでにこれを行っている場合は、次の手順に進みます。
  2. インデックスのデプロイ

制限事項

自動化では、プロジェクトごとにネットワークごとに 1 つの IP アドレスのみを使用できます。複数の IP アドレスを使用する必要がある場合は、インデックスを手動でデプロイするをご覧ください。

サービス接続ポリシーを作成する

インデックスのデプロイを自動化するためのサービス接続ポリシーを作成するには、ネットワーク管理者である必要があります。

インデックスのデプロイを自動化する手順は次のとおりです。

  1. サービス接続ポリシーを作成します。

    • PROJECT: Vertex AI リソースを作成するサービス プロジェクト。

    • VPC_PROJECT: クライアント VPC が存在するプロジェクト。単一の VPC 設定では、$PROJECT と同じです。共有 VPC 設定の場合、これは VPC ホスト プロジェクトです。

    • NETWORK_NAME: デプロイ先のネットワークの名前(projects//global/networks/ の形式)。

    • REGION: ネットワーク リージョン。

    • PSC_SUBNETS: 使用する Private Service Connect サブネット。

    gcloud network-connectivity service-connection-policies create <policy_name> \
    --project=<vpc_project> --network=<network_name> # in the format projects/<project_id>/global/networks/<network_name> \
    --service-class=gcp-vertexai --region=<region> --subnets=<psc subnets>
    
  2. サービス接続ポリシーを表示します。

    gcloud network-connectivity service-connection-policies list --project=<vpc_project> -–region=<region>
    

サービス接続ポリシーの詳細については、サービス接続ポリシーを構成するをご覧ください。

インデックスのデプロイ

REST

  • PROJECT: Vertex AI リソースを作成するサービス プロジェクト。

  • VPC_PROJECT: クライアント VPC が存在するプロジェクト。共有 VPC 設定の場合、これは VPC ホスト プロジェクトです。

  • DISPLAY_NAME: エンドポイントに付ける表示名。この名前はエンドポイントの ID の作成に使用され、後で更新することはできません。

  • NETWORK_NAME: デプロイ先のネットワークの名前(projects//global/networks/ の形式)。

  • REGION: ネットワーク リージョン。

  • PSC_SUBNETS: 使用する Private Service Connect サブネット。

PROJECT=PROJECT
VPC_PROJECTS=VPC_PROJECTS
REGION=REGION
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)"
-H "Content-Type: application/json; charset=utf-8" "https://REGIONAL_ENDPOINT.googleapis.com/v1/projects/PROJECT_NUMBER/locations/REGION/indexEndpoints/INDEX_ENDPOINT_ID:deployIndex"
-d '{
  "deployedIndex": {
    "id": "DEPLOYED_INDEX_ID",
    "index": "projects/PROJECT/locations/us-central1/indexes/INDEX_ID ",
    "displayName": "DISPLAY_NAME",
    "psc_automation_configs": [
      { "project_id": "PROJECT_1", "network": "NETWORK_NAME_1" },
      { "project_id": "PROJECT_2", "network": "NETWORK_NAME_2" },
      { "project_id": "PROJECT_N", "network": "NETWORK_NAME_N" }]
    }
}'

コンソール

エンドポイントをデプロイするには:

  1. 次のボタンをクリックして、 Google Cloud コンソールのベクトル検索に移動します。アクティブなインデックスのリストが表示されます。

    [ベクトル検索] に移動

  2. デプロイする Private Service Connect 対応ベクトル検索エンドポイントの [デプロイ] ボタンをクリックします。[インデックスをデプロイ] スライドアウト パネルが表示されます。

  3. [表示名] に、デプロイされたインデックスの表示名を入力します。この名前は ID の作成に使用され、後で更新することはできません。

  4. [エンドポイント] をクリックし、デプロイ先のインデックス エンドポイントを選択します。

  5. 必要に応じて、[マシンタイプ] をクリックして、インデックスをデプロイするマシンのタイプを手動で選択します。デフォルトでは、マシンタイプはインデックス シャードサイズに基づいて自動的に選択されます。

Private Service Connect の自動化構成を追加する必要があります。手順は次のとおりです。

  1. [PSC 自動化構成] セクションで、 [新しい構成を追加] をクリックします。

  2. 接続する VPC プロジェクトの名前を入力します。

  3. 接続する VPC プロジェクトのネットワーク名を入力します。形式は projects/<project_number>/global/networks/<network_name> にする必要があります。

  4. 必要に応じて、[新しい構成を追加] をクリックして、Private Service Connect の自動化構成の追加を続行します。

  5. [デプロイ] をクリックして終了します。

サービス接続ポリシーの削除

サービス接続ポリシーを削除する必要がある場合は、次のコマンドを実行します。

gcloud network-connectivity service-connection-policies delete --project=<vpc_project> –-region=<region> <policy_name>

サービス接続ポリシーの詳細については、サービス接続ポリシーを構成するをご覧ください。

手動接続でデプロイする

インデックスをデプロイし、VPC プロジェクトに転送ルールを作成します。

インデックスのデプロイ

インデックスの準備が整ったので、この手順では、Private Service Connect を有効にして作成したエンドポイントに、インデックスをデプロイします。

gcloud

この例では、gcloud ai index-endpoints deploy-index コマンドを使用します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • INDEX_ENDPOINT_ID: インデックス エンドポイントの ID。
  • DEPLOYED_INDEX_ID: デプロイされたインデックスを一意に識別するユーザー指定の文字列。先頭は英字にします。英字、数字、アンダースコアのみ使用できます。形式のガイドラインについては、DeployedIndex.id をご覧ください。
  • DEPLOYED_INDEX_ENDPOINT_NAME: デプロイされたインデックス エンドポイントの表示名。
  • INDEX_ID: インデックスの ID。
  • LOCATION: Vertex AI を使用するリージョン。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID \
    --deployed-index-id=DEPLOYED_INDEX_ID \
    --display-name=DEPLOYED_INDEX_ENDPOINT_NAME \
    --index=INDEX_ID \
    --region=LOCATION \
    --project=PROJECT_ID

Windows(PowerShell)

gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID `
    --deployed-index-id=DEPLOYED_INDEX_ID `
    --display-name=DEPLOYED_INDEX_ENDPOINT_NAME `
    --index=INDEX_ID `
    --region=LOCATION `
    --project=PROJECT_ID

Windows(cmd.exe)

gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID ^
    --deployed-index-id=DEPLOYED_INDEX_ID ^
    --display-name=DEPLOYED_INDEX_ENDPOINT_NAME ^
    --index=INDEX_ID ^
    --region=LOCATION ^
    --project=PROJECT_ID

REST

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

  • INDEX_ENDPOINT_ID: インデックス エンドポイントの ID。
  • DEPLOYED_INDEX_ID: デプロイされたインデックスを一意に識別するユーザー指定の文字列。先頭は英字にします。英字、数字、アンダースコアのみ使用できます。形式のガイドラインについては、DeployedIndex.id をご覧ください。
  • DEPLOYED_INDEX_ENDPOINT_NAME: デプロイされたインデックス エンドポイントの表示名。
  • INDEX_ID: インデックスの ID。
  • LOCATION: Vertex AI を使用するリージョン。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID
  • PROJECT_NUMBER: プロジェクトに自動生成されたプロジェクト番号

HTTP メソッドと URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexEndpoints/INDEX_ENDPOINT_ID:deployIndex

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

{
 "deployedIndex": {
   "id": "DEPLOYED_INDEX_ID",
   "index": "projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID",
   "displayName": "DEPLOYED_INDEX_ENDPOINT_NAME"
 }
}

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

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

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexEndpoints/INDEX_ENDPOINT_ID/operations/OPERATION_ID",
 "metadata": {
   "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeployIndexOperationMetadata",
   "genericMetadata": {
     "createTime": "2022-10-19T17:53:16.502088Z",
     "updateTime": "2022-10-19T17:53:16.502088Z"
   },
   "deployedIndexId": "DEPLOYED_INDEX_ID"
 }
}

Terraform

次のサンプルでは、vertex_ai_index_endpoint_deployed_index Terraform リソースを使用して、デプロイするインデックス エンドポイントを作成します。

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

provider "google" {
  region = "us-central1"
}

resource "google_vertex_ai_index_endpoint_deployed_index" "default" {
  depends_on        = [google_vertex_ai_index_endpoint.default]
  index_endpoint    = google_vertex_ai_index_endpoint.default.id
  index             = google_vertex_ai_index.default.id
  deployed_index_id = "deployed_index_for_psc"
}

resource "google_vertex_ai_index_endpoint" "default" {
  display_name = "sample-endpoint"
  description  = "A sample index endpoint with Private Service Connect enabled"
  region       = "us-central1"
  private_service_connect_config {
    enable_private_service_connect = true
    project_allowlist = [
      data.google_project.project.project_id,
    ]
  }
}

data "google_project" "project" {}

# Cloud Storage bucket name must be unique
resource "random_id" "default" {
  byte_length = 8
}

# Create a Cloud Storage bucket
resource "google_storage_bucket" "bucket" {
  name                        = "vertex-ai-index-bucket-${random_id.default.hex}"
  location                    = "us-central1"
  uniform_bucket_level_access = true
}

# Create index content
resource "google_storage_bucket_object" "data" {
  name    = "contents/data.json"
  bucket  = google_storage_bucket.bucket.name
  content = <<EOF
{"id": "42", "embedding": [0.5, 1.0], "restricts": [{"namespace": "class", "allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace": "class", "allow": ["dog", "pet"]},{"namespace": "category", "allow": ["canine"]}]}
EOF
}

resource "google_vertex_ai_index" "default" {
  region       = "us-central1"
  display_name = "sample-index-batch-update"
  description  = "A sample index for batch update"
  labels = {
    foo = "bar"
  }

  metadata {
    contents_delta_uri = "gs://${google_storage_bucket.bucket.name}/contents"
    config {
      dimensions                  = 2
      approximate_neighbors_count = 150
      distance_measure_type       = "DOT_PRODUCT_DISTANCE"
      algorithm_config {
        tree_ah_config {
          leaf_node_embedding_count    = 500
          leaf_nodes_to_search_percent = 7
        }
      }
    }
  }
  index_update_method = "BATCH_UPDATE"

  timeouts {
    create = "2h"
    update = "1h"
  }
}

Vertex AI SDK for Python

Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。詳細については、Vertex AI SDK for Python API のリファレンス ドキュメントをご覧ください。

def vector_search_deploy_index(
    project: str,
    location: str,
    index_name: str,
    index_endpoint_name: str,
    deployed_index_id: str,
) -> None:
    """Deploy a vector search index to a vector search index endpoint.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_name (str): Required. The index to update. A fully-qualified index
          resource name or a index ID.  Example:
          "projects/123/locations/us-central1/indexes/my_index_id" or
          "my_index_id".
        index_endpoint_name (str): Required. Index endpoint to deploy the index
          to.
        deployed_index_id (str): Required. The user specified ID of the
          DeployedIndex.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index
    index = aiplatform.MatchingEngineIndex(index_name=index_name)

    # Create the index endpoint instance from an existing endpoint.
    index_endpoint = aiplatform.MatchingEngineIndexEndpoint(
        index_endpoint_name=index_endpoint_name
    )

    # Deploy Index to Endpoint
    index_endpoint = index_endpoint.deploy_index(
        index=index, deployed_index_id=deployed_index_id
    )

    print(index_endpoint.deployed_indexes)

コンソール

次の手順でインデックスをデプロイします。

  1. コンソールの [Vertex AI] セクションで、[デプロイと使用] セクションに移動します。 Google Cloud [ベクトル検索] を選択します。

    [ベクトル検索] に移動します。アクティブなインデックスのリストが表示されます。

  2. デプロイするインデックスの名前を選択します。インデックスの詳細ページが開きます。
  3. インデックスの詳細ページで、[ エンドポイントにデプロイ] をクリックします。インデックスのデプロイパネルが開きます。
  4. 表示名を入力します。この名前は ID として使用され、更新できません。
  5. [エンドポイント] プルダウンから、このインデックスをデプロイするエンドポイントを選択します。注: インデックスがすでにデプロイされている場合、そのエンドポイントは使用できません。
  6. 省略可: [マシンタイプ] フィールドで、標準またはハイメモリを選択します。
  7. 省略可。[自動スケーリングを有効にする] を選択すると、ワークロードの需要に応じてノード数が自動的に変更されます。自動スケーリングが無効になっている場合、デフォルトのレプリカ数は 2 です。
  8. [デプロイ] をクリックして、エンドポイントにインデックスをデプロイします。注: デプロイには 30 分ほどかかります。

VPC プロジェクトでの転送ルールの作成

インデックスのデプロイが完了すると、インデックス エンドポイントは IP アドレスではなくサービス アタッチメント URI を返します。コンピューティング アドレスを作成し、作成したコンピューティング アドレスを使用して、サービス アタッチメントをターゲットとする VPC プロジェクトに転送ルールを作成する必要があります。コンピューティング アドレスを作成するには、次の例を使用します。

gcloud compute addresses create ${ADDRESS_NAME:?} \
    --region=${REGION:?} \
    --subnet=${SUBNET_NAME:?} \
    --project=${VPC_PROJECT:?}

作成したコンピューティング アドレスを使用してサービス アタッチメント URI をターゲットとする転送ルールを作成するには、次の例を使用します。

SERVICE_ATTACHMENT_URI=`gcloud ai index-endpoints describe {INDEX_ENDPOINT_ID}
--format="value(deployedIndexes.privateEndpoints.serviceAttachment)"`

gcloud compute forwarding-rules create ${ENDPOINT_NAME:?} \
    --network=${NETWORK_NAME:?} \
    --address=${ADDRESS_NAME:?} \
    --target-service-attachment=${SERVICE_ATTACHMENT_URI:?} \
    --project=${VPC_PROJECT:?} \
    --region=${REGION:?}

(省略可)IP アドレスの DNS レコードを作成する

実際の IP アドレスを記憶せずに接続と読み込みを行うために、DNS レコードを作成できます。この手順は省略可能です。

DNS_NAME_SUFFIX=matchingengine.vertexai.goog. # Don't forget the "." in the end.
DNS_NAME=${INDEX_ENDPOINT_ID:?}.${REGION:?}.${DNS_NAME_SUFFIX:?}

gcloud dns managed-zones create ${DNS_ZONE_NAME:?} \
    --dns-name=${DNS_NAME_SUFFIX:?} \
    --visibility=private \
    --project=${VPC_PROJECT:?} \
    --region=${REGION:?}

gcloud dns record-sets create ${DNS_NAME:?} \
    --rrdatas=${IP_ADDRESS:?} \
    --type=A --ttl=60 \
    --zone=${DNS_ZONE_NAME:?} \
    --project=${VPC_PROJECT:?} \
    --region=${REGION:?}

インデックス エンドポイントにクエリを送信する

Private Service Connect でエンドポイントを作成し、インデックスを作成したので、クエリの実行を開始できます。

インデックスにクエリを実行するには、インデックスをクエリして最近傍を取得するをご覧ください。

次のステップ