Inicio automático de la duplicación de paquetes para la supervisión de aplicaciones

En este instructivo, se muestra cómo usar Cloud LoggingPub/Sub y Cloud Functions a fin de habilitar de forma automática la duplicación de paquetes para que puedas supervisar flujos de tráfico en la red de nube privada virtual (VPC) y solucionar sus problemas. Este instructivo está dirigido a los equipos de red, seguridad y DevOps. Se supone que estás familiarizado con Cloud Logging, Pub/Sub, Cloud Functions, la duplicación de paquetes, Compute Engine y Terraform.

Introducción

La duplicación de paquetes es una función que te permite supervisar flujos de tráfico de VPC en tiempo real. Mediante la duplicación de paquetes, los equipos de DevOps pueden solucionar problemas de tráfico o rendimiento degradado que generan mensajes de error. Además, las empresas que se preocupan por la seguridad pueden observar patrones de tráfico que podrían ser maliciosos y reaccionar ante ellos. Las organizaciones suelen usar la duplicación de paquetes junto con un sistema de detección de intrusiones (IDS) para ayudar a detectar y mitigar las amenazas.

La duplicación de paquetes captura todo el tráfico de entrada y salida, y los datos de paquetes (como las cargas útiles y los encabezados). Luego, exporta el tráfico, lo que te brinda una visibilidad completa de la red. Puedes enviar tráfico duplicado fuera de banda a los dispositivos de seguridad y supervisión que te ayudan a detectar amenazas, supervisar el rendimiento de la red y solucionar problemas de aplicaciones.

Puedes habilitar la duplicación de paquetes a nivel de subred, en etiquetas de red o en instancias de VPC específicas. Puedes realizar una duplicación continua de paquetes o habilitar e inhabilitar la duplicación en función de activadores predefinidos.

En este instructivo, configurarás la arquitectura que aparece en el siguiente diagrama.

El tráfico de Internet se enruta a través del balanceador de cargas global a la VPC con duplicación de paquetes.

Esta arquitectura tiene el siguiente flujo de trabajo:

  1. Se envía una solicitud no válida al balanceador de cargas, lo que activa un código de estado HTTP 500 Internal Server Error desde los servidores web.
  2. Cloud Monitoring genera un evento, y Cloud Logging registra un mensaje de error.
  3. Pub/Sub, que se configura como un receptor para Cloud Monitoring, recibe el mensaje de error.
  4. Cloud Monitoring envía un evento a Pub/Sub para que Cloud Functions habilite la duplicación de paquetes.
  5. La duplicación de paquetes está habilitada, y el tráfico se duplica en las VM de colector para que una persona o un equipo adecuado pueda realizar una investigación más exhaustiva de los mensajes de error. En este instructivo, usarás la utilidad tcpdump para ver los paquetes capturados.

A fin de completar este instructivo, debes usar Terraform de HashiCorp para crear la VPC, las subredes, el balanceador de cargas global, el servidor web y la VM de colector. Luego, debes configurar de forma manual una política de duplicación de paquetes y sus VM de colector asociadas para recibir tráfico duplicado. Por último, configura Cloud Logging, Cloud Functions y Pub/Sub para activar la duplicación de paquetes.

Aunque en este instructivo se muestra lo que es posible cuando usas un código de mensaje de error (HTTP 500) para activar un evento, puedes personalizar esta solución en otros casos de uso y entornos. Por ejemplo, recomendamos activar el registro para poder ver patrones (como un patrón de regex específico) o métricas de aplicación (como el uso de CPU y memoria).

Consulta la documentación de Cloud Logging y Cloud Monitoring para obtener más información sobre cómo configurarlos.

Objetivos

  • Implementar un entorno base mediante Terraform
  • Configurar la infraestructura de duplicación de paquetes
  • Activar un mensaje de error de la aplicación
  • Verificar que la duplicación de paquetes esté habilitada
  • Mostrar una captura de paquetes en las instancias de Compute Engine de colector

Costos

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

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 califiquen para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. En la consola, activa Cloud Shell.

    Activar Cloud Shell

    Completa la mayor parte de este instructivo desde la terminal de Cloud Shell mediante Terraform y Google Cloud CLI.

  2. En Cloud Shell, cambia el directorio de trabajo local y clona el repositorio de GitHub:

    cd $HOME
    git clone https://github.com/GoogleCloudPlatform/terraform-gce-packetmirror.git packetMirror
    

    El repositorio contiene todos los archivos que necesitas para completar este instructivo. Para obtener una descripción completa de cada archivo, consulta el archivo README.md en el repositorio.

  3. Haz que todas las secuencias de comandos de shell sean ejecutables:

    cd $HOME/packetMirror
    sudo chmod 755 *.sh
    
  4. Asegúrate de que la cuenta de usuario que usas en este instructivo tenga los permisos necesarios de la administración de identidades y accesos (IAM) para completar el instructivo.

Prepara tu entorno

En esta sección, debes configurar las variables de entorno e implementar la infraestructura de respaldo.

Configura Terraform

  1. Para instalar Terraform, sigue los pasos de la documentación de HashiCorp.
  2. En Cloud Shell, inicializa Terraform:

    terraform init
    

    El resultado es similar al siguiente:

    ...
    Initializing provider plugins...
    The following providers do not have any version constraints in configuration, so the latest version was installed.
    ...
    Terraform has been successfully initialized!
    ...
    

Configura las variables de entorno

  1. Si la cuenta de usuario de Google Cloud forma parte de una organización de Google Cloud, ejecuta los siguientes comandos en Cloud Shell:

    1. Configura la variable TF_VAR_org_id con el nombre de tu organización de Google Cloud:

      export TF_VAR_org_id=$(gcloud organizations list \
          --format="value(ID)" \
          --filter="DISPLAY_NAME:YOUR_ORGANIZATION_NAME")
      

      Reemplaza YOUR_ORGANIZATION_NAME por el nombre de la organización de Google Cloud que deseas usar para este instructivo.

    2. Agrega la variable org_id de Terraform al recurso del proyecto:

      sed -i "s/#org_id          = var.org_id/org_id          = var.org_id/" main.tf
      
    3. Verifica si configuraste la variable de entorno de forma correcta:

      echo $TF_VAR_org_id
      

      El resultado muestra el ID numérico de la organización y es similar al siguiente:

      ...
      123123123123
      ...
      
  2. Establece el nombre de la cuenta de facturación:

    1. Haz una lista de las cuentas de facturación activas:

      gcloud beta billing accounts list
      

      Copia el nombre de la cuenta de facturación que deseas usar para el instructivo. Necesitarás este nombre en el paso siguiente.

    2. Establece la variable de entorno de la cuenta de facturación:

      TF_VAR_billing_name="YOUR_BILLING_ACCOUNT_NAME"
      export TF_VAR_billing_name
      

      Reemplaza YOUR_BILLING_ACCOUNT_NAME por el nombre de la cuenta de facturación que copiaste en el paso anterior.

  3. Configura las variables de entorno restantes:

    source $HOME/packetMirror/set_variables.sh
    
  4. Verifica si configuraste las variables de entorno de forma correcta:

    env | grep TF_
    

    El resultado es similar al siguiente:

    ...
    TF_VAR_billing_account=YOUR_BILLING_ACCOUNT_NAME
    TF_VAR_org_id=YOUR_ORGANIZATION_NAME
    TF_VAR_region=YOUR_REGION
    TF_VAR_user_account=YOUR_USER_ACCOUNT
    TF_VAR_pid=YOUR_PROJECT_ID
    TF_VAR_zone=YOUR_ZONE
    ...
    

    En este resultado, se ilustra lo siguiente:

    • YOUR_REGION: La región del proyecto de Google Cloud, por ejemplo, us-west1
    • YOUR_USER_ACCOUNT: El ID de la cuenta, por ejemplo, user@example
    • YOUR_PROJECT_ID: El ID del proyecto de Cloud
    • YOUR_ZONE: La zona de tu proyecto de Cloud, por ejemplo, us-west1-b
  5. Si la variable TF_VAR_billing_account no está configurada de forma correcta, en la consola, ve a la página Descripción general de la cuenta de facturación en la página Administrar cuentas de facturación, copia el número de ID de la cuenta de facturación y, luego, configura la siguiente variable de entorno:

    export TF_VAR_billing_account=BILLING_ACCOUNT_ID
    

    Reemplaza BILLING_ACCOUNT_ID por el número de ID de la cuenta que copiaste antes en este paso.

  6. Crea un archivo de variable de entorno:

    $HOME/packetMirror/saveVars.sh
    

    Mediante este comando, se redireccionan las variables de entorno que creaste a un archivo llamado TF_ENV_VARS. Cada variable está precedida por el comando export. Si tu sesión de Cloud Shell finaliza, puedes usar este archivo para restablecer las variables. Las secuencias de comandos de Terraform, las de Cloud Shell y Google Cloud CLI usan estas variables.

    Si necesitas reinicializar las variables más adelante, puedes ejecutar el siguiente comando:

    source $HOME/packetMirror/TF_ENV_VARS
    

Implementa la infraestructura base

  1. En Cloud Shell, implementa la infraestructura de respaldo de Terraform:

    cd $HOME/packetMirror
    terraform apply
    
  2. Cuando se te solicite, ingresa yes para aplicar cualquiera de las opciones de configuración.

    El comando terraform apply indica a Terraform que implemente el proyecto, las redes, las subredes, el balanceador de cargas global y los servidores web. Para comprender cómo se define la infraestructura de forma declarativa, lee los manifiestos de Terraform (archivos con una extensión .tf).

    Puede llevarle varios minutos a Terraform implementar los componentes. Se crean los siguientes objetos:

    • VPC
    • Reglas de firewall
    • Subredes
    • Plantilla de instancias para el servidor web
    • Grupo de instancias administrado para servidores web
    • Grupo de instancias no administrado para VM de colector
    • Cloud NAT
    • Balanceador de cargas global y verificaciones de estado asociadas

    Puedes explorar tu proyecto para ver estos elementos a través de la consola o mediante los comandos de gcloud.

Crea recursos de duplicación de paquetes

En los siguientes pasos, crearás y verificarás la infraestructura con duplicación de paquetes.

Crea recursos de balanceo de cargas interno de colector

  • En Cloud Shell, crea el servicio de backend y la regla de reenvío:

    gcloud compute backend-services create collector-ilb \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --health-checks=http-basic-check
    
    gcloud compute backend-services add-backend collector-ilb \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --instance-group=collector-ig \
        --instance-group-zone="$TF_VAR_zone"
    
    gcloud compute forwarding-rules create fr-ilb-packet-mirroring \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --load-balancing-scheme=internal \
        --network=packet-mirror-vpc \
        --subnet=collectors \
        --ip-protocol=TCP \
        --ports=all \
        --backend-service=collector-ilb \
        --backend-service-region="$TF_VAR_region" \
        --is-mirroring-collector
    

    El resultado es similar al siguiente:

    ...
    Created [https://www.googleapis.com/compute/v1/projects/pm-pid-1357261223/regions/us-west1/backendServices/collector-ilb].
    NAME           BACKENDS  PROTOCOL
    collector-ilb            TCP
    ...
    Updated [https://www.googleapis.com/compute/v1/projects/pm-pid-1357261223/regions/us-west1/backendServices/collector-ilb].
    ...
    Created [https://www.googleapis.com/compute/projects/pm-pid-1357261223/regions/us-west1/forwardingRules/fr-ilb-packet-mirroring].
    ...
    

Crea e inhabilita la política de duplicación de paquetes

  1. En Cloud Shell, crea e inhabilita una política de duplicación de paquetes:

    gcloud compute packet-mirrorings create pm-mirror-subnet1 \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --network=packet-mirror-vpc \
        --collector-ilb=fr-ilb-packet-mirroring \
        --mirrored-subnets=webservers \
        --no-enable
    
    gcloud compute packet-mirrorings describe pm-mirror-subnet1 \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region"
    

    El resultado es similar al siguiente:

    ...
    Created [https://www.googleapis.com/compute/projects/pm-pid-1357261223/regions/us-west1/packetMirrorings/pm-mirror-subnet1].
    ...
    collectorIlb:
    ...
    enable: 'FALSE'
    ...
    

    La política de duplicación de paquetes está habilitada de forma predeterminada. En este paso, inhabilitarás la política porque deseas que la duplicación de paquetes se desactive hasta que Cloud Logging detecte un problema.

Crea la automatización para activar la duplicación de paquetes

  1. En Cloud Shell, crea el tema de Pub/Sub que usarás para el receptor de Cloud Logging:

    gcloud pubsub topics create stackdriver_logging \
        --project="$TF_VAR_pid"
    

    El resultado es similar al siguiente:

    ...
    Created topic [projects/pm-pid-1357261223/topics/stackdriver_logging].
    ...
    
  2. Crea un receptor de Cloud Logging:

    gcloud logging sinks create stackdriver_logging pubsub.googleapis.com/projects/"$TF_VAR_pid"/topics/stackdriver_logging \
        --log-filter='resource.type="http_load_balancer" \
            AND http_request.status>=500' \
        --project=$TF_VAR_pid
    

    El receptor de Cloud Logging filtra los códigos de estado HTTP globales en el rango 500 (como 500501502) y envía los eventos al tema de Pub/Sub.

    El resultado es similar al siguiente:

    Created [https://logging.googleapis.com/v2/projects/pm-pid-1357261223/sinks/stackdriver_logging].
    Please remember to grant `serviceAccount:p422429379846-984011@gcp-sa-logging.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
    More information about sinks can be found at https://cloud.oogle.com/logging/docs/export/configure_export
    

    Copia el valor de serviceAccount del resultado. Necesitarás este valor en el paso siguiente.

  3. Otorga a la cuenta de servicio la función de IAM de publicador de Pub/Sub (roles/pubsub.publisher):

    gcloud pubsub topics add-iam-policy-binding stackdriver_logging \
        --project="$TF_VAR_pid" \
        --member serviceAccount:UPDATE_ACCOUNT \
        --role roles/pubsub.publisher
    

    Reemplaza UPDATE_ACCOUNT por el valor de serviceAccount del paso anterior.

    El resultado es similar al siguiente:

    ...
    Updated IAM policy for topic [stackdriver_logging].
    bindings:
    - members:
      - serviceAccount:UPDATE_ACCOUNT
      role: roles/pubsub.publisher
    etag: notuCRmpoyI=
    version: 1
    ...
    
  4. Actualiza el archivo main.py:

    net_id="$(gcloud compute networks describe packet-mirror-vpc --project="$TF_VAR_pid" --format='value(id)')"
    sed -i "s/PROJECT-ID/"$TF_VAR_pid"/g" main.py
    sed -i "s/REGION/"$TF_VAR_region"/g" main.py
    sed -i "s/NETWORK-ID/"$net_id"/g" main.py
    

    El archivo main.py en el repositorio contiene la función packet_mirror_pubsub que usarás para crear la función de Cloud Functions. Antes de crear la función de Cloud Functions, mediante el comando anterior, se actualizan el ID del proyecto de Google Cloud, la región y la información de la red en el archivo de Python.

  5. Crea la función de Cloud Functions:

    gcloud functions deploy packet_mirror_pubsub \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --runtime python37 \
        --trigger-topic stackdriver_logging
    

    Si ves la siguiente advertencia, ingresa N:

    Allow unauthenticated invocations of new function
    [packet_mirror_pubsub]? (y/N)?
    

    El resultado es similar al siguiente:

    ...
    availableMemoryMb: 256
    entryPoint: packet_mirror_pubsub
    eventTrigger:
      eventType: google.pubsub.topic.publish
      failurePolicy: {}
      resource: projects/pm-pid--1517226903/topics/stackdriver_logging
      service: pubsub.googleapis.com
    ingressSettings: ALLOW_ALL
    labels:
      deployment-tool: cli-gcloud
    name: projects/pm-pid--1517226903/locations/europe-west1/functions/packet_mirror_pubsub
    runtime: python37
    serviceAccountEmail: pm-pid--1517226903@appspot.gserviceaccount.com
    ...
    status: ACTIVE
    ...
    

    La implementación de la función de Cloud Functions puede tomar varios minutos en completarse.

  6. Si recibes un error, haz lo siguiente:

    • Si recibes un error sobre la habilitación de la API de Cloud Build, habilita la API:

      gcloud services enable cloudbuild.googleapis.com
      

      Vuelve a intentar el paso 5.

    • Si recibes un mensaje de error relacionado con el acceso a Cloud Storage, vuelve a intentar el paso 5. Este error puede generarse cuando ejecutas los comandos uno tras otro con rapidez.

Verifica la solución

En los siguientes pasos, activarás y verificarás la solución.

  1. En Cloud Shell, valida la suscripción a Pub/Sub nueva:

    gcloud pubsub subscriptions list --project="$TF_VAR_pid"
    

    El resultado es similar al siguiente:

    ...
    ---
    ackDeadlineSeconds: 600
    expirationPolicy: {}
    messageRetentionDuration: 604800s
    name: projects/pm-pid--1517226903/subscriptions/gcf-packet_mirror_pubsub-europe-west1-stackdriver_logging
    pushConfig:
      attributes:
        x-goog-version: v1
      pushEndpoint: https://e147a3acbd9a5314f553d1710671be9c-dot-efdbf9529ce1147d5p-tp.appspot.com/_ah/push-handlers/pubsub/projects/pm-pid--1517226903/topics/stackdriver_logging?pubsub_trigger=true
    topic: projects/pm-pid--1517226903/topics/stackdriver_logging
    ...
    
  2. Accede a la VM de colector:

    gcloud compute ssh collector \
        --tunnel-through-iap \
        --project="$TF_VAR_pid" \
        --zone="$TF_VAR_zone"
    
  3. Después de acceder a la VM de colector, instala y habilita la utilidad tcpdump:

    sudo apt-get install tcpdump -y
    sudo tcpdump -n not net 172.16.21.0/24
    

    El resultado es similar al siguiente:

    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    

    Deja abierta esta sesión de Cloud Shell.

  4. Abre una ventana de la terminal de Cloud Shell nueva y, luego, activa la función de Cloud Functions mediante la generación de un error HTTP 500:

    cd $HOME/packetMirror
    source TF_ENV_VARS
    lb_ip=$(gcloud compute forwarding-rules describe packet-mirror-gfr --project=$TF_VAR_pid --global --format="value(IPAddress)")
    curl http://"$lb_ip"/error500
    

    El resultado es similar al siguiente:

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>500 Internal Server Error</title>
    </head><body>
    <h1>Internal Server Error</h1>
    <p>The server encountered an internal error or
    misconfiguration and was unable to complete
    your request.</p>
    <p>Please contact the server administrator at
     webmaster@localhost to inform them of the time this error occurred,
     and the actions you performed just before this error.</p>
    <p>More information about this error may be available
    in the server error log.</p>
    <hr>
    <address>Apache/2.4.25 (Debian) Server at 35.241.40.217 Port 80</address>
    
  5. Regresa a la sesión de Cloud Shell de la VM de colector y observa los resultados del comando tcpdump. La VM de colector recibe tráfico, que es el sondeo de verificación de estado en las instancias del servidor web.

    El resultado es similar al siguiente:

    ...
    07:33:41.131992 IP 130.211.2.146.53702 > 172.16.20.2.80: Flags [S], seq 4226031116, win 65535, options [mss 1420,sackOK,TS val 2961711820 ecr 0,nop,wscale 8], length 0
    07:33:41.132149 IP 130.211.2.146.53702 > 172.16.20.2.80: Flags [.], ack 3978158577, win 256, options [nop,nop,TS val 2961711821 ecr 4348156], length 0
    ...
    
  6. Para detener el resultado del comando tcpdump, presiona Control+C.

  7. Escribe exit para salir de la VM de colector.

  8. En Cloud Shell, verifica los registros para validar que la función de Cloud Functions se haya ejecutado:

    gcloud functions logs read \
        --limit 50 \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region"
    

    El resultado es similar al siguiente:

    LEVEL  NAME                  EXECUTION_ID     TIME_UTC                 LOG
    D      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:39.206  Function execution started
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:39.222  HTTP 500 Error Detected in: {"httpRequest":{"remoteIp":"136.27.39.107","requestMethod":"GET","requestSize":"85","requestUrl":"http://35.241.40.217/error500","responseSize":"801","serverIp":"172.16.20.2","status":500,"userAgent":"curl/7.52.1"},"insertId":"nb4g1sfdrpm04","jsonPayload":{"@type":"type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry","enforcedSecurityPolicy":{"configuredAction":"ACCEPT","name":"policy","outcome":"ACCEPT","priority":2147483647},"statusDetails":"response_sent_by_backend"},".............
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:39.222  Activating Packet Mirroring For Analysis
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:39.329  ya29.c.KqUBvwfoZ5z88EmHKPXkgd1Gwqwwca88wWsyqjxrEFdhK8HjJDwmBWBIX_DAnC4wOO5W2B6EOQArgHQ03AIVwFnQMawXrB2tLGIkBYFuP3Go5Fylo6zZAvgtXF3LvrXiarwaASkfAM73lXfQiT20PYn4ML4E2Kli9WmhZDu6AdAe1aH-FK2MEoca84zgG65tirRGe04EJGY_hYHejlG_xrRWeaojVlc3
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:40.100  {
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:40.100    "id": "1924200601229605180",
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:40.100    "name": "operation-1582270419413-59f110a49a878-b68f2d26-c8f66a7b",
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:40.100    "operationType": "patch",
    I      packet_mirror_pubsub  999875368753102  2020-02-21 07:33:40.100    …..
     Function execution took 900 ms, finished with status: 'ok'
    

    En los registros, se muestra que la duplicación de paquetes se activó según el código de error HTTP 500 generado por las instancias del servidor web.

  9. Valida el estado de la función de duplicación de paquetes:

    gcloud compute packet-mirrorings describe pm-mirror-subnet1 \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region"
    

    El resultado es similar a este:

    ...
    collectorIlb:
    ...
    enable: 'TRUE'
    ...
    

Limpia

Para evitar que se generen costos en tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, sigue estos pasos.

Borra la infraestructura

  1. En Cloud Shell, quita los recursos de automatización:

    gcloud functions delete packet_mirror_pubsub \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --quiet
    gcloud logging sinks delete stackdriver_logging \
        --project="$TF_VAR_pid" \
        --quiet
    gcloud pubsub topics delete stackdriver_logging \
        --project="$TF_VAR_pid" \
        --quiet
    gcloud compute packet-mirrorings delete  pm-mirror-subnet1  \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --quiet
    gcloud compute forwarding-rules delete fr-ilb-packet-mirroring \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --quiet
    gcloud compute backend-services delete collector-ilb \
        --project="$TF_VAR_pid" \
        --region="$TF_VAR_region" \
        --quiet
    
  2. Destruye todos los componentes del instructivo:

    pushd $HOME/packetMirror
    terraform destroy
    popd
    

    Cuando se te solicite, ingresa yes para destruir la configuración.

  3. Quita el repositorio de Git:

    rm -rf $HOME/packetMirror
    

Próximos pasos