VPC フローログのレコードについて
このページでは、使用可能な基本フィールドとメタデータ フィールドなど、VPC フローログのレコード形式について説明します。また、特定の条件に一致するログのみを生成するようにログフィルタを使用する方法についても説明します。
レコードの形式
ログレコードには、各ログレコードのコアフィールドであるベース フィールドと、詳細情報を追加するメタデータ フィールドが含まれています。メタデータ フィールドは、ストレージ費用を節約するために省略できます。
一部のログフィールドはマルチ フィールド形式であり、所定のフィールドに複数のデータが含まれます。たとえば、connection
フィールドは IpConnection
形式で、送信元と宛先の IP アドレスとポート、およびプロトコルが 1 つのフィールドに格納されます。これらのマルチフィールドのフィールドについては、レコードの形式に関する表を示した後で説明します。
メタデータ フィールドには次の制限があります。
- メタデータ フィールドの値はデータプレーン パスに基づくものではなく近似値です。このため、存在しない可能性や不正確な可能性もあります。メタデータ フィールドとは異なり、基本フィールドの値はパケット ヘッダーから直接取得されます。
internet_routing_details
フィールドでは、自律システム(AS)パスが存在しない場合があります。たとえば、パケットが VPC 内でルーティングされる場合、AS パス情報は含まれません。
フィールド | フィールドの形式 | フィールド タイプ: 基本またはオプションのメタデータ |
---|---|---|
connection |
IpConnection
この接続に関する説明を含む 5 つのタプル。 |
ベース |
reporter |
string
フローを報告した側。 SRC か DEST のいずれかになります。 |
ベース |
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 を返します。 |