Como iniciar o espelhamento de pacotes automaticamente para monitoramento de aplicativos

Neste tutorial, mostramos como usar o Cloud Logging, Pub/Sub e Cloud Functions para ativar automaticamente o Espelhamento de pacote para monitorar e resolver problemas de fluxos de tráfego na rede da nuvem privada virtual (VPC). Este tutorial se destina a equipes de rede, segurança e DevOps. Presumimos que você esteja familiarizado com o Cloud Logging, o Pub/Sub, o Cloud Functions, o espelhamento de pacotes, o Compute Engine e o Terraform.

Introdução

O espelhamento de pacotes é um recurso que permite monitorar os fluxos de tráfego de VPC em tempo real. Usando o espelhamento de pacotes, as equipes de DevOps podem resolver problemas de desempenho ou tráfego degradados que geram mensagens de erro ou que as empresas preocupadas com a segurança possam observar e reagir a padrões de tráfego que podem ser maliciosos. As organizações geralmente usam o espelhamento de pacotes junto com um sistema de detecção de intrusões (IDS, na sigla em inglês) para ajudar a detectar e mitigar ameaças.

O espelhamento de pacotes captura todo o tráfego de entrada e saída e todos os dados de pacote (como payloads e cabeçalhos) e, em seguida, exporta o tráfego, oferecendo visibilidade total da rede. É possível enviar tráfego espelhado de fora da banda para dispositivos de segurança e monitoramento que ajudam a detectar ameaças, monitorar o desempenho da rede e solucionar problemas de aplicativos.

É possível ativar o espelhamento de pacotes no nível da sub-rede, nas tags de rede ou em instâncias de VPC específicas. Use o espelhamento de pacotes contínuo ou ative e desative o espelhamento de pacotes com base em acionadores predefinidos.

Neste tutorial, você configura a arquitetura no diagrama a seguir.

O tráfego da Internet é roteado pelo balanceador de carga global para a VPC espelhada por pacote.

Essa arquitetura tem o seguinte fluxo de trabalho:

  1. Uma solicitação inválida é enviada ao balanceador de carga, acionando um código de status HTTP 500 Internal Server Error dos servidores da Web.
  2. O Cloud Monitoring gera um evento, e o Cloud Logging registra uma mensagem de erro.
  3. O Pub/Sub, configurado como um coletor do Cloud Monitoring, recebe a mensagem de erro.
  4. O Cloud Monitoring envia um evento para o Pub/Sub, acionando o Cloud Functions para ativar o espelhamento de pacotes.
  5. O espelhamento de pacotes está ativado e o tráfego é espelhado nas VMs do coletor para que uma pessoa ou equipe apropriada possa investigar as mensagens de erro. Neste tutorial, você usará o utilitário tcpdump para examinar os pacotes capturados.

Para concluir este tutorial, use o Terraform da HashiCorp para criar a VPC, as sub-redes, o balanceador de carga global, o servidor da Web e a VM do coletor. Em seguida, configure manualmente uma política de espelhamento de pacotes e as VMs de coletores associadas para receber tráfego espelhado. Por fim, você configura o Cloud Logging, o Cloud Functions e o Pub/Sub para acionar o espelhamento de pacotes.

Este tutorial mostra o que é possível quando você usa um código de mensagem de erro (HTTP 500) para acionar um evento, mas é possível personalizar essa solução para outros casos de uso e ambientes. Por exemplo, talvez você queira acionar a geração de registros para poder examinar padrões (como um padrão regex específico) ou métricas de aplicativo (como uso de CPU e memória).

Para mais informações sobre como configurar o Cloud Monitoring e o Cloud Logging, consulte a documentação do Cloud Logging e do Cloud Monitoring.

Objetivos

  • Implantar um ambiente básico usando o Terraform
  • Configurar a infraestrutura de espelhamento de pacotes.
  • Acionar uma mensagem de erro de aplicativo.
  • Conferir se o espelhamento de pacotes está ativado.
  • Mostrar uma captura de pacote nas instâncias do coletor do Compute Engine.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.

Antes de começar

  1. No Console do Cloud, ative o Cloud Shell.

    Ativar o Cloud Shell

    Você conclui a maior parte deste tutorial a partir do terminal do Cloud Shell usando o Terraform e o SDK do Cloud.

  2. No Cloud Shell, altere o diretório de trabalho local e clone o repositório do GitHub:

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

    O repositório contém todos os arquivos necessários para concluir este tutorial. Para uma descrição completa de cada arquivo, consulte o arquivo README.md no repositório.

  3. Torne executáveis todos os scripts de shell:

    cd $HOME/packetMirror
    sudo chmod 755 *.sh
    
  4. Verifique se a conta de usuário usada neste tutorial tem as permissões de gerenciamento de identidade e acesso (IAM, na sigla em inglês) necessárias para concluir o tutorial.

Como preparar o ambiente

Nesta seção, você configura suas variáveis de ambiente e implanta a infraestrutura de suporte.

Configurar o Terraform

  1. Instale o Terraform seguindo as etapas na documentação do HashiCorp (em inglês).
  2. No Cloud Shell, inicialize o Terraform:

    terraform init
    

    A resposta será semelhante a:

    ...
    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!
    ...
    

Definir as variáveis de ambiente

  1. Se sua conta de usuário do Google Cloud fizer parte de uma organização do Google Cloud, execute os seguintes comandos no Cloud Shell:

    1. Defina a variável TF_VAR_org_id como o nome da sua organização do Google Cloud:

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

      Substitua YOUR_ORGANIZATION_NAME pelo nome da organização do Google Cloud que você quer usar neste tutorial.

    2. Adicione a variável Terraform org_id ao recurso do projeto:

      sed -i "s/#org_id          = var.org_id/org_id          = var.org_id/" main.tf
      
    3. Verifique se você definiu a variável de ambiente corretamente:

      echo $TF_VAR_org_id
      

      A saída é uma lista com o ID numérico da organização, em um formato semelhante a este:

      ...
      123123123123
      ...
      
  2. Defina o nome da conta de faturamento:

    1. Liste suas contas de faturamento ativas:

      gcloud beta billing accounts list
      

      Copie o nome da conta de faturamento que você quer usar no tutorial. Você precisará desse nome na próxima etapa.

    2. Defina a variável de ambiente da conta de faturamento:

      TF_VAR_billing_name="YOUR_BILLING_ACCOUNT_NAME"
      export TF_VAR_billing_name
      

      Substitua YOUR_BILLING_ACCOUNT_NAME pelo nome da conta de faturamento que você copiou na etapa anterior.

  3. Defina as variáveis de ambiente restantes:

    source $HOME/packetMirror/set_variables.sh
    
  4. Verifique se você definiu as variáveis de ambiente corretamente:

    env | grep TF_
    

    A resposta será semelhante a:

    ...
    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
    ...
    

    Nesta saída:

    • YOUR_REGION: a região do seu projeto do Google Cloud, por exemplo, us-west1.
    • YOUR_USER_ACCOUNT: o ID da conta. Por exemplo, user@example.
    • YOUR_PROJECT_ID: o ID do projeto do Cloud
    • YOUR_ZONE: a zona do projeto do Cloud. Por exemplo, us-west1-b.
  5. Se a variável TF_VAR_billing_account não estiver definida corretamente, no Console do Cloud, acesse a página Visão geral da conta de faturamento da página Gerenciar contas de faturamento, copie o número do ID da conta de faturamento e defina a seguinte variável de ambiente:

    export TF_VAR_billing_account=BILLING_ACCOUNT_ID
    

    Substitua BILLING_ACCOUNT_ID pelo número do ID da conta que você copiou anteriormente nesta etapa.

  6. Crie um arquivo de variável de ambiente:

    $HOME/packetMirror/saveVars.sh
    

    Esse comando redireciona as variáveis de ambiente que você criou para um arquivo chamado TF_ENV_VARS. Cada variável é precedida pelo comando export. Se sua sessão do Cloud Shell for encerrada, use esse arquivo para redefinir as variáveis. Essas variáveis são usadas pelos scripts do Terraform, do Cloud Shell e pela ferramenta de linha de comando gcloud.

    Se você precisar reinicializar as variáveis posteriormente, execute o seguinte comando:

    source $HOME/packetMirror/TF_ENV_VARS
    

Implantar a infraestrutura base

  1. No Cloud Shell, implante a infraestrutura de suporte do Terraform:

    cd $HOME/packetMirror
    terraform apply
    
  2. Quando solicitado, digite yes para aplicar uma das configurações.

    O comando terraform apply instrui o Terraform para implantar o projeto, redes, sub-redes, balanceador de carga global e servidores da Web. Para entender como a infraestrutura é declarativamente definida, leia os manifestos do Terraform (arquivos que têm a extensão .tf).

    O Terraform pode levar vários minutos para implantar os componentes. Os seguintes objetos são criados:

    • VPC
    • Regras de firewall
    • Sub-redes
    • Modelo de instância para servidor da Web
    • Grupo de instâncias gerenciadas para servidores da Web
    • Grupo de instâncias não gerenciadas para VMs do coletor
    • Cloud NAT
    • Balanceador de carga global e verificações de integridade associadas

    É possível navegar pelo projeto para ver esses itens por meio do Console do Cloud ou usando comandos gcloud.

Como criar recursos de espelhamento de pacotes

Nas etapas a seguir, você cria e verifica a infraestrutura de espelhamento de pacotes.

Criar recursos de balanceamento de carga interno do coletor

  • No Cloud Shell, crie o serviço de back-end e a regra de encaminhamento:

    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
    

    A resposta será semelhante a:

    ...
    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].
    ...
    

Criar e desativar a política de espelhamento de pacotes

  1. No Cloud Shell, crie e desative uma política de espelhamento de pacotes:

    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"
    

    A resposta será semelhante a:

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

    A política de espelhamento de pacotes é ativada por padrão. Nesta etapa, você desativa a política porque quer que o espelhamento de pacotes seja desativado até que o Cloud Logging detecte um problema.

Criar automação para acionar o espelhamento de pacotes

  1. No Cloud Shell, crie o tópico do Pub/Sub usado para o coletor do Cloud Logging:

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

    A resposta será semelhante a:

    ...
    Created topic [projects/pm-pid-1357261223/topics/stackdriver_logging].
    ...
    
  2. Crie um coletor do 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
    

    O coletor do Cloud Logging filtra os códigos de status HTTP globais no intervalo 500 (como 500, 501 ou 502) e envia os eventos para o tópico do Pub/Sub.

    A resposta será semelhante a:

    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
    

    Copie o valor serviceAccount da saída. Ele será necessário na próxima etapa.

  3. Conceda à conta de serviço o papel de IAM do editor do 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
    

    Substitua UPDATE_ACCOUNT pelo valor de serviceAccount da etapa anterior.

    A resposta será semelhante a:

    ...
    Updated IAM policy for topic [stackdriver_logging].
    bindings:
    - members:
      - serviceAccount:UPDATE_ACCOUNT
      role: roles/pubsub.publisher
    etag: notuCRmpoyI=
    version: 1
    ...
    
  4. Atualize o arquivo 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
    

    O arquivo main.py no repositório contém a função packet_mirror_pubsub que você usará para criar a Função do Cloud. Antes de criar a Função do Cloud, o comando anterior atualiza as informações de ID, região e rede do projeto do Google Cloud no arquivo Python.

  5. Crie a Função do Cloud:

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

    Se o seguinte aviso aparecer, digite N:

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

    A resposta será semelhante a:

    ...
    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
    ...
    

    A implantação da Função do Cloud pode levar vários minutos para ser concluída.

  6. Se você receber um erro, faça o seguinte:

    • Se você receber um erro sobre a ativação da API Cloud Build, ative a API:

      gcloud services enable cloudbuild.googleapis.com
      

      Repita a etapa 5.

    • Se você receber uma mensagem de erro sobre acesso ao Cloud Storage, repita a etapa 5. Esse erro pode ocorrer quando você executa os comandos em sucessão rápida.

Como verificar a solução

Nas etapas a seguir, você acionará e verificará a solução.

  1. No Cloud Shell, valide a nova assinatura do Pub/Sub:

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

    A resposta será semelhante a:

    ...
    ---
    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. Faça login na VM do coletor:

    gcloud compute ssh collector \
        --tunnel-through-iap \
        --project="$TF_VAR_pid" \
        --zone="$TF_VAR_zone"
    
  3. Depois de fazer login na VM do coletor, instale e ative o utilitário tcpdump:

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

    A resposta será semelhante a:

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

    Deixe esta sessão do Cloud Shell aberta.

  4. Abra uma nova janela de terminal do Cloud Shell e acione a Função do Cloud gerando um erro 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
    

    A resposta será semelhante a:

    <!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. Retorne à sessão do Cloud Shell da VM do coletor e observe a saída do comando tcpdump. A VM do coletor está recebendo tráfego, que é a sondagem de verificação de integridade nas instâncias do servidor da Web.

    A resposta será semelhante a:

    ...
    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 interromper a saída do comando tcpdump, pressione Control+C.

  7. Digite exit para sair da VM do coletor.

  8. No Cloud Shell, verifique os registros para confirmar se a Função do Cloud foi executada:

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

    A resposta será semelhante a:

    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'
    

    Os registros mostram que o espelhamento de pacotes foi acionado com base no código de erro HTTP 500 gerado pelas instâncias do servidor da Web.

  9. Valide o estado do recurso de espelhamento de pacotes:

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

    A saída será assim:

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

Limpeza

Para evitar cobranças dos recursos usados neste tutorial na sua conta do Google Cloud, siga estas etapas.

Excluir a infraestrutura

  1. No Cloud Shell, remova os recursos de automação:

    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. Destrua todos os componentes do tutorial:

    pushd $HOME/packetMirror
    terraform destroy
    popd
    

    Quando solicitado, digite yes para destruir a configuração.

  3. Remova o repositório Git:

    rm -rf $HOME/packetMirror
    

A seguir