Déploiement réseau automatisé : Utiliser Terraform pour créer des connexions VPN entre GCP et AWS

Ce tutoriel explique comment utiliser Terraform de HashiCorp pour créer des connexions de site à site sécurisées et privées entre Google Cloud Platform (GCP) et Amazon Web Services (AWS) à l'aide de réseaux privés virtuels (VPN). Il s'agit d'un déploiement multicloud.

Ce tutoriel est le troisième d'une série en trois parties qui illustre le déploiement automatisé de modèles courants de ressources réseau. Le tutoriel s'appuie sur l'authentification et la configuration du projet décrites dans le tutoriel Déploiement réseau automatisé : présentation.

Dans ce tutoriel, vous allez déployer des instances de machine virtuelle (VM) sur des réseaux cloud privés virtuels (VPC) personnalisés dans GCP et AWS. Vous déployez ensuite l'infrastructure sous-jacente pour établir une connexion VPN avec deux tunnels IPsec (Internet Protocol Security) entre les réseaux VPC de GCP et AWS. L'environnement et le déploiement du tunnel s'achèvent généralement en quatre minutes.

Bien que ce tutoriel soit une extension du tutoriel Déploiement réseau automatisé : tutoriel démarrage, il n'inclut pas de configuration de Deployment Manager car les ressources sont déployées vers des fournisseurs extérieurs à GCP. Au lieu de cela, pour déployer des ressources en utilisant plusieurs fournisseurs de cloud public, y compris GCP, ce tutoriel utilise les fichiers de configuration Terraform. Les déploiements multicloud dépassent le champ d'application de Deployment Manager.

Coûts

Ce tutoriel utilise les composants facturables suivants de GCP et AWS :

  • Instances Compute Engine et instances Amazon Elastic Compute Cloud (Amazon EC2)
  • Plusieurs instances de processeur virtuel pour permettre un débit réseau supérieur
  • Stockage de blocs et sur disque persistant
  • Sortie réseau
  • Tunnels VPN

Le trafic sortant ou entrant des instances de VM est soumis à des limites maximales de débit de sortie réseau. Ce tutoriel utilise plusieurs types de machines de processeurs virtuels pour offrir une marge de progression au trafic de sortie réseau.

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.

Avant de commencer

  1. Sélectionnez le projet GCP nommé gcp-automated-networks.

    Accéder à la page Projets

  2. Démarrez une instance Cloud Shell. Exécutez toutes les commandes de terminal indiquées dans ce tutoriel à partir de Cloud Shell.

    Ouvrir Cloud Shell

Architecture de déploiement

Dans ce tutoriel, vous allez créer l'environnement de déploiement suivant :

environnement de déploiement

Ce tutoriel vous guide à travers :

  • la création de réseaux VPC personnalisés avec des blocs CIDR spécifiés par l'utilisateur dans GCP et AWS ;
  • le déploiement d'une instance de VM sur chaque réseau VPC ;
  • la création de passerelles VPN dans chaque réseau VPC et de ressources associées pour deux tunnels IPsec.

Alors que GCP utilise des routes pour être compatible avec le routage Equal Cost Multi-Path (ECMP), AWS accepte les passerelles VPN avec deux tunnels, un actif et l'autre en attente, pour la redondance et la disponibilité.

Routage

La configuration du tutoriel utilise Cloud Router pour illustrer le routage dynamique. Cloud Router échange les mises à jour de votre routage réseau VPC avec votre environnement AWS à l'aide du protocole BGP (Border Gateway Protocol). Le routage dynamique de Cloud Router nécessite un routeur Cloud distinct pour chaque tunnel IPsec. Vous pouvez également procéder à une configuration avec des routes statiques. Les deux configurations sont décrites dans le Guide d'interopérabilité de Cloud VPN.

Préparer l'environnement de travail GCP

Dans cette section, vous allez :

  • cloner le code du tutoriel ;
  • valider votre région et votre zone GCP.

Cloner le code du tutoriel

  1. Clonez le code du tutoriel à partir de GitHub :

    git clone https://github.com/GoogleCloudPlatform/autonetdeploy-multicloudvpn.git
  2. Accédez au répertoire du tutoriel :

    cd autonetdeploy-multicloudvpn
    

Valider la région et la zone GCP

Certaines ressources cloud de ce tutoriel, y compris les instances Compute Engine, les passerelles VPN et le routeur Cloud, vous obligent à déclarer explicitement la région ou la zone de l'emplacement prévue, ou les deux. Pour plus d'informations, consultez la page Régions et zones pour GCP.

Ce tutoriel nécessite une seule région pour chaque fournisseur. Pour optimiser la connexion entre les deux clouds, choisissez des régions proches les unes des autres. Le tableau suivant répertorie les valeurs définies dans les fichiers du tutoriel terraform/gcp_variables.tf et terraform/aws_variables.tf.

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

Se préparer à l'utilisation d'AWS

Dans cette section, vous allez valider votre région AWS. Pour plus d'informations sur les régions AWS, consultez Régions et Zones de disponibilité pour AWS.

  1. Connectez-vous à AWS Management Console et accédez au tableau de bord VPC. Sélectionnez la région Oregon dans le menu déroulant.

  2. Dans le tableau de bord EC2 et le tableau de bord VPC, passez en revue les ressources utilisées par ce tutoriel.

Préparer Terraform

Dans cette section, vous allez télécharger le script exécutable Terraform.

  • Dans Cloud Shell, exécutez le script suivant :

    ./get_terraform.sh
    

    Ce script télécharge et décompresse le fichier binaire exécutable de l'outil Terraform dans le répertoire ~/terraform. Le résultat du script montre une commande d'exportation pour mettre à jour votre chemin d'accès (PATH). Après avoir mis à jour votre PATH, vérifiez que Terraform fonctionne :

    terraform --help
    

    Résultat :

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

Si vous avez besoin d'aide, consultez les rubriques Télécharger Terraform et Installer Terraform.

Créer des identifiants d'accès GCP et AWS

Vous avez créé des identifiants d'accès dans le tutoriel de présentation. Cependant, vous devez enregistrer vos identifiants avec Terraform.

  1. Enregistrez vos identifiants GCP avec Terraform :

    ./gcp_set_credentials.sh exists
    

    Résultat :

    Updated gcp_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    
  2. Enregistrez vos identifiants AWS avec Terraform :

    ./aws_set_credentials.sh exists
    

    Résultat :

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

Définir votre projet

GCP propose plusieurs façons de désigner le projet GCP à utiliser par les outils d'automatisation. Par souci de simplicité, au lieu d'extraire l'ID de projet de l'environnement, le projet GCP est explicitement identifié par une variable de chaîne dans les fichiers de modèle.

  1. Définissez votre ID de projet :

    gcloud config set project [YOUR-PROJECT-ID]

    Résultat :

    Updated property [core/project].
    
  2. Mettez à jour la valeur du projet dans votre fichier de configuration pour Terraform à l'aide du script fourni.

    ./gcp_set_project.sh
    

    Résultat :

    Updated gcp_project_id in /home/[USER]/autonetdeploy-gcpawsvpn/terraform/terraform.tfvars.
    
  3. Examinez le fichier mis à jour, terraform/terraform.tfvars, pour vérifier que votre project-id a été inséré.

  4. Exécutez la commande unique terraform init pour installer les fournisseurs Terraform pour ce déploiement.

    pushd ./terraform && terraform init && popd > /dev/null
    
  5. Exécutez la commande Terraform plan pour vérifier vos identifiants.

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

    Si vous ne voyez pas de texte d'erreur rouge, votre authentification fonctionne correctement.

    Résultat :

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

Examiner des fichiers de configuration Terraform

Dans Terraform, une configuration de déploiement est définie par un répertoire de fichiers. Bien que ces fichiers puissent être des fichiers JSON, il est préférable d'utiliser la syntaxe Fichier de configuration Terraform (fichier .tf), qui est plus facile à lire et à gérer. Ce tutoriel fournit un ensemble de fichiers qui illustrent une manière d'organiser proprement vos ressources. Cet ensemble est un déploiement fonctionnel et ne nécessite aucune modification pour être exécuté.

Nom du fichier Objectif
main.tf Définit vos fournisseurs et spécifie les clouds à déployer dans cette configuration. Lit également vos identifiants, le nom du projet et les régions sélectionnées.
gcp_variables.tf aws_variables.tf Déclare les variables utilisées pour paramétrer et personnaliser le déploiement, par exemple, gcp_region et gcp_instance_type.
gcp_compute.tf aws_compute.tf Définit les ressources de calcul utilisées dans votre déploiement (par exemple, google_compute_instance).
vm_userdata.sh Spécifie le script à exécuter lors du démarrage des instances de VM. Configure automatiquement l'outil de test iperf3 et certains scripts de wrapper.
gcp_networking.tf aws_networking.tf Définit les ressources réseau, y compris google_compute_network, google_compute_subnetwork, google_compute_address, google_compute_vpn_gateway et google_compute_vpn_tunnel.
gcp_security.tf aws_security.tf Définit les ressources permettant d'autoriser le trafic de test dans l'environnement GCP ou AWS, y compris les règles google_compute_firewall et les ressources aws_security_group.
gcp_outputs.tf aws_outputs.tf Définit les variables à renvoyer à la fin du déploiement, par exemple, external_ip et internal_ip, de l'instance de VM déployée.
terraform.tfstate [SORTIE]. Spécifie le fichier utilisé par Terraform pour stocker l'état de la ressource côté client après vérification avec le cloud. Pour plus de détails, consultez la page Gérer des projets GCP avec Terraform.
run_graph.sh Script d'interface système permettant de générer un fichier PNG à partir de Terraform, qui indique les dépendances de ressources. Vous pouvez voir la sortie de ce script dans images/gcpawsvpn_plan_graph.png.

Dans ce tutoriel, vous allez utiliser des scripts pour créer le fichier terraform.tfvars, qui inclut une configuration spécifique à l'utilisateur pour credentials et gcp_project_id.

Déployer les réseaux VPC, les instances de VM, les passerelles VPN et les tunnels IPsec

L'établissement de connexions entre plusieurs clouds est complexe. Vous pouvez déployer de nombreuses ressources en parallèle dans les deux environnements, mais lorsque vous créez des tunnels IPsec, vous devez commander les interdépendances avec précaution. Ainsi, l'établissement d'une configuration de déploiement stable dans le code constitue un moyen utile de faire évoluer vos connaissances en matière de déploiement. La figure suivante récapitule les étapes nécessaires à la création de cette configuration de déploiement sur plusieurs fournisseurs.

Étapes de déploiement

Déployer avec Terraform

Terraform utilise le fichier terraform.tfstate pour capturer l'état de la ressource. Pour afficher l'état actuel des ressources dans un format lisible, vous pouvez exécuter terraform show.

Pour que Terraform s'authentifie correctement auprès de vos fournisseurs, vous devez d'abord suivre le tutoriel de présentation. Les étapes suivantes supposent que vous avez déjà configuré Terraform.

  1. Dans Cloud Shell, accédez au répertoire terraform :

    pushd terraform
    
  2. Utilisez la commande validate de Terraform pour valider la syntaxe de vos fichiers de configuration. Cette vérification de validation est plus simple que celles effectuées dans le cadre des commandes plan et apply lors des étapes suivantes. La commande validate ne s'authentifie auprès d'aucun fournisseur.

    terraform validate
    

    Si vous ne voyez pas de message d'erreur, vous avez terminé la validation initiale de la syntaxe de votre fichier et de la sémantique de base. Si vous voyez un message d'erreur, la validation a échoué.

  3. Utilisez la commande plan de Terraform pour examiner le déploiement sans instancier de ressources dans le cloud. La commande plan nécessite une authentification réussie auprès de tous les fournisseurs spécifiés dans la configuration.

    terraform plan
    

    La commande plan renvoie une liste de sortie des ressources à ajouter, supprimer ou mettre à jour. La dernière ligne de la sortie plan indique le nombre de ressources à ajouter, à modifier ou à détruire.

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 34 to add, 0 to change, 0 to destroy.
    
  4. Vous pouvez éventuellement visualiser vos dépendances de ressources à l'aide de la commande graph de Terraform. Le graphique de dépendance vous aide à analyser vos ressources déployées. Vous pouvez afficher une version préalablement préparée du fichier de sortie dans images/gcpawsvpn_plan_graph.png..

    Le script run_graph.sh crée le fichier PNG ./gcpawsvpn_plan_graph.png, qui ressemble à ceci :

    plan_graph file

    Le script run_graph.sh repose sur le package graphviz. Si graphviz n'est pas installé, un message dot: command not found s'affiche. Dans Cloud Shell, vous pouvez installer graphviz à l'aide de la commande suivante :

    sudo apt-get install graphviz
    
  5. Utilisez la commande apply de Terraform pour créer un déploiement :

    terraform apply
    

    La commande apply crée un déploiement avec des ressources de sauvegarde dans le cloud. En l'espace d'environ quatre minutes, apply vous crée plus de 30 ressources, y compris des réseaux VPC, des instances de VM, des passerelles VPN et des tunnels IPsec de GCP et AWS. Le résultat de la commande apply inclut des détails sur les ressources déployées et les variables de sortie définies par la configuration.

    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. Si vous devez mettre à jour l'état final attendu de votre configuration, modifiez vos fichiers .tf. Ajoutez le port 23 à votre règle google_compute_firewall gcp_allow-ssh en modifiant gcp_security.tf :

    ports = ["22", "23"]
    

    Terraform analyse les modifications, et identifie les changements requis au minimum pour mettre à jour l'état du déploiement.

    terraform apply
    

    Terraform remplace gcp-network-gcp-allow-ssh par la configuration mise à jour.

  7. Les déploiements peuvent émettre des variables de sortie pour faciliter le workflow. Dans ce tutoriel, les adresses IP internes et externes attribuées aux instances de VM ont été identifiées comme variables de sortie par les fichiers gcp_outputs.tf et aws_outputs.tf. Ces adresses sont imprimées automatiquement à la fin de l'étape apply. Si vous souhaitez afficher à nouveau les valeurs des variables de sortie ultérieurement dans le workflow, exécutez la commande output :

    terraform output
    

    Les variables de sortie définies par cette configuration incluent les adresses IP internes et externes de vos instances de VM. Afin d'utiliser la commande ssh pour la validation du réseau, vous avez besoin des adresses IP externes pour vous connecter aux instances de 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. Utilisez la commande show de Terraform pour inspecter les ressources déployées et vérifier l'état actuel.

    terraform show
    

    Résultat :

    ...
    google_compute_instance.gcp-vm:
    ...
    Outputs:
    ...
    
  9. Pour examiner vos instances, utilisez gcloud compute instances list, ou accédez à Cloud Console et consultez le panneau Instances de VM.

    gcloud compute instances list

    Résultat :

    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. Vérifiez que votre instance de VM GCP fonctionne en utilisant la commande ssh pour vous y connecter :

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  11. Exécutez les commandes ping et curl dans votre session ssh :

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. Exécutez des contrôles de performances réseau simples à partir de l'instance de VM GCP. Exécutez un test sur chaque interface réseau, à la fois externe et interne, à l'aide des scripts pré-installés.

    1. Sur les adresses IP externes :

      /tmp/run_iperf_to_ext.sh
      

      Ce script exécute un test de performance de 30 secondes qui produit des données récapitulatives sur les performances du réseau.

      Résultat :

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. Sur le VPN (adresses IP internes) :

      /tmp/run_iperf_to_int.sh
      

      Ce script exécute un test de performance de 30 secondes qui produit des données récapitulatives sur les performances du réseau.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  13. Une fois les vérifications effectuées à partir de l'instance de VM GCP, entrez la commande suivante :

    exit
    
  14. Pour vérifier que votre instance de VM AWS fonctionne, utilisez la commande ssh pour vous y connecter :

    ssh -i ~/.ssh/vm-ssh-key ubuntu@[AWS_EXTERNAL_IP]
  15. Exécutez les commandes ping et curl dans votre session ssh :

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  16. Exécutez des contrôles de performances réseau simples à partir de l'instance de VM AWS. Exécutez un test sur chaque interface réseau, à la fois externe et interne, à l'aide des scripts pré-installés.

    1. Sur les adresses IP externes :

      /tmp/run_iperf_to_ext.sh
      

      Ce script exécute un test de performance de 30 secondes qui produit des données récapitulatives sur les performances du réseau.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. Sur le VPN (adresses IP internes) :

      /tmp/run_iperf_to_int.sh
      

      Ce script exécute un test de performance de 30 secondes qui produit des données récapitulatives sur les performances du réseau.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  17. Une fois les vérifications effectuées à partir de l'instance de VM AWS, entrez la commande suivante :

    exit
    

Vous avez déployé avec succès une connexion de site à site privée et sécurisée entre GCP et AWS à l'aide de VPN.

Nettoyer

Nettoyez les ressources déployées. Vous continuerez d'être facturé pour vos instances de VM jusqu'à ce que vous exécutiez la commande de déploiement destroy.

  1. Exécutez la commande facultative plan -destroy pour examiner les ressources concernées par destroy :

    terraform plan -destroy
    

    Résultat :

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 0 to add, 0 to change, 34 to destroy.
    
  2. Étant donné que la commande destroy supprime définitivement vos ressources, vous devez confirmer vos intentions en saisissant yes. L'exécution de la commande destroy prend généralement environ une centaine de secondes :

    terraform destroy
    

    Résultat :

    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
    

    Saisissez yes pour confirmer la destruction de la ressource que vous avez créée.

    Destroy complete! Resources: 34 destroyed.
    
  3. Exécutez la commande show pour afficher l'état des ressources :

    terraform show
    

    Comme vous venez de détruire toutes les ressources, la commande show ne génère aucune ligne, ce qui indique qu'aucune ressource n'est déployée.

  4. Enfin, restaurez votre répertoire :

    popd > /dev/null
    

Vous avez déployé et nettoyé avec succès une connexion de site à site privée et sécurisée entre des instances GCP et AWS.

Étapes suivantes