Private Service Connect エンドポイントを使用する GCE 上の Gemini CLI

1. 概要

Gemini CLI は、ローカル環境と仮想環境の両方で使用できます。Gemini CLI は、Gemini の機能をターミナルに直接取り込むオープンソースの AI エージェントです。Gemini CLI を使用すると、ネットワークの観点から、一般公開されている API IP アドレスを介して Gemini API が呼び出されます。

Google Compute Engine マシンで Gemini CLI を使用し、API に非公開で接続する場合はどうすればよいでしょうか?この Codelab では、指定した内部 IP アドレスにトラフィックを転送するように、Google API への Private Service Connect エンドポイントを構成する方法について説明します。

構成は、Terraform、gcloud、コンソールの組み合わせになります。

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

  • VM インスタンスと Cloud NAT を設定する
  • Gemini CLI をインストールして認証する
  • Googleapis に接続するように Private Service Connect エンドポイントを構成する
  • *.googleais への接続パスを確認する
  • 手動 DNS エントリを構成する

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

図 1.

809ec92718405b07.png

2. Google Cloud サービスの設定

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.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 Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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

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

  1. コンソールの右上にある Cloud Shell を開き、Cloud Shell に正しいプロジェクト ID が表示されていることを確認し、アクセスを許可するプロンプトが表示されたら確認します。4261e776f64ea978.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] を選択し、エディタでフォルダを開きます。78f5eb9f2f82f1b0.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 = "gemini-vpc-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" {
  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 = "192.168.100.0/24"
  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    = "outbound-nat"
  region  = "us-east1"
  network = google_compute_network.default.id

 bgp {
  asn = 64514
  }
}

resource "google_compute_router_nat" "default" {
  name                               = "outbound-gw"
  router                             = google_compute_router.default.name
  region                             = google_compute_router.default.region
  nat_ip_allocate_option             = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"

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

resource "google_compute_instance" "vm1" {
  name         = "cli-vm"
  zone         = "us-east1-b"
  machine_type = "n2-standard-2"

  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
    sudo apt-get update    
  EOF
}

resource "google_compute_instance" "vm2" {
  name         = "monitor-vm"
  zone         = "us-east1-b"
  machine_type = "n2-standard-2"

  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
    sudo apt-get update
    sudo apt-get install python3 python3-dev python3-venv -y
    sudo apt-get install tcpdump dnsutils -y
  EOF
}
  1. Cloud Shell ターミナルに切り替え、terraform-build フォルダに移動して terraform plan を実行します。これにより、4 つのアイテムが追加されることがわかります。次に、terraform apply を実行して yes と入力し、NAT ゲートウェイと 2 つの VM を作成します。

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

  1. VM インスタンスに移動します。cli-vm で始まる VM を選択します。[SSH] を選択します。
  2. SSH 接続が確立されたら、VM にアクセスできるようになります。Gemini CLI を実行するときに使用するフォルダを作成しましょう。
mkdir geminicli && cd geminicli
  1. Gemini CLI をインストールするには、Node.js が必要です。次のコマンドを使用して Node.js をインストールします。
curl -fsSL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh

スクリプトを実行

sudo -E bash nodesource_setup.sh

Node.js をインストールする

sudo apt-get install -y nodejs
  1. Vertex AI 認証オプションを使用して認証し、後でテストを行うのに役立つ変数を設定しましょう。注: YOUR_PROJECT_ID は実際の project ID に置き換えてください。
cat <<EOF >> ~/.bashrc 

export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
export GOOGLE_CLOUD_LOCATION="us-east1" 
export GOOGLE_GENAI_USE_VERTEXAI=true
EOF

bash を再読み込みする

source ~/.bashrc
  1. 認証を行いましょう。VM で次のコマンドを実行し、プロンプトが表示されたら y を押します。
gcloud auth application-default login
  1. 次に、https:// で始まる URL をコピーし、ラボのブラウザ ウィンドウで新しいタブを開いて、URL を貼り付けます。プロンプトを承認します。
  2. 次の選択肢が表示されたら、コピーして vm cli-vm セッションに戻り、[Enter authorization code:] にコピーしたコードを貼り付けて Enter キーを押し、認証します。

c29615cdf9324209.png

  1. Gemini CLI をインストールします。次のコマンドを実行します。
sudo npm install -g @google/gemini-cli

完了したら、gemini と入力してインターフェースを起動し、好みのテーマを選択して、[認証方法を選択] で Vertex AI を選択します。

7fb8ea7fbf48cad9.png

a9f9a93ae8694e2f.png

  1. 認証が完了すると、Gemini CLI を使用できるようになります。

b13a934b6220c9af.png

モニター VM を介して Gemini へのトラフィック ルートをモニタリングする

  1. VM インスタンスに移動します。monitor-vm で始まる VM を選択します。[SSH] を選択します。
  2. monitor-vm に SSH 接続すると、アクセスできるようになります
  3. dig コマンドを使用して、Gemini API への接続パスをテストしましょう。us-east1-aiplatform.googleapis.com を使用します。
dig us-east1-aiplatform.googleapis.com

次のような結果が表示されます(アドレスは異なります)。API はパブリック API であるため、パスはパブリック IP アドレス経由になります。

コピー不可

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> us-east1-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58905
;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;us-east1-aiplatform.googleapis.com. IN A

;; ANSWER SECTION:
us-east1-aiplatform.googleapis.com. 300 IN A    173.194.217.95
us-east1-aiplatform.googleapis.com. 300 IN A    172.217.204.95
us-east1-aiplatform.googleapis.com. 300 IN A    172.217.203.95
us-east1-aiplatform.googleapis.com. 300 IN A    142.250.98.95
us-east1-aiplatform.googleapis.com. 300 IN A    142.251.107.95
us-east1-aiplatform.googleapis.com. 300 IN A    74.125.196.95
us-east1-aiplatform.googleapis.com. 300 IN A    173.194.216.95
us-east1-aiplatform.googleapis.com. 300 IN A    108.177.11.95
us-east1-aiplatform.googleapis.com. 300 IN A    192.178.219.95
us-east1-aiplatform.googleapis.com. 300 IN A    173.194.210.95
us-east1-aiplatform.googleapis.com. 300 IN A    173.194.212.95
us-east1-aiplatform.googleapis.com. 300 IN A    173.194.215.95
us-east1-aiplatform.googleapis.com. 300 IN A    108.177.12.95
us-east1-aiplatform.googleapis.com. 300 IN A    74.125.26.95
  1. 次に、ping テストを実行して、Gemini API に接続できるかどうかを確認します。このコマンドは us-east1-aiplatform.googleapis.com に 4 回 ping を送信するため、API のパブリック アドレスからレスポンスが返されます。
ping -c 4 us-east1-aiplatform.googleapis.com
  1. この VM のテストは後で行います。SSH セッションを閉じて、続行しましょう。

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

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

  1. Cloud Shell がまだ開いていない場合は、エディタ ビューで開きます。次のものを作成します。
  • PSC エンドポイント 10.10.100.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         = "gemini-ip"
  purpose      = "PRIVATE_SERVICE_CONNECT"
  network      = google_compute_network.default.id
  address_type = "INTERNAL"
  address      = "10.10.100.250"
}

resource "google_compute_global_forwarding_rule" "default" {  
  name                  = "pscgemini"
  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=( 'gemini-ip' ...)"
gcloud compute forwarding-rules describe pscgemini --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-pscgemini.p.googleapis.com
  3. この例では、限定公開 DNS エントリを手動で作成します。構成は次のようになります。
  • 「googleapis.com」の「googleapis-private」という名前の限定公開 DNS ゾーンを作成し、「python-net」ネットワークに制限します。
  • 「googleapis.com」を IP アドレス「10.10.100.250」にマッピングする A レコードを追加します。
  • CNAME レコードを追加して、「googleapis.com」のすべてのサブドメイン(www.googleapis.com など)を「googleapis.com」にリダイレクトします。
  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 = ["10.10.100.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 が設定されていることを確認します。

a33a4d3d629c54dd.png

  1. 次に、monitor-vm でこれらの変更による接続を確認します。

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

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

  1. VM インスタンス monitor-vm に移動します。[SSH] を選択して VM に SSH 接続する
  2. ping コマンドを使用して、us-east1-aiplatform.googleapis.com への接続パスを確認します。これにより、プライベート DNS の googleapis の A レコードにある IP アドレスに ping が送信されます。この IP は PSC エンドポイントであるため、ping は失敗します。
ping -c 2 us-east1-aiplatform.googleapis.com
  1. aiplatform-pscvertexgemini.p.googleapis.com を使用して PSC Google API 用に自動的に作成された DNS エントリを使用して、ping で接続パスを確認します。これは PSC エンドポイントの IP アドレスを指しているため、ping は失敗します。
ping -c 2 aiplatform-pscgemini.p.googleapis.com
  1. dig コマンドを使用して、us-east1-aiplatform.googleapis.com への接続パスを確認します。これは、PSC エンドポイントの IP アドレス(10.10.100.250)である必要があります。
dig us-east1-aiplatform.googleapis.com

bcb26844349ee775.png

  1. 完了したら、monitor-vm SSH セッションを閉じます。
  2. これで、cli-vm で TCP ダンプを実行できます。同じ VM に対して 2 つの SSH セッションを開く必要があります。1 つのセッションで tcpdump コマンドを実行し、もう 1 つのセッションで Gemini CLI を使用します。
  3. cli-vm の最初のセッションに SSH 接続します。
  4. 次のコマンドを入力して、tcpdump で接続を確認します。
sudo tcpdump -i any port 53 -n or host us-east1-aiplatform.googleapis.com
  1. 次に、cli-vm の次のセッションに SSH 接続します。
  2. gemini と入力して Gemini CLI を有効にします。
  3. 「空の色は何色ですか?」という質問をして、Gemini API への呼び出しを生成します。

d6189c2adef69eaf.png

  1. Enter キーを押して実行し、結果を確認します。
  2. cli-vm の最初のセッションに戻ります。tcpdump の結果が表示されます。VM の送受信と IP アドレスが PSC エンドポイントの IP アドレスを使用して gemini API に接続していることがわかります。

ce99170d9f9c7858.png

VM インスタンスへのすべての SSH セッションを閉じる

9. クリーンアップ

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

10. 完了

おめでとうございます。パブリック API アドレスと、Google API 用の Private Service Connect エンドポイントをプライベートに使用して、Gemini CLI に正常に接続できました。この機能により、プライベート API 接続を(Interconnect、Cross-Cloud Interconnect、VPC を介して接続されている)オンプレミス環境や他のクラウド環境に拡張できます。

次のステップと詳細情報

Vertex AI ネットワーキングの詳細を確認し、Gemini CLI リポジトリをご覧ください。

次のラボを受講する

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