從外部網路使用 API

本教學課程說明如何從外部網路 (例如您的內部部署私人網路或其他雲端服務業者的網路) 使用 Google Cloud Platform (GCP) 服務 API。此方法可讓連線至私人網路的內部部署伺服器無需使用公開 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 Proxy 使用內部 IP 位址,將 API 要求從外部伺服器傳送到 Google Cloud Platform API 和服務。

整體架構

目標

  • 啟用私人 Google 存取權,讓 Compute Engine VM 執行個體無需使用公開 IP 位址即可存取 Google Cloud Platform API。

  • 使用 Compute Engine 執行個體設定 HTTP 或 HTTPS Proxy,讓 Amazon VPC 中的伺服器無需使用公開 IP 位址即可存取 Google Cloud Platform API。

費用

本教學課程使用下列 Google Cloud Platform 計費元件:

您可以使用 Pricing Calculator,根據您的預測使用量來產生預估費用。 初次使用 GCP 的使用者可能符合申請免費試用的資格。

您可能需要另外支付使用 Amazon Web Services (AWS) 服務的費用,如 Amazon VPC、VPN 和 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。

事前準備

開始本教學課程之前,請先使用 GCP 主控台建立一個 GCP 專案並啟用計費功能。請勿使用現有的專案,因為您需要在教學課程結束後刪除這個專案,以避免產生進一步的費用。

  1. 為教學課程建立一個 GCP 專案。

    前往「MANAGE RESOURCES」(管理資源) 頁面

  2. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  3. 啟用 Translation。

    啟用 Translation

    Compute Engine API 自動在新專案中啟用。

  4. 在 GCP 主控台中,開啟「Credentials」(憑證) 頁面。

    前往「Credentials」(憑證)

  5. 在「Create credentials」(建立憑證) 部分,選取 [API key] (API 金鑰),然後按一下 [Close] (關閉)。

  6. 記下顯示於主控台中的 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 閘道,建立 VPN 與 AWS 的連線。

您使用 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 主控台中顯示 VPN 設定,請開啟「VPN」頁面:

    開啟「VPN」

    GCP 主控台中的 VPN 設定看起來與下列圖片類似。綠色勾號表示 aws-vpn 的遠端對等 IP 位址已正確設定。

    GCP 主控台上的 VPN 設定

主控台

  1. 前往 GCP 主控台的「VPC Networks」(VPC 網路) 頁面。

    開啟「VPC Networks」(VPC 網路)

  2. 按一下 [Create VPC Network] (建立 VPC 網路)

  3. 設定以下選項,其他選項請保留預設值:

    • 「Name」(名稱)aws-vpn
    • 「Subnets」(子網路)Automatic
  4. 按一下 [Create] (建立)

  5. 前往「External IP addresses」(外部 IP 位址) 頁面:

    開啟「External IP addresses」(外部 IP 位址)

  6. 按一下 [Reserve static address] (預約靜態位址)

  7. 設定以下選項,其他選項請保留預設值:

    • 「Name」(名稱)aws-vpn
    • 「Region」(地區)asia-east1
  8. 按一下 [預約]

  9. 按照搭配使用 Cloud VPN 與 Amazon Web Services 一文中的指示操作。

  10. 如要在 GCP 主控台中顯示 VPN 設定,請開啟「VPN」頁面:

    開啟「VPN」

    GCP 主控台中的 VPN 設定看起來與下列圖片類似。綠色勾號表示 aws-vpn 的遠端對等 IP 位址已正確設定。

    GCP 主控台上的 VPN 設定

設定 Amazon VPC 路徑表

如要讓 Amazon EC2 執行個體存取您專案中的 GCP 虛擬網路,請按照以下步驟執行:

  1. 在 AWS 管理主控台中,點選 [Route Table] 分頁標籤。

  2. 選取 [Route Propagation],然後點選 [Edit]

  3. 在 VPC 網路私人 IP 範圍中選取 [Propagate] (傳播),然後點選 [Save] (儲存)

啟用私人 Google 存取權

您會在與 Amazon VPC 連線的子網路上啟用私人 Google 存取權。

gcloud

  1. 在 Cloud Shell 中執行下列指令:

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

主控台

  1. 前往 GCP 主控台的「VPC Networks」(VPC 網路) 頁面:

    開啟「VPC Networks」(VPC 網路)

  2. asia-east1 區域中選取 asia-east1 子網路。

  3. 按一下 [Edit] (編輯)

  4. 在「Private Google Access」(私人 Google 存取權) 方塊中,選取 [On] (開啟),然後點選 [Save] (儲存)

設定防火牆規則

下一步是新增允許來自 Amazon VPC 的 Proxy 連線及來自所有外部網路的 SSH 連線的防火牆規則。SSH 連線僅用於設定 HTTP 或 HTTPS Proxy 執行個體。如要設定 Proxy 而不手動登入執行個體,您可以使用開機指令碼,這樣就不需要為 SSH 連線建立防火牆規則。

gcloud

  1. 在 Cloud Shell 中,為 Proxy 新增防火牆規則:

    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
    

主控台

  1. 前往 GCP 主控台的「Firewall rules」(防火牆規則) 頁面:

    開啟「Firewall rules」(防火牆規則)

  2. 按一下 [Create Firewall rule] (建立防火牆規則)。

  3. 設定以下選項,其他選項請保留預設值:

    • 「Name」(名稱)aws-vpn-allow-proxy
    • 「Description」(說明)Allow Google Private Access from Amazon VPC
    • 「Network」(網路)aws-vpn
    • 「Target tags」(目標標記)api-proxy
    • 「Source IP ranges」(來源 IP 範圍)172.31.0.0/16
    • 「Protocols and ports」(通訊協定與通訊埠)tcp:8118
  4. 按一下 [Create] (建立)

  5. 按一下 [Create Firewall rule] (建立防火牆規則)。

  6. 設定以下選項,其他選項請保留預設值:

    • 「Name」(名稱)aws-vpn-allow-ssh
    • 「Description」(說明)Allow SSH from anywhere
    • 「Network」(網路)aws-vpn
    • 「Target tags」(目標標記)api-proxy
    • 「Source IP ranges」(來源 IP 範圍)0.0.0.0/0
    • 「Protocols and ports」(通訊協定與通訊埠)tcp:22
  7. 按一下 [Create] (建立)

建立 HTTP 或 HTTPS Proxy 執行個體

接下來,您需要建立 Compute Engine 執行個體,將其設為 HTTP 或 HTTPS Proxy,然後登入。

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"
    

    指定您要用做 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
    

主控台

  1. 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。

    開啟「VM INSTANCES」(VM 執行個體)

  2. 按一下 [Create] (建立)

  3. 在「Create an instance」(建立執行個體) 頁面上,設定以下選項,並保留其他選項的預設值:

    • 「Name」(名稱)api-proxy
    • 「Zone」(區域)asia-east1-a
  4. 開啟 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用) 並選取 [Networking] (網路)

  5. 設定以下選項,其他選項請保留預設值:

    • 「Network tags」(網路標記)api-proxy
    • 「Network interface」(網路介面) >「Network」(網路)aws-vpn
    • 「Network interface」(網路介面) >「Subnetwork」(子網路)aws-vpn(10.140.0.0/20)
    • 「Network interface」(網路介面) >「Primary internal IP」(主要內部 IP)Custom
    • 「Network interface」(網路介面) >「Custom ephemeral IP address」(自訂臨時 IP 位址)10.140.0.2
  6. 按一下 [Done] (完成)

  7. 按一下 [Create] (建立)

  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"

主控台

  1. 前往 GCP 主控台的「Firewall rules」(防火牆規則) 頁面:

    開啟「Firewall rules」(防火牆規則)

  2. 選取 aws-vpn-allow-ssh

  3. 按一下 [Delete] (刪除)。

從 Proxy 執行個體移除外部 IP 位址

您必須防止 Proxy 執行個體意外使用公開 IP 位址存取 GCP API。本節說明如何從 Proxy 執行個體移除外部 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"

主控台

  1. 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。

    開啟「VM INSTANCES」(VM 執行個體)

  2. 按一下 [api-proxy]

  3. 按一下 [Edit] (編輯)

  4. 按一下 [nic0: aws-vpn]

  5. 設定以下選項,其他選項請保留預設值:

    • 「External IP」(外部 IP)None
  6. 按一下 [Done] (完成)

  7. 按一下 [Save] (儲存)

從 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. 張貼指定 Proxy 位址的要求。將 [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 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
解決方案