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 リソースを作成するサービス プロジェクト。
  • VPC_PROJECT: クライアント VPC が存在するプロジェクト。スタンドアロン VPC 設定の場合、これは $PROJECT と同じです。共有 VPC 設定では、VPC ホスト プロジェクトです。
  • PROJECT=<your-service-project>
    VPC_PROJECT=<your-vpc-project>
    REGION=us-central1
    VERTEX_ENDPOINT=$REGION-aiplatform.googleapis.com
    curl -H "Content-Type: application/json" \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      https://$VERTEX_ENDPOINT/v1/projects/$PROJECT/locations/$REGION/indexEndpoints \
      -d '{displayName: "<your-index-endpoint-name>", privateServiceConnectConfig:
      { enablePrivateServiceConnect: true, projectAllowlist: ["'$VPC_PROJECT'", "'$PROJECT'"] }}'
    

    Python

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

    def vector_search_create_index_endpoint_private_service_connect(
        project: str, location: str, display_name: str, project_allowlist: list[str]
    ) -> aiplatform.MatchingEngineIndexEndpoint:
        """Create a vector search index endpoint with Private Service Connect enabled.
    
        Args:
            project (str): Required. Project ID
            location (str): Required. The region name
            display_name (str): Required. The index endpoint display name
            project_allowlist (list[str]): Required. A list of projects from which
                the forwarding rule will be able to target the service attachment.
    
        Returns:
            aiplatform.MatchingEngineIndexEndpoint - The created index endpoint.
        """
        # Initialize the Vertex AI client
        aiplatform.init(project=project, location=location)
    
        # Create Index Endpoint
        index_endpoint = aiplatform.MatchingEngineIndexEndpoint.create(
            display_name=display_name,
            description="Matching Engine VPC Index Endpoint",
            enable_private_service_connect=True,
            project_allowlist=project_allowlist,
        )
    
        return index_endpoint
    
    

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

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

    • Private Service Connect の自動化でデプロイする: サービス接続ポリシーを設定し、インデックスをデプロイします。サービス接続ポリシーを設定すると、コンピューティング アドレスと転送ルールを毎回作成しなくても、特定のネットワークにデプロイできます。
    • 手動接続でデプロイする: インデックスをデプロイし、コンピューティング アドレスと転送ルールを手動で作成します。複数の 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>
      

    インデックスのデプロイ

    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
    • NETWORK_1: このインデックス エンドポイントがデプロイされる Compute Engine ネットワーク名。
    • NETWORK_2:(省略可)このエンドポイントをデプロイする追加の Compute Engine ネットワーク名。

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

    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 \
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_1 \
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_2

    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 `
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_1 `
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_2

    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 ^
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_1 ^
        --psc-automation-configs=project-id=PROJECT_ID,network=NETWORK_2

    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
    • NETWORK_1: このインデックス エンドポイントがデプロイされる Compute Engine ネットワーク名。
    • NETWORK_2:(省略可)このエンドポイントをデプロイする追加の Compute Engine ネットワーク名。
    • 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"
       "psc_automation_configs": [
              {"project_id": "PROJECT_ID", "network": "NETWORK_1"},
              {"project_id": "PROJECT_ID", "network": "NETWORK_2" }]
     }
    }
    

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

    次のような 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"
     }
    }
    

    Python

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

    def vector_search_deploy_psc_automation_index(
        project: str,
        location: str,
        index_name: str,
        index_endpoint_name: str,
        deployed_index_id: str,
        psc_automation_configs: Sequence[Tuple[str, str]],
    ) -> None:
        """Deploy a vector search index to an index endpoint using PSC automation.
    
        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.
            psc_automation_config (Sequence[Tuple[str, str]]): Required. A list of
              (project_id, network) pairs where PSC endpoints will be setup for the
              deployed index. Example:
              [("123", "{projects/123/global/networks/my-network1"),
              ("123", "{projects/123/global/networks/my-network2")]
        """
        # 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 with PSC automation enabled.
        index_endpoint.deploy_index(
            index=index,
            deployed_index_id=deployed_index_id,
            psc_automation_configs=psc_automation_configs,
        )
    
    

    サービス接続ポリシーを削除する

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

    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"
     }
    }
    

    Python

    Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、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)
    
    

    Console

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

    1. Google Cloud コンソールの [Vertex AI] セクションで、[Deploy and Use] セクションに移動します。[ベクトル検索] を選択します。

      [ベクトル検索] に移動

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

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

    次のステップ