自動化網路部署:使用 Terraform 在 GCP 與 AWS 之間建構 VPN

本教學課程說明如何透過 HashiCorp 的 Terraform,在 Google Cloud Platform (GCP) 與 Amazon Web Services (AWS) 之間,使用虛擬私人網路 (VPN) 建立安全的站台對站台私人連線。此為多雲端部署環境。

這個教學課程系列說明一般網路資源模式的自動化部署作業,總共有三部分,本教學課程為第三部分。本教學課程需要使用「自動化網路部署:總覽」教學課程中所述的驗證和專案設定。

在這個教學課程中,您會將虛擬機器 (VM) 執行個體部署到 GCP 和 AWS 中的自訂虛擬私人雲端 (VPC) 網路。接著您會部署支援的基礎架構,並透過 GCP 與 AWS VPC 網路之間的兩個網際網路通訊協定安全性 (IPsec) 通道來建立 VPN 連線。環境和通道的部署作業通常會在四分鐘內完成。

本教學課程是「自動化網路部署:入門」教學課程的延伸資源,由於資源是部署至 GCP 以外的供應商,因此並不包含 Deployment Manager 設定。為了使用多個公用雲端供應商來部署資源 (包括 GCP),本教學課程改用 Terraform 設定檔。多雲端部署並不在預定的 Deployment Manager 說明範圍內。

費用

本教學課程使用下列的 GCP 和 AWS 可計費元件:

  • Compute Engine 執行個體和 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體
  • 多個支援較高網路總處理量的 vCPU 執行個體
  • 永久磁碟和區塊儲存空間
  • 網路輸出
  • VPN 通道

來自 VM 執行個體的傳出或輸出流量受限於最大網路輸出總處理量上限。本教學課程使用多種 vCPU 機器類型,以便為網路輸出流量預留空間。

使用 Pricing Calculator 可根據您的預測使用量來產生預估費用。

事前準備

  1. 選取名為 gcp-automated-networks 的 GCP 專案。

    前往專案頁面

  2. 啟動 Cloud Shell 執行個體。您將使用 Cloud Shell 執行本教學課程中所有的終端機指令。

    開啟 Cloud Shell

部署架構

在本教學課程中,您會建構下列部署環境。

部署環境

本教學課程會逐步引導您完成下列操作:

  • 使用 GCP 和 AWS 中使用者指定的 CIDR 區塊,建立自訂 VPC 網路
  • 在每個 VPC 網路中部署 VM 執行個體
  • 在每個 VPC 網路中建立 VPN 閘道和兩個 IPsec 通道的相關資源。

GCP 使用路徑來支援等價多路徑 (ECMP) 轉送功能,而 AWS 則支援具有兩個通道的 VPN 閘道 (啟用和待命),以提供備援功能和可用性。

轉送

本教學課程設定使用 Cloud Router 來示範動態轉送。Cloud Router 會使用邊界閘道通訊協定 (BGP),在 AWS 中與您的環境交換 VPC 網路路徑更新資訊。Cloud Router 提供的動態轉送在每個 IPsec 通道中都需要獨立的 Cloud Router。或者,您也可以透過靜態路徑進行設定。Cloud VPN 協同整合指南會提供這兩種設定的說明。

準備 GCP 工作環境

在本節中,您會執行下列作業:

  • 複製教學課程程式碼。
  • 確認 GCP 地區和區域。

複製教學課程程式碼

  1. GitHub 複製教學課程程式碼:

    git clone https://github.com/GoogleCloudPlatform/autonetdeploy-multicloudvpn.git
  2. 前往教學課程目錄:

    cd autonetdeploy-multicloudvpn
    

確認 GCP 地區和區域

如要使用本教學課程中的某些雲端資源 (包括 Compute Engine 執行個體、VPN 閘道和 Cloud Router),您必須明確宣告這些資源的預定放置地區和/或區域。詳情請參閱 GCP 的地區和區域

在本教學課程中,每個供應商只需要一個地區。如要最佳化兩個雲端環境之間的連線,請選擇彼此靠近的地區。下表列出 terraform/gcp_variables.tfterraform/aws_variables.tf 教學檔案中設定的值。

欄位名稱 GCP 值 AWS 值
Region Name us-west1 US West (us-west-2)
Location The Dalles, Oregon, USA Oregon

為使用 AWS 做準備

您會在本節中驗證您的 AWS 地區。如要進一步瞭解 AWS 地區,請參閱 AWS 的地區和可用性

  1. 登入 AWS 管理主控台,並前往「VPC Dashboard」。使用下拉式選單選取 [Oregon] 區域。

  2. 在「EC2 Dashboard」和「VPC Dashboard」 中,查看本教學課程使用的資源。

準備 Terraform

在本節中,您將下載 Terraform 執行檔。

  • 在 Cloud Shell 中,執行下列指令碼:

    ./get_terraform.sh
    

    這個指令碼會下載 Terraform 工具的可執行二進位檔,並將檔案解壓縮至 ~/terraform 目錄。指令碼輸出內容會顯示可更新 PATH 的匯出指令。更新 PATH 後,請確認 Terraform 是否正常運作:

    terraform --help
    

    產生的輸出:

    Usage: terraform [--version] [--help] [command] [args]
    ...
    

如需協助,請查看下載 Terraform安裝 Terraform 主題。

建立 GCP 和 AWS 存取憑證

您在「總覽」教學課程中已經建立憑證,不過您必須透過 Terraform 註冊憑證。

  1. 使用 Terraform 註冊 GCP 憑證:

    ./gcp_set_credentials.sh exists
    

    產生的輸出:

    Updated gcp_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    
  2. 使用 Terraform 註冊 AWS 憑證:

    ./aws_set_credentials.sh exists
    

    產生的輸出:

    Updated aws_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    

設定專案

GCP 提供數種方式來指定自動化工具要使用的 GCP 專案。為求簡單起見,我們不會從環境提取專案 ID,而是透過範本檔案中的字串變數明確指定 GCP 專案。

  1. 設定專案 ID:

    gcloud config set project [YOUR-PROJECT-ID]

    產生的輸出:

    Updated property [core/project].
    
  2. 使用提供的指令碼更新 Terraform 設定檔中的專案值。

    ./gcp_set_project.sh
    

    產生的輸出:

    Updated gcp_project_id in /home/[USER]/autonetdeploy-gcpawsvpn/terraform/terraform.tfvars.
    
  3. 查看已更新的檔案 (terraform/terraform.tfvars),確認您已插入 project-id

  4. 執行一次性指令 terraform init 來安裝這個部署的 Terraform 供應商。

    pushd ./terraform && terraform init && popd > /dev/null
    
  5. 執行 Terraform plan 指令來驗證憑證。

    pushd ./terraform && terraform plan && popd > /dev/null
    

    如果您沒有看到紅色的錯誤訊息,就代表驗證已順利完成。

    產生的輸出:

    Refreshing Terraform state in-memory prior to plan...
    ...
     +google_compute_instance.gcp-vm
    ...
    Plan: 34 to add, 0 to change, 0 to destroy.
    

檢查 Terraform 設定檔

在 Terraform 中,部署設定是由檔案目錄定義的。雖然這些檔案可以是 JSON 檔案,但最好使用比較容易讀取及維護的 Terraform 設定檔 (.tf 檔案) 語法。本教學課程會提供一組檔案來說明有效組織資源的一種方法。這是一種功能部署,不需要進行任何編輯即可執行。

檔案名稱 目的
main.tf 定義您的供應商並指定要在這個設定中部署哪種雲端,並且讀取您的憑證、專案名稱和選取的地區。
gcp_variables.tfaws_variables.tf 宣告用於參數化及自訂部署的變數,例如 gcp_regiongcp_instance_type
gcp_compute.tfaws_compute.tf 定義您部署中使用的運算資源,例如 google_compute_instance
vm_userdata.sh 指定啟動 VM 執行個體時要執行的指令碼,並自動設定 iperf3 測試工具和一些包裝函式指令碼。
gcp_networking.tfaws_networking.tf 定義網路資源,包括 google_compute_networkgoogle_compute_subnetworkgoogle_compute_addressgoogle_compute_vpn_gatewaygoogle_compute_vpn_tunnel
gcp_security.tfaws_security.tf 定義允許 GCP 或 AWS 環境中測試流量的資源,包括 google_compute_firewall 規則和 aws_security_group 資源。
gcp_outputs.tfaws_outputs.tf 定義部署作業完成時輸出的變數,例如已部署 VM 執行個體的 external_ipinternal_ip
terraform.tfstate [輸出]。指定 Terraform 檢查雲端環境後用來儲存用戶端資源狀態的檔案。詳情請參閱使用 Terraform 管理 GCP 專案
run_graph.sh 殼層指令碼,用來從 Terraform 產生顯示資源依附元件的 PNG 檔案。您可以在 images/gcpawsvpn_plan_graph.png 中查看這個指令碼的輸出結果。

在本教學課程中,您將使用指令碼建立 terraform.tfvars 檔案,其中包含 credentialsgcp_project_id 的使用者專用設定。

部署 VPC 網路、VM 執行個體、VPN 閘道和 IPsec 通道

在多個雲端環境之間建立連線是一項複雜的工作。您可以在兩種環境中以平行的方式部署許多資源,但在建立 IPsec 通道時,您必須謹慎安排相互依存的元件。因此,在程式碼中建立穩定的部署設定有助於擴展您的部署知識。下圖概述在多個供應商之間建立此部署設定所需的步驟。

部署步驟

使用 Terraform 進行部署

Terraform 使用 terraform.tfstate 檔案擷取資源狀態。如要以可理解的形式查看目前的資源狀態,您能執行 terraform show

為了讓 Terraform 正確地向供應商進行驗證,您必須先完成「總覽」教學課程。下列步驟假設 Terraform 已設定完成。

  1. 在 Cloud Shell 中,前往 terraform 目錄。

    pushd terraform
    
  2. 使用 Terraform validate 指令驗證設定檔的語法。這項驗證檢查比後續步驟執行的 planapply 指令較為簡單。validate 指令並不會對任何供應商進行驗證。

    terraform validate
    

    如果您沒有看見錯誤訊息,代表您已完成檔案語法和基本語意的初步驗證程序。如果您看見錯誤訊息,則代表驗證程序失敗。

  3. 使用 Terraform plan 指令能在不建立雲端資源執行個體的情況下查看部署,但 plan 指令需要設定中指定的所有供應商皆成功完成驗證。

    terraform plan
    

    plan 指令傳回的輸出清單會列出新增、移除或更新的資源。plan 輸出結果的最後一行會顯示已新增、變更或刪除資源的計數。

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 34 to add, 0 to change, 0 to destroy.
    
  4. 您也可以透過使用 Terraform graph 指令,以視覺化方式呈現您的資源依附元件。相依關係圖有助於分析部署的資源。您可以在 images/gcpawsvpn_plan_graph.png. 查看先前準備的輸出檔案版本。

    run_graph.sh 指令碼會建立 PNG 檔案 (./gcpawsvpn_plan_graph.png),該檔案的內容與下圖相似:

    plan_graph 檔案

    run_graph.sh 指令碼需要使用 graphvizgrz 套件。如果您沒有安裝 graphviz,則會看見 dot: command not found 訊息。在 Cloud Shell 中,您可使用下列指令安裝 graphviz

    sudo apt-get install graphviz
    
  5. 使用 Terraform apply 指令建立部署:

    terraform apply
    

    apply 指令會建立部署並將備用資源放在雲端環境中。apply 指令大約會花費四分鐘的時間來為您建立 30 個以上的資源,包含 GCP 和 AWS 的 VPC 網路VM 執行個體VPN 閘道IPsec 通道apply 指令的輸出結果包含已部署資源的詳細資料,以及由設定定義的輸出變數。

    data.google_compute_zones.available: Refreshing state...
    ...
    Apply complete! Resources: 34 added, 0 changed, 0 destroyed.
    ...
    Outputs:
    
    aws_instance_external_ip = [AWS_EXTERNAL_IP]
    aws_instance_internal_ip = 172.16.0.100
    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = 10.240.0.100
    
  6. 如果您需要更新設定的預期結束狀態,請編輯 .tf 檔案。透過編輯 gcp_security.tf,將通訊埠 23 加入 google_compute_firewall gcp_allow-ssh 規則:

    ports = ["22", "23"]
    

    Terraform 會分析編輯內容,並識別更新部署狀態以符合編輯內容所需的最小變更。

    terraform apply
    

    Terraform 會將 gcp-network-gcp-allow-ssh 修改為更新的設定。

  7. 您的部署會發出輸出變數來協助您的工作流程。在本教學課程中,gcp_outputs.tfaws_outputs.tf 檔案會將指派給 VM 執行個體的內部和外部 IP 位址識別為輸出變數。這些位址會在 apply 步驟完成時自動輸出。如果您想要在之後的工作流程中重新顯示輸出變數值,請使用 output 指令:

    terraform output
    

    這個設定所定義的輸出變數包含 VM 執行個體的內部和外部 IP 位址。如要使用 ssh 指令進行網路驗證,您需要透過外部 IP 位址來連線至 VM 執行個體。

    aws_instance_external_ip = [AWS_EXTERNAL_IP]
    aws_instance_internal_ip = 172.16.0.100
    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = 10.240.0.100
  8. 使用 Terraform show 指令檢查已部署的資源並確認目前狀態。

    terraform show
    

    產生的輸出:

    ...
    google_compute_instance.gcp-vm:
    ...
    Outputs:
    ...
    
  9. 如要查看執行個體,請使用 gcloud compute instances list: 或使用「VM instances」(VM 執行個體) 面板上的 Cloud Console。

    gcloud compute instances list

    產生的輸出:

    NAME             ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP    EXTERNAL_IP    STATUS
    gcp-vm-us-west1  us-west1-a  n1-highmem-8               10.240.0.100   [EXTERNAL IP]  RUNNING
    
  10. 使用 ssh 指令進行連線,確認 GCP VM 執行個體是否正常運作:

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  11. ssh 工作階段中,執行 pingcurl 指令:

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. 在 GCP VM 執行個體上執行簡易的網路效能檢查。請使用預先安裝的指令碼,在內部和外部的每個網路介面上執行測試。

    1. 經由外部 IP:

      /tmp/run_iperf_to_ext.sh
      

      這個指令碼會執行 30 秒的效能測試,並產生有關網路效能的摘要資料。

      產生的輸出:

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. 經由 VPN (內部 IP):

      /tmp/run_iperf_to_int.sh
      

      這個指令碼會執行 30 秒的效能測試,並產生有關網路效能的摘要資料。

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  13. 完成 GCP VM 執行個體的檢查後,請輸入下列指令:

    exit
    
  14. 如要確認 AWS VM 執行個體是否正常運作,請使用 ssh 指令進行連線:

    ssh -i ~/.ssh/vm-ssh-key ubuntu@[AWS_EXTERNAL_IP]
  15. ssh 工作階段中,執行 pingcurl 指令:

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  16. 在 AWS VM 執行個體上執行簡易的網路效能檢查。請使用預先安裝的指令碼,在內部和外部的每個網路介面上執行測試。

    1. 經由外部 IP:

      /tmp/run_iperf_to_ext.sh
      

      這個指令碼會執行 30 秒的效能測試,並產生有關網路效能的摘要資料。

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. 經由 VPN (內部 IP):

      /tmp/run_iperf_to_int.sh
      

      這個指令碼會執行 30 秒的效能測試,並產生有關網路效能的摘要資料。

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  17. 完成 AWS VM 執行個體的檢查後,請輸入下列指令:

    exit
    

您已經使用 VPN 在 GCP 與 AWS 之間成功部署安全的站台對站台私人連線。

清除所用資源

請清除已經部署的資源,否則直到您執行 destroy 部署指令之前,系統會持續針對您的 VM 執行個體收取費用。

  1. 執行選用的 plan -destroy 指令來查看會受 destroy 影響的資源:

    terraform plan -destroy
    

    產生的輸出:

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 0 to add, 0 to change, 34 to destroy.
    
  2. 由於 destroy 指令會永久刪除您的資源,您必須輸入 yes 來確認您的意願。destroy 指令通常會在大約 100 秒內完成:

    terraform destroy
    

    產生的輸出:

    Do you really want to destroy?
      Terraform will delete all your managed infrastructure.
      There is no undo. Only 'yes' will be accepted to confirm.
        Enter a value: yes
    

    輸入 yes 以確認刪除您建立的資源。

    Destroy complete! Resources: 34 destroyed.
    
  3. 執行 show 指令來顯示資源的狀態:

    terraform show
    

    由於您已刪除所有資源,show 指令並不會輸出任何行列,代表沒有部署資源遺留。

  4. 最後,請還原您的目錄:

    popd > /dev/null
    

現在,您在 GCP 與 AWS 的執行個體之間已成功完成安全的站台對站台私人連線部署作業,並且清除所用資源。

後續步驟

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

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

這個網頁
解決方案