Implementación automatizada de redes: compila una VPN entre GCP y AWS

(compila una VPN entre AWS y GCP con Terraform)

En este instructivo, se muestra cómo usar Terraform de HashiCorp para crear conexiones seguras, privadas y de sitio a sitio entre Google Cloud Platform (GCP) y Amazon Web Services (AWS) mediante redes privadas virtuales (VPN). Esta es una implementación de múltiples nubes.

Este instructivo es la tercera parte de una serie de tres que demuestra la implementación automática de patrones de recursos de red comunes. Este instructivo se basa en la autenticación y la configuración de proyecto que se describen en el instructivo Implementación automatizada de redes: descripción general.

En este instructivo, se enseña a implementar instancias de máquina virtual (VM) en redes de nube privada virtual personalizadas (VPC) en GCP y AWS. Luego, a implementar infraestructura de respaldo para crear una conexión de VPN con dos túneles de Protocolo de seguridad de Internet (IPsec) entre las redes de VPC de GCP y AWS. La implementación del entorno y del túnel se completa, por lo general, en cuatro minutos.

Si bien este instructivo es una extensión de Implementación automatizada de redes: inicio, no incluye la configuración de Deployment Manager porque los recursos se implementan en proveedores externos a GCP. En su lugar, para implementar recursos mediante múltiples proveedores de servicios en la nube pública, incluido GCP, en este instructivo se usan los archivos de configuración de Terraform. Las implementaciones de múltiples nubes están más allá del alcance previsto para Deployment Manager.

Costos

En este instructivo se usan los siguientes componentes facturables de GCP y AWS:

  • Instancias de Compute Engine y de Amazon Elastic Compute Cloud (Amazon EC2)
  • Instancias de múltiples CPU virtuales para una mayor capacidad de procesamiento de red
  • Discos persistentes y almacenamiento en bloque
  • Salida de herramientas de redes
  • Túneles VPN

El tráfico de salida de una instancia de VM está sujeto a los límites de la capacidad de procesamiento de salida de la red máximos. En este instructivo se usan los tipos de máquina de múltiples CPU virtuales para darle lugar al tráfico de salida de red.

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.

Antes de comenzar

  1. Selecciona el proyecto de GCP llamado gcp-automated-networks.

    Ir a la página Proyectos

  2. Inicia una instancia de Cloud Shell. Ejecuta todos los comandos de terminal en este instructivo desde Cloud Shell.

    Abrir Cloud Shell

Arquitectura de implementación

En este instructivo, compilarás el entorno de implementación siguiente.

entorno de implementación

En este instructivo, se describe cómo realizar las siguientes acciones:

  • Compilar redes de VPC personalizadas con bloques CIDR especificados por el usuario en GCP y AWS
  • Implementar una instancia de VM en cada red de VPC
  • Crear puertas de enlace VPN en cada red de VPC y recursos relacionados para dos túneles IPsec

Mientras que GCP usa rutas compatibles con el enrutamiento de varias rutas de igual costo (ECMP), AWS es compatible con puertas de enlace VPN con dos túneles, activo y en espera, para la redundancia y disponibilidad.

Enrutamiento

La configuración del instructivo usa Cloud Router para demostrar el enrutamiento dinámico. Cloud Router cambia las actualizaciones de tu ruta de red de VPC por tu entorno en AWS mediante el Protocolo de Puerta de Enlace Fronteriza (BGP). El enrutamiento dinámico de Cloud Router requiere un Cloud Router para cada túnel IPsec. De manera alternativa, puedes determinar una configuración con rutas estáticas. Se tratan ambas configuraciones en la Guía de interoperabilidad de Cloud VPN.

Prepara tu entorno de trabajo de GCP

En esta sección, podrás hacer lo siguiente:

  • Clonar el código del instructivo
  • Verificar tu región y zona de GCP

Clona el código del instructivo

  1. Clona el código del instructivo desde GitHub:

    git clone https://github.com/GoogleCloudPlatform/autonetdeploy-multicloudvpn.git
  2. Navega hacia el directorio del instructivo:

    cd autonetdeploy-multicloudvpn
    

Verifica la región y zona de GCP

Algunos recursos de la nube en este instructivo, incluidas las instancias de Compute Engine, las puertas de enlace VPN y Cloud Router, requieren que declares de forma explícita la región o zona de ubicación, o ambas, deseadas. Si quieres obtener más detalles, consulta Regiones y zonas para GCP.

En este instructivo solo se necesita una región para cada proveedor. Para optimizar la conexión entre dos nubes, elige regiones cercanas. En la siguiente tabla se enumeran los valores establecidos en los archivos del instructivo terraform/gcp_variables.tf y terraform/aws_variables.tf.

Nombre del campo Valores de GCP Valores de AWS
Region Name us-west1 US West (us-west-2)
Location The Dalles, Oregon, USA Oregon

Prepara AWS para su uso

En esta sección, podrás verificar tu región de AWS. Si quieres obtener detalles sobre las regiones de AWS, consulta Regiones y zonas de disponibilidad para AWS.

  1. Accede a la consola de administración de AWS y navega hacia el Panel de VPC. Selecciona la región de Oregón mediante el menú desplegable.

  2. En el Panel de EC2 y el Panel de VPC, revisa los recursos que se usan en este instructivo.

Prepara Terraform

En esta sección, podrás descargar el ejecutable de Terraform.

  • En Cloud Shell, ejecuta la siguiente secuencia de comandos:

    ./get_terraform.sh
    

    Con la secuencia de comandos se descarga y descomprime el ejecutable binario de la herramienta de Terraform en el directorio ~/terraform. El resultado de la secuencia de comandos muestra un comando de exportación para actualizar tu PATH. Una vez que actualizas tu PATH, verifica que Terraform funcione:

    terraform --help
    

    Resultado:

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

Si necesitas ayuda, consulta los temas Descarga Terraform y, también, Instala Terraform.

Crea credenciales de acceso de GCP y AWS

Creaste credenciales en el Instructivo de descripción general. Sin embargo, debes registrar tus credenciales con Terraform.

  1. Registra tus credenciales de GCP con Terraform:

    ./gcp_set_credentials.sh exists
    

    Resultado:

    Updated gcp_credentials_file_path in ~/autonetdeploy-multicloudvpn/terraform/terraform.tfvars.
    
  2. Registra tus credenciales de AWS con Terraform:

    ./aws_set_credentials.sh exists
    

    Resultado:

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

Configura tu proyecto

GCP ofrece varias maneras de designar el proyecto de GCP que usarán las herramientas de automatización. Con el fin de hacerlo más simple, en vez de extraer el ID del proyecto desde el entorno, el proyecto de GCP se identifica de forma explícita a través de una string variable en los archivos de plantilla.

  1. Determina tu ID del proyecto:

    gcloud config set project [YOUR-PROJECT-ID]

    Resultado:

    Updated property [core/project].
    
  2. Usa la secuencia de comandos proporcionada para actualizar el valor del proyecto en el archivo de configuración de Terraform.

    ./gcp_set_project.sh
    

    Resultado:

    Updated gcp_project_id in /home/[USER]/autonetdeploy-gcpawsvpn/terraform/terraform.tfvars.
    
  3. Revisa el archivo actualizado, terraform/terraform.tfvars, para verificar que se insertó tu project-id.

  4. Ejecuta el comando único terraform init con el fin de instalar los proveedores de Terraform para esta implementación.

    pushd ./terraform && terraform init && popd > /dev/null
    
  5. Ejecuta el comando de Terraform plan para verificar tus credenciales.

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

    Si no ves texto de error rojo, tu autenticación funciona de forma correcta.

    Resultado:

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

Examina los archivos de configuración de Terraform

En Terraform, una configuración de implementación se define por un directorio de archivos. Si bien estos archivos pueden ser JSON, es mejor usar la sintaxis del archivo de configuración de Terraform (archivo .tf), que es más fácil de leer y mantener. En este instructivo se proporciona un conjunto de archivos que ilustran una forma de organizar de manera clara tus recursos. Este conjunto es una implementación funcional y no requiere cambios para ejecutarse.

Nombre del archivo Motivo
main.tf Define tus proveedores y especifica qué nubes implementar en esta configuración. También lee tus credenciales, nombre de proyecto y regiones seleccionadas.
gcp_variables.tf, aws_variables.tf Declara variables usadas para determinar parámetros y personalizar la implementación, por ejemplo, gcp_region y gcp_instance_type.
gcp_compute.tf, aws_compute.tf Define los recursos de procesamiento usados en tu implementación, como google_compute_instance.
vm_userdata.sh Especifica la secuencia de comandos que se ejecuta cuando se inician las instancias de VM. Determina de manera automática la herramienta de prueba iperf3 y algunas secuencias de comandos del wrapper.
gcp_networking.tf, aws_networking.tf Define los recursos de red, incluidos google_compute_network, google_compute_subnetwork, google_compute_address, google_compute_vpn_gateway y google_compute_vpn_tunnel.
gcp_security.tf, aws_security.tf Define recursos para permitir pruebas de tráfico en el entorno de GCP o AWS, incluidas las reglas google_compute_firewall y los recursos aws_security_group.
gcp_outputs.tf, aws_outputs.tf Define variables resultantes de la finalización de la implementación, como la external_ip y la internal_ip de la instancia de VM implementada.
terraform.tfstate [OUTPUT]. Especifica el archivo usado por Terraform para almacenar el estado del recurso del lado del cliente luego de verificar con la nube. Para obtener más detalles, consulta Administra proyectos de GCP con Terraform.
run_graph.sh Secuencia de comandos de Shell para generar un archivo PNG desde Terraform que muestra las dependencias de recursos. Puedes ver el resultado de esta secuencia de comandos en images/gcpawsvpn_plan_graph.png.

En este instructivo, usarás secuencias de comandos a fin de crear el archivo terraform.tfvars, que incluye la configuración específica del usuario para credentials y gcp_project_id.

Implementa redes de VPC, instancias de VM, puertas de enlace VPN y túneles IPsec

Crear conexiones entre múltiples nubes es complejo. Puedes implementar muchos recursos en paralelo en ambos entornos, pero cuando compilas túneles IPsec, necesitas ordenar las interdependencias con cuidado. Por esta razón, establecer una configuración de implementación segura en código es una forma útil de escalar tu conocimiento de implementación. La siguiente figura resume los pasos necesarios para crear esta configuración de implementación en múltiples proveedores.

pasos de implementación

Implementa con Terraform

Terraform usa el archivo terraform.tfstate para capturar el estado del recurso. Para ver el estado actual del recurso en un formato de lectura, ejecuta terraform show.

A fin de que Terraform se autentique de forma correcta con tus proveedores, primero debes completar el Instructivo de descripción general. Para los siguientes pasos, se da por sentado que ya configuraste Terraform.

  1. En Cloud Shell, navega hacia el directorio terraform:

    pushd terraform
    
  2. Usa el comando de Terraform validate para validar la sintaxis de tus archivos de configuración. Esta verificación de validación es más simple que aquellas realizadas como parte de los comandos plan y apply en pasos posteriores. El comando validate no se autentica con ningún proveedor.

    terraform validate
    

    Si no ves un mensaje de error, completaste la validación inicial de la sintaxis y semántica básica de tu archivo. Si ves un mensaje de error, la validación falló.

  3. Usa el comando de Terraform plan para revisar la implementación sin crear instancias de recursos en la nube. El comando plan requiere una autenticación exitosa con todos los proveedores especificados en la configuración.

    terraform plan
    

    El comando plan muestra una lista de recursos para agregar, quitar o actualizar. La última línea del resultado plan muestra un conteo de resultados para agregar, cambiar o destruir:

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 34 to add, 0 to change, 0 to destroy.
    
  4. De manera opcional, visualiza tus dependencias de recurso con el comando de Terraform graph. El grafo de dependencia te ayuda a analizar tus recursos implementados. Puedes ver una versión preparada con anterioridad del archivo de salida en images/gcpawsvpn_plan_graph.png.

    La secuencia de comandos run_graph.sh crea el archivo PNG ./gcpawsvpn_plan_graph.png, que es similar al siguiente:

    archivo plan_graph

    La secuencia de comandos run_graph.sh se basa en el paquete graphviz. Si graphviz no se instala, verás un mensaje dot: command not found. En Cloud Shell, puedes instalar graphviz con el siguiente comando:

    sudo apt-get install graphviz
    
  5. Usa el comando de Terraform apply para crear una implementación:

    terraform apply
    

    El comando apply crea una implementación con recursos de apoyo en la nube. En cuatro minutos, apply crea más de 30 recursos, incluidos redes de VPC, instancias de VM, puertas de enlace VPN y túneles IPsec de GCP y AWS. El resultado del comando apply incluye detalles de los recursos implementados y de las variables de salida definidas en la configuración.

    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 necesitas actualizar el estado final esperado de tu configuración, edita tus archivos .tf. Edita gcp_security.tf para agregar el puerto 23 a tu regla google_compute_firewall gcp_allow-ssh:

    ports = ["22", "23"]
    

    Terraform analiza las ediciones y luego identifica los cambios mínimos necesarios para actualizar el estado de tu implementación a fin de que coincida.

    terraform apply
    

    Terraform modifica gcp-network-gcp-allow-ssh en la configuración actualizada.

  7. Tus implementaciones pueden emitir variables de salida para aliviar tu flujo de trabajo. En este instructivo, los archivos gcp_outputs.tf y aws_outputs.tf identifican como variables de salida a las direcciones IP internas y externas asignadas a instancias de VM. Estas direcciones se imprimen de manera automática cuando se completa el paso apply. Si, más adelante en tu flujo de trabajo, quieres volver a mostrar los valores de variable de salida, usa el comando output.

    terraform output
    

    Las variables de salida definidas en esta configuración incluyen las direcciones IP internas y externas para tus instancias de VM. Si quieres usar el comando ssh a fin de validar la red, necesitas las direcciones IP externas para conectarte a las instancias 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. Usa el comando de Terraform show para inspeccionar los recursos implementados y verificar el estado actual.

    terraform show
    

    Resultado:

    ...
    google_compute_instance.gcp-vm:
    ...
    Outputs:
    ...
    
  9. Para revisar tus instancias, usa gcloud compute instances list: o usa Cloud Console, en el panel Instancias de VM.

    gcloud compute instances list

    Resultado:

    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. Verifica que tu instancia de VM de GCP funciona con el comando ssh para conectarte a ella:

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  11. Ejecuta los comandos ping y curl en tu sesión ssh:

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. Ejecuta controles de rendimiento de red simples desde la instancia de VM de GCP. Usa secuencias de comandos preinstaladas para ejecutar una prueba en la interfaz interna y externa de cada red.

    1. Sobre IP externas:

      /tmp/run_iperf_to_ext.sh
      

      La secuencia de comandos ejecuta una prueba de rendimiento de 30 segundos que produce datos de resumen sobre el rendimiento de la red.

      Resultado:

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. Sobre VPN (IP internas):

      /tmp/run_iperf_to_int.sh
      

      La secuencia de comandos ejecuta una prueba de rendimiento de 30 segundos que produce datos de resumen sobre el rendimiento de la red.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  13. Cuando completes las revisiones de la instancia de VM de GCP, ingresa el siguiente comando:

    exit
    
  14. Con el fin de verificar que tu instancia de VM de AWS funcione, usa el comando ssh para conectarte a ella:

    ssh -i ~/.ssh/vm-ssh-key ubuntu@[AWS_EXTERNAL_IP]
  15. Ejecuta los comandos ping y curl en tu sesión ssh:

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  16. Ejecuta controles de rendimiento de red simples desde la instancia de VM de AWS. Usa secuencias de comandos preinstaladas para ejecutar una prueba en la interfaz interna y externa de cada red.

    1. Sobre IP externas:

      /tmp/run_iperf_to_ext.sh
      

      La secuencia de comandos ejecuta una prueba de rendimiento de 30 segundos que produce datos de resumen sobre el rendimiento de la red.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
    2. Sobre VPN (IP internas):

      /tmp/run_iperf_to_int.sh
      

      La secuencia de comandos ejecuta una prueba de rendimiento de 30 segundos que produce datos de resumen sobre el rendimiento de la red.

      ...
      [SUM]   ... sender
      [SUM]   ... receiver
      ...
      
  17. Cuando completes las revisiones de la instancia de VM de AWS, ingresa el siguiente comando:

    exit
    

Implementaste correctamente una conexión segura, privada, de sitio a sitio entre GCP y AWS mediante VPN.

Limpieza

Limpia los recursos implementados. Se te seguirá facturando por tus instancias de VM hasta que ejecutes el comando de implementación destroy.

  1. Ejecuta el comando opcional plan -destroy para revisar los recursos afectados por destroy:

    terraform plan -destroy
    

    Resultado:

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 0 to add, 0 to change, 34 to destroy.
    
  2. Debido a que el comando destroy borrará de manera permanente tus recursos, debes confirmar que estás seguro con yes. El comando destroy se completa, por lo general, en 100 segundos:

    terraform destroy
    

    Resultado:

    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
    

    Ingresa yes para confirmar la destrucción del recurso que creaste.

    Destroy complete! Resources: 34 destroyed.
    
  3. Ejecuta el comando show para mostrar el estado de los recursos:

    terraform show
    

    Ya que destruiste todos los recursos, el comando show no muestra líneas, lo que indica que ya no hay recursos implementados.

  4. Por último, restablece tu directorio:

    popd > /dev/null
    

Completaste con éxito la implementación y limpieza de una conexión segura, privada, de sitio a sitio entre instancias en GCP y AWS.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...