1. 概览
您可以通过互联网访问 Vertex AI API,但在企业中,您可能希望在不通过互联网的情况下私下访问 Vertex AI API。在本实验中,您将首先通过公共互联网访问在虚拟机实例上运行的 Python SDK 中的 Vertex Gemini Chat API。
然后,您将为 Google API 创建 Private Service Connect 端点,并更改流量流,以使用专用端点连接到 Gemini Chat API。配置将结合使用 Terraform、gcloud 和控制台。
在本实验中,您将创建以下图案。
图 1.
2. 目标
在本实验中,您将学习如何执行以下任务:
- 设置虚拟机实例以使用 Python SDK
- 通过 Python 脚本连接到 Gemini Chat
- 配置 PSC 端点以连接到 Googleapis
- 验证到 Googleais 的连接路径
- 配置手动 DNS 条目
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID
标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。
3. 任务 1. 使用 Terraform 设置环境
我们将创建一个包含防火墙规则和子网的自定义 VPC。打开 Cloud 控制台,然后选择要使用的项目。
- 打开控制台右上角的 Cloud Shell,确保您在 Cloud Shell 中看到正确的项目 ID,然后确认所有提示以允许访问。
- 创建一个名为 terraform-build 的文件夹,并将其移至
mkdir terraform-build && cd terraform-build
- 创建 main.tf 和 variable.tf 文件。
touch main.tf variable.tf
- 切换到 Cloud Shell 编辑器视图。选择编辑器,确保允许所有必要的提示,以便界面加载。
- 加载完毕后,依次选择 File > Open Folder,然后前往 /home/your-user-name/terraform-build,然后选择 Ok 以在编辑器中打开该文件夹。
- 选择 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" }
- 接下来,打开 main.tf 文件。我们将添加一些 Terraform 代码来执行各种操作,如下所述。
启用 API |
|
创建名为 python-net 的 VPC |
|
添加子网 |
|
添加两条防火墙规则 |
|
- 将以下内容复制并粘贴到 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 = "10.0.11.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"] }
- 切换回 Cloud Shell 终端,确保您位于 terraform-build 目录
cd terraform-build
中,然后运行以下命令
terraform init
初始化工作目录。此步骤会下载给定配置所需的提供程序。
terraform plan
生成执行计划,显示 Terraform 将执行哪些操作来部署基础架构。
- 现在,运行
terraform apply
命令并输入yes
以运行,以创建资源。
4. 任务 2. 使用 Terraform 创建 NAT 网关和虚拟机
我们需要向互联网授予出站外部访问权限,因此请创建一个 Cloud NAT 网关并将其附加。
- 打开 Cloud Shell,前往 terraform-build 文件夹,然后创建以下文件(共三个文件)。我们稍后会对这些信息进行修改。
touch nat-vm.tf psc.tf dns.tf
- 切换到 Cloud Shell 编辑器视图,选择 nat-vm.tf 文件,然后添加以下 Terraform 代码。这将创建一个 NAT 网关和两个虚拟机。
Terraform nat-vm.tf
resource "google_compute_router" "default" {
name = "py-outbound-nat"
region = "us-east1"
network = google_compute_network.default.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"
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"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
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
sudo -i
sudo mkdir -p ~/py-gem-env
cd ~/py-gem-env
python3 -m venv env
source env/bin/activate
pip install ipython google-cloud-aiplatform
EOF
}
resource "google_compute_instance" "vm2" {
name = "py-vm2"
zone = "us-east1-b"
machine_type = "n2-standard-2"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
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
sudo -i
sudo mkdir -p ~/py-gem-env
cd ~/py-gem-env
python3 -m venv env
source env/bin/activate
pip install ipython google-cloud-aiplatform
EOF
}
- 切换到 Cloud Shell 终端,确保您位于 terraform-build 文件夹中,然后运行
terraform plan
,系统会显示将添加 4 项,然后运行terraform apply
并输入yes
以创建 NAT 网关和两个虚拟机。
5. 任务 3. 配置虚拟机并进行测试
- 前往“虚拟机实例”。选择以 py-vm1 开头的虚拟机。选择 SSH。
- 通过 SSH 连接到 py-vm1 后,输入
sudo -i
以启用 root - 激活 venv 环境:
cd py-gem-env
source env/bin/activate
- 现在,我们来对其进行身份验证,以便稍后进行一些测试。在虚拟机中运行以下命令,并在出现提示时按 y。
gcloud auth application-default login
- 接下来,复制以 https:// 开头的网址,在实验室浏览器窗口中打开一个新标签页,然后粘贴该网址。接受提示。
- 当您看到以下内容时,选择“复制”,然后切换回虚拟机 py-vm1 会话,在输入授权代码:中粘贴您复制的代码,然后按 Enter 键进行身份验证。
- 现在,我们来快速测试一下,看看能否连接到 Vertex Gemini API。该 API 使用 us-central1-aiplatform.googleapis.com,因此我们将对该地址执行
dig
,以查看流量如何路由。
dig us-central1-aiplatform.googleapis.com
- 您应该会看到类似的内容(地址会有所不同)。请注意,由于该 API 是公共 API,因此路径是通过公共 IP 地址。请勿复制
; <<>> DiG 9.16.48-Debian <<>> us-central1-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9117
;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-aiplatform.googleapis.com. IN A
;; ANSWER SECTION:
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.210.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.211.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.212.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.213.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.215.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.216.95
us-central1-aiplatform.googleapis.com. 300 IN A 108.177.12.95
us-central1-aiplatform.googleapis.com. 300 IN A 108.177.13.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.26.95
- 现在,我们使用 Python。输入
ipython
以激活 ipython 界面。
ipython
- 现在,复制并粘贴以下内容。这会询问 Gemini“Google 徽标的所有颜色是什么”和“天空是什么颜色”。将引号中的
enter-your-project-id-here
替换为您的项目 ID
import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession
project_id = "enter-your-project-id-here"
location = "us-central1"
vertexai.init(project=project_id, location=location)
model = GenerativeModel("gemini-1.5-pro")
chat_session = model.start_chat()
def get_chat_response(chat: ChatSession, prompt: str) -> str:
text_response = []
responses = chat.send_message(prompt, stream=True)
for chunk in responses:
text_response.append(chunk.text)
return "".join(text_response)
prompt = "Hello."
print(get_chat_response(chat_session, prompt))
prompt = "What are all the colors of the Google logo?"
print(get_chat_response(chat_session, prompt))
prompt = "What color is the sky?"
print(get_chat_response(chat_session, prompt))
- 按 Enter 键运行并查看结果。
- 此请求通过公开 API 访问了 Vertex。
- 关闭 SSH 会话,然后继续操作。
现在,使用相同的配置配置 py-vm2
- 前往“虚拟机实例”。选择以 py-vm2 开头的虚拟机。选择 SSH。
- 通过 SSH 连接到 py-vm2-**** 后,输入 **
sudo -i
** 以启用 root - 激活 venv 环境:
cd py-gem-env
source env/bin/activate
- 现在,我们来对其进行身份验证,以便稍后进行一些测试。在虚拟机中运行以下命令
gcloud auth application-default login
- 接下来,复制以 https:// 开头的网址,在实验室浏览器窗口中打开一个新标签页,然后粘贴该网址。接受提示。
- 当您看到以下内容时,选择“复制”,然后切换回虚拟机 py-vm2 会话,在输入授权代码:中粘贴您复制的代码,然后按 Enter 键进行身份验证。
- 现在,我们来快速进行一项测试,看看能否连接到 Vertex Gemini API。此命令将向 us-central1-aiplatform.googleapis.com 发出 4 次 ping,以便我们从 API 的公共地址收到响应。
ping -c 4 us-central1-aiplatform.googleapis.com
- 我们稍后会再来测试此虚拟机。关闭 SSH 会话,然后继续操作。
6. 任务 4. 使用 Terraform 创建指向 googleapis 的 PSC 端点
为了实现与 Vertex API 端点的专用连接,我们将为 Google API 创建一个 Private Service Connect 端点。这样,我们就可以使用分配的专用 IP 地址将流量路由到所需的 Google API(在本例中为 Vertex)。
- 在编辑器视图中打开 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 = ""
}
- 切换到 Cloud Shell 终端,确保您位于
terraform-build
文件夹中。然后运行terraform init
和terraform plan
,系统会显示将添加 2 项,
然后运行terraform apply
并输入yes
以创建 IP 和 PSC Google API 端点。 - 验证端点是否存在
gcloud compute addresses list --filter="name=( 'vertex-ip' ...)"
gcloud compute forwarding-rules describe pscvertexgemini --global
7. 任务 5. 通过 IP 地址验证端点连接
我们来使用专用端点连接到 Gemini。
- 前往虚拟机实例 py-vm1。选择 SSH,然后通过 SSH 连接到虚拟机
- 输入
sudo -i
以获取 root 访问权限 - 我们只会使用此单个实例来测试 PSC 端点,因此我们将使用以下条目修改主机文件
echo 192.168.255.250 us-central1-aiplatform.googleapis.com >> /etc/hosts
cat /etc/hosts
- 使用
ping
命令检查到 us-central1-aiplatform.googleapis.com 的连接路径。这会对您在主机文件中输入的 IP 地址执行 ping 操作。这是 PSC 端点,您的 ping 将会失败。
ping -c 2 us-central1-aiplatform.googleapis.com
- 返回控制台,打开另一个虚拟机实例 py-vm1。选择 SSH,然后通过 SSH 连接到虚拟机
- 输入
sudo -i
以获取 root 访问权限 - 运行以下命令,在 TCP 转储中查看连接情况
sudo tcpdump -i any port 53 -n or host us-central1-aiplatform.googleapis.com
- 现在,切换回虚拟机实例 py-vm1 的第一个 SSH 实例
- 使用以下命令激活该环境
cd py-gem-env
source env/bin/activate
- 现在,我们来测试 Python。输入
ipython
以激活 ipython 界面。这次,流量将通过 PSC 端点传输。
ipython
- 现在,复制并粘贴以下内容。这会让 Gemini 回答“Google 徽标的所有颜色是什么?”和“描述尼亚加拉瀑布”。将引号中的
enter-your-project-id-here
替换为您的项目 ID
import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession
project_id = "enter-your-project-id-here"
location = "us-central1"
vertexai.init(project=project_id, location=location)
model = GenerativeModel("gemini-1.5-pro")
chat_session = model.start_chat() # Corrected line
def get_chat_response(chat: ChatSession, prompt: str) -> str:
text_response = []
responses = chat.send_message(prompt, stream=True)
for chunk in responses:
text_response.append(chunk.text)
return "".join(text_response)
prompt = "Hello."
print(get_chat_response(chat_session, prompt))
prompt = "What are all the colors of the Google logo?"
print(get_chat_response(chat_session, prompt))
prompt = "Describe Niagara Falls"
print(get_chat_response(chat_session, prompt))
- 按 Enter 键运行并查看结果。
- 切换回虚拟机实例 py-vm1 的第二个实例。您应该会看到 TCPDUMP 的结果。您会看到“In”和“Out”,其中包含虚拟机的 IP 地址,以及用于连接到 us-central1-aiplatform.googleapis.com 的 PSC 端点 IP 地址
22:21:55.032433 ens4 Out IP 10.0.11.18.57114 > 192.168.255.250.443: Flags [.], ack 8606, win 501, options [nop,nop,TS val 1797790182 ecr 2593039209], length 0
22:21:55.468285 ens4 In IP 192.168.255.250.443 > 10.0.11.18.57114: Flags [P.], seq 8606:8991, ack 5785, win 296, options [nop,nop,TS val 2593039645 ecr 1797790182], length 385
22:21:55.468320 ens4 Out IP 10.0.11.18.57114 > 192.168.255.250.443: Flags [.], ack 8991, win 501, options [nop,nop,TS val 1797790618 ecr 2593039645], length 0
- 关闭与虚拟机实例 py-vm1 的所有 SSH 会话
8. 任务 6. 使用 Terraform 为 googleapis 创建手动 DNS 条目(可选)
您可以使用专用 DNS 创建手动 DNS 条目,将其指向 PSC 端点。这会影响您为其分配的所有广告联盟。
- 前往“网络服务”,然后选择“Cloud DNS”。
- 在“区域”中,您应该会看到为 Google API 的 Private Service Connect 自动创建的区域,其区域类型为 Service Directory。此值可用于连接到格式为 **SERVICE-ENDPOINT.p.googleapis.com 的 PSC 端点。示例:
aiplatform-pscvertexgemini.p.googleapis.com
- 在本例中,我们要手动创建专用 DNS 条目。配置将如下所示
- 为“googleapis.com”创建一个名为“googleapis-private”的专用 DNS 区域,并将其限制为“python-net”网络。
- 添加 A 记录,将“googleapis.com”映射到 IP 地址“192.168.255.250”。
- 添加 CNAME 记录,将“googleapis.com”的所有子网域(例如 www.googleapis.com)重定向到“googleapis.com”。
- 在编辑器视图中打开 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."]
}
- 切换到 Cloud Shell 终端,确保您位于
terraform-build
文件夹中。然后运行terraform plan
,系统会显示要添加的内容,
然后运行terraform apply
并输入yes
以创建专用 DNS 条目。 - 您应该会看到包含 A 记录和 CNAME 的设置,如下所示:
- 接下来,我们在 py-vm2 上验证这些更改的连接性
9. 任务 7. 通过 IP 地址验证端点连接情况(可选)
我们来使用专用端点连接到 Gemini。
- 前往虚拟机实例 py-vm2。选择 SSH,然后通过 SSH 连接到虚拟机
- 输入
sudo -i
以获取 root 访问权限 - 使用
ping
命令检查到 us-central1-aiplatform.googleapis.com 的连接路径。这将对专用 DNS 中的 IP 地址执行 ping 操作,即 googleapis 的 A 记录。此 IP 地址是 PSC 端点,您的 ping 将会失败。
ping -c 2 us-central1-aiplatform.googleapis.com
- 使用
aiplatform-pscvertexgemini.p.googleapis.com
为 PSC Google API 自动创建的 DNS 条目,通过ping
检查连接路径。此 IP 地址指向 PSC 端点的 IP 地址,因此您的 ping 将会失败。
ping -c 2 aiplatform-pscvertexgemini.p.googleapis.com
- 使用
dig
命令检查到 us-central1-aiplatform.googleapis.com 的连接路径。此处应填写 PSC 端点的 IP 地址。
dig us-central1-aiplatform.googleapis.com
- 返回控制台,然后打开另一个虚拟机实例 py-vm2。选择 SSH,然后通过 SSH 连接到虚拟机
- 输入
sudo -i
以获取 root 访问权限 - 运行以下命令,查看 TCP 转储中的连接情况
sudo tcpdump -i any port 53 -n or host us-central1-aiplatform.googleapis.com
- 现在,切换回虚拟机实例 py-vm2 的第一个 SSH 实例
- 使用以下命令激活该环境
cd py-gem-env
source env/bin/activate
- 现在,我们来测试 Python。输入
ipython
以激活 ipython 界面。
ipython
- 现在,复制并粘贴以下内容。这会询问 Gemini“Google 徽标有哪些颜色”和“Gemini Pro 有哪两项功能”。将引号中的
enter-your-project-id-here
替换为您的项目 ID
import vertexai
from vertexai.generative_models import GenerativeModel, ChatSession
project_id = "enter-your-project-id-here"
location = "us-central1"
vertexai.init(project=project_id, location=location)
model = GenerativeModel("gemini-1.5-pro")
chat_session = model.start_chat() # Corrected line
def get_chat_response(chat: ChatSession, prompt: str) -> str:
text_response = []
responses = chat.send_message(prompt, stream=True)
for chunk in responses:
text_response.append(chunk.text)
return "".join(text_response)
prompt = "Hello."
print(get_chat_response(chat_session, prompt))
prompt = "What are all the colors of the Google logo?"
print(get_chat_response(chat_session, prompt))
prompt = "What are two features of Gemini pro"
print(get_chat_response(chat_session, prompt))
- 按 Enter 键运行并查看结果。
- 切换回虚拟机实例 py-vm2 的第二个实例。您应该会看到 TCPDUMP 的结果。您会注意到,虚拟机的 IP 地址使用 PSC 端点 IP 地址连接到 us-central1-aiplatform.googleapis.com
关闭与虚拟机实例 py-vm2 的所有 SSH 会话
10. 清理
- 前往 Cloud Shell,确保您位于 terraform-build 目录
cd terraform-build
中,然后运行以下命令terraform destroy
并输入yes
,您在项目中使用 Terraform 创建的所有资源都将被移除。
11. 恭喜
恭喜,您已成功使用公共 API 地址和 Google API 专用 Private Service Connect 端点以私密方式连接到 Vertex Gemini Chat。此功能可将私有 API 连接扩展到通过(互连、跨云互连和 VPC)连接的本地/其他云环境。
后续步骤/了解详情
您可以详细了解 Vertex AI 网络
Codelab:通过 Private Service Connect 端点使用 Python SDK 访问 Vertex AI 上的 Anthropic Claude
参与下一项实验
继续完成 Google Cloud 相关的挑战任务,并查看以下其他 Google Cloud Skills Boost 实验: