Vertex AI で TLS を使用して安全なオンライン予測を行う

1. はじめに

Private Service Connect(PSC)を活用して、Vertex AI Model Garden からデプロイされたモデルに安全なプライベート アクセスを確立します。この方法では、パブリック エンドポイントを公開する代わりに、Virtual Private Cloud(VPC)内でのみアクセス可能なプライベート Vertex AI エンドポイントにモデルをデプロイできます。

Private Service Connect は、VPC 内の内部 IP アドレスを持つエンドポイントを作成し、モデルをホストする Google マネージド Vertex AI サービスに直接接続します。これにより、VPC 環境とオンプレミス環境(Cloud VPN または Interconnect 経由)のアプリケーションは、プライベート IP を使用して推論リクエストを送信できます。

重要なのは、VPC とプライベート Vertex AI エンドポイント間のすべてのネットワーク トラフィックが Google の専用ネットワーク上に残り、公共のインターネットから完全に分離されることです。また、このプライベート接続は、TLS 暗号化を使用して転送中に保護されます。このエンドツーエンド暗号化により、予測リクエストとモデル レスポンスが保護され、データの機密性と完全性が強化されます。PSC によるネットワーク分離と TLS 暗号化を組み合わせることで、オンライン予測に堅牢で安全な環境が提供され、レイテンシが短縮され、セキュリティ ポスチャーが大幅に強化されます。

8bdac2f2d3dd88c9.png

作成するアプリの概要

このチュートリアルでは、Vertex AI オンライン推論でホストされている Gemma 3 を Model Garden からダウンロードし、Private Service Connect を介してアクセス可能なプライベート エンドポイントとして使用します。エンドツーエンドのセットアップには次のものが含まれます。

  1. Model Garden モデル: Vertex AI Model Garden から Gemma 3 を選択し、Private Service Connect エンドポイントにデプロイします。
  2. Private Service Connect: 独自のネットワーク内の内部 IP アドレスで構成される Virtual Private Cloud(VPC)にコンシューマー エンドポイントを構成します。
  3. Vertex AI への安全な接続: PSC エンドポイントは、プライベート モデルのデプロイ用に Vertex AI によって自動的に生成されたサービス アタッチメントをターゲットにします。これによりプライベート接続が確立され、VPC とモデル提供エンドポイント間のトラフィックが公共のインターネットを通過しないようになります。
  4. VPC 内のクライアント構成: VPC 内にクライアント(Compute Engine VM など)を設定して、PSC エンドポイントの内部 IP アドレスを使用して、デプロイされたモデルに推論リクエストを送信します。
  5. TLS 暗号化を確認する: VPC 内のクライアント VM から、標準ツール(openssl s_client)を使用して PSC エンドポイントの内部 IP アドレスに接続します。この手順では、ハンドシェイクの詳細と提示されたサーバー証明書を検査して、Vertex AI サービスへの通信チャネルが TLS を使用して暗号化されていることを確認できます。

このチュートリアルを完了すると、指定した VPC ネットワーク内からのみアクセスできる、非公開で提供される Model Garden モデルの機能例が作成されます。

学習内容

このチュートリアルでは、Vertex AI Model Garden からモデルをデプロイし、Private Service Connect(PSC)を使用して Virtual Private Cloud(VPC)から安全にアクセスできるようにする方法について説明します。この方法を使用すると、VPC 内のアプリケーション(コンシューマー)は、公共のインターネットを経由せずに Vertex AI モデル エンドポイント(プロデューサー サービス)に非公開で接続できます。

具体的には、次のことを学びます。

  1. Vertex AI の PSC について: PSC がコンシューマーとプロデューサー間のプライベートで安全な接続をどのように実現するか。VPC は、内部 IP アドレスを使用してデプロイされた Model Garden モデルにアクセスできます。
  2. プライベート アクセスでモデルをデプロイする: Model Garden モデルで PSC を使用するように Vertex AI エンドポイントを構成し、プライベート エンドポイントにする方法。
  3. サービス アタッチメントのロール: モデルをプライベート Vertex AI エンドポイントにデプロイすると、Google Cloud は Google マネージドのテナント プロジェクトにサービス アタッチメントを自動的に作成します。このサービス アタッチメントは、モデル提供サービスをコンシューマー ネットワークに公開します。
  4. VPC での PSC エンドポイントの作成:
  • デプロイされた Vertex AI エンドポイントの詳細から一意のサービス アタッチメント URI を取得する方法。
  • VPC で選択したサブネット内の内部 IP アドレスを予約する方法。
  • Vertex AI サービス アタッチメントをターゲットとする PSC エンドポイントとして機能する転送ルールを VPC に作成する方法。このエンドポイントにより、予約済みの内部 IP を介してモデルにアクセスできるようになります。
  1. プライベート接続の確立: VPC の PSC エンドポイントがサービス アタッチメントに接続され、ネットワークと Vertex AI サービスが安全にブリッジされます。
  2. 推論リクエストを非公開で送信する: VPC 内のリソース(Compute Engine VM など)から PSC エンドポイントの内部 IP アドレスに予測リクエストを送信する方法。
  3. 検証: VPC からデプロイされた Model Garden モデルにプライベート接続を介して推論リクエストを正常に送信できることをテストして確認する手順。
  4. TLS 暗号化の検証: VPC クライアント(Compute Engine VM など)内のツールを使用して、TLS 経由で PSC エンドポイントの内部 IP アドレスに接続する方法。

この手順を完了すると、プライベート ネットワーク インフラストラクチャからのみアクセス可能な Model Garden のモデルをホストできるようになります。

必要なもの

Google Cloud プロジェクト

IAM 権限

2. 始める前に

チュートリアルをサポートするようにプロジェクトを更新する

このチュートリアルでは、$variables を使用して、Cloud Shell での gcloud 構成の実装を支援します。

Cloud Shell で、次の操作を行います。

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
projectid=[YOUR-PROJECT-ID]
echo $projectid

API の有効化

Cloud Shell で、次の操作を行います。

gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "serviceusage.googleapis.com"
gcloud services enable dns.googleapis.com

3. モデルをデプロイする

Model Garden からモデルをデプロイする手順は次のとおりです。

Google Cloud コンソールで、Model Garden に移動して、Gemma 3 を検索して選択します。

47c724030a846b25.png

[モデルをデプロイ] をクリックして [Vertex AI] を選択します。

a9a9f4aef7e52356.png

[デプロイ設定] セクションの下部にある [設定を編集] を選択します。

d5b449d2893ddf2f.png

[Vertex AI にデプロイ] ペインで、[エンドポイント アクセス] が [Private Service Connect] に構成されていることを確認し、プロジェクトを選択します。

c679aa90c3638e31.png

他のオプションはすべてデフォルトのままにして、下部の [デプロイ] を選択します。デプロイ ステータスについては通知を確認してください。

d5eab71cbb43e2fe.png

Model Garden で、Gemma 3 モデルとエンドポイントを提供するリージョン us-central1 を選択します。モデルのデプロイには約 5 分かかります。

fce9d5c9152255f1.png

30 分以内に、エンドポイントは完了すると [有効] に移行します

d6cc741415213e1a.png

エンドポイントを選択してエンドポイント ID を取得し、メモします。

87d1756fa534619d.png

エンドポイントを選択してエンドポイント ID を取得し、変数を更新します。この例では、ID は 1934769929467199488 です。

Cloud Shell で、次の操作を行います。

endpointID=<Enter_Your_Endpoint_ID>
region=us-central1

Private Service Connect サービス アタッチメント URI を取得するには、次の操作を行います。この URI 文字列は、PSC コンシューマー エンドポイントをデプロイするときにコンシューマーによって使用されます。

Cloud Shell で、エンドポイント ID/リージョン変数を使用して、次のコマンドを発行します。

gcloud ai endpoints describe $endpointID --region=$region  | grep -i serviceAttachment:

次の例をご覧ください。

user@cloudshell:$ gcloud ai endpoints describe 1934769929467199488 --region=us-central1 | grep -i serviceAttachment:

Using endpoint [https://us-central1-aiplatform.googleapis.com/]
    serviceAttachment: projects/o9457b320a852208e-tp/regions/us-central1/serviceAttachments/gkedpm-52065579567eaf39bfe24f25f7981d

serviceAttachment の後の内容を「Service_attachment」という変数にコピーします。これは、後で PSC 接続を作成するときに必要になります。

user@cloudshell:$ Service_attachment=<Enter_Your_ServiceAttachment>

4. コンシューマーの設定

コンシューマー VPC を作成する

Cloud Shell で、次の操作を行います。

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

コンシューマー VM サブネットを作成する

Cloud Shell で、次の操作を行います。

gcloud compute networks subnets create consumer-vm-subnet --project=$projectid --range=192.168.1.0/24 --network=consumer-vpc --region=$region --enable-private-ip-google-access

Cloud Shell で、次の操作を行って PSC エンドポイント サブネットを作成します。

gcloud compute networks subnets create pscendpoint-subnet --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=$region

5. IAP を有効にする

IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。

  • IAP を使用してアクセス可能にするすべての VM インスタンスに適用されます。
  • IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可します。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。

Cloud Shell 内で、IAP ファイアウォール ルールを作成します。

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

6. コンシューマー VM インスタンスを作成する

Cloud Shell 内で、コンシューマー VM インスタンス consumer-vm を作成します。

gcloud compute instances create consumer-vm \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --shielded-secure-boot \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=consumer-vm-subnet 

7. Private Service Connect エンドポイント

コンシューマーは、VPC 内の内部 IP アドレスを使用してコンシューマー エンドポイント(転送ルール)を作成します。この PSC エンドポイントは、プロデューサーのサービス アタッチメントをターゲットにします。コンシューマー VPC またはハイブリッド ネットワーク内のクライアントは、この内部 IP アドレスにトラフィックを送信して、プロデューサーのサービスにアクセスできます。

コンシューマー エンドポイントの IP アドレスを予約します。

Cloud Shell 内で、転送ルールを作成します。

gcloud compute addresses create psc-address \
    --project=$projectid \
    --region=$region \
    --subnet=pscendpoint-subnet \
    --addresses=10.10.10.6

IP アドレスが予約されていることを確認します。

Cloud Shell で、予約済みの IP アドレスを一覧表示します。

gcloud compute addresses list 

10.10.10.6 IP アドレスが予約されていることがわかります。

3029e97ddc9c192d.png

前の手順(モデルのデプロイ)で取得したサービス アタッチメント URI(target-service-attachment)を指定して、コンシューマー エンドポイントを作成します。

Cloud Shell 内で、ネットワーク アタッチメントの説明を取得します。

 gcloud compute forwarding-rules create psc-consumer-ep \
    --network=consumer-vpc \
    --address=psc-address \
    --region=$region \
    --target-service-attachment=$Service_attachment \
    --project=$projectid

サービス アタッチメントがエンドポイントを受け入れることを確認します。

Cloud Shell で、次の操作を行います。

gcloud compute forwarding-rules describe psc-consumer-ep \
    --project=$projectid \
    --region=$region

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

e1debc2bdb6a1a44.png

8. TLS 経由で Vertex HTTPS エンドポイントに接続するように設定する

IP アドレスを指定せずにオンライン推論を取得できるように、DNS 限定公開ゾーンを作成します。

Cloud Shell で、次の操作を行います。

DNS_NAME_SUFFIX="prediction.p.vertexai.goog."  

gcloud dns managed-zones create vertex \
--project=$projectid \
--dns-name=$DNS_NAME_SUFFIX \
--networks=consumer-vpc \
--visibility=private \
--description="A DNS zone for Vertex AI endpoints using Private Service Connect."

ドメインを PSC IP アドレスにマッピングする A レコードを作成します。

Cloud Shell で、次の操作を行います。

gcloud dns record-sets create "*.prediction.p.vertexai.goog." \
  --zone=vertex \
  --type=A \
  --ttl=300 \
  --rrdatas="10.10.10.6"

NAT インスタンスの前提条件として Cloud Router インスタンスを作成します。

Cloud Shell で、次の操作を行います。

gcloud compute routers create consumer-cr \
--region=$region --network=consumer-vpc \
--asn=65001 

openssl パッケージと dnsutils パッケージのダウンロードに使用される Cloud NAT インスタンスを作成します。

Cloud Shell で、次の操作を行います。

gcloud compute routers nats create consumer-nat-gw \
  --router=consumer-cr \
  --region=$region \
  --nat-all-subnet-ip-ranges \
  --auto-allocate-nat-external-ips 

ssh(コンソール)経由で Consumer VM に接続します。Cloud Shell で、次の操作を行います。

gcloud compute ssh --zone "us-central1-a" "consumer-vm" --tunnel-through-iap --project "$projectid"

次のパッケージを更新し、open-ssl をインストールして DNS ユーティリティをインストールします

Cloud Shell で、次の操作を行います。

sudo apt update 
sudo apt install openssl
sudo apt-get install -y dnsutils

次のステップでプロジェクト番号が必要になります。プロジェクト番号を取得するには、Cloud Shell から次のコマンドを実行して、変数に格納します。

Cloud Shell で、次の操作を行います。

gcloud projects describe $projectid --format="value(projectNumber)"
Example Output: 549538389202
projectNumber=549538389202

次の手順で定義する他の変数も必要になります。これらの変数(ENDPOINT_IDREGIONVERTEX_AI_PROJECT_ID)を定義するには、まず Cloud Shell から取得し、VM に同じ変数を作成します。

Cloud Shell で、次の操作を行います。

echo $projectNumber
echo $projectid 
echo $region
echo $endpointID

出力例は次のとおりです。

549538389202
test4-473419
Us-central1
1934769929467199s

コンシューマー VM に次の変数を追加します(以下の例を参照)。

projectNumber=1934769929467199488  
projectid=test4-473419
region=us-central1
endpointID=1934769929467199488

VM のホーム ディレクトリから次のコマンドを実行して、Vertex AI 証明書をダウンロードします。このコマンドにより、vertex_certificate.crt という名前のファイルが作成されます。

sudo openssl s_client -showcerts -connect $endpointID-$region-$projectNumber.prediction.p.vertexai.goog:443 </dev/null | openssl x509 -outform pem -out vertex_certificate.crt

Output should look like below, error is expected.

2f2899141dde1af2.png

証明書をシステムのトラストストアに移動します。

sudo mv vertex_certificate.crt /usr/local/share/ca-certificates

証明書マネージャーを更新します。

sudo update-ca-certificates

更新すると、次のようになります。

user@linux-vm:~$ sudo update-ca-certificates

Updating certificates in /etc/ssl/certs...

1 added, 0 removed; done.

Running hooks in /etc/ca-certificates/update.d...

Done.

9. コンシューマー VM からの最終テスト

コンシューマー VM で、アプリケーションのデフォルト認証情報を使用して再認証し、Vertex AI スコープを指定します。

gcloud auth application-default login
--scopes=https://www.googleapis.com/auth/cloud-platform 

コンシューマー VM で次の curl コマンドを実行して、プロンプト「1 ポンドの羽と岩のどちらが重いですか?」を使用して Gemini モデルに対する予測をテストします。

curl -v -X POST -H "Authorization: Bearer $(gcloud auth application-default print-access-token)"   -H "Content-Type: application/json" https://$endpointID-$region-$projectNumber.prediction.p.vertexai.goog/v1/projects/$projectid/locations/$region/endpoints/$endpointID/chat/completions   -d '{"model": "google/gemma-3-12b-it", "messages": [{"role": "user","content": "What weighs more 1 pound of feathers or rocks?"}] }'

最終結果 - 成功!!!

出力の下部に Gemma 3 からの予測が表示されます。これは、PSC エンドポイントを介して API エンドポイントにプライベートにアクセスできたことを示しています。

 Connection #0 to host 10.10.10.6 left intact
{"id":"chatcmpl-9e941821-65b3-44e4-876c-37d81baf62e0","object":"chat.completion","created":1759009221,"model":"google/gemma-3-12b-it","choices":[{"index":0,"message":{"role":"assistant","reasoning_content":null,"content":"This is a classic trick question! They weigh the same. One pound is one pound, regardless of the material. 😊\n\n\n\n","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":106}],"usage":{"prompt_tokens":20,"total_tokens":46,"completion_tokens":26,"prompt_tokens_details":null},"prompt_logprobs":null

10. クリーンアップ

Cloud Shell から、チュートリアルのコンポーネントを削除します。

Get Deployed Model ID first with this command, you will need it to delete the Endpoint ID:

gcloud ai endpoints describe $endpointID \
  --region=$region \
  --project=$projectid \
  --format="table[no-heading](deployedModels.id)"

Example Output: 7389140900875599872

Put it in a Variable:

deployedModelID=7389140900875599872

Run following Commands:

gcloud ai endpoints undeploy-model $endpointID --deployed-model-id=$deployedModelID --region=$region --quiet

gcloud ai endpoints delete $endpointID --project=$projectid --region=$region --quiet

Run Following command to get $MODEL_ID to delete Model:

gcloud ai models list --project=$projectid --region=$region

Example Output:

Using endpoint [https://us-central1-aiplatform.googleapis.com/]
MODEL_ID: gemma-3-12b-it-1768409471942
DISPLAY_NAME: gemma-3-12b-it-1768409471942

Put MODEL_ID value in a variable:

MODEL_ID=gemma-3-12b-it-1768409471942

Run the follow command to delete Model:

gcloud ai models delete $MODEL_ID --project=$projectid --region=$region --quiet

Clean up rest of the lab:
gcloud compute instances delete consumer-vm --zone=us-central1-a --quiet

gcloud compute forwarding-rules delete psc-consumer-ep --region=$region --project=$projectid --quiet

gcloud compute addresses delete psc-address --region=$region --project=$projectid --quiet

gcloud compute networks subnets delete pscendpoint-subnet consumer-vm-subnet --region=$region --quiet

gcloud compute firewall-rules delete ssh-iap-consumer --project=$projectid

gcloud compute routers delete consumer-cr --region=$region

gcloud compute networks delete consumer-vpc --project=$projectid --quiet

11. 完了

お疲れ様でした。Vertex AI から取得した自己署名証明書を使用して、Vertex AI Prediction でホストされている Gemma 3 API へのプライベート アクセスを Private Service Connect エンドポイントを使用して構成し、検証しました。この証明書は、VM のトラスト ストアにデプロイされています。

内部 IP アドレスの予約、VPC 内の Private Service Connect エンドポイント(転送ルール)とプライベート DNS の構成(自己署名証明書 *prediction.p.vertexai.goog に一致するように)など、コンシューマー インフラストラクチャを作成しました。このエンドポイントは、デプロイされた Gemma 3 モデルに関連付けられているサービス アタッチメントをターゲットにして、Vertex AI サービスに安全に接続します。

この設定により、VPC 内または接続されたネットワーク内のアプリケーションは、証明書を使用して内部 IP アドレスを使用して Gemma 3 API とプライベートにやり取りできます。すべてのトラフィックは Google のネットワーク内に留まり、公共のインターネットを経由することはありません。

次のステップ

参考資料と動画

リファレンス ドキュメント