Implementación de red automatizada: inicio

En este instructivo, se describe una implementación simple de una sola instancia de máquina virtual (VM) en la red de nube privada virtual (VPC) predeterminada. Este instructivo es el segundo de una serie de tres partes en la que se muestra la implementación automatizada de patrones de recursos de red comunes mediante Cloud Deployment Manager y Terraform de HashiCorp.

Para usar este instructivo, primero debes configurar tu entorno con la autenticación adecuada mediante el instructivo Implementación de red automatizada: descripción general.

Objetivos

  • Prepara un entorno de trabajo simple en Google Cloud Platform (GCP).
  • Comprende los archivos de configuración iniciales para una implementación simple.
  • Ejecuta comandos comunes en Deployment Manager para implementar una instancia de VM.
  • Ejecuta comandos comunes en Terraform para implementar una instancia de VM.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • Instancia de VM de Compute Engine
  • Disco persistente
  • Salida de red

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

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.

    Abra Cloud Shell

Arquitectura de implementación

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

entorno de implementación

El primer paso es crear una instancia de VM en la red de VPC default. Verifica que esté activa y en ejecución mediante el comando ping y accede a la instancia mediante la herramienta de Secure Shell (ssh).

Después de crear la implementación, navega hasta el panel Redes de VPC de Cloud Console. Observa que se creó una red de VPC default de manera automática para tu proyecto. Esta VPC contiene las siguientes recolecciones de recursos prediseñadas:

  • Firewalls

    Define las reglas de firewall básicas, que permiten tráfico HTTP(S) y ping.

  • Rutas

    Crea rutas, que permiten que el tráfico fluya entre varias regiones y la puerta de enlace de Internet predeterminada.

Los usuarios nuevos notan que estas recolecciones de recursos de red facilitan el uso inicial de GCP.

Prepara tu entorno de trabajo de GCP

Este instructivo se basa en la configuración del proyecto y el código de instructivo clonado en el Instructivo de descripción general.

Examina los archivos de configuración

Archivos de configuración para Deployment Manager

En Deployment Manager, se define una configuración de implementación mediante un archivo de configuración general YAML y un conjunto de archivos de plantillas de recursos relacionados. En este instructivo, se proporciona un conjunto de archivos mínimo para ilustrar los conceptos. Esta es una implementación funcional y no requiere modificaciones para ejecutarse.

Nombre del archivo Propósito
autonetdeploy_config.yaml Importa la plantilla de configuración autonetdeploy-startup.py. Establece los valores para las siguientes variables de implementación necesarias: project_id, zone y instance_type.
autonetdeploy_startup.py.schema Define las variables de implementación necesarias para la plantilla de configuración. Revisa este archivo para ver cómo se debe usar la plantilla sin necesidad de comprender todos los detalles subyacentes de la configuración de la implementación.
autonetdeploy_startup.py Contiene las definiciones de recursos detalladas para la configuración de la implementación (por ejemplo, compute.v1.instance). Puede ser un archivo YAML, pero Python permite una mayor flexibilidad.

Archivos de configuración para Terraform

En Terraform, se define una configuración de implementación mediante un directorio de archivos. Aunque 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 tus recursos de forma clara. Este conjunto es una implementación funcional y no requiere modificaciones para ejecutarse.

Nombre del archivo Objetivo
main.tf Define tus proveedores y especifica qué nubes implementar en esta configuración. También lee tus credenciales, proyectos y regiones deseadas.
gcp_variables.tf Declara las variables que se usan para configurar los parámetros de la implementación y personalizarla, por ejemplo, gcp_region y gcp_instance_type.
gcp_compute.tf Define los recursos de procesamiento que se usan en la implementación, por ejemplo, google_compute_instance.
gcp_outputs.tf Define las variables que se muestran o se obtienen cuando se completa la implementación, por ejemplo, external_ip y internal_ip de la instancia de VM implementada.
terraform.tfstate [SALIDA]. Archivo que usa Terraform para almacenar el estado del recurso del lado del cliente después 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 muestre las dependencias de recursos. Puedes ver el resultado de esta secuencia de comandos en images/startup_plan_graph.png.

En este instructivo, se usan 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 una instancia de Compute Engine en la red de VPC predeterminada

En todos los instructivos de implementación de red automatizada, se siguen los mismos pasos para implementar y limpiar una arquitectura de implementación, como se describe en la siguiente imagen.

implementación y limpieza

Implementa con Deployment Manager

Cuando creas una implementación, ya sea en modo de vista previa o no, Deployment Manager transfiere los archivos de configuración de recursos, evalúa las dependencias de los recursos y se prepara para compilar el entorno de la manera más eficiente posible. Cada implementación se etiqueta con un deployment_name único que puedes usar más adelante para describir, actualizar o destruir la implementación.

  1. En Cloud Shell, navega al directorio deploymentmanager:

    pushd deploymentmanager
    
  2. Obtén una vista previa de la implementación con la marca --preview. Esto crea una implementación en GCP sin usar ningún recurso.

    gcloud deployment-manager deployments create defaultvm-deployment --config ./autonetdeploy_config.yaml --preview
  3. Luego, inspecciona lo que creaste para asegurarte de que es lo que esperabas:

    gcloud deployment-manager deployments list

    Salida:

    NAME                  LAST_OPERATION_TYPE  STATUS  DESCRIPTION  MANIFEST  ERRORS
    defaultvm-deployment  preview              DONE                           []
    
  4. Ahora verifica cómo se describen tus implementaciones:

    gcloud deployment-manager deployments describe defaultvm-deployment

    Salida:

    ...
    NAME                 TYPE                 STATE       INTENT
    gcp-disk-us-west1-b  compute.v1.disk      IN_PREVIEW  CREATE_OR_ACQUIRE
    gcp-vm-us-west1-b    compute.v1.instance  IN_PREVIEW  CREATE_OR_ACQUIRE
    
  5. Ya que la vista previa de la implementación es solo documentación para una implementación planificada, bórrala.

    gcloud deployment-manager deployments delete defaultvm-deployment

    Resultado:

    ...
    Do you want to continue (y/N)?  y
    ...
    Delete operation operation-[id] completed successfully.
    
  6. Crea una implementación real. Usa el siguiente comando para implementar un recurso compute.v1.disk y un recurso compute.v1.instance, por lo general, dentro de 30 segundos:

    gcloud deployment-manager deployments create defaultvm-deployment --config ./autonetdeploy_config.yaml

    Salida:

    ...
    NAME                 TYPE                 STATE      ERRORS  INTENT
    gcp-disk-us-west1-b  compute.v1.disk      COMPLETED  []
    gcp-vm-us-west1-b    compute.v1.instance  COMPLETED  []
    
  7. Asegúrate de que creaste una implementación válida:

    gcloud deployment-manager deployments list

    Salida:

    NAME                  LAST_OPERATION_TYPE  STATUS  DESCRIPTION  MANIFEST       ERRORS
    defaultvm-deployment  insert               DONE                 manifest-[ID]  []
    
  8. Inspecciona los recursos implementados para verificar sus detalles:

    gcloud deployment-manager deployments describe defaultvm-deployment

    Salida:

    fingerprint: ...
    id: ...
    insertTime: ...
    manifest: ...
    name: defaultvm-deployment
    operation:
      endTime: ...
      name: ...
      operationType: insert
      progress: 100
      startTime: ...
      status: DONE
      user: ...
    NAME                 TYPE                 STATE      INTENT
    gcp-disk-us-west1-b  compute.v1.disk      COMPLETED
    gcp-vm-us-west1-b    compute.v1.instance  COMPLETED
    
  9. Verifica que tu implementación creó con éxito instancias en ejecución:

    gcloud compute instances list

    Resultado (desplázate hacia la derecha para verlo todo):

    NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP        STATUS
    gcp-vm-us-west1-b  us-west1-b  n1-standard-1               10.138.0.2   [GCP_EXTERNAL_IP]  RUNNING
    

    En Cloud Console, puedes revisar y verificar estas instancias en el panel Deployment Manager o Instancias de VM. En este caso, se implementa una instancia en la red de VPC default.

  10. Si deseas comunicarte con la instancia en ejecución, usa el comando ssh para conectarte a la VM y, luego, ejecutar comandos, como ping y curl. Recuerda que registraste la vm-ssh-key necesaria como metadatos de todo el proyecto en el instructivo Implementación automatizada de redes: Descripción general.

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

    ping -c 5 google.com
    curl ifconfig.co/ip
    
  12. Después de verificar que todo funcione de forma correcta, ingresa el siguiente comando:

    exit
    
  13. Observa el archivo de manifiesto, puede que te resulte útil cuando depures tus implementaciones. El archivo consta de información de solo lectura que describe en detalle los recursos implementados, junto con los errores o advertencias. Si no estás seguro del nombre del archivo de manifiesto, búscalo en el resultado del comando manifests list. El nombre del archivo de manifiesto tiene el siguiente formato: manifest-###.

    gcloud deployment-manager manifests list --deployment defaultvm-deployment

    Salida:

    NAME                    ID                   INSERT_TIME
    manifest-1234567890000  3456789012394315470  2017-08-22T...
    
    gcloud deployment-manager manifests describe [MANIFEST_FILENAME] --deployment defaultvm-deployment

    Resultado (desplázate hacia la derecha para verlo todo):

    ...
    name: [MANIFEST_FILENAME]
    selfLink: https://www.googleapis.com/deploymentmanager/v2/projects/gcp-automated-networks/global/deployments/defaultvm-deployment/manifests/[MANIFEST_FILENAME]
    

Limpieza con Deployment Manager

Limpia los recursos implementados. Se te seguirá cobrando por la instancia de VM hasta que ejecutes el comando de implementación delete. Debido a que delete borra los recursos de forma permanente, debes ingresar y (por “yes”) para confirmar tus intenciones. Por lo general, este comando delete finaliza en 30 segundos.

gcloud deployment-manager deployments delete defaultvm-deployment

Salida:

The following deployments will be deleted:
- defaultvm-deployment

Do you want to continue (y/N)?  y
gcloud deployment-manager deployments list

Salida:

Listed 0 items.
popd > /dev/null

Ahora implementaste y borraste con éxito una instancia de VM en GCP con Deployment Manager.

Implementa con Terraform

Las implementaciones en Terraform son un poco diferentes. Terraform usa un archivo, terraform.tfstate, para capturar el estado del recurso. Para ver el estado actual en un formato legible, ejecuta terraform show.

  1. En Cloud Shell, navega al directorio terraform.

    pushd terraform
    
  2. Puede que debas volver a exportar la PATH al directorio ~/terraform. Puedes volver a ejecutar la siguiente secuencia de comandos desde Cloud Shell para ver el comando de exportación.

    ./get_terraform.sh
    
  3. Valida la sintaxis de los archivos de configuración. Terraform proporciona el comando validate para comprobar si la sintaxis es válida en todos los archivos de configuración.

    terraform validate
    

    Esta verificación de validación es más simple que las realizadas como parte de plan y apply en los pasos posteriores. El comando validate no se autentica con ningún proveedor.

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

  4. Obtén una vista previa de la implementación. Mediante el comando plan de Terraform, se puede obtener una vista previa de la implementación sin crear instancias de recursos en la nube:

    terraform plan
    

    El comando plan difiere del comando preview de Deployment Manager en que no crea una referencia de la implementación en la nube que se deba borrar. Además, el comando plan requiere una autenticación correcta con todos los proveedores indicados en la configuración.

    Mediante el comando plan, se muestra una lista de salida de recursos que se deben agregar, quitar o actualizar. En la última línea del resultado de plan, se muestra un recuento de los recursos que se deben agregar, cambiar o destruir.

    Resultado:

    Refreshing Terraform state in-memory prior to plan...
    ...
    Plan: 1 to add, 0 to change, 0 to destroy.
    
  5. De forma opcional, visualiza las dependencias de los recursos mediante el comando graph de Terraform. El grafo de dependencias te ayuda a analizar los recursos implementados. Puedes ver una versión preparada con anterioridad del archivo de salida en images/startup_plan_graph.png.

    Mediante la secuencia de comandos run_graph.sh, se crea el archivo PNG ./startup_plan_graph.png, que se parece a esto:

    run_graph.sh script

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

    sudo apt-get install graphviz
    
  6. Crea una implementación:

    terraform apply
    

    Mediante el comando apply, se crea una implementación con recursos de respaldo en la nube. En poco más de diez segundos, se crea el recurso google_compute_instance, que incluye un disco de arranque y una interfaz de red con direcciones IP internas y externas.

    El resultado del comando apply incluye detalles de los recursos implementados y las variables de salida que define la configuración:

    data.google_compute_zones.available: Refreshing state...
    ...
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    ...
    Outputs:
    
    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = [GCP_INTERNAL_IP]
    
  7. Si necesitas actualizar el estado final esperado de la configuración, edita los archivos .tf. Edita gcp_compute.tf para agregar una secuencia de comandos de inicio a google_compute_instance:

    zone = "${data.google_compute_zones.available.names[0]}"
    metadata_startup_script = "echo hi > /test.txt"
    

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

    terraform apply
    

    Terraform destruye gcp-vm y vuelve a crearlo con la configuración actualizada.

  8. Las implementaciones pueden emitir variables de salida para ayudar al flujo de trabajo. En este instructivo, gcp_outputs.tf identifica las direcciones IP internas y externas asignadas como variables de salida. Las direcciones se imprimen de forma automática cuando se completa el paso apply. Si más adelante quieres volver a mostrar los valores de las variables de salida en el flujo de trabajo, usa el comando output.

    terraform output
    

    Las variables de salida que define esta configuración incluyen las direcciones IP internas y externas para la instancia de GCP. Cuando usas el comando ssh, necesitas que la dirección IP externa de GCP se conecte a la instancia.

    gcp_instance_external_ip = [GCP_EXTERNAL_IP]
    gcp_instance_internal_ip = [GCP_INTERNAL_IP]
    
  9. Inspecciona los recursos implementados para verificar el estado actual:

    terraform show
    

    Salida:

    data.google_compute_zones.available:
    ...
    google_compute_instance.gcp-vm:
    ...
    
  10. Revisa las instancias mediante gcloud compute instances list o Cloud Console, en el panel Instancias de VM o Deployment Manager. Para esta implementación, esta instancia en particular se implementa en la red de VPC default.

    gcloud compute instances list

    Salida:

    NAME             ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP
    gcp-vm-us-west1  us-west1-a  n1-standard-1               10.138.0.2   [GCP_EXTERNAL_IP]  RUNNING
    
  11. Ejecuta el siguiente comando ssh para verificar que la instancia de VM funcione:

    ssh -i ~/.ssh/vm-ssh-key [GCP_EXTERNAL_IP]
  12. Ejecuta los siguientes comandos en tu sesión de ssh:

    ping -c 5 google.com
    curl ifconfig.co/ip`
    exit
    

    Salida:

    Connection to [GCP_EXTERNAL_IP] closed.
    

Limpieza con Terraform

Limpia los recursos implementados. Se te seguirá cobrando por la instancia de VM hasta que ejecutes el comando de implementación destroy.

  1. Verifica lo que sucederá sin destruir ningún recurso.

    terraform plan -destroy
    

    Salida:

    ...
    Plan: 0 to add, 0 to change, 1 to destroy.
    
  2. Destruye de manera permanente los recursos implementados en la nube. Para confirmar tus intenciones, ingresa yes. Por lo general, este comando destroy se completa en 30 segundos.

    terraform destroy
    

    Salida:

    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
    
    ...
    Destroy complete! Resources: 1 destroyed.
    
  3. Verifica que los recursos ya no estén implementados.

    terraform show
    

    Debido a que acabas de destruir todos los recursos, el comando show no muestra líneas, lo que indica que no quedan recursos implementados.

  4. Ejecuta el siguiente comando para finalizar:

    popd > /dev/null
    

Ahora usaste Terraform con éxito para implementar y destruir una instancia de VM en GCP.

Pasos siguientes

  • Comienza el instructivo sobre la Compilación de una VPN entre GCP y AWS, que te guiará en la creación de instancias de VM en redes de VPC personalizadas en GCP y Amazon Web Services (AWS). Después de crear las instancias de VM, implementa una red privada virtual (VPN) entre las redes de VPC asociadas. Luego puedes realizar pruebas de conectividad con direcciones IP privadas entre las instancias de VM en GCP y AWS.

  • Si quieres obtener información sobre un método más avanzado para almacenar el archivo de estado de Terraform (terraform.tfstate) en Cloud Storage, consulta Administra proyectos de GCP con Terraform.

  • Explora arquitecturas de referencia, diagramas, instructivos y prácticas recomendadas sobre Google Cloud. Consulta nuestro Centro de arquitectura de Cloud.