低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

阿里云虚机应用程序通过 VPN 访问谷歌云 API

于有志

2020 年 11 月 03 日

阿里云虚机应用程序通过VPN访问谷歌云API

本文用示例介绍如何在中国大陆的公有云及数据中心内用虚机上的应用程序访问谷歌云 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.8traceroute 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.8traceroute 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 443Trying 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 ioimport os
# Imports the Google Cloud client libraryfrom google.cloud import speechfrom google.cloud.speech import enumsfrom google.cloud.speech import types
# Instantiates a clientclient = speech.SpeechClient()
# The name of the audio file to transcribefile_name = os.path.join( os.path.dirname(__file__), '', 'weather.wav')
# Loads the audio into memorywith 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 fileresponse = 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
复制代码


2020 年 11 月 03 日 15:501786

评论

发布
暂无评论
发现更多内容

概念有时候很坑

伯薇

抽象 思考力 沟通 概念

MySQL数据类型DECIMAL用法

Simon

MySQL

聊聊Serverless

kimmking

CDN云课堂 | EdgeRoutine技术专家教你把JS代码跑到CDN边缘

阿里云Edge Plus

Java CDN edge

奔向 10W+ 的第一次 update

赵新龙

InfoQ B站 Quora

用测试驱动开发学算法

escray

学习 CSD 认证实战营

DD 测试linux性能

HU

TOTO 2020再次荣获iF、红点两项国际设计大奖

极客编

视达荣登ChinaBang Awards 2020智慧零售榜Top10

极客编

如何推动与影响中型前端团队的成长

堂主

前端 研发管理 团队建设

多个 SSH keys 的配置,方便 Git 对不同仓库的使用与管理

与光

git GitHub SSH

CDN百科 | 最近,你的APP崩了吗?

阿里云Edge Plus

CDN

可视化 Tekton 组件 Tekton Dashboard

郭旭东

Kubernetes cicd

游戏夜读 | 如何优化缓冲加载?

game1night

读懂才会用 : 瞅瞅Redis的epoll模型

小眼睛聊技术

redis 缓存 学习 开源 架构 后端

一文看懂开源工作流引擎 Flowable

Herbert

Java spring 开源 企业中台 工作流

由丰巢快递柜引发的思考

Neco.W

创业 思考 丰巢

一杯茶的时间,上手 Git 团队协作开发

图雀社区

git GitHub

抄作业

escray

学习 CSD 认证实战营

我站在愚蠢之巅

escray

学习 CSD 认证实战营

GrowingIO 微服务 SaaS 与私有部署运行实践

GrowingIO技术专栏

大数据 微服务架构 SaaS

KubeFATE:在Kubernetes上部署联邦学习平台

亨利笔记

人工智能 学习 FATE KUBEFATE

Java 编程基础

michaelliu

Kafka系列第6篇:消息是如何在服务端存储与读取的,你真的知道吗?

z小赵

Java 大数据 kafka 实时计算

谈谈控制感(2):怎么让我们更健康

史方远

个人成长 心理

《Linux就该这么学》笔记(二)

编程随想曲

Linux

CDN百科 | 假如没有CDN,网络世界会变成什么样?

阿里云Edge Plus

Rust安装注意事项

邱张华

rust 镜像源 diesel

并发编程如何才能不再头疼:iOS中的协程

超越杨超越

ios 协程 coobjc ucontext

想退休,可能没机会了

池建强

读书感悟

CDN云课堂 |可编程CDN – EdgeScript应用场景、语言速览和实操演示

阿里云Edge Plus

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

阿里云虚机应用程序通过VPN访问谷歌云API-InfoQ