Automatisierte Netzwerkbereitstellung: VPN zwischen der GCP und AWS mit Terraform erstellen

In dieser Anleitung wird gezeigt, wie Sie mit Terraform von HashiCorp sichere, private und standortübergreifende Verbindungen zwischen der Google Cloud Platform (GCP) und Amazon Web Services (AWS) mithilfe von virtuellen privaten Netzwerken (VPNs) herstellen. Dies ist eine Multi-Cloud-Bereitstellung.

Diese Anleitung ist die dritte einer dreiteiligen Reihe, die die automatisierte Bereitstellung gängiger Arten von Netzwerkressourcen darstellt. Die Anleitung basiert auf der Authentifizierungs- und Projektkonfiguration wie in der Anleitung Automatisierte Netzwerkbereitstellung: Übersicht beschrieben.

In dieser Anleitung stellen Sie Instanzen virtueller Maschinen (VMs) in benutzerdefinierten Netzwerken virtueller privater Clouds (VPC) in der GCP und in AWS bereit. Anschließend stellen Sie eine unterstützende Infrastruktur bereit, um eine VPN-Verbindung mit zwei Tunneln der Internetprotokollsicherheit (IPsec) zwischen den GCP- und AWS-VPC-Netzwerken einzurichten. Die Bereitstellung der Umgebung und des Tunnels ist in der Regel innerhalb von vier Minuten abgeschlossen.

Diese Anleitung dient als Ergänzung zur Anleitung Automatisiertes Netzwerk-Deployment: Einstieg. Sie enthält aber keine Deployment Manager-Konfiguration, da die Ressourcen den Anbietern außerhalb der GCP bereitgestellt werden. Stattdessen werden in dieser Anleitung Terraform-Konfigurationsdateien zum Bereitstellen von Ressourcen mithilfe mehrerer Anbieter öffentlicher Clouds, einschließlich der GCP, verwendet. Multi-Cloud-Bereitstellungen sind für Deployment Manager nicht vorgesehen.

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten der GCP und von AWS verwendet:

  • Compute Engine-Instanzen und Amazon Elastic Compute Cloud-Instanzen (Amazon EC2)
  • Multi-vCPU-Instanzen zur Unterstützung eines höheren Netzwerkdurchsatzes
  • Nichtflüchtiger Speicher und Blockspeicherung
  • Ausgehender Netzwerk-Traffic
  • VPN-Tunnel

Für den ausgehenden Traffic von VM-Instanzen gilt eine Begrenzung des ausgehenden Netzwerkdurchsatzes. In dieser Anleitung werden verschiedene vCPU-Maschinentypen genutzt, um die Kapazität für den ausgehenden Netzwerktraffic zu erhöhen.

Sie können mithilfe des Preisrechners eine Kostenschätzung für Ihre voraussichtliche Nutzung erstellen.

Hinweis

  1. Wählen Sie das GCP-Projekt mit dem Namen gcp-automated-networks aus.

    Zur Seite "Projekte"

  2. Starten Sie eine Cloud Shell-Instanz. Alle Terminalbefehle in dieser Anleitung werden über Cloud Shell ausgeführt.

    Cloud Shell öffnen

Bereitstellungsarchitektur

Im Rahmen dieser Anleitung erstellen Sie die folgende Bereitstellungsumgebung.

Bereitstellungsumgebung

In dieser Anleitung wird Folgendes beschrieben:

  • Erstellen benutzerdefinierter VPC-Netzwerke mit benutzerspezifischen CIDR-Blöcken in der GCP und in AWS
  • Bereitstellen einer VM-Instanz in jedem VPC-Netzwerk
  • Erstellen von VPN-Gateways in jedem VPC-Netzwerk und zugehörigen Ressourcen für zwei IPsec-Tunnel.

GCP verwendet Routen zur Unterstützung des ECMP-Routings (Equal Cost Multi Path). AWS unterstützt dagegen VPN-Gateways mit zwei Tunneln, aktiv und Standby, um Redundanz und Verfügbarkeit zu gewährleisten.

Routing

In der Konfiguration der Anleitung wird Cloud Router für die Darstellung des dynamischen Routings verwendet. Cloud Router tauscht die Aktualisierungen Ihrer VPC-Netzwerkroute mit Ihrer Umgebung in AWS mithilfe des Border Gateway Protocol (BGP) aus. Das dynamische Routing durch Cloud Router erfordert einen separaten Cloud Router für jeden IPsec-Tunnel. Alternativ können Sie eine Einrichtung mit statischen Routen konfigurieren. Beide Konfigurationen werden im Cloud VPN Interop-Handbuch behandelt.

GCP-Arbeitsumgebung vorbereiten

In diesem Abschnitt werden Sie:

  • Klonen des Anleitungscodes
  • Überprüfen Ihrer GCP-Region und -Zone

Anleitungscode klonen

  1. Klonen Sie den Anleitungscode von GitHub:

    git clone https://github.com/GoogleCloudPlatform/autonetdeploy-multicloudvpn.git
  2. Gehen Sie zum Anleitungsverzeichnis:

    cd autonetdeploy-multicloudvpn
    

GCP-Region und -Zone prüfen

Bestimmte Cloudressourcen in dieser Anleitung wie Compute Engine-Instanzen, VPN-Gateways und Cloud Router erfordern die explizite Deklaration der vorgesehenen Platzierungsregion und/oder -zone. Weitere Informationen finden Sie unter Regionen und Zonen für GCP.

Diese Anleitung benötigt nur eine einzige Region für jeden Anbieter. Zur Optimierung der Verbindung zwischen den beiden Clouds wählen Sie benachbarte Regionen aus. Die folgende Tabelle enthält die Werte der Anleitungsdateien terraform/gcp_variables.tf und terraform/aws_variables.tf.

Feldname GCP-Werte AWS-Werte
Region Name us-west1 US West (us-west-2)
Location The Dalles, Oregon, USA Oregon

AWS-Verwendung vorbereiten

In diesem Abschnitt prüfen Sie Ihre AWS-Region. Weitere Informationen zu AWS-Regionen finden Sie unter Regionen und Verfügbarkeitszonen für AWS.

  1. Melden Sie sich bei der AWS Management Console an und wechseln Sie zum VPC-Dashboard. Wählen Sie über das Drop-down-Menü die Region Oregon aus.

  2. Überprüfen Sie im EC2-Dashboard und im VPC-Dashboard die von dieser Anleitung verwendeten Ressourcen.

Terraform vorbereiten

In diesem Abschnitt laden Sie die ausführbare Terraform-Datei herunter.

  • Führen Sie in Cloud Shell das folgende Skript aus:

    ./get_terraform.sh
    

    Dieses Skript lädt die ausführbare Binärdatei für das Terraform-Tool herunter und entpackt sie im Verzeichnis ~/terraform. Die Skriptausgabe enthält einen Exportbefehl, mit dem Sie Ihren PATH aktualisieren können. Prüfen Sie nach dem Aktualisieren von PATH, ob Terraform funktioniert:

    terraform --help
    

    Ausgabe:

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

Weitere Informationen finden Sie unter Terraform herunterladen und Terraform installieren.

Zugangsdaten für GCP und AWS erstellen

Sie haben in der Anleitung "Übersicht" Anmeldedaten erstellt. Diese müssen Sie nun bei Terraform registrieren.

  1. Registrieren Sie Ihre GCP-Anmeldedaten bei Terraform:

    ./gcp_set_credentials.sh exists
    

    Ausgabe:

    Updated gcp_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    
  2. Registrieren Sie Ihre AWS-Anmeldedaten bei Terraform:

    ./aws_set_credentials.sh exists
    

    Ausgabe:

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

Projekt einrichten

GCP bietet mehrere Möglichkeiten zur Festlegung des GCP-Projekts, das von den Automatisierungstools verwendet werden soll. Zur Vereinfachung lässt sich das GCP-Projekt statt durch Abruf der Projekt-ID aus der Umgebung explizit über eine Stringvariable in den Vorlagendateien ermitteln.

  1. Legen Sie Ihre Projekt-ID fest:

    gcloud config set project [YOUR-PROJECT-ID]

    Ausgabe:

    Updated property [core/project].
    
  2. Aktualisieren Sie mit dem bereitgestellten Skript den Projektwert in Ihrer Konfigurationsdatei für Terraform.

    ./gcp_set_project.sh
    

    Ausgabe:

    Updated gcp_project_id in /home/[USER]/autonetdeploy-gcpawsvpn/terraform/terraform.tfvars.
    
  3. Prüfen Sie, ob project-id in die aktualisierte Datei terraform/terraform.tfvars eingefügt wurde.

  4. Führen Sie einmalig den Befehl terraform init aus, um den Terraform-Anbieter für diese Bereitstellung zu installieren.

    pushd ./terraform && terraform init && popd > /dev/null
    
  5. Führen Sie den Terraform-Befehl plan aus, um Ihre Anmeldedaten zu überprüfen.

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

    Wenn kein roter Fehlertext angezeigt wird, werden Sie ordnungsgemäß authentifiziert.

    Ausgabe:

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

Terraform-Konfigurationsdateien untersuchen

In Terraform wird eine Bereitstellungskonfiguration durch ein Verzeichnis mit Dateien definiert. Auch wenn es sich bei diesen Dateien um JSON-Dateien handeln kann, wird empfohlen, die Syntax der Terraform-Konfigurationsdatei (.tf-Datei) zu verwenden. Diese ist einfacher zu lesen und zu pflegen. Die vorliegende Anleitung enthält eine Reihe von Dateien, die eine Möglichkeit zeigen, wie Sie Ihre Ressourcen übersichtlich strukturieren können. Dieses Set stellt eine funktionsfähige Bereitstellung dar und kann ohne Änderungen ausgeführt werden.

Dateiname Zweck
main.tf Definiert Ihre Anbieter und gibt die Clouds an, die in dieser Konfiguration bereitgestellt werden. Außerdem werden damit Ihre Anmeldedaten, Ihr Projektname und die ausgewählten Regionen gelesen.
gcp_variables.tf, aws_variables.tf Deklariert Variablen zur Parametrisierung und Anpassung der Bereitstellung, z. B. gcp_region und gcp_instance_type.
gcp_compute.tf, aws_compute.tf Definiert die in der Bereitstellung verwendeten Rechenressourcen, z. B. google_compute_instance.
vm_userdata.sh Legt das Skript fest, das beim Start der VM-Instanzen ausgeführt wird. Dabei werden automatisch das Testtool iperf3 und einige Wrapper-Skripts eingerichtet.
gcp_networking.tf, aws_networking.tf Definiert Netzwerkressourcen, einschließlich google_compute_network, google_compute_subnetwork, google_compute_address, google_compute_vpn_gateway und google_compute_vpn_tunnel.
gcp_security.tf, aws_security.tf Definiert Ressourcen für den zulässigen Testtraffic in der GCP- oder AWS-Umgebung, einschließlich google_compute_firewall-Regeln und aws_security_group-Ressourcen.
gcp_outputs.tf, aws_outputs.tf Definiert Variablen für die Ausgabe nach Abschluss des Deployments, z. B. external_ip und internal_ip für die bereitgestellte VM-Instanz.
terraform.tfstate [AUSGABE]. Legt die von Terraform verwendete Datei zum Speichern des clientseitigen Ressourcenstatus nach der Überprüfung mit der Cloud fest. Weitere Informationen finden Sie unter GCP-Projekte mit Terraform verwalten.
run_graph.sh Shell-Skript zum Erstellen einer PNG-Datei aus Terraform, die die Ressourcenabhängigkeiten anzeigt. Die Ausgabe dieses Skripts wird in gcpawsvpn_plan_graph.png dargestellt.

In dieser Anleitung verwenden Sie Skripts zum Erstellen der Datei terraform.tfvars, einschließlich einer nutzerspezifischen Einrichtung von credentials und gcp_project_id.

VPC-Netzwerke, VM-Instanzen, VPN-Gateways und IPsec-Tunnel bereitstellen

Das Erstellen von Verbindungen zwischen mehreren Clouds ist ein komplexer Vorgang. Sie können dabei viele Ressourcen in beiden Umgebungen parallel bereitstellen. Wenn Sie aber IPsec-Tunnel erstellen, müssen Sie die Abhängigkeiten sorgfältig aufeinander abstimmen. Aus diesem Grund ist das Einrichten einer stabilen codebasierten Bereitstellungskonfiguration eine hilfreiche Möglichkeit, Ihr Bereitstellungs-Know-how zu erweitern. In der folgenden Abbildung sind die Schritte zusammengefasst, die für das Erstellen dieser Bereitstellungskonfiguration für mehrere Anbieter erforderlich sind.

Bereitstellungsschritte

Mit Terraform bereitstellen

In Terraform wird die Datei terraform.tfstate zum Erfassen des Ressourcenstatus verwendet. Wenn Sie den aktuellen Ressourcenstatus in lesbarer Form aufrufen möchten, führen Sie den Befehl terraform show aus.

Um Terraform ordnungsgemäß mit Ihren Anbietern zu authentifizieren, müssen Sie als Erstes die Anleitung "Übersicht" abgeschlossen haben. Die folgenden Schritte setzen voraus, dass Sie Terraform bereits konfiguriert haben.

  1. Öffnen Sie in Cloud Shell das Verzeichnis terraform:

    pushd terraform
    
  2. Validieren Sie mit dem Terraform-Befehl validate die Syntax der Konfigurationsdateien. Diese Validierungsprüfung ist einfacher als jene, die im Rahmen der Befehle plan und apply in den nachfolgenden Schritten ausgeführt wird. Mit dem Befehl validate lässt sich nicht jeder Anbieter authentifizieren.

    terraform validate
    

    Wenn keine Fehlermeldung angezeigt wird, wurde erfolgreich eine erste Validierung Ihrer Dateisyntax und der grundlegenden Semantik durchgeführt. Wenn eine Fehlermeldung eingeblendet wird, ist die Validierung fehlgeschlagen.

  3. Mit dem Terraform-Befehl plan können Sie die Bereitstellung prüfen, ohne Ressourcen in der Cloud zu instanziieren. Der Befehl plan erfordert eine erfolgreiche Authentifizierung mit allen in der Konfiguration angegebenen Anbietern.

    terraform plan
    

    Der Befehl plan gibt eine Liste der Ressourcen zurück, die hinzugefügt, entfernt oder aktualisiert werden müssen. Die letzte Zeile der Ausgabe von plan enthält die Anzahl der Ressourcen, die hinzugefügt, geändert oder gelöscht werden sollen.

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 34 to add, 0 to change, 0 to destroy.
    
  4. Optional können Sie die Ressourcenabhängigkeiten mithilfe des Terraform-Befehls graph visualisieren. Mit der Abhängigkeitsgrafik lassen sich Ihre bereitgestellten Ressourcen besser analysieren. Eine bereits vorbereitete Version der Ausgabedatei finden Sie in images/gcpawsvpn_plan_graph.png.

    Das Skript run_graph.sh erstellt die PNG-Datei ./gcpawsvpn_plan_graph.png, die in etwa so aussieht:

    Datei plan_graph

    Das Skript run_graph.sh benötigt das Paket graphviz. Wenn graphviz nicht installiert ist, wird die Meldung dot: command not found angezeigt. In Cloud Shell können Sie graphviz mithilfe des folgenden Befehls installieren:

    sudo apt-get install graphviz
    
  5. Erstellen Sie mit dem Terraform-Befehl apply ein Deployment:

    terraform apply
    

    Mit dem Befehl apply wird eine Bereitstellung mit unterstützenden Ressourcen in der Cloud erstellt. In etwa vier Minuten generiert apply mehr als 30 Ressourcen, einschließlich VPC-Netzwerke, VM-Instanzen, VPN-Gateways und IPsec-Tunnel der GCP und von AWS. Die Ausgabe des Befehls apply enthält Details zu den bereitgestellten Ressourcen und zu den durch die Konfiguration definierten Ausgabevariablen.

    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. Wenn Sie den vorgesehenen Endstatus Ihrer Konfiguration aktualisieren müssen, bearbeiten Sie die .tf-Dateien. Fügen Sie der google_compute_firewall gcp_allow-ssh-Regel durch Bearbeiten von gcp_security.tf Port 23 hinzu:

    ports = ["22", "23"]
    

    Terraform analysiert die Änderungen und ermittelt die erforderlichen Mindeständerungen zur Aktualisierung Ihrer Bereitstellung, damit diese damit übereinstimmt.

    terraform apply
    

    Terraform ändert gcp-network-gcp-allow-ssh auf die aktualisierte Konfiguration.

  7. Ihre Bereitstellungen können Ausgabevariablen zur Unterstützung Ihres Workflows ausgeben. In dieser Anleitung wurden die zugewiesenen internen und externen IP-Adressen der VM-Instanzen durch Ausgabevariablen von den Dateien gcp_outputs.tf und aws_outputs.tf ermittelt. Diese Adressen werden automatisch mit dem Schritt apply ausgegeben. Wenn Sie später im Workflow die Werte der Ausgabevariablen noch einmal aufrufen möchten, verwenden Sie den Befehl output:

    terraform output
    

    Zu den durch diese Konfiguration definierten Ausgabevariablen gehören auch die internen und externen IP-Adressen für Ihre VM-Instanzen. Damit Sie den Befehl ssh für die Netzwerkvalidierung nutzen können, benötigen Sie die externen IP-Adressen, um eine Verbindung zu den VM-Instanzen herzustellen.

    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. Prüfen Sie die bereitgestellten Ressourcen und den aktuellen Status mit dem Terraform-Befehl show.

    terraform show
    

    Ausgabe:

    ...
    google_compute_instance.gcp-vm:
    ...
    Outputs:
    ...
    
  9. Sie können die Instanzen mit gcloud compute instances list oder in der Cloud Console im Feld VM-Instanzen prüfen.

    gcloud compute instances list

    Ausgabe:

    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. Stellen Sie mit dem Befehl ssh eine Verbindung zu Ihrer GCP-VM-Instanz her, um zu prüfen, ob diese verwendet werden kann:

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  11. Führen Sie in der ssh-Sitzung die Befehle ping und curl aus:

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. Führen Sie einfache Überprüfungen der Netzwerkleistung von der GCP-VM-Instanz aus. Führen Sie mit vorinstallierten Skripts einen Test für jede Netzwerkschnittstelle, intern wie extern, durch.

    1. Über externe IP-Adressen:

      /tmp/run_iperf_to_ext.sh
      

      Dieses Skript führt einen 30 Sekunden dauernden Leistungstest aus, der zusammenfassende Daten zur Netzwerkleistung liefert.

      Ausgabe:

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. Über VPN (interne IP-Adressen):

      /tmp/run_iperf_to_int.sh
      

      Dieses Skript führt einen 30 Sekunden dauernden Leistungstest aus, der zusammenfassende Daten zur Netzwerkleistung liefert.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  13. Wenn Sie die Überprüfung von der GCP-VM-Instanz abgeschlossen haben, geben Sie den folgenden Befehl ein:

    exit
    
  14. Stellen Sie mit dem Befehl ssh eine Verbindung zu Ihrer AWS-VM-Instanz her, um zu prüfen, ob diese verwendet werden kann:

    ssh -i ~/.ssh/vm-ssh-key ubuntu@[AWS_EXTERNAL_IP]
  15. Führen Sie in der ssh-Sitzung die Befehle ping und curl aus:

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  16. Führen Sie einfache Überprüfungen der Netzwerkleistung von der AWS-VM-Instanz aus. Führen Sie mit vorinstallierten Skripts einen Test für jede Netzwerkschnittstelle, intern wie extern, durch.

    1. Über externe IP-Adressen:

      /tmp/run_iperf_to_ext.sh
      

      Dieses Skript führt einen 30 Sekunden dauernden Leistungstest aus, der zusammenfassende Daten zur Netzwerkleistung liefert.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. Über VPN (interne IP-Adressen):

      /tmp/run_iperf_to_int.sh
      

      Dieses Skript führt einen 30 Sekunden dauernden Leistungstest aus, der zusammenfassende Daten zur Netzwerkleistung liefert.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  17. Wenn Sie die Überprüfung der AWS-VM-Instanz abgeschlossen haben, geben Sie den folgenden Befehl ein:

    exit
    

Sie haben mithilfe eines VPN erfolgreich eine sichere, private und standortübergreifende Verbindung zwischen der GCP und AWS hergestellt.

Bereinigen

Bereinigen Sie die bereitgestellten Ressourcen. Es werden Ihnen so lange Gebühren für Ihre VM-Instanzen in Rechnung gestellt, bis Sie den Deployment-Befehl destroy ausführen.

  1. Führen Sie den optionalen Befehl plan -destroy aus, um die von destroy betroffenen Ressourcen zu prüfen:

    terraform plan -destroy
    

    Ausgabe:

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 0 to add, 0 to change, 34 to destroy.
    
  2. Mit dem Befehl destroy werden die Ressourcen endgültig gelöscht. Daher müssen Sie diesen Vorgang mit yes bestätigen. Der Befehl destroy wird in der Regel innerhalb von etwa 100 Sekunden ausgeführt:

    terraform destroy
    

    Ausgabe:

    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
    

    Geben Sie yes ein, um das Löschen der von Ihnen erstellten Ressource zu bestätigen.

    Destroy complete! Resources: 34 destroyed.
    
  3. Führen Sie den Befehl show aus, um den Status der Ressourcen aufzurufen:

    terraform show
    

    Da Sie nun alle Ressourcen gelöscht haben, gibt der Befehl show keine Zeilen aus. Daran erkennen Sie, dass keine Ressourcen mehr bereitgestellt sind.

  4. Abschließend stellen Sie Ihr Verzeichnis wieder her:

    popd > /dev/null
    

Sie haben jetzt die Bereitstellung und die Bereinigung einer sicheren, privaten, standortübergreifenden Verbindung zwischen Instanzen in GCP und AWS erfolgreich abgeschlossen.

Nächste Schritte