本文用示例介绍如何在中国大陆的公有云及数据中心内用虚机上的应用程序访问谷歌云 API,比如语音识别、对象存储、云资源管理等。主要使用到了跨云 VPN 连接,以及谷歌云 Private Google Access 服务,允许从 VPC 私网访问谷歌云 API。
注:谷歌云翻译服务 API 不需要特殊配置既可以在中国大陆网络进行访问。
下面的示例使用了阿里云华北 2 区域及谷歌云香港区域的资源和服务。但您可以根据具体需要选择不同的云资源厂商和区域。
目录
目录
一、搭建 VPN
创建谷歌云 VPN 网关
创建阿里云 VPN 网关
创建谷歌云 VPN 通道
配置谷歌云 VPC 防火墙规则
配置阿里云 VPC 路由
配置阿里云 VPC 私有 DNS Zone
打开谷歌云 VPC 子网的 Private Google Access
测试连接
三、搭建客户端环境
安装 SDK
配置 API 访问密钥并运行示例程序
一、搭建 VPN
分别开通谷歌云和阿里云的 VPN 网关并搭建 IPSec 通道。
创建谷歌云 VPN 网关
首先在谷歌云控制台界面操作预留一个固定公网 IP。
然后在导航栏中选择 Hybrid Connectivity -> VPN。点击按钮创建 VPN 连接。
由于阿里云 VPN 网关不支持 BGP 而只支持静态路由,需要选择谷歌云 VPN 类型为 Classic VPN。
选择区域为 asia-east2,并选择 IP 地址为上面预留的公网 IP。暂时不配置 VPN 通道,而等对端 VPN 网关搭建好后再配置。
创建阿里云 VPN 网关
在创建和配置 VPN 网关之前,先要规划好阿里云 VPC 内的网段,避免与连接对端谷歌云 VPC 子网的网段重合。本例在阿里云创建了一个 192.168.3.0/24 网段的子网,并创建对应的交换机。
现在到阿里云控制台开通 VPN 网关服务。
选择华北 2 区域,并选择对应的 VPC。根据预估用量选择对应的带宽。选择开启 IPSec-VPN。
VPN 网关创建成功后,查看其分配的 IP 地址。
创建一个用户网关,IP 地址输入为上面谷歌云 VPN 网关的公网地址。
创建 IPSec 连接。选择上面创建的 VPN 网关和用户网关。本地网段选择上面创建的交换机对应的子网段。对端网段选择谷歌云 default VPC 的 asia-east2 子网的网段,本例为 10.170.0.0/20。
在高级配置里输入自选的 IKE 密钥,并选择 IKE 版本为 v2。
创建谷歌云 VPN 通道
现在知道了阿里云 VPN 网关的地址,可以回到谷歌云控制台完成创建 VPN 通道。在 VPN 配置界面选择 Cloud VPN Tunnels 标签页,并点击 Create VPN Tunnel 按钮。之后填写通道配置。对端 IP 填写阿里云 VPN 公网 IP,IKE 密钥填写上面用到的密钥。路由策略可以选择 Route-based 或者 Policy-based。对端网络 IP 段填写阿里云 VPC 的 IP 段。
创建完成后等待一段时间,可以看到 VPN 通道的状态变为 Established,说明双方 VPN 网关协商成功,通道建立。
配置谷歌云 VPC 防火墙规则
谷歌云 VPC 需要允许从阿里云 VPC 经过 VPN 流入的网络请求。配置对应的防火墙规则如下。方向为入向,行为为允许,IP 段为阿里云 VPC 的 IP 段。
配置阿里云 VPC 路由
在阿里云控制台,打开 VPN 网关配置,选择策略路由表标签,可以方便地把 VPN 网关上配置的路由策略发布到所关联的 VPC。当前已经有一条默认路由策略,是在创建 VPN 网关时自动创建的,到谷歌云 VPC 网段的路由策略。可以在操作一栏点击发布。
另外需要创建一条指向 199.36.153.8/30 网段的路由,也指向通往谷歌云 VPC 的 VPN 通道。这个地址段是从谷歌云 VPC 经内网访问的谷歌云 API 的地址段。创建完成后,也点击发布将其发布到 VPC。
配置阿里云 VPC 私有 DNS Zone
通过 Private Google Access 访问谷歌云 API 也需要请求中配置比如 speech.googleapis.com 的 host,不可以只用 IP 访问。因此还需要在 VPC 内做相应 DNS 配置,将*.googleapis.com 通过 CNAME 指向 private.googleapis.com。而 private.googleapis.com 的地址已知,可以通过 A 记录来配置。
如果只修改虚机上的 hosts 文件可以覆盖 DNS 记录,但是并不支持通配符。如果要方便稳定地修改虚机的 DNS 查询结果,可以使用阿里云的云解析 Private Zone,并关联 VPC。
首先要开通 Private Zone 服务。
创建一个 Private Zone。
创建将*.googleapis.com 指向 private.googleapis.com 的 CNAME 记录。
创建 private.googleapis.com 的四个 A 记录,分别为
199.36.153.8
199.36.153.9
199.36.153.10
199.36.153.11
配置之后还需要将 Private Zone 关联到 VPC。
选择 VPN 通道所对应的 VPC。
打开谷歌云 VPC 子网的 Private Google Access
为了允许从谷歌云 VPC 或 VPN 连接的阿里云 VPC 内的服务器应用通过私网地址访问谷歌云 API 服务,需要在对应的谷歌云 VPC 子网打开 Private Google Access 功能。
首先在谷歌云控制台选择对应的 VPC,选择 asia-east2 对应的子网,点击编辑。找到 Private Google Access 开关,选择打开,然后保存。
测试连接
测试谷歌云 VPC 和阿里云 VPC 的互通,可以在两个 VPC 对连的子网内各开通一台虚机,然后 ping 对端虚机的私网地址。如果正确返回,说明 VPN 通道健康。
测试阿里云 VPC 内的虚机可以通过私网地址访问谷歌云 API,需要从一台没有绑定弹性公网 IP 的虚机来测试。因为如果绑定了弹性公网 IP,那么从虚机到 199.36.153.8/30 的路由默认会指向本地互联网网关,而不是指向 VPN 网关。从下面 traceroute 的返回可以看出。
因此需要单独创建一台只有私网 IP 的虚机,然后从跳板机 ssh 到此机器来测试。下面是测试机和跳板机的示例。
在测试机上可以首先查看到 199.36.153.8 的路由。
可以看到下一跳确实是 VPN 网关。
之后可以测试连接 speech.googleapis.com 的 443 端口。
连接成功说明上述所有配置正确。
三、搭建客户端环境
我们在阿里云 VPC 内的虚机上运行程序来请求谷歌云 API 接口,可以通过访问 REST 接口或者 gRPC 接口的方式。如果访问 gRPC 接口,比较方便的是使用谷歌云提供的各种编程语言的客户端 SDK。下面举例使用 Pyhon SDK 来访问谷歌云语音识别(Speech-to-Text)API。
安装 SDK
首先在阿里云仅有私网 IP 的虚机上安装 python、pip 及谷歌云 SDK 库。安装需要访问外网地址,可以给虚机临时绑定弹性公网 IP,或者用阿里云 NAT 服务来访问外网。下面示例使用了 NAT 网关,并通过 SNAT 配置关联了对应虚拟机。
外网可以访问后,运行下面命令来安装 SDK(本例使用的阿里云虚机镜像已经自带 python 和 pip)。
如果安装过程中发生类似
的报错,可以尝试更改 pip 请求的镜像地址。将/root/.pip/pip.conf 中指向的阿里云镜像地址注释掉。
配置 API 访问密钥并运行示例程序
访问谷歌云 API 的应用程序需要通过服务账号密钥(Service Account Key)来通过 API 的身份和权限验证。首先在谷歌云控制台创建服务账号,配置访问 API 服务的权限,并下载其对应密钥文件。具体步骤可以参考官方文档。
然后将下载的密钥文件复制到阿里云虚机上,本例放在了/root/gcp-service-account-key.json。
复制一个英语的录音文件到此虚机上,本例放在了/root/weather.wav。
创建一个示例 python 脚本/root/recognize.py,其内容为如下代码。
配置密钥文件环境变量并运行示例程序。
如果看到下面输出(具体文字内容应匹配录音内容),说明上面所有配置正确,可以成功调用谷歌云 API。
评论