コンテンツに移動
データ分析

BigQuery Export ユーザーの Log Analytics への移行

2022年10月17日
Google Cloud Japan Team

※この投稿は米国時間 2022 年 10 月 7 日に、Google Cloud blog に投稿されたものの抄訳です。

ログ分析を BigQuery に一元化して、ログとイベントを一括表示しているお客様は、BigQuery から次のようなメリットをすでに享受しています。

Log Analytics(公開プレビュー版)の導入により、良いものがさらに素晴らしいものになりました。Log Analytics を使用すると、BigQuery を活用しながら、BigQuery における Google Cloud のログのエクスポートと分析に関する費用を削減できるほか、価値創出までの時間を短縮することができます。

この投稿は、BigQuery ログシンクから Log Analytics に移行する(または移行を検討している)ユーザーを対象としています。これら 2 つの相違点を説明したあと、BigQuery の既存の SQL クエリを Log Analytics で機能するように調整する簡単な方法をご紹介します。Log Analytics の概要と Cloud Logging への適合については、ユーザー ドキュメントをご覧ください。

比較

BigQuery の機能を使用した高度なログ分析に関しては、Log Analytics では、ログデータの複製を伴う Log Router を使用した BigQuery へのエクスポート(ログシンクを使用)に代わり、シンプルで費用対効果が高く、簡単に使用できる方法が用意されています。BigQuery の SQL クエリの変換の例やパターンをご紹介する前に、Log Analytics と BigQuery へのログシンクを比較してみましょう。
https://storage.googleapis.com/gweb-cloudblog-publish/images/1_Log_Analytics_2Hzhw0K.max-1700x1700.jpg
https://storage.googleapis.com/gweb-cloudblog-publish/images/2_Log_Analytics_trGVotm.max-1000x1000.jpg


BigQuery へのログシンク

Log Analytics

運用上のオーバーヘッド

  • ログシンク(1 つまたは複数)と BigQuery データセットを追加で作成、管理し、ログエントリのコピーをエクスポート

費用

  • BigQuery でデータが複製されるため、ストレージと取り込みで 2 重の費用を支払う必要がある


  • BigQuery のストレージと取り込みの費用は、Cloud Logging の取り込み費用に含まれる

  • Log Analytics からのクエリは無料枠


ストレージ

  • テーブル作成時にログタイプごとにスキーマを定義

  • ログ形式を変更すると、スキーマの不一致によりエラーが発生する可能性がある

  • 単一の統合型スキーマ

  • ログ形式を変更しても、スキーマの不一致によるエラーは発生しない

分析

  • BigQuery から SQL でログのクエリを実行

  • Log Analytics ページで、または BigQuery ページから SQL でログのクエリを実行

  • ネイティブ JSON データ型を使用して簡単に JSON フィールドに対するクエリを実行可能

  • 事前構築済みの検索インデックスを使用することで検索を高速化

セキュリティ

Log Analytics と従来の BigQuery へのログシンクとの比較

シンプルなテーブル構成

データに関する最も重要な変更点は、Log Analytics でアップグレードされたログバケット内のすべてのログを、Google Cloud のすべてのログタイプまたはログ形式をサポートする包括的なスキーマ(次のセクションで詳述)を使用して、単一のログビュー _AllLogs で利用できることです。これは、各エントリがログ名に基づいてデータセット内の別の BigQuery テーブルにマッピングされる従来の BigQuery ログシンク(BigQuery のルーティング スキーマで詳述)とは対照的です。次に例を示します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/3_Log_Analytics.max-1200x1200.jpg
SQL の FROM 句におけるテーブルパス

このテーブルの 2 列目は、BigQuery ログシンクがパーティション分割テーブルを使用するように構成されていることを前提としています。BigQuery ログシンクが日付でシャーディングされたテーブルを使用するように構成されている場合、クエリではテーブル名に追加された接尾辞(ログエントリの日付)も考慮する必要があります(例: cloudaudit_googleapis_com_data_access_09252022)。

上の比較表に示すように、Log Analytics ではすべてのログを同一のビューで利用できるため、特定のログの名前や、そのログの正確なテーブル名を知る必要はありません。そのため、特に複数の異なるログタイプを横断的に検索して関連付けする場合に、クエリが大幅にシンプルになります。

WHERE 句にオプションで log_id または log_name を指定することで、与えられたクエリの範囲を制御できます。たとえば、クエリを data_access のログに制限する場合は、以下を追加します。

WHERE log_id = "cloudaudit.googleapis.com/data_access"

統合型ログスキーマ

Log Analytics には、すべてのログに対応するスキーマが 1 つだけ存在します。そのため、Log Analytics では、スキーマのスーパーセットが 1 つ管理されています。このスキーマは、想定されるすべてのログスキーマを照合したものです。たとえば、このスキーマは LogEntry のペイロード(protoPayload、textPayload、jsonPayload)を一意のフィールド(それぞれ proto_payloadtext_payloadjson_payload)にマッピングすることで、想定されるさまざまなタイプのペイロードに対応します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/4_Log_Analytics.max-700x700.jpg

また、ログフィールド名が、全体的にキャメルケース(例: logName)からスネークケース(例: log_name)に変更になりました。さらに、log_id などの新しいフィールドもあります(log_id は各ログエントリの log_id です)。

ユーザー向けのスキーマのもう 1 つの変更点として、Log Analytics では、json_payloadlabels など、ネストされたオブジェクトを表す一部のフィールドに、ネイティブ JSON データ型を使用できることが挙げられます。JSON 型の列には任意の JSON オブジェクトを含めることができるため、Log Analytics のスキーマでは、その列に利用可能なフィールドのリストは表示されません。これは、ネストされたフィールドを含むすべてのログタイプに事前定義済みの厳格なスキーマが存在する従来の BigQuery ログシンクとは対照的です。Log Analytics では、JSON フィールドを含むより柔軟なスキーマを使用することで、任意のログを含む半構造化データをサポートしながら、クエリをシンプルにし、場合によって高速化することができます。

スキーマ移行ガイド

スキーマに関するこれらすべての変更を踏まえて、新しい SQL クエリを作成したり、既存の SQL クエリを従来の BigQuery ログシンクから Log Analytics へと変換するには、どうすればよいでしょうか。

次のテーブルは、BigQuery にルーティングする従来のログシンクと新しい Log Analytics のすべてのログフィールドを、対応する列名とタイプをマッピングして並べて表示したものです。このテーブルを移行ガイドとして使用し、破壊的変更の特定、新しいフィールドの適切な参照、既存の SQL クエリの体系的な移行にお役立てください(画像をクリックすると拡大表示されます)。

https://storage.googleapis.com/gweb-cloudblog-publish/images/5_Log_Analytics.max-900x900.jpg
ログスキーマの対応表(クリックして拡大)

破壊的変更を伴うフィールドは、変更が必要な部分を視覚的に追跡しやすいように、すべて太字で表記されています。たとえば、監査ログに対してクエリを実行する場合、protopayload_auditlog STRUCT フィールドを参照および解析すると思います。前出のスキーマ移行テーブルを見ると、そのフィールドが Log Analytics では proto_payload.audit_log STRUCT フィールドに対応していることがわかります。

新たに追加されたフィールドは黄色のセル、JSON に変換されたフィールドは赤色のセルで表示されていることに注目してください。

スキーマの変更の概要

先ほどのスキーマ移行ガイドを見ると、全体的に列名がキャメルケースからスネークケースに変更されたこと以外に、5 つの注目すべき破壊的変更があることがわかります。

1)タイプが STRING から JSON に変更されたフィールド(赤色のセル):

  • metadataJson

  • requestJson

  • responseJson

  • resourceOriginalStateJson

2)タイプが STRUCT から JSON に変更されたフィールド(赤色のセル):

  • labels

  • resource.labels

  • jsonPayload

  • jsonpayload_type_loadbalancerlogentry

  • protopayload_auditlog.servicedata_v1_bigquery

  • protopayload_auditlog.servicedata_v1_iam

  • protopayload_auditlog.servicedata_v1_iam_admin

3)さらにネストされているフィールド:

  • protopayload_auditlogLog Analytics では proto_payload.audit_log

  • protopayload_requestlogLog Analytics では proto_payload.request_log

4)1 つにまとめられたフィールド:

  • jsonPayloadLog Analytics では json_payload

  • jsonpayload_type_loadbalancerlogentryLog Analytics では json_payload

  • jsonpayload_v1beta1_actionlogLog Analytics では json_payload

5)タイプが変更されたその他のフィールド:

  • httpRequest.latency(FLOAT から STRUCT に変更)

クエリの移行パターン

これらの各変更について、SQL クエリをどのように変換するかを見ていきましょう。例として、以下にいくつかの SQL を抜粋しました。各 SQL の全体を確認したい場合は、それぞれに記載されている Community Security Analytics(CSA)レポートのリンクをご覧ください。例は次のようになっています。

  • 変換前: 従来の BigQuery ログシンクを使用する場合の SQL

  • 変換後: Log Analytics を使用する場合の SQL

パターン 1: STRING 列からのネストされたフィールドの参照を JSON に変更: 

これは、スキーマ移行テーブルで赤色で表示されているフィールドの一部が対象となります。次のものがあります。

  • metadataJson

  • requestJson

  • responseJson

  • resourceOriginalStateJson


変換前:

JSON_VALUE(protopayload_auditlog.metadataJson, '$.violationReason')

変換後:

JSON_VALUE(proto_payload.audit_log.metadata.violationReason)

抜粋元のクエリ: CSA 1.10


変換前:

JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].targetResource')

変換後:

JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].targetResource)

抜粋元のクエリ: CSA 1.10


パターン 2: STRUCT 列からのネストされたフィールドの参照を JSON に変更: 

これは、スキーマ移行テーブルで赤色で表示されているフィールドの一部が対象となります。次のものがあります。

  • labels

  • resource.labels

  • jsonPayload

  • jsonpayload_type_loadbalancerlogentry

  • protopayload_auditlog.servicedata*


変換前:

jsonPayload.connection.dest_ip

変換後:

JSON_VALUE(jsonPayload.connection.dest_ip)

抜粋元のクエリ: CSA 6.01


変換前:

resource.labels.backend_service_name

変換後:

JSON_VALUE(resource.labels.backend_service_name)

抜粋元のクエリ: CSA 1.20


変換前:

jsonpayload_type_loadbalancerlogentry.statusdetails

変換後:

JSON_VALUE(json_payload.statusDetails)

抜粋元のクエリ: CSA 1.20


変換前:

protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas

変換後:

JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)

抜粋元のクエリ: CSA 2.20


パターン 3: protoPayload からのフィールドの参照:

これは、スキーマ移行テーブルで太字で表示されているフィールドの一部が対象となります。次のものがあります。

  • protopayload_auditlogLog Analytics では proto_payload.audit_log

  • protopayload_requestlogLog Analytics では proto_payload.request_log


変換前:

protopayload_auditlog.authenticationInfo.principalEmail

変換後:

proto_payload.audit_log.authentication_info.principal_email

抜粋元のクエリ: CSA 1.01


パターン 4: タイプがロードバランサ ログエントリの jsonPayload からのフィールドの参照:


変換前:

jsonpayload_type_loadbalancerlogentry.statusdetails

変換後:

JSON_VALUE(json_payload.statusDetails)

抜粋元のクエリ: CSA 1.20


パターン 5: httpRequest の latency フィールドの参照:


変換前:

httpRequest.latency

変換後:

http_request.latency.nanos / POW(10,9)


まとめ

Log Analytics を使用して、セルフマネージドのログシンクと BigQuery データセットから Google が管理するログシンクと BigQuery データセットに移行することで、ログ分析の費用と複雑さを軽減しながら、よりシンプルで高速なクエリを活用することができます。さらに、リアルタイムのトラブルシューティングに役立つログ エクスプローラ、ログベースの指標、ログアラート、Error Reporting の自動インサイトなど、Cloud Logging の各種機能もご利用いただけます。

このガイドを活用すれば、Log Analytics を使用したログ分析に簡単に切り替えることができます。ここでご紹介したスキーマ移行ガイドを使用し、規範的な 5 つの移行パターンを適用して、BigQuery の SQL ログクエリを変換したり、Log Analytics で新しい SQL を作成したりしてください。


- Google Cloud ソリューション アーキテクト Roy Arsan
投稿先