アプリケーション モニタリングの自動起動パケット ミラーリング

このチュートリアルでは、Cloud LoggingPub/SubCloud Functions を使用して、パケット ミラーリングを自動的に有効にすることで、Virtual Private Cloud(VPC)ネットワークのトラフィック フローのモニタリングとトラブルシューティングを行う方法を説明します。このチュートリアルは、ネットワーク チーム、セキュリティ チーム、DevOps チームを対象とし、Cloud Logging、Pub/Sub、Cloud Functions、パケット ミラーリング、Compute Engine、Terraform を十分に理解していることを前提としています。

はじめに

パケット ミラーリングは、VPC トラフィック フローをリアルタイムでモニタリングできる機能です。パケット ミラーリングを使用すると、DevOps チームは、エラー メッセージを生成するパフォーマンスの低下やトラフィックのトラブルシューティングを行うことができます。また、セキュリティを重視している組織では、不正な可能性があるトラフィック パターンを監視して対処できます。多くの組織は、脅威の検出と軽減のため侵入検知システム(IDS)とパケット ミラーリングを使用しています。

パケット ミラーリングでは、すべての上り(内向き)トラフィックと下り(外向き)トラフィック、パケット(ペイロード、ヘッダーなど)をキャプチャし、これをエクスポートすることで、完全なネットワーク可視性をもたらします。帯域外でミラーリングされたトラフィックをセキュリティとモニタリングのアプライアンスに送信すると、脅威の検出、ネットワーク パフォーマンスのモニタリング、アプリケーションのトラブルシューティングに役立ちます。

パケット ミラーリングは、サブネット レベル、ネットワーク タグ、特定の VPC インスタンスに対して有効にできます。パケット ミラーリングは継続して行うことも、事前定義のトリガーで有効と無効を切り替えることもできます。

このチュートリアルでは、次の図のようなアーキテクチャを構成します。

インターネット トラフィックは、グローバル ロードバランサからパケット ミラーリング VPC に転送されます。

このアーキテクチャには、次のワークフローがあります。

  1. 無効なリクエストがロードバランサに送信され、ウェブサーバーからの HTTP 500 Internal Server Error ステータス コードがトリガーされます。
  2. Cloud Monitoring によりイベントが生成され、Cloud Logging によりエラー メッセージがログに記録されます。
  3. Cloud Monitoring のシンクとして構成された Pub/Sub がエラー メッセージを受け取ります。
  4. Cloud Monitoring がイベントを Pub/Sub に push します。これにより、Cloud Functions がトリガーされ、パケット ミラーリングが有効になります。
  5. パケット ミラーリングが有効になり、トラフィックはコレクタ VM にミラーリングされます。これにより、適切な担当者またはチームがエラー メッセージを詳しく調査できるようになります。このチュートリアルでは、tcpdump ユーティリティを使用してキャプチャされたパケットを確認します。

このチュートリアルでは、HashiCorp の Terraform を使用して VPC、サブネット、グローバル ロードバランサ、ウェブサーバー、コレクタ VM を作成します。次に、ミラーリング トラフィックを受信するようにパケット ミラーリング ポリシーと、関連するコレクタ VM を手動で構成します。最後に、Packet Mirroring をトリガーするように Cloud Logging、Cloud Functions、Pub/Sub を構成します。

このチュートリアルでは、エラー メッセージ コード(HTTP 500)を使用してイベントをトリガーする方法を紹介していますが、このソリューションは他のユースケースや環境に合わせてカスタマイズできます。たとえば、特定のパターン(特定の正規表現パターンなど)やアプリケーションの指標(CPU やメモリの使用状況など)を確認するために、ロギングをトリガーできます。

Cloud Monitoring と Cloud Logging の構成方法については、Cloud LoggingCloud Monitoring のドキュメントをご覧ください。

目標

  • Terraform を使用して基本環境をデプロイする。
  • パケット ミラーリング インフラストラクチャを構成する。
  • アプリケーションのエラー メッセージをトリガーする。
  • パケット ミラーリングが有効になっていることを確認する。
  • コレクタ Compute Engine インスタンスのパケット キャプチャを表示する。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Cloud Console で、Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

    このチュートリアルのほとんどの操作は Cloud Shell ターミナルから実行し、Terraform と Cloud SDK を使用します。

  2. Cloud Shell で、ローカル作業ディレクトリを変更して、GitHub リポジトリのクローンを作成します。

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

    このリポジトリには、チュートリアルで必要なすべてのファイルが含まれています。各ファイルの詳細については、リポジトリ内の README.md ファイルをご覧ください。

  3. すべてのシェル スクリプトを実行可能にします。

    cd $HOME/packetMirror
    sudo chmod 755 *.sh
    
  4. このチュートリアルで使用するユーザー アカウントに、チュートリアルを完了するために必要な Identity and Access Management(IAM)権限があることを確認します。

環境の準備

このセクションでは、環境変数を設定し、サポート インフラストラクチャをデプロイします。

Terraform を設定する

  1. HashiCorp ドキュメントの手順に沿って Terraform をインストールします。
  2. Cloud Shell で Terraform を初期化します。

    terraform init
    

    出力は次のようになります。

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

環境変数を設定する

  1. Google Cloud ユーザー アカウントが Google Cloud 組織の一部である場合は、Cloud Shell で次のコマンドを実行します。

    1. TF_VAR_org_id 変数を Google Cloud 組織の名前に設定します。

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

      YOUR_ORGANIZATION_NAME は、このチュートリアルで使用する Google Cloud 組織名に置き換えます。

    2. Terraform 変数 org_id をプロジェクト リソースに追加します。

      sed -i "s/#org_id          = var.org_id/org_id          = var.org_id/" main.tf
      
    3. 環境変数が正しく設定されていることを確認します。

      echo $TF_VAR_org_id
      

      出力には、次のように組織 ID が数値で表示されます。

      ...
      123123123123
      ...
      
  2. 請求先アカウント名を設定します。

    1. 有効な請求先アカウントを一覧表示します。

      gcloud beta billing accounts list
      

      このチュートリアルで使用する請求先アカウントの名前をコピーします。この名前は次のステップで必要になります。

    2. 請求先アカウントの環境変数を設定します。

      TF_VAR_billing_name="YOUR_BILLING_ACCOUNT_NAME"
      export TF_VAR_billing_name
      

      YOUR_BILLING_ACCOUNT_NAME は、前の手順でコピーした請求先アカウント名に置き換えます。

  3. 残りの環境変数を設定します。

    source $HOME/packetMirror/set_variables.sh
    
  4. 環境変数が正しく設定されていることを確認します。

    env | grep TF_
    

    出力は次のようになります。

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

    この出力で:

    • YOUR_REGION: Google Cloud プロジェクトのリージョン(例: us-west1
    • YOUR_USER_ACCOUNT: アカウント ID(例: user@example
    • YOUR_PROJECT_ID: 実際の Cloud プロジェクトの ID
    • YOUR_ZONE: Cloud プロジェクトのゾーン(例: us-west1-b
  5. Cloud Console に TF_VAR_billing_account 変数が正しく設定されていない場合は、[請求先アカウントの管理] ページから [請求先アカウントの概要] ページに移動し、請求先アカウント ID 番号をコピーして、次の環境変数を設定します。

    export TF_VAR_billing_account=BILLING_ACCOUNT_ID
    

    BILLING_ACCOUNT_ID は、前のステップでコピーしたアカウント ID 番号に置き換えます。

  6. 環境変数ファイルを作成します。

    $HOME/packetMirror/saveVars.sh
    

    このコマンドを実行すると、作成した環境変数が TF_ENV_VARS というファイルに保存されます。各変数の先頭に export コマンドが追加されます。Cloud Shell セッションが終了したら、このファイルを使用して変数をリセットできます。これらの変数は、Terraform スクリプト、Cloud Shell スクリプト、gcloud コマンドライン ツールで使用されます。

    後で変数を再初期化する場合は、次のコマンドを実行します。

    source $HOME/packetMirror/TF_ENV_VARS
    

ベース インフラストラクチャのデプロイ

  1. Cloud Shell で、Terraform サポート インフラストラクチャをデプロイします。

    cd $HOME/packetMirror
    terraform apply
    
  2. メッセージが表示されたら、「yes」と入力して、いずれかの構成を適用します。

    terraform apply コマンドは、プロジェクト、ネットワーク、サブネットワーク、グローバル ロードバランサ、ウェブサーバーをデプロイするように Terraform に指示します。Terraform マニフェスト(拡張子が .tf のファイル)を見ると、インフラストラクチャがどのように定義されているのかを確認できます。

    Terraform によるリソースのデプロイに数分かかる場合があります。次のオブジェクトが作成されます。

    • VPC
    • ファイアウォール ルール
    • サブネット
    • ウェブサーバーのインスタンス テンプレート
    • ウェブサーバーのマネージド インスタンス グループ
    • コレクタ VM の非マネージド インスタンス グループ
    • Cloud NAT
    • グローバル ロードバランサとそれに関連するヘルスチェック

    これらの項目を確認するには、Cloud Console または gcloud コマンドを使用します。

パケット ミラーリング リソースの作成

次の手順でパケット ミラーリング インフラストラクチャを作成して、検証します。

コレクタの内部負荷分散リソースを作成する

  • Cloud Shell で、バックエンド サービスと転送ルールを作成します。

    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
    

    出力は次のようになります。

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

パケット ミラーリング ポリシーを作成して無効にする

  1. Cloud Shell で、パケット ミラーリング ポリシーを作成して無効にします。

    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"
    

    出力は次のようになります。

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

    デフォルトでは、パケット ミラーリング ポリシーは有効になっています。この手順では、Cloud Logging が問題を検出するまでパケット ミラーリングを行わないようにするため、このポリシーを無効にします。

パケット ミラーリングのトリガーを自動化する

  1. Cloud Shell で、Cloud Logging シンクに使用する Pub/Sub トピックを作成します。

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

    出力は次のようになります。

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

    Cloud Logging シンクは、500 番台のグローバル HTTP ステータス コード(500501502 など)をフィルタリングし、イベントを Pub/Sub トピックに送信します。

    出力は次のようになります。

    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
    

    出力から serviceAccount の値をコピーします。この値は次のステップで必要になります。

  3. サービス アカウントに Pub/Sub パブリッシャー IAM ロールroles/pubsub.publisher)を付与します。

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

    UPDATE_ACCOUNT は、前のステップで取得した serviceAccount の値で置き換えます。

    出力は次のようになります。

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

    リポジトリ内の main.py ファイルには、Cloud Functions の関数の作成に使用する packet_mirror_pubsub 関数が含まれています。Cloud Functions の関数を作成する前に、上のコマンドを実行して、Python ファイル内の Google Cloud プロジェクト ID、リージョン、ネットワーク情報を更新します。

  5. Cloud Functions の関数を作成します。

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

    次の警告が表示されたら、「N」と入力します。

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

    出力は次のようになります。

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

    Cloud Functions の関数のデプロイには、数分かかることがあります。

  6. エラーが表示された場合は、次の操作を行います。

    • Cloud Build API の有効化に関するエラーが表示された場合は、API を有効にします。

      gcloud services enable cloudbuild.googleapis.com
      

      ステップ 5 を再試行します。

    • Cloud Storage へのアクセスに関するエラー メッセージが表示された場合は、ステップ 5 を再試行します。このエラーは、コマンドを連続して実行したときに発生することがあります。

ソリューションの確認

次の手順では、ソリューションをトリガーして確認します。

  1. Cloud Shell で、新しい Pub/Sub サブスクリプションを検証します。

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

    出力は次のようになります。

    ...
    ---
    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. コレクタ VM にログインします。

    gcloud compute ssh collector \
        --tunnel-through-iap \
        --project="$TF_VAR_pid" \
        --zone="$TF_VAR_zone"
    
  3. コレクタ VM にログインしたら、tcpdump ユーティリティをインストールして有効にします。

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

    出力は次のようになります。

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

    この Cloud Shell セッションは、開いたままにしておきます。

  4. 新しい Cloud Shell ターミナル ウィンドウを開き、HTTP 500 エラーを生成して Cloud Functions の関数をトリガーします。

    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
    

    出力は次のようになります。

    <!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. コレクタ VM の Cloud Shell セッションに戻り、tcpdump コマンドの出力を確認します。コレクタ VM がトラフィックを受信しています。これは、ウェブサーバー インスタンスでのヘルスチェック プローブです。

    出力は次のようになります。

    ...
    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. tcpdump コマンドの出力を停止するには、Control+C を押します。

  7. exit」と入力して、コレクタ VM を終了します。

  8. Cloud Shell でログを確認し、Cloud Functions の関数が実行されたことを確認します。

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

    出力は次のようになります。

    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'
    

    ログは、ウェブサーバー インスタンスによって生成された HTTP 500 エラーコードに基づいて、パケット ミラーリングがトリガーされたことを示しています。

  9. パケット ミラーリング機能の状態を確認します。

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

    出力は次のようになります。

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

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにする手順は次のとおりです。

インフラストラクチャを削除する

  1. Cloud Shell で自動化リソースを削除します。

    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. このチュートリアルで使用したすべてのコンポーネントを破棄します。

    pushd $HOME/packetMirror
    terraform destroy
    popd
    

    メッセージが表示されたら、「yes」と入力して構成を破棄します。

  3. Git リポジトリを削除します。

    rm -rf $HOME/packetMirror
    

次のステップ