VPC フローログの使用

VPC フローログには、VM インスタンスによって送受信されたネットワーク フローのサンプルが記録されます。これには GKE ノードとして使用されるインスタンスも含まれます。このログは、ネットワーク モニタリング、フォレンジック、リアルタイム セキュリティ分析、費用の最適化に使用できます。

このページは、VPC フローログの概要で説明されているコンセプトを理解していることを前提としています。

VPC フローログの有効化

VPC フローログを有効にすると、サブネット内のすべての VM に対して有効にすることになります。ただし、Logging に書き込まれる情報の量は削減されます。制御できるパラメータの詳細については、ログのサンプリングと集計をご覧ください。

サブネット作成時の VPC フローログの有効化

Console

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. サブネットを追加するネットワークをクリックします。
  3. [サブネットを追加] をクリックします。
  4. [フローログ] で [オン] を選択します。
  5. ログのサンプリングと集計を調整する場合は、[ログを構成] をクリックして次のいずれかを調整します。
    • 集計間隔
    • 最終ログエントリにメタデータを含めるかどうか
      デフォルトでは、[メタデータを含める] によって特定のフィールドのみが含まれるように処理されます。詳細については、メタデータ フィールドのカスタマイズをご覧ください。メタデータ フィールドをカスタマイズするには、gcloud コマンドライン インターフェースまたは API を使用する必要があります。
    • サンプルレート 100% はすべてのエントリが保持されることを意味します。
  6. 必要に応じて他のフィールドに値を入力します。
  7. [追加] をクリックします。

gcloud

gcloud compute networks subnets create subnet-name \
    --enable-flow-logs \
    [--logging-aggregation-interval=aggregation-interval \
    [--logging-flow-sampling=0.0...1.0] \
    [--logging-filter-expr=expression] \
    [--logging-metadata=(include-all | exclude-all | custom)] \
    [--logging-metadata-fields=fields] \
    [other flags as needed]

ここで

  • --logging-aggregation-interval=aggregation-interval は、そのサブネットのフローログの集計間隔を設定します。間隔は、5 秒(デフォルト)、30 秒、1 分、5 分、10 分、15 分のいずれかに設定できます。
  • --logging-flow-sampling はフロー サンプリング レートです。フロー サンプリングは、0.0(サンプリングなし)から 1.0(すべてのログ)まで設定できます。デフォルトは 0.5 です。
  • --logging-filter-expr=expression は、ログ コレクションを式に一致するログのみに制限します。詳細については、ログのフィルタリングをご覧ください。
  • --logging-metadata=(include-all | exclude-all | custom) は、レコードのメタデータ アノテーションをオンまたはオフにするか、custom に設定します。custom に設定した場合は、--logging-metadata-fields も指定します。デフォルトは include-all です。注: include-all にはすべてのフィールドが含まれているわけではありません。詳細については、メタデータ フィールドのカスタマイズをご覧ください。
  • --logging-metadata-fields は、ログに含めるメタデータ フィールドのカンマ区切りのリストです(例: --logging-metadata-fields=src_instance,dst_instance)。--logging-metadata=custom の場合にのみ設定できます。

API

新しいサブネットの作成時に VPC フローログを有効にします。

POST https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks
{
  "logConfig": {
    "aggregationInterval": "aggregation-interval",
    "flowSampling": sampling-rate,
    "filterExpr": expression,
    "metadata": metadata-setting,
    "metadataFields": metadata-fields,
    "enable": true
  },
  "ipCidrRange": "ip-range",
  "network": "network-url",
  "name": "subnet-name"
}

プレースホルダを有効な値に置き換えます。

  • project-id は、サブネットが作成されるプロジェクトの ID です。
  • region は、サブネットが作成されるリージョンです。
  • aggregation-interval は、サブネット内のフローログの集計間隔を設定します。間隔は次のいずれかに設定できます。INTERVAL_5_SECINTERVAL_30_SECINTERVAL_1_MININTERVAL_5_MININTERVAL_10_MININTERVAL_15_MIN
  • sampling-rate はフロー サンプリング レートです。フロー サンプリングは、0.0(サンプリングなし)から 1.0(すべてのログ)まで設定できます。デフォルトは .0.5 です。
  • expression は、実際に書き込まれるログをフィルタリングするために使用するフィルタ式です。詳細については、ログのフィルタリングをご覧ください。
  • metadata-setting により、すべてのメタデータがログに記録されるか(INCLUDE_ALL_METADATA)、メタデータが記録されない(EXCLUDE_ALL_METADATA)か、特定のメタデータのみがログに記録されるか(CUSTOM_METADATA)を指定します。このフィールドが CUSTOM_METADATA に設定されている場合は、metadataFields フィールドも設定します。INCLUDE_ALL_METADATA にはすべてのフィールドが含まれているわけではありません。詳細については、メタデータ フィールドのカスタマイズをご覧ください。
  • metadata-fields は、metadata: CUSTOM_METADATA を設定した場合に取得するメタデータ フィールドです。これは、src_instance, src_vpc.project_id などのメタデータ フィールドのカンマ区切りのリストです。
  • ip-range は、サブネットのプライマリ内部 IP アドレスの範囲です。
  • network-url は、サブネットが作成される VPC ネットワーク URL です。
  • subnet-name はサブネットの名前です。

詳細については、subnetworks.insert メソッドをご覧ください。

既存のサブネットの VPC フローログの有効化

Console

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. 更新するサブネットをクリックします。
  3. [編集] をクリックします。
  4. [フローログ] で [オン] を選択します。
  5. ログのサンプリングと集計を調整する場合は、[ログを構成] をクリックして次のいずれかを調整します。
    • 集計間隔
    • 最終ログエントリにメタデータを含めるかどうか
      デフォルトでは、[メタデータを含める] によって特定のフィールドのみが含まれるように処理されます。詳細については、メタデータ フィールドのカスタマイズをご覧ください。メタデータ フィールドをカスタマイズするには、gcloud コマンドライン インターフェースまたは API を使用する必要があります。
    • サンプルレート 100% はすべてのエントリが保持されることを意味します。
  6. [保存] をクリックします。

gcloud

gcloud compute networks subnets update subnet-name \
    --enable-flow-logs \
    [--logging-aggregation-interval=aggregation-interval] \
    [--logging-flow-sampling=0.0...1.0] \
    [--logging-filter-expr=expression] \
    [--logging-metadata=(include-all | exclude-all | custom)] \
    [--logging-metadata-fields=fields]

ここで

  • --logging-aggregation-interval=aggregation-interval は、そのサブネットのフローログの集計間隔を設定します。間隔は、5 秒(デフォルト)、30 秒、1 分、5 分、10 分、15 分のいずれかに設定できます。
  • --logging-flow-sampling はフロー サンプリング レートです。フロー サンプリングは、0.0(サンプリングなし)から 1.0(すべてのログ)まで設定できます。デフォルトは .0.5 です。
  • --logging-filter-expr=expression は、ログ コレクションを式に一致するログのみに制限します。詳細については、ログのフィルタリングをご覧ください。
  • --logging-metadata=(include-all | exclude-all | custom) は、レコードのメタデータ アノテーションをオンまたはオフにするか、custom に設定します。custom に設定した場合は、--logging-metadata-fields も指定します。デフォルトはオンです。注: include-all には GKE アノテーションは含まれません。GKE アノテーションを表示するには、[custom] を選択してアノテーションを指定します。
  • --logging-metadata-fields は、ログに含めるメタデータ フィールドのカンマ区切りのリストです(例: --logging-metadata-fields=src_instance,dst_instance)。--logging-metadata=custom の場合にのみ設定できます。

API

既存のサブネットの VPC フローログを有効にします。

PATCH https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks/subnet-name
{
  "logConfig": {
    "enable": true
    ...other logging fields.
  },
  "fingerprint": "SUBNETWORK_FINGERPRINT"
}

プレースホルダを有効な値に置き換えます。

  • project-id は、サブネットが配置されているプロジェクトの ID です。
  • region は、サブネットが存在するリージョンです。
  • subnet-name は既存のサブネットの名前です。
  • SUBNET_FINGERPRINT は、既存のサブネットのフィンガー プリント ID です。サブネットを記述するときに指定します。
  • 他のロギング フィールドについては、サブネット作成時の VPC フローログの有効化を参照してください。

詳細については、subnetworks.patch メソッドをご覧ください。

既存のサブネットの推定ログボリュームの表示

Google Cloud Console では、既存のサブネットのログボリュームを推定することにより、フローログを有効にする費用を見積もることができます。この推定値は、過去 7 日にわたり各サブネットで 5 秒間隔で取得されたフローに基づきます。また、各ログのサイズは、メタデータ アノテーションを有効にするかどうかによって異なります。

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. 費用を推定するサブネットをクリックします。
  3. [編集] をクリックします。
  4. [フローログ] で [オン] を選択します。
  5. [ログを構成] をクリックします。
  6. [1 日あたりの生成ログの推定数] で、推定値を確認します。
  7. 変更が保存されないように [キャンセル] をクリックします。

VPC フローログが有効になっているサブネットの表示

VPC フローログが有効になっているネットワーク内のサブネットを確認できます。

Console

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. [フローログ] 列を表示して、Logging がオンかオフかを確認します。

gcloud

gcloud compute networks subnets list \
    --project project-id \
    --filter="network=network-url" \
    --format="csv(name,logConfig.enable)"

ここで

  • project-id は、クエリするプロジェクトの ID です。
  • network-url は、サブネットを含むネットワークの完全修飾ドメイン名です。

VPC フローロギング パラメータの更新

ログ サンプリング パラメータを変更できます。制御できるパラメータの詳細については、ログのサンプリングと集計をご覧ください。

Console

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. 更新するサブネットをクリックします。
  3. [編集] をクリックします。
  4. ログのサンプリングと集計を調整するには、[ログを構成] をクリックします。
    • 集計間隔
    • 最終ログエントリにメタデータを含めるかどうか
      デフォルトでは、[メタデータを含める] によって特定のフィールドのみが含まれるように処理されます。詳細については、メタデータ フィールドのカスタマイズをご覧ください。メタデータ フィールドをカスタマイズするには、gcloud コマンドライン インターフェースまたは API を使用する必要があります。
    • サンプルレート 100% はすべてのエントリが保持されることを意味します。
  5. [保存] をクリックします。

gcloud

gcloud compute networks subnets update subnet-name \
    [--logging-aggregation-interval=aggregation-interval] \
    [--logging-flow-sampling=0.0...1.0] \
    [--logging-filter-expr=expression] \
    [--logging-metadata=(include-all | exclude-all | custom)] \
    [--logging-metadata-fields=fields]

ここで

  • --logging-aggregation-interval=aggregation-interval は、そのサブネットのフローログの集計間隔を設定します。間隔は、5 秒(デフォルト)、30 秒、1 分、5 分、10 分、15 分のいずれかに設定できます。
  • --logging-flow-sampling はフロー サンプリング レートです。フロー サンプリングは、0.0(サンプリングなし)から 1.0(すべてのログ)まで設定できます。デフォルトは .0.5 です。
  • --logging-filter-expr=expression は、ログ コレクションを式に一致するログのみに制限します。詳細については、ログのフィルタリングをご覧ください。
  • --logging-metadata=(include-all | exclude-all | custom) は、レコードのメタデータ アノテーションをオンまたはオフにするか、custom に設定します。custom に設定した場合は、--logging-metadata-fields も指定します。デフォルトはオンです。注: include-all には GKE アノテーションは含まれません。GKE アノテーションを表示するには、[custom] を選択してアノテーションを指定します。
  • --logging-metadata-fields は、ログに含めるメタデータ フィールドのカンマ区切りのリストです(例: --logging-metadata-fields=src_instance,dst_instance)。--logging-metadata=custom の場合にのみ設定できます。

API

ログ サンプリング フィールドを変更して、VPC フローログの動作を更新します。

PATCH https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks/subnet-name
{
  "logConfig": {
    ...fields to modify
  },
  "fingerprint": "SUBNETWORK_FINGERPRINT"
}

プレースホルダを有効な値に置き換えます。

  • project-id は、サブネットが配置されているプロジェクトの ID です。
  • region は、サブネットが存在するリージョンです。
  • subnet-name は既存のサブネットの名前です。
  • SUBNET_FINGERPRINT は、既存のサブネットのフィンガー プリント ID です。サブネットを記述するときに指定します。
  • 変更可能なフィールドについては、サブネット作成時の VPC フローログの有効化を参照してください。

詳細については、subnetworks.patch メソッドをご覧ください。

サブネットの VPC フローログの無効化

Console

  1. Google Cloud Console で [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. 更新するサブネットをクリックします。
  3. [編集] をクリックします。
  4. [フローログ] で [オフ] を選択します。
  5. [保存] をクリックします。

gcloud

gcloud compute networks subnets update subnet-name \
    --no-enable-flow-logs

API

ログレコードの収集を停止するには、サブネットの VPC フローログを無効にします。

PATCH https://www.googleapis.com/compute/v1/projects/project-id/regions/region/subnetworks/subnet-name
{
  "logConfig": {
    "enable": false
  },
  "fingerprint": "SUBNETWORK_FINGERPRINT"
}

プレースホルダを有効な値に置き換えます。

  • project-id は、サブネットが配置されているプロジェクトの ID です。
  • region は、サブネットが存在するリージョンです。
  • subnet-name は既存のサブネットの名前です。
  • SUBNET_FINGERPRINT は、既存のサブネットのフィンガー プリント ID です。サブネットを記述するときに指定します。

詳細については、subnetworks.patch メソッドをご覧ください。

Logging を使用するログへのアクセス

IAM の構成

Logging のアクセス制御ガイドの手順に従って操作します。

[ログビューア] ページからログを表示します。

これらのコマンドには、プロジェクトのプロジェクト ID が必要です。

すべてのフローログへのアクセス

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. 最初のプルダウン メニューで [サブネットワーク] を選択します。
  3. 2 番目のプルダウン メニューで compute.googleapis.com/vpc_flows を選択します。
  4. [OK] をクリックします。

別の方法:

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。
  3. フィールドに以下を貼り付けます。project-id は実際のプロジェクト ID に置き換えます。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    
  4. [フィルタを送信] をクリックします。

特定のサブネットのログへのアクセス

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. 最初のプルダウン メニューでカーソルを [サブネットワーク] に移します。カーソルをさらに右側に進めてそれぞれのサブネット選択メニューを開きます。
  3. 2 番目のプルダウン メニューで compute.googleapis.com/vpc_flows を選択します。
  4. [OK] をクリックします。

別の方法:

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。
  3. フィールドに以下を貼り付けます。project-id をプロジェクト ID に、subnet-name をサブネットワークに置き換えます。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    resource.labels.subnetwork_name="subnet-name"
    
  4. [フィルタを送信] をクリックします。

特定の VM のログに対するアクセス

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。
  3. フィールドに以下を貼り付けます。project-id をプロジェクト ID に、VM_NAME を VM に置き換えます。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.src_instance.vm_name="VM_NAME"
    
  4. [フィルタを送信] をクリックします。

特定のサブネット範囲へのトラフィックのログに対するアクセス

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。
  3. フィールドに以下を貼り付けます。project-id をプロジェクト ID に、subnet-range を CIDR 範囲(192.168.1.0/24)に置き換えます。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    ip_in_net(jsonPayload.connection.dest_ip, subnet-range)
    
  4. [フィルタを送信] をクリックします。

特定の GKE クラスタのログに対するアクセス

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。
  3. フィールドに以下を貼り付けます。project-id をプロジェクト ID に、subnet-name をサブネットワークに置き換えます。
    resource.type="gce_subnetwork"
    logName="projects/{#project_id}/logs/vpc_flows"
    jsonPayload.src_gke_details.cluster.cluster_name="{#cluster_name}" OR jsonPayload.dest_gke_details.cluster.cluster_name="{#cluster_name}"
    
  4. [フィルタを送信] をクリックします。

特定のポートとプロトコルのログへのアクセス

個別の宛先ポートの場合

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。
  3. フィールドに以下を貼り付けます。project-id をプロジェクト ID に、PORT を宛先ポートに、PROTOCOL をプロトコルに置き換えます。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.dest_port=PORT
    jsonPayload.connection.protocol=PROTOCOL
    
  4. [フィルタを送信] をクリックします。

複数の宛先ポートの場合

  1. Google Cloud Console の [ログ] ページに移動します。
    [ログ] ページに移動
  2. [ラベルまたはテキスト検索でフィルタ] フィールドの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。
  3. フィールドに以下を貼り付けます。project-id をプロジェクト ID に、PORT1PORT2 を宛先ポートに、PROTOCOL をプロトコルに置き換えます。
    resource.type="gce_subnetwork"
    logName="projects/project-id/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.dest_port=(PORT1 OR PORT2)
    jsonPayload.connection.protocol=PROTOCOL
    
  4. [フィルタを送信] をクリックします。

BigQuery、Pub/Sub、およびカスタム ターゲットへのログのエクスポート

Logging のフローログは、Logging のドキュメントの説明に沿って任意の宛先にエクスポートできます。フィルタの例については、前のセクションをご覧ください。

トラブルシューティング

Logging で gce_subnetwork リソースの下に vpc_flows が表示されない

  • 指定したサブネットで Logging が有効になっていることを確認します。
  • VPC フローがサポートされるのは VPC ネットワークのみです。レガシー ネットワークを使用している場合、ログは表示されません。
  • 共有 VPC ネットワークでは、ログはホスト プロジェクトでのみ表示され、サービス プロジェクトでは表示されません。ホスト プロジェクトのログを調べていることを確認してください。
  • Logging の除外フィルタは、指定されたログをブロックします。VPC フローログを破棄する除外ルールが存在しないことを確認してください。
    1. [リソースの使用量] に移動します。
    2. [除外] タブをクリックします。
    3. VPC フローログを破棄する除外ルールが存在しないことを確認します。

一部のログで RTT 値またはバイト値が存在しない

  • RTT をキャプチャするのに十分なパケットがサンプリングされなかった場合、RTT の測定値が存在しないことがあります。この現象は、接続が少量である場合に発生する可能性が高くなります。
  • UDP フローでは RTT 値は提供されません。
  • 一部のパケットはペイロードなしで送信されます。ヘッダーのみのパケットがサンプリングされた場合、バイト値は 0 になります。

一部のフローが見つからない

  • サポートされているのは UDP プロトコルと TCP プロトコルのみです。VPC フローログは他のプロトコルをサポートしていません。
  • ログがサンプリングされます。非常に少量のフローでは、一部のパケットが失われる場合があります。

一部のログで GKE アノテーションが見つからない

GKE アノテーションの詳細については、GKE のアノテーションをご覧ください。

  • クラスタで Google Kubernetes Engine Monitoring が有効になっていることを確認します。場合によっては、GKE Monitoring が有効になっていない場合、アノテーションの一部が欠落することがあります。こちらの手順で、クラスタで GKE Monitoring が有効になっているかどうかを確認してください。
  • クラスタで GKE Monitoring が有効になっていても、GKE アノテーションが欠落している場合は、Cloud Console のプロジェクトの API Monitoring ダッシュボードにアクセスして、メタデータの更新を Monitoring に送信するエージェントが正常に更新を送信しているか確認します。API の割り当てを超えたためにエラーが発生することもあります。API の割り当てダッシュボードに移動し、割り当て超過のエラーがないか確認してください。割り当て超過エラーが発生している場合は、割り当ての管理の手順に従って、割り当ての増加をリクエストしてください。

一部の GKE フローのログが見つからない

クラスタでノード内の可視化が有効になっていることを確認してください。有効になっていない場合、同じノード上の Pod 間のフローはログに記録されません。

フローログを有効にした場合でも無効として表示される

  • 内部 HTTP(S) ロードバランサのプロキシ専用サブネットを構成し、gcloud compute networks subnets コマンドを使用して VPC フローログを有効にした場合、コマンドは成功したように見えますが、フローログは実際には有効になりません。--purpose=INTERNAL_HTTPS_LOAD_BALANCER フラグも指定した場合、--enable-flow-logs フラグは有効になりません。

    Cloud Console または API を使用してフローログを有効にすると、「Invalid value for field 'resource.enableFlowLogs': 'true'.Invalid field set in subnetwork with purpose INTERNAL_HTTPS_LOAD_BALANCER.」というエラー メッセージが表示されます。

    プロキシ専用サブネットには VM がないため、VPC フローログはサポートされません。これは想定どおりの挙動です。

料金

Logging、BigQuery、または Pub/Sub の標準料金が適用されます。VPC フローログの料金については、ネットワーク テレメトリーの料金をご覧ください。

次のステップ