本文用示例介绍如何在中国大陆的公有云及数据中心内用虚机上的应用程序访问谷歌云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的返回可以看出。



root@iZ2zea4ht42wfvs78rrp3jZ:~# traceroute 199.36.153.8
traceroute to 199.36.153.8 (199.36.153.8), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 11.220.137.122 (11.220.137.122) 1.930 ms 11.220.136.58 (11.220.136.58) 2.145 ms 11.220.136.118 (11.220.136.118) 2.394 ms
4 123.56.34.82 (123.56.34.82) 1.848 ms 116.251.116.34 (116.251.116.34) 2.319 ms 116.251.116.30 (116.251.116.30) 2.308 ms
5 116.251.112.161 (116.251.112.161) 2.764 ms 116.251.112.173 (116.251.112.173) 28.540 ms 116.251.112.189 (116.251.112.189) 2.468 ms
6 106.38.196.225 (106.38.196.225) 3.075 ms 106.38.196.237 (106.38.196.237) 3.271 ms 106.38.196.241 (106.38.196.241) 3.739 ms
7 36.110.248.37 (36.110.248.37) 3.832 ms 36.110.244.53 (36.110.244.53) 4.205 ms 180.149.141.157 (180.149.141.157) 3.668 ms
8 * * *
...



复制代码


因此需要单独创建一台只有私网IP的虚机,然后从跳板机ssh到此机器来测试。下面是测试机和跳板机的示例。



在测试机上可以首先查看到199.36.153.8的路由。


root@test-private:~# traceroute 199.36.153.8
traceroute to 199.36.153.8 (199.36.153.8), 30 hops max, 60 byte packets
1 192.168.0.160 (192.168.0.160) 1.246 ms 1.309 ms 1.399 ms
2 * * *
3 * * *

复制代码


可以看到下一跳确实是VPN网关。


之后可以测试连接speech.googleapis.com的443端口。


root@test-private:~# telnet speech.googleapis.com 443
Trying 199.36.153.8...
Connected to private.googleapis.com.
Escape character is '^]'.


复制代码


连接成功说明上述所有配置正确。


三、搭建客户端环境


我们在阿里云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 install --upgrade google-cloud-speech

复制代码


如果安装过程中发生类似


ERROR: Package 'cachetools' requires a different Python: 2.7.15 not in '~= 3.5'

复制代码


的报错,可以尝试更改pip请求的镜像地址。将/root/.pip/pip.conf中指向的阿里云镜像地址注释掉。


[global]
#index-url=http://mirrors.cloud.aliyuncs.com/pypi/simple/

复制代码


配置API访问密钥并运行示例程序


访问谷歌云API的应用程序需要通过服务账号密钥(Service Account Key)来通过API的身份和权限验证。首先在谷歌云控制台创建服务账号,配置访问API服务的权限,并下载其对应密钥文件。具体步骤可以参考官方文档


然后将下载的密钥文件复制到阿里云虚机上,本例放在了/root/gcp-service-account-key.json。


复制一个英语的录音文件到此虚机上,本例放在了/root/weather.wav。


创建一个示例python脚本/root/recognize.py,其内容为如下代码。


import io
import os

# Imports the Google Cloud client library
from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types

# Instantiates a client
client = speech.SpeechClient()

# The name of the audio file to transcribe
file_name = os.path.join(
os.path.dirname(__file__),
'',
'weather.wav')

# Loads the audio into memory
with io.open(file_name, 'rb') as audio_file:
content = audio_file.read()
audio = types.RecognitionAudio(content=content)

config = types.RecognitionConfig(
encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=16000,
language_code='en-US')

# Detects speech in the audio file
response = client.recognize(config, audio)

for result in response.results:
print('Transcript: {}'.format(result.alternatives[0].transcript))


复制代码


配置密钥文件环境变量并运行示例程序。


export GOOGLE_APPLICATION_CREDENTIALS="/root/gcp-service-account-key.json"
python recognize.py

复制代码


如果看到下面输出(具体文字内容应匹配录音内容),说明上面所有配置正确,可以成功调用谷歌云API。


Transcript: what's the weather like today

复制代码


评论

发布