从外部网络使用 API

本教程演示了如何从外部网络(例如本地专用网络或其他云服务商的网络)将 API 用于 Google Cloud Platform (GCP) 服务。此方法允许连接到您的专用网络的本地服务器在不使用公共 IP 地址的情况下访问 GCP 服务。本教程提供了一个示例,您可以在其中使用 Amazon Virtual Private Cloud (Amazon VPC) 上的专用网络来模拟本地专用网络。

架构

下图总结了您在本教程中创建的整体架构。

  • 您可以通过 IPsec VPN 将 Amazon VPC 中的专用网络连接到 GCP 项目中的虚拟网络。如果您使用本地专用网络而不是 Amazon VPC,则可以使用 Cloud Interconnect 与 GCP 项目建立专用网络连接。

  • 您使用 GCP 项目中的专用 Google 访问权限。即使启用了专用 Google 访问权限,在 GCP 项目外运行的服务器也无法使用内部 IP 地址访问 GCP API,例如 Cloud Translation。因此,您在 GCP 项目中使用 HTTP 或 HTTPS 代理,通过内部 IP 地址将 API 请求从外部服务器传输到 Google Cloud Platform API 和服务。

整体架构

目标

  • 启用专用 Google 访问权限,以允许 Compute Engine 虚拟机实例在不使用公共 IP 地址的情况下访问 Google Cloud Platform API。

  • 使用 Compute Engine 实例设置 HTTP 或 HTTPS 代理,以允许 Amazon VPC 中的服务器在不使用公共 IP 地址的情况下访问 Google Cloud Platform API。

费用

本教程使用 Google Cloud Platform 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。GCP 新用户可能有资格免费试用

此外,Amazon Web Services (AWS) 的各项服务可能会产生费用,例如 Amazon VPC、VPN 和 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

准备工作

在开始本教程之前,请使用 GCP Console 创建一个 GCP 项目并启用结算功能。请勿使用现有项目,因为完成本教程后,您需要删除此项目以避免产生额外的费用。

  1. 为本教程创建一个 GCP 项目。

    转到“管理资源”页面

  2. 确保您的 Google Cloud Platform 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  3. 启用 Translation。

    启用 Translation

    新项目中会自动启用 Compute Engine API。

  4. 在 GCP Console 中,打开凭据页面。

    转到“凭据”页面

  5. 对于创建凭据,选择 API 密钥,然后点击关闭

  6. 记下 Console 中显示的 API 密钥字符串。

将 Amazon VPC 连接到您的 GCP 虚拟网络

在本教程中,您将使用 Amazon VPC 模拟本地数据中心。要建立 Amazon VPC,请按照将 Cloud VPN 与 Amazon Web Services 搭配使用中“基于政策的 IPsec VPN:配置 - AWS”和“基于政策的 IPsec VPN:配置 - GCP UI”部分中的说明进行操作。

  • 使用网络地址为 172.31.0.0/16 CIDR 的默认 VPC。
  • 使用网络地址为 172.31.0.0/16 CIDR 的默认子网。
  • 使用静态 IP 地址 aws-vpn 作为 Compute Engine VPN 网关与 AWS 建立 VPN 连接。

您使用 IPsec VPN 将 Amazon VPC 连接到您在 GCP 中创建的 GCP 虚拟网络。

gcloud

  1. 打开 Cloud Shell:

    激活 Cloud Shell

  2. 创建 GCP 虚拟网络:

    gcloud compute networks create "aws-vpn" --subnet-mode "auto"
    gcloud compute addresses create "aws-vpn" --region "asia-east1"
    
  3. 按照将 Cloud VPN 与 Amazon Web Services 搭配使用中的说明进行操作。

  4. 要在 GCP Console 中显示 VPN 配置,请打开 VPN 页面:

    打开“VPN”页面

    GCP Console 中的 VPN 配置类似于下图。绿色对勾标记表示 aws-vpn 的远程对等 IP 地址设置正确。

    GCP Console 上的 VPN 配置

Console

  1. 在 GCP Console 中,转到 VPC 网络页面。

    打开“VPC 网络”页面

  2. 点击创建 VPC 网络

  3. 设置以下选项,其他选项保留为默认值:

    • 名称aws-vpn
    • 子网Automatic
  4. 点击创建

  5. 转到外部 IP 地址页面:

    打开“外部 IP 地址”页面

  6. 点击保留静态地址

  7. 设置以下选项,其他选项保留为默认值:

    • 名称aws-vpn
    • 区域asia-east1
  8. 点击保留

  9. 按照将 Cloud VPN 与 Amazon Web Services 搭配使用中的说明进行操作。

  10. 要在 GCP Console 中显示 VPN 配置,请打开 VPN 页面:

    打开“VPN”页面

    GCP Console 中的 VPN 配置类似于下图。绿色对勾标记表示 aws-vpn 的远程对等 IP 地址设置正确。

    GCP Console 上的 VPN 配置

配置 Amazon VPC 路由表

要使 Amazon EC2 实例能够访问项目中的 GCP 虚拟网络,请执行以下步骤:

  1. 在 AWS 管理控制台中,点击路由表标签。

  2. 选择路由传播,然后点击修改

  3. 在 VPC 网络专用 IP 范围中选择传播,然后点击保存

启用专用 Google 访问权限

在连接到 Amazon VPC 的子网上启用专用 Google 访问权限。

gcloud

  1. 在 Cloud Shell 中运行以下命令:

    gcloud compute networks subnets update aws-vpn \
        --enable-private-ip-google-access --region asia-east1

Console

  1. 在 GCP Console 中,转到 VPC 网络页面:

    打开“VPC 网络”页面

  2. asia-east1 区域中选择 aws vpn 子网。

  3. 点击修改

  4. 专用 Google 访问权限框中,选择开启,然后点击保存

配置防火墙规则

下一步是添加允许来自 Amazon VPC 的代理连接,以及来自所有外部网络的 SSH 连接的防火墙规则。SSH 连接仅用于配置 HTTP 或 HTTPS 代理实例。要在不手动登录实例的情况下配置代理,可以使用启动脚本,在这种情况下,您无需为 SSH 连接创建防火墙规则。

gcloud

  1. 在 Cloud Shell 中,为代理添加防火墙规则:

    gcloud compute firewall-rules create "aws-vpn-allow-proxy" \
      --description "Allow Google private access from AWS VPC" \
      --network "aws-vpn" --allow tcp:8118 \
      --source-ranges "172.31.0.0/16" --target-tags "api-proxy"
    

    创建防火墙规则后,将显示以下输出:

    Creating firewall...done.
    NAME                 NETWORK  SRC_RANGES     RULES     SRC_TAGS  TARGET_TAGS
    aws-vpn-allow-proxy  aws-vpn  172.31.0.0/16  tcp:8118            api-proxy
    
  2. 如果您没有使用启动脚本,请为 SSH 连接添加防火墙规则:

    gcloud compute firewall-rules create "aws-vpn-allow-ssh" \
      --description "Allow SSH from anywhere" \
      --network "aws-vpn" --allow tcp:22  --source-ranges "0.0.0.0/0"
    

    创建防火墙规则后,将显示以下输出:

    Creating firewall...done.
    NAME               NETWORK  SRC_RANGES  RULES   SRC_TAGS  TARGET_TAGS
    aws-vpn-allow-ssh  aws-vpn  0.0.0.0/0   tcp:22
    

Console

  1. 在 GCP Console 中,转到防火墙规则页面:

    打开“防火墙规则”页面

  2. 点击创建防火墙规则

  3. 设置以下选项,其他选项保留为默认值:

    • 名称aws-vpn-allow-proxy
    • 说明Allow Google Private Access from Amazon VPC
    • 网络aws-vpn
    • 目标标记api-proxy
    • 来源 IP 地址范围172.31.0.0/16
    • 协议和端口tcp:8118
  4. 点击创建

  5. 点击创建防火墙规则

  6. 设置以下选项,其他选项保留为默认值:

    • 名称aws-vpn-allow-ssh
    • 说明Allow SSH from anywhere
    • 网络aws-vpn
    • 目标标记api-proxy
    • 来源 IP 地址范围0.0.0.0/0
    • 协议和端口tcp:22
  7. 点击创建

创建 HTTP 或 HTTPS 代理实例

接下来,您需要创建 Compute Engine 实例,将其配置为 HTTP 或 HTTPS 代理,然后登录。

gcloud

  1. 启动 Compute Engine 实例:

    gcloud compute instances create "api-proxy" \
      --zone "asia-east1-a" --machine-type "n1-standard-1" \
      --subnet "aws-vpn" --private-network-ip "10.140.0.2" \
      --tags "api-proxy"
    

    指定要用作代理地址的实例专用 IP 地址。

  2. 登录实例:

    gcloud compute ssh "api-proxy" --zone "asia-east1-a"
  3. 在 SSH 会话中,安装 privoxy 服务:

    sudo apt-get -y install privoxy
  4. 配置 privoxy 服务:

    sudo sed -i "s/listen-address  127.0.0.1:8118/listen-address  10.140.0.2:8118/" /etc/privoxy/config
    sudo systemctl restart privoxy
    
  5. 确认该服务已配置为通过端口 8118 接受到 IP 地址 10.140.0.2 的连接:

    sudo netstat -nlt

    输出类似于以下内容:

    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 10.140.0.2:8118         0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
    tcp6       0      0 :::22                   :::*                    LISTEN
    

Console

  1. 在 GCP Console 中,转到虚拟机实例页面。

    打开“虚拟机实例”页面

  2. 点击创建

  3. 创建实例页面中,设置以下选项,其他选项保留为默认值:

    • 名称api-proxy
    • 地区asia-east1-a
  4. 展开管理、安全、磁盘、网络、单独租用并选择网络

  5. 设置以下选项,其他选项保留为默认值:

    • 网络标记api-proxy
    • 网络接口 > 网络aws-vpn
    • 网络接口 > 子网aws-vpn(10.140.0.0/20)
    • 网络接口 > 主要内部 IPCustom
    • 网络接口 > 自定义临时 IP 地址10.140.0.2
  6. 点击完成

  7. 点击创建

  8. 选择 api-proxy 实例,点击 SSH 以打开 SSH 终端。

  9. 在 SSH 会话中,安装 privoxy 服务:

    sudo apt-get -y install privoxy
  10. 配置 privoxy 服务:

    sudo sed -i "s/listen-address  127.0.0.1:8118/listen-address  10.140.0.2:8118/" /etc/privoxy/config
    sudo systemctl restart privoxy
    
  11. 确认该服务已配置为通过端口 8118 接受到 IP 地址 10.140.0.2 的连接:

    sudo netstat -nlt

    输出类似于以下内容:

    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 10.140.0.2:8118         0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
    tcp6       0      0 :::22                   :::*                    LISTEN
    
  12. 退出实例:

    exit
    

此时,您不再需要与实例的 SSH 连接。如果您的安全标准要求您移除允许 SSH 连接的防火墙规则,请执行以下操作:

gcloud

  1. 删除防火墙规则:

    gcloud compute firewall-rules delete "aws-vpn-allow-ssh"

Console

  1. 在 GCP Console 中,转到防火墙规则页面:

    打开“防火墙规则”页面

  2. 选择 aws-vpn-allow-ssh

  3. 点击删除

从代理实例中移除外部 IP 地址

您必须防止代理实例意外使用公共 IP 地址访问 GCP API。本部分介绍如何从代理实例中移除外部 IP 地址。

gcloud

  1. 确定配置名称:

    gcloud compute instances describe api-proxy | grep -A5 accessConfigs

    在以下示例输出中,外部 IP 地址的配置名称为 external-nat

    - accessConfigs:
    - kind: compute#accessConfig
        name: external-nat
        natIP: 104.199.157.31
        type: ONE_TO_ONE_NAT
    kind: compute#networkInterface
    
  2. 指定上一步中的配置名称,移除外部 IP 地址。

    gcloud compute instances delete-access-config api-proxy --access-config-name "external-nat"

Console

  1. 在 GCP Console 中,转到虚拟机实例页面。

    打开“虚拟机实例”页面

  2. 点击 api-proxy

  3. 点击修改

  4. 点击 nic0:aws-vpn

  5. 设置以下选项,其他选项保留为默认值:

    • 外部 IPNone
  6. 点击完成

  7. 点击保存

从 Amazon VPC 使用 Google API

在本部分中,您将使用 Cloud Translation 来验证您是否可以从 Amazon VPC 上运行的 Amazon EC2 实例使用 Google Cloud Platform API。

  1. 在您创建的 Amazon VPC 中启动 Amazon EC2 实例。

  2. 使用 SSH 终端连接到 Amazon EC2 实例。

  3. 创建 API 请求消息文件:

    echo '{"q": ["this is a test translation via proxy"], "target": "it"}' >/tmp/translation.json
  4. 发布指定代理地址的请求。将 [YOUR_API_KEY] 替换为您之前创建的 API 密钥字符串

    API_KEY=[YOUR_API_KEY]
    curl -H 'Content-Type: application/json' --dump-header - \
      --proxy http://10.140.0.2:8118 -d @/tmp/translation.json \
      -X POST https://translation.googleapis.com/language/translate/v2?key=${API_KEY}
    

    Translation 服务的回复如下:

    HTTP/1.1 200 Connection established
    Proxy-Agent: Privoxy/3.0.21
    
    HTTP/1.1 200 OK
    Content-Type: application/json; charset=UTF-8
    Vary: X-Origin
    Vary: Referer
    Date: Thu, 06 Jul 2017 23:44:57 GMT
    Server: ESF
    Cache-Control: private
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN
    X-Content-Type-Options: nosniff
    Accept-Ranges: none
    Vary: Origin,Accept-Encoding
    Transfer-Encoding: chunked
    
    {
      "data": {
        "translations": [
          {
            "translatedText": "Questa è una traduzione del test tramite il proxy",
            "detectedSourceLanguage": "en"
          }
        ]
      }
    }
    

清理

完成本教程后,请删除项目以避免产生额外的费用。

  1. 在 GCP Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择您要删除的项目,然后点击删除 delete。
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤