Private Service Connect エンドポイントを介して Python SDK を使用して Gemini 3 Pro チャットにアクセスする

1. 概要

Vertex AI API には インターネット経由 でアクセスできますが、企業によってはインターネット経由ではなく、Vertex AI API にプライベートにアクセスしたい場合があります。このラボでは、最初に次の作業を行います。

  • Python SDK を使用して Vertex 経由で **Gemini 3 Pro API** にアクセスする
  • これは VM インスタンスで実行されます
  • 接続は Cloud NAT 経由で公共のインターネットに行われます。

次に、Google API への Private Service Connect エンドポイントを作成し、Gemini とのチャット API に接続するためにプライベート エンドポイントを使用するようにトラフィック フローを変更します。構成は、Terraform、gcloud、コンソールの組み合わせになります。

このラボでは、次のパターンを作成します。

図 1.

304c579d349aec90.png

2. 目標

このラボでは、次のタスクの実行方法について学びます。

  • Python SDK を使用するように VM インスタンスを設定する
  • Python スクリプトを使用して Gemini とのチャットに接続する
  • Googleapis に接続するように PSC エンドポイントを構成する
  • Googleais への接続パスを確認する
  • DNS エントリを手動で構成する

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • プロジェクト名 は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud コンソール で、右上のツールバーにある Cloud Shell アイコンをクリックします。

Cloud Shell をアクティブにする

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

環境が接続されていることを示す Google Cloud Shell ターミナルのスクリーンショット

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

3. タスク 1. Terraform を使用して環境を設定する

ファイアウォール ルールとサブネットを含むカスタム VPC を作成します。Cloud コンソールを開き、使用するプロジェクトを選択します。

  1. コンソールの右上の Cloud Shell を開き、Cloud Shell に正しい プロジェクト ID が表示されていることを確認し、アクセスを許可するプロンプトを確認します。 b51b80043d3bac90.png
  2. terraform-build という名前のフォルダを作成し、そのフォルダに移動します。
mkdir terraform-build  && cd terraform-build
  1. main.tf ファイルと variable.tf ファイルを作成します。
touch main.tf variable.tf 
  1. Cloud Shell エディタビューに切り替えます。[エディタ] を選択し、インターフェースを読み込むために必要なプロンプトを許可します。
  2. 読み込まれたら、[File] > [Open Folder] に移動し、[/home/your-user-name/terraform-build] に移動して [OK] を選択し、エディタでフォルダを開きます。39b3eb9a3e077bfd.png
  3. variable.tf ファイルを選択し、以下を追加します。your-project-id-here というテキストを、引用符で囲まれた実際のプロジェクト ID に置き換えます。
variable "project_id" {
  type = string
  default = "your-project-id-here"
}

variable "network_id" {
  type = string
  default = "python-net"
}
  1. 次に、main.tf ファイルを開きます。以下で説明するように、さまざまなアクションを実行する Terraform コードを追加します。

API を有効にする

resource "google_project_service" "default"

python-net という名前の VPC を作成する

resource "google_compute_network" "default"

サブネットを追加する

resource "google_compute_subnetwork" "default"

2 つのファイアウォール ルールを追加する

resource "google_compute_firewall" "allow_icmp"resource "google_compute_firewall" "allow_ssh"

  1. 次の内容をコピーして、main.tf ファイルに貼り付けます。
resource "google_project_service" "default" {
  project = var.project_id 
  for_each = toset([
    "dns.googleapis.com",
    "aiplatform.googleapis.com",
    "servicedirectory.googleapis.com"
  ])

  service            = each.value
  disable_on_destroy = false
}

resource "google_compute_network" "default" {
  project                 = var.project_id
  name                    = var.network_id
  auto_create_subnetworks = false
  mtu                     = 1460
  routing_mode            = "GLOBAL"
}

resource "google_compute_subnetwork" "default" {
  name          = "vm1-subnet"
  ip_cidr_range = "10.0.11.0/24"
  project       = var.project_id
  region        = "us-east1"
  stack_type    = "IPV4_ONLY"
  network       = google_compute_network.default.id
}

resource "google_compute_firewall" "allow_icmp" {
  name    = "allow-icmp-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "icmp"
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-icmp"]
}

resource "google_compute_firewall" "allow_ssh" {
  name    = "allow-ssh-${google_compute_network.default.name}"
  network = google_compute_network.default.id
  project = var.project_id

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["allow-ssh"]
}
  1. Cloud Shell ターミナル に戻り、terraform-build ディレクトリ cd terraform-build に移動して、次のコマンドを実行します。

terraform init

作業ディレクトリを初期化します。このステップでは、指定された構成に必要なプロバイダがダウンロードされます。

terraform plan

実行プランを生成し、インフラストラクチャをデプロイするために Terraform が実行するアクションを示します。

  1. リソースを作成するには、terraform apply コマンドを実行し、「yes」と入力して実行します。

4. タスク 2. Terraform を使用して NAT ゲートウェイと VM を作成する

インターネットへの送信外部アクセスを許可する必要があるため、Cloud NAT ゲートウェイを作成してアタッチします。

  1. Cloud Shell を開き、terraform-build フォルダに移動して、次のファイルを作成します(合計 3 つのファイル)。これらは後で編集します。
touch nat-vm.tf psc.tf dns.tf
  1. Cloud Shell エディタ ビューに切り替えて、 nat-vm.tf ファイルを選択し、次の Terraform コードを追加します。これにより、NAT ゲートウェイと 2 つの VM が作成されます。

Terraform nat-vm.tf

resource "google_compute_router" "default" {
  name    = "py-outbound-nat"
  region  = "us-east1"
  network = google_compute_network.default.id
  project = var.project_id
  

 bgp {
  asn = 64514
  }
}

resource "google_compute_router_nat" "default" {
  name                               = "py-outbound-nat-gw"
  router                             = google_compute_router.default.name
  region                             = google_compute_router.default.region
  nat_ip_allocate_option             = "AUTO_ONLY"
  project                            = var.project_id
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"

  log_config {
    enable = true
    filter = "ERRORS_ONLY"
  }
}

resource "google_compute_instance" "vm1" {
  name         = "py-vm1"
  zone         = "us-east1-b"
  machine_type = "n2-standard-2"
  project      = var.project_id

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-12"
    }
  }

  network_interface {
    subnetwork = google_compute_subnetwork.default.id  
    stack_type = "IPV4_ONLY"
  }

  tags = ["allow-ssh", "allow-icmp"]

  metadata_startup_script = <<-EOF
    #! /bin/bash
    sudo apt-get update
    sudo apt-get install python3 python3-dev python3-venv git -y
    sudo apt-get install tcpdump dnsutils -y    
    
      mkdir -p ~/py-gem-env
      cd ~/py-gem-env
      python3 -m venv env
      source env/bin/activate
      pip install --upgrade pip
      pip install ipython google-genai
    '
  EOF
}
  1. Cloud Shell ターミナル に切り替えて、terraform-build フォルダに移動し、terraform plan を実行します。これにより、4 つの項目が追加されることが示されます。次に、terraform apply を実行し、yes と入力して NAT ゲートウェイと VM を作成します。

5. タスク 3. VM を構成してテストする

  1. [VM インスタンス] に移動します。py-vm1 で始まる VM を選択します。[SSH] を選択します。
  2. py-vm1 に SSH 接続したら、「sudo -i 」と入力して root を有効にします。
  3. venv 環境を有効にします。
cd py-gem-env
source env/bin/activate
  1. 後でテストを行うために、これを認証しましょう。VM で次のコマンドを実行し、プロンプトが表示されたら y を押します。
gcloud auth application-default login
  1. 次に、https:// で始まる URL をコピーし、ラボ ブラウザ ウィンドウで新しいタブを開いて URL を貼り付けます。プロンプトを受け入れます。
  2. 次のような画面が表示されたら、[コピー] を選択し、VM py-vm1 セッションに戻ります。[認証コードを入力:] にコピーしたコードを貼り付けて Enter キーを押して認証します。

b703db7aa2aa286a.png

  1. Vertex API に接続できるかどうかを簡単にテストしてみましょう。これは *-aiplatform.googleapis.com を使用するため、そのアドレスに対して dig を実行して、トラフィックのルーティング方法を確認します。
dig *-aiplatform.googleapis.com
  1. 次のように表示されます(アドレスは異なります)。API は公開 API であるため、パスはパブリック IP アドレス経由になります。コピーしないでください
; <<>> DiG 9.18.41-1~deb12u1-Debian <<>> *-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60947
;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;*-aiplatform.googleapis.com.   IN      A

;; ANSWER SECTION:
*-aiplatform.googleapis.com. 300 IN     A       173.194.216.95
*-aiplatform.googleapis.com. 300 IN     A       108.177.11.95
*-aiplatform.googleapis.com. 300 IN     A       192.178.219.95
*-aiplatform.googleapis.com. 300 IN     A       74.125.134.95
*-aiplatform.googleapis.com. 300 IN     A       74.125.139.95
*-aiplatform.googleapis.com. 300 IN     A       108.177.12.95
*-aiplatform.googleapis.com. 300 IN     A       173.194.210.95
*-aiplatform.googleapis.com. 300 IN     A       74.125.26.95
*-aiplatform.googleapis.com. 300 IN     A       173.194.212.95
*-aiplatform.googleapis.com. 300 IN     A       172.217.204.95
  1. Python を使用してみましょう。「ipython 」と入力して ipython インターフェースを有効にします。
ipython

845ef4291429888a.png

  1. 次の内容をコピーして貼り付けます。これにより、Gemini に「Google ロゴの色は何色ですか」と「空の色は何色ですか」と尋ねます。
from google import genai
from google.genai import types
import os
import sys

LOCATION = "global"
MODEL_ID = "gemini-3-pro-preview" 

try:
    client = genai.Client(vertexai=True, location=LOCATION)
    print(f"Successfully initialized Google Gen AI Client (Vertex AI mode) in {LOCATION}")
except Exception as e:
    print(f"Error initializing client: {e}")
    print("Ensure you have installed the library: `pip install google-genai`")
    print("And authenticated: `gcloud auth application-default login`")
    sys.exit(1)

class SimpleChatSession:
    def __init__(self, model_id):
        self.model_id = model_id
        self.history = [] 

    def send_message(self, prompt, stream=True):
        user_content = types.Content(
            role="user",
            parts=[types.Part(text=prompt)]
        )
        self.history.append(user_content)

        try:
            response_stream = client.models.generate_content_stream(
                model=self.model_id,
                contents=self.history,
                config=types.GenerateContentConfig(
                    temperature=0.7 
                )
            )

            accumulated_text = ""
            
            for chunk in response_stream:
                if chunk.text:
                    yield chunk.text
                    accumulated_text += chunk.text
            
            model_content = types.Content(
                role="model",
                parts=[types.Part(text=accumulated_text)]
            )
            self.history.append(model_content)

        except Exception as e:
            print(f"\n[Error during generation: {e}]")

def get_chat_response(session: SimpleChatSession, prompt: str):
    print(f"\n--- User: {prompt} ---")
    print("--- Model: ", end="")
    
    stream_generator = session.send_message(prompt)
    
    full_text = ""
    for chunk_text in stream_generator:
        full_text += chunk_text
        print(chunk_text, end="", flush=True)

    print() 
    return full_text

if __name__ == "__main__":
    chat_session = SimpleChatSession(MODEL_ID)

    get_chat_response(chat_session, "Hello.")
    get_chat_response(chat_session, "What are all the colors of the Google logo?")
    get_chat_response(chat_session, "What color is the sky?")
  1. Enter キーを 2 回押して実行し、結果を確認します。
  2. このリクエストは、公開 API 経由で Vertex にアクセスしました。
  3. SSH セッションを閉じて続行しましょう。

6. タスク 4. Terraform を使用して googleapis への PSC エンドポイントを作成する

Vertex API エンドポイントへのプライベート接続を有効にするには、Google API 用の Private Service Connect エンドポイントを作成します。これにより、割り当てたプライベート IP アドレスを使用して、必要な Google API(この場合は Vertex)にトラフィックをルーティングできます。

  1. まだ開いていない場合は、エディタビューで Cloud Shell を開きます。次のものを作成します。
  • PSC エンドポイント 192.168.255.250 の IP を作成します(resource "google_compute_global_address" "default"))。
  • Google API への PSC エンドポイントを作成します(resource "google_compute_global_forwarding_rule" "default"))。

terraform-build フォルダにある psc.tf ファイルを開きます。ファイルに次のコードを追加します。

Terraform psc.tf

resource "google_compute_global_address" "default" {
  name         = "vertex-ip"
  purpose      = "PRIVATE_SERVICE_CONNECT"
  network      = google_compute_network.default.id
  address_type = "INTERNAL"
  address      = "192.168.255.250"
}

resource "google_compute_global_forwarding_rule" "default" {  
  name                  = "pscvertexgemini"
  target                = "all-apis"
  network               = google_compute_network.default.id
  ip_address            = google_compute_global_address.default.id
  load_balancing_scheme = ""
  }
  1. Cloud Shell ターミナル に切り替えて、terraform-build フォルダに移動します。次に、terraform init を実行し、terraform plan を実行します。これにより、2 つの項目が追加されることが示されます。
    次に、terraform apply を実行し、「yes」と入力して IP と PSC Google API エンドポイントを作成します。
  2. エンドポイントが存在することを確認します。
gcloud compute addresses list --filter="name=( 'vertex-ip' ...)"
gcloud compute forwarding-rules describe pscvertexgemini --global

7. タスク 5. Terraform を使用して googleapis への手動 DNS エントリを作成する

プライベート DNS を使用して、PSC エンドポイントを参照する手動 DNS エントリを作成できます。これは、割り当てたすべてのネットワークに影響します。

  1. [ネットワーク サービス] に移動して [Cloud DNS] を選択します。
  2. [ゾーン] に、Google API 用の Private Service Connect 用に自動的に作成されたゾーンが表示されます。ゾーンタイプは Service Directory です。これは、**SERVICE-ENDPOINT.p.googleapis.com** の形式で PSC エンドポイントに接続するために使用できます。例: aiplatform-pscvertexgemini.p.googleapis.com
  3. この例では、プライベート DNS エントリを手動で作成します。構成は次のようになります。
  • 「googleapis.com」の「googleapis-private」という名前のプライベート DNS ゾーンを作成 し、「python-net」ネットワークに制限します。
  • 「googleapis.com」を IP アドレス「192.168.255.250」にマッピングする A レコードを追加 します。
  • 「googleapis.com」のすべてのサブドメイン(www.googleapis.com など)を「googleapis.com」にリダイレクトする CNAME レコードを追加 します。
  1. まだ開いていない場合は、エディタビューで Cloud Shell を開きます。terraform-build フォルダにある dns.tf ファイルを開きます。ファイルに次のコードを追加します。

Terraform dns.tf

resource "google_dns_managed_zone" "private_zone" {
  name        = "googleapis-private"
  dns_name    = "googleapis.com."  
  visibility  = "private"
  project     = var.project_id     

  private_visibility_config {
    networks {
      network_url = google_compute_network.default.id  
    }
  }
}

resource "google_dns_record_set" "a_record" {
  name    = "googleapis.com."  
  type    = "A"
  ttl     = 300
  managed_zone = google_dns_managed_zone.private_zone.name
  project = var.project_id    

  rrdatas = ["192.168.255.250"]
}

resource "google_dns_record_set" "cname_record" {
 name    = "*.googleapis.com."
 type    = "CNAME"
 ttl     = 300
 managed_zone = google_dns_managed_zone.private_zone.name
 project = var.project_id    

 rrdatas = ["googleapis.com."]  
}
  1. Cloud Shell ターミナル に切り替えて、terraform-build フォルダに移動します。次に、terraform plan を実行します。これにより、追加される項目が表示されます。
    次に、terraform apply を実行し、「yes」と入力してプライベート DNS エントリを作成します。
  2. 次のように、A レコードと CNAME を使用して設定が表示されます。6d2fc061460cd983.png
  3. 次に、py-vm1 でこれらの変更による接続を確認します。

8. タスク 6. IP アドレスを使用してエンドポイントの接続を確認する

プライベート エンドポイントを使用して Gemini に接続しましょう。

  1. VM インスタンス py-vm1 に移動します。[SSH] を選択して VM に SSH 接続します。
  2. sudo -i 」と入力して root アクセス権を取得します。
  3. ping コマンドを使用して、aiplatform.googleapis.com への接続パスを確認します。これにより、プライベート DNS の IP アドレス(googleapis の A レコード)に ping が送信されます。この IP は PSC エンドポイントであるため、ping は失敗します。
ping -c 2 aiplatform.googleapis.com
  1. aiplatform-pscvertexgemini.p.googleapis.com を使用して、PSC Google API 用に自動的に作成された DNS エントリを使用して、ping で接続パスを確認します。これは PSC エンドポイントの IP アドレスを参照するため、ping は失敗します。
ping -c 2 aiplatform-pscvertexgemini.p.googleapis.com
  1. dig コマンドを使用して、aiplatform.googleapis.com への接続パスを確認します。これは PSC エンドポイントの IP アドレスです。
dig aiplatform.googleapis.com
  1. コンソールに戻り、VM インスタンス py-vm1 の別のインスタンスを開きます。[SSH] を選択して VM に SSH 接続します。
  2. sudo -i 」と入力して root アクセス権を取得します。
  3. 次のコマンドを実行して、TCP ダンプで接続を確認します。
sudo tcpdump -i any port 53 -n or host aiplatform.googleapis.com
  1. VM インスタンス py-vm1 の最初の SSH インスタンスに戻ります。
  2. を使用して env を有効にします。
cd py-gem-env
source env/bin/activate
  1. Python をテストしてみましょう。「ipython 」と入力して ipython インターフェースを有効にします。
ipython
  1. 次の内容をコピーして貼り付けます。これにより、Gemini に「AI におけるトークナイザーとは何かを 1 つの短い文で要約してください」と「クジラはすごいですか」と尋ねます。
from google import genai
from google.genai import types
import os
import sys

LOCATION = "global"
MODEL_ID = "gemini-3-pro-preview" 

try:
    client = genai.Client(vertexai=True, location=LOCATION)
    print(f"Successfully initialized Google Gen AI Client (Vertex AI mode) in {LOCATION}")
except Exception as e:
    print(f"Error initializing client: {e}")
    print("Ensure you have installed the library: `pip install google-genai`")
    print("And authenticated: `gcloud auth application-default login`")
    sys.exit(1)

class SimpleChatSession:
    def __init__(self, model_id):
        self.model_id = model_id
        self.history = [] 

    def send_message(self, prompt, stream=True):
        user_content = types.Content(
            role="user",
            parts=[types.Part(text=prompt)]
        )
        self.history.append(user_content)

        try:
            response_stream = client.models.generate_content_stream(
                model=self.model_id,
                contents=self.history,
                config=types.GenerateContentConfig(
                    temperature=0.7 
                )
            )

            accumulated_text = ""
            
            for chunk in response_stream:
                if chunk.text:
                    yield chunk.text
                    accumulated_text += chunk.text
            
            model_content = types.Content(
                role="model",
                parts=[types.Part(text=accumulated_text)]
            )
            self.history.append(model_content)

        except Exception as e:
            print(f"\n[Error during generation: {e}]")

def get_chat_response(session: SimpleChatSession, prompt: str):
    print(f"\n--- User: {prompt} ---")
    print("--- Model: ", end="")
    
    stream_generator = session.send_message(prompt)
    
    full_text = ""
    for chunk_text in stream_generator:
        full_text += chunk_text
        print(chunk_text, end="", flush=True)

    print() 
    return full_text

if __name__ == "__main__":
    chat_session = SimpleChatSession(MODEL_ID)

    get_chat_response(chat_session, "Hello.")
    get_chat_response(chat_session, "In one short sentence summarize what is a tokenizer in the context of AI?")
    get_chat_response(chat_session, "Are whales awesome or not?")
  1. Enter キーを 2 回 押して実行し、結果を確認します。
  2. VM インスタンス py-vm1 の 2 番目のインスタンスに切り替えます。TCPDUMP の結果が表示されます。VM の IP アドレスが PSC エンドポイントの IP アドレスを使用して aiplatform.googleapis.com に接続していることがわかります。

VM インスタンス py-vm1 へのすべての SSH セッションを閉じます。

9. クリーンアップ

  1. Cloud Shell に移動し、terraform-build ディレクトリ cd terraform-build に移動します。
  2. terraform plan destroy を実行して、行われるすべての変更を確認します。
terraform plan -destroy
  1. 次に、コマンド terraform destroy を実行し、「yes」と入力すると、Terraform を使用してプロジェクトに作成したすべてのリソースが削除されます。
terraform destroy 

10. 完了

お疲れさまでした。Vertex に正常に接続し、公開 API アドレス経由で Gemini 3 pro を使用しました。また、Google API 用の Private Service Connect エンドポイントを使用してプライベートに接続しました。この機能により、非公開 API 接続を(Interconnect、Cross-Cloud Interconnect、VPC)経由で接続されたオンプレミス環境や他のクラウド環境に拡張できます。

次のステップと詳細情報

Vertex AI ネットワーキングの詳細をご覧ください。

Codelab: Python SDK を使用して、Private Service Connect エンドポイント経由で Vertex AI の Anthropic Claude にアクセスする

次のラボを受講する

Google Cloud のクエストを続け、その他の Google Cloud Skills Boost ラボをご確認ください。