VPC フローログのレコードについて

このページでは、使用可能な基本フィールドとメタデータ フィールドなど、VPC フローログのレコード形式について説明します。また、特定の条件に一致するログのみを生成するようにログフィルタを使用する方法についても説明します。

レコードの形式

ログレコードには、各ログレコードのコアフィールドであるベース フィールドと、詳細情報を追加するメタデータ フィールドが含まれています。メタデータ フィールドは、ストレージ費用を節約するために省略できます。

一部のログフィールドはマルチ フィールド形式であり、所定のフィールドに複数のデータが含まれます。たとえば、connection フィールドは IpConnection 形式で、送信元と宛先の IP アドレスとポート、およびプロトコルが 1 つのフィールドに格納されます。これらのマルチフィールドのフィールドについては、レコードの形式に関する表を示した後で説明します。

メタデータ フィールドには次の制限があります。

  • メタデータ フィールドの値はデータプレーン パスに基づくものではなく近似値です。このため、存在しない可能性や不正確な可能性もあります。メタデータ フィールドとは異なり、基本フィールドの値はパケット ヘッダーから直接取得されます。
  • internet_routing_details フィールドでは、自律システム(AS)パスが存在しない場合があります。たとえば、パケットが VPC 内でルーティングされる場合、AS パス情報は含まれません。
フィールド フィールドの形式 フィールド タイプ: 基本またはオプションのメタデータ
connection IpConnection
この接続に関する説明を含む 5 つのタプル。
ベース
reporter string
フローを報告した側。SRCDEST のいずれかになります。
ベース
rtt_msec int64
時間間隔中に測定されたレイテンシ。TCP フローに対してのみ測定されます。測定されたレイテンシは、SEQ を送信してから対応する ACK を受信するまでの経過時間です。レイテンシの結果は、ネットワーク RTT とアプリケーションが消費した時間の合計です。
ベース
bytes_sent int64
送信元から宛先に送信されるバイト数
ベース
packets_sent int64
送信元から宛先に送信されるパケット数
ベース
start_time string
集計対象である時間間隔で最初に観測されるパケットのタイムスタンプ(RFC 3339 の日付文字列形式)。
ベース
end_time string
集計対象である時間間隔で最後に観測されるパケットのタイムスタンプ(RFC 3339 の日付文字列形式)。
ベース
internet_routing_details InternetRoutingDetails
接続が Google Cloud とインターネットの間である場合、このフィールドにはルーティングの詳細が設定されます。下り(外向き)フローの場合にのみ使用できます。
メタデータ
src_gke_details GkeDetails
送信元のエンドポイントの GKE メタデータ。エンドポイントが GKE の場合にのみ使用できます。
メタデータ
dest_gke_details GkeDetails
宛先エンドポイントの GKE メタデータ。エンドポイントが GKE の場合にのみ使用できます。
メタデータ
src_instance InstanceDetails
接続の送信元が同じ VPC 上の VM である場合、このフィールドには VM インスタンスの詳細が入力されます。共有 VPC 構成の場合、project_id はインスタンスを所有するプロジェクト(通常はサービス プロジェクト)に対応します。
メタデータ
dest_instance InstanceDetails
接続の宛先が同じ VPC 上の VM である場合、このフィールドには VM インスタンスの詳細が入力されます。共有 VPC 構成の場合、project_id はインスタンスを所有するプロジェクト(通常はサービス プロジェクト)に対応します。
メタデータ
src_location GeographicDetails
接続の参照元が VPC の外部にある場合、このフィールドには使用可能な場所のメタデータが入力されます。
メタデータ
dest_location GeographicDetails
接続の宛先が VPC の外部にある場合、このフィールドには使用可能な場所のメタデータが入力されます。
メタデータ
src_vpc VpcDetails
接続の参照元が同じ VPC 上の VM である場合、このフィールドには VPC ネットワークの詳細が入力されます。共有 VPC 構成の場合、project_id はホスト プロジェクトの詳細に対応します。
メタデータ
dest_vpc VpcDetails
接続の宛先が同じ VPC 上の VM である場合、このフィールドには VPC ネットワークの詳細が入力されます。共有 VPC 構成の場合、project_id はホスト プロジェクトの詳細に対応します。
メタデータ

IpConnection フィールドの形式

フィールド タイプ 説明
protocol int32 IANA プロトコル番号
src_ip 文字列 送信元 IP アドレス
dest_ip 文字列 宛先 IP アドレス
src_port int32 送信元ポート
dest_port int32 宛先ポート

InternetRoutingDetails フィールドの形式

フィールド タイプ 説明
egress_as_path AsPath 関連する AS パスのリスト。フローで使用できる AS パスが複数ある場合、このフィールドには複数の AS パスが含まれることがあります。

AsPath フィールドの形式

フィールド タイプ 説明
as_details AsDetails AS パス内のすべてのシステムの AS の詳細のリスト。このリストは、Google Cloud のネットワークの外部にある最初の AS から始まり、リモート IP アドレスが属する AS で終わります。

AsDetails フィールドの形式

フィールド タイプ 説明
asn uint32 AS の自律システム番号(ASN)。

GkeDetails フィールドの形式

フィールド タイプ 説明
クラスタ ClusterDetails GKE クラスタ メタデータ
Pod PodDetails トラフィックの送信元または宛先が Pod である場合に入力される GKE Pod のメタデータ。
サービス ServiceDetails Service エンドポイントにのみ入力される GKE Service メタデータ。レコードには最大 2 つの Service が含まれます。関連する Service が 3 つ以上ある場合、このフィールドには特別な MANY_SERVICES マーカーを持つ 1 つの Service が含まれます。

ClusterDetails フィールドの形式

フィールド タイプ 説明
cluster_location 文字列 クラスタのロケーション。ゾーンクラスタかリージョン クラスタかに応じて、ゾーンまたはリージョンになります。
cluster_name 文字列 GKE クラスタ名。

PodDetails フィールドの形式

フィールド タイプ 説明
pod_name 文字列 Pod の名前
pod_namespace 文字列 Pod の Namespace

ServiceDetails フィールドの形式

フィールド タイプ 説明
service_name 文字列 Service の名前。関連する Service が 3 つ以上ある場合、フィールドは特別な MANY_SERVICES マーカーに設定されます。
service_namespace 文字列 Service の名前空間。

例:

2 つのサービスがある場合、[Service] フィールドは次のようになります。

service: [
 0: {
  service_name: "my-lb-service"
  service_namespace: "default"
 }
 1: {
  service_name: "my-lb-service2"
  service_namespace: "default"
 }
]

3 つ以上のサービスがある場合、[Service] フィールドは次のようになります。

service: [
 0: {
  service_name: "MANY_SERVICES"
 }
]

InstanceDetails フィールドの形式

フィールド タイプ 説明
project_id 文字列 VM を含むプロジェクトの ID
region 文字列 VM のリージョン
vm_name 文字列 VM のインスタンス名
zone 文字列 VM のゾーン

GeographicDetails フィールドの形式

フィールド タイプ 説明
asn int32 このエンドポイントが属する外部ネットワークの ASN。
city 文字列 外部エンドポイントの都市
continent 文字列 外部エンドポイントの大陸
country 文字列 外部エンドポイントの国で、ISO 3166-1 Alpha-3 の国コードにより表されます。
region 文字列 外部エンドポイントのリージョン

VpcDetails フィールドの形式

フィールド タイプ 説明
project_id 文字列 VPC を含むプロジェクトの ID
subnetwork_name 文字列 VM が動作しているサブネットワーク
vpc_name 文字列 VM が動作している VPC

メタデータ アノテーション

ログレコードには、基本フィールドとメタデータ フィールドが含まれます。レコード形式セクションには、フィールドの種類(メタデータか基本か)が記載されています。すべての基本フィールドが常に含まれます。保持するメタデータ フィールドはカスタマイズできます。

  • すべてのメタデータを選択すると、VPC フローログ レコード内のすべてのメタデータ フィールドがフローログに含まれます。新しいメタデータ フィールドがレコード形式に追加されると、フローログに新しいフィールドが自動的に含まれます。

  • メタデータを選択しない場合は、すべてのメタデータ フィールドが省略されます。

  • カスタム メタデータを選択した場合、親フィールド(src_vpc など)または完全名(src_vpc.project_id など)を使用して、含めるメタデータ フィールドを指定できます。

    新しいメタデータ フィールドがレコード形式に追加された場合、これらのフィールドが指定した親フィールド内の新しいフィールドである場合を除き、これらのフィールドはフローログに含まれません。

    • 親フィールドを使用してカスタム メタデータを指定した場合、その親フィールド内のレコード形式に新しいメタデータ フィールドが追加されると、フローログには新しいフィールドが自動的に含まれます。

    • フィールドの完全名を使用してカスタム メタデータを指定した場合、新しいメタデータ フィールドが親フィールドに追加されたときに、新しいフィールドはフローログに含まれません。

メタデータ フィールドのカスタマイズについては、サブネットの作成時に VPC フローロギングを有効にするで Google Cloud CLI または API の手順をご覧ください。

GKE メタデータのアノテーション

GKE クラスタにエンドポイントがあるフローには、そのエンドポイントのクラスタ、Pod、Service の詳細を含む GKE メタデータ アノテーションを付けることができます。

GKE Service アノテーション

ClusterIP、NodePort、LoadBalancer に送信されたトラフィックは、Service アノテーションを取得できます。NodePort または LoadBalancer に送信された場合、フローは接続の両方のホップで Service アノテーションを受け取ります。

Pod の Service ポートに直接送信されたトラフィックには、宛先エンドポイントの Service アノテーションでアノテーションが付けられます。

Pod が同じ Service ポートで複数の Service をサポートしている場合、Pod のサービスポートに送信されるトラフィックには、宛先エンドポイントで複数の Service がアノテーションされます。これは 2 つの Service に限定されます。それ以上ある場合は、エンドポイントに特別な MANY_SERVICES マーカーが付けられます。

インターネット トラフィックでの Pod アノテーション

Pod とインターネット間のトラフィックは、デフォルトでは Pod アノテーションを受信しません。インターネットへのパケットの場合、マスカレード エージェントが Pod の IP アドレスをノード IP アドレスに変換してから VPC フローログがパケットを認識します。このため、VPC フローログは Pod に関する情報がないため Pod アノテーションを追加できません。

マスカレードのため、リンク先がデフォルトの非マスカレードの宛先またはカスタム nonMasqueradeCIDRs リスト内にある場合にのみ、Pod アノテーションが表示されます。インターネットの宛先をカスタム nonMasqueradeCIDRs リストに含める場合は、インターネットに到達する前に内部 Pod IP アドレスが変換されるようにする必要があります。Cloud NAT は限定公開クラスタと非プライベート クラスタの両方で使用できます。詳細については、GKE の操作をご覧ください。

ログのフィルタリング

VPC フローログを有効にすると、フィルタに一致するログのみを保持する基本フィールドとメタデータ フィールドの両方に基づいてフィルタを設定できます。他のすべてのログは Logging に書き込まれる前に破棄されるため、コストが節約され、必要な情報の検索にかかる時間が短縮されます。

[レコード形式] に記載されているフィールドのサブセットでフィルタリングできます。ただし、次のフィールドは除きます。

  • rtt_msec
  • bytes_sent
  • packets_sent
  • start_time
  • end_time

VPC フローログ フィルタリングでは、属性ベースの論理式に埋め込み式の表現言語である CEL が使用されます。VPC フローログのフィルタ式は 2,048 文字以内に制限されています。詳しくは、サポートされている CEL 論理演算子をご覧ください。

CEL の詳細については、CEL の概要言語の定義をご覧ください。生成フィルタ機能では、CEL 構文の特定のサブセットのみがサポートされます。

ログ フィルタリングを使用するサブネットの作成については、サブネット作成時の VPC フローログの有効化で gcloud CLI または API の手順をご覧ください。

ログ フィルタリングの構成については、VPC フローログ パラメータの更新で gcloud CLI または API の手順をご覧ください。

例 1: ログの収集を my-vm という名前の特定の VM に制限する。この場合、トラフィックの送信元から報告された src_instance フィールドが my-vm であるか、トラフィックの宛先から報告された dst_instance フィールドが my-vm であるログのみが記録されます。

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr="(src_instance.vm_name == 'my-vm' && reporter=='SRC') || (dest_instance.vm_name == 'my-vm' && reporter=='DEST')"

例 2: ログの収集を送信元 IP アドレスが 10.0.0.0/8 サブネットのパケットに限定する。

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr="inIpRange(connection.src_ip, '10.0.0.0/8')"

例 3: ログの収集を VPC の外部のトラフィックに制限する。

gcloud compute networks subnets update my-subnet \
    --logging-filter-expr '!(has(src_vpc.vpc_name) && has(dest_vpc.vpc_name))'

サポートされている CEL 論理演算子

サポートされる形式 説明
true、false ブール値 ブール定数

x == y

x != y

ブール値、整数、文字列

比較演算子

例: connection.protocol == 6

x && y

x || y

ブール値

ブール論理演算子

例: connection.protocol == 6 && src_instance.vm_name == "vm_1"

!x ブール値 否定
1、2.0、0、... Int 定数の数値リテラル
x + y 文字列 文字列の連結
"foo"、'foo'、... 文字列 定数の文字列リテラル
x.lower() 文字列 文字列の小文字の値を返します。
x.upper() 文字列 文字列の大文字の値を返します。
x.contains(y) 文字列 文字列に指定された部分文字列が含まれている場合は true を返します。
x.startsWith(y) 文字列 文字列が、指定された部分文字列で始まる場合に true を返します。
x.endsWith(y) 文字列 文字列が、指定された部分文字列で終わる場合に true を返します。
inIpRange(X, Y) 文字列

X が IP で Y が X を含む IP 範囲である場合、true を返します

例: inIpRange("1.2.3.1", "1.2.3.0/24")

x.containsFieldValue(y) x: list
y: map(string, string)

指定された Key-Value ペアと一致するフィールドを含むオブジェクトがリストに含まれている場合、true が返されます。

例: dest_gke_details.service.containsFieldValue({'service_name': 'service1', 'service_namespace': 'namespace1'})

has(x) 文字列

フィールドが存在する場合は true を返します。

次のステップ