Cloud Loggingのベストプラクティス　監査ログに関するコスト最適化・分析

# はじめに
本記事はGoogle Cloudのログ管理サービスである[Cloud Logging](https://cloud.google.com/logging?hl=ja)について記載しています。

クラウド環境におけるログ管理は、多くの利便性をもたらしますが、従量課金という切っては離せない課題が存在します。

本記事ではGoogle Cloudで取り扱う監査ログの運用を行うにあたり、サービスの使いどころやAWSと比較した際のポイントなどについてまとめています。

Google Cloudの監査ログは、AWSと比較した際にコストに影響を与える要因が多いため、適切な管理が求められます。

## Cloud Logging
Cloud Loggingは、AWSのAmazon CloudWatch Logsに相当します。

基本的にGoogle CloudやAWSで管理するクラウドが出力するログは、JSON形式など**構造化**されたログを取り扱います。
従ってオンプレミスの環境と比べた場合、マネージドサービスなどを活用することで、収集したログに対する分析も容易です。

ログ分析系のサービスについては、2023年にGoogle Cloud及びAWSでそれぞれ新しいサービスがリリースされています。
Google CloudのLog Analyticsは、ログバケットに保存されたログに対してSQLクエリが実行できます。

- [Cloud Logging の Log Analytics の一般提供を開始](https://cloud.google.com/blog/ja/products/devops-sre/log-analytics-in-cloud-logging-is-now-ga)
- [Amazon Security Lake の一般提供を開始](https://aws.amazon.com/jp/about-aws/whats-new/2023/05/amazon-security-lake-generally-available/)

### Cloud Loggingが出力するログ
Cloud Loggingが出力するログは、公式ドキュメントの[使用可能なログ](https://cloud.google.com/logging/docs/view/available-logs?hl=ja)の通りに以下の種類に分類できます。

- [Google Cloud Platform のログ](https://cloud.google.com/logging/docs/view/available-logs?hl=ja#gcp-logs)
- [ユーザー作成のログ](https://cloud.google.com/logging/docs/view/available-logs?hl=ja#user-logs)
- [コンポーネント ログ](https://cloud.google.com/logging/docs/view/available-logs?hl=ja#component-logs)
- [セキュリティ ログ](https://cloud.google.com/logging/docs/view/available-logs?hl=ja#security-logs)

また、セキュリティ ログは[監査ログ](https://cloud.google.com/logging/docs/view/available-logs?hl=ja#audit-logs)と、[アクセスの透明性ログ](https://cloud.google.com/logging/docs/view/available-logs?hl=ja#axt-logs)の2種類になります。
更に監査ログは**Cloud Audit Logs**と呼ばれ以下の種類に分類されます。

- [管理アクティビティ監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#admin-activity)
- [データアクセス監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#data-access)
- [システム イベント監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#system-event)
- [ポリシー拒否監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#policy_denied)

Cloud Audit Logsは、AWSのAWS CloudTrailに相当します。

### ログバケット
Cloud Loggingの運用を適切に行うためには、Cloud Loggingが出力するログの仕組みにについて理解することが重要です。

公式ドキュメントの[転送とストレージの概要](https://cloud.google.com/logging/docs/routing/overview?hl=ja)からCloud Logging がログエントリを処理する方法が確認できます。

![](https://cloud.google.com/static/logging/docs/images/routing-overview.png?hl=ja)

上記図を踏まえて、セキュリティ ログは以下のログバケットに保存されます。

| ログバケット | 監査ログ | 保持期間 | 料金 | カスタム |
|:-----------|:------------|:------------|:------------|:------------|
| _Default   | [データアクセス監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#data-access)/[ポリシー拒否監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#policy_denied) | 30日間 | 30日を超えるログは追加料金が発生 | 構成可能
| _Required  | [管理アクティビティ監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#admin-activity)/[システム イベント監査ログ](https://cloud.google.com/logging/docs/audit?hl=ja#system-event)/[アクセスの透明性ログ](https://cloud.google.com/assured-workloads/access-transparency/docs/overview?hl=ja)|400日間 | 発生しない | 構成不可

::: note warn
データアクセス監査ログは、デフォルトでBigQueryのみ有効です。
その他のサービスで監査ログを有効にする場合は、**データアクセス監査ログの構成**の設定が必要です。詳細は公式ドキュメントの[データアクセス監査ログを有効にする](https://cloud.google.com/logging/docs/audit/configure-data-access?hl=ja)をご参照ください。

AWSに例えると、CloudTrailのデータイベントの機能に相当します。

参考：[データイベントをログ記録する](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)
:::

### 料金
Cloud Loggingの料金は、公式サイトの[Cloud Logging](https://cloud.google.com/stackdriver/pricing?hl=ja#logging-costs)から確認できます。

Cloud Billingの料金明細上では、以下の**SKU**として整理されます。
SKU IDは公式ドキュメントの[SKU Groups - Cloud Logging](https://cloud.google.com/skus/sku-groups/cloud-logging)をご参照ください。

- Log Storage cost
    - ログストレージに取り込んだログの合計量に対して、GiBあたり$0.50の金額が課金される
    - プロジェクトごとに最初の50GiBは無料枠が適用される
- Log Retention cost
    - 2023年4月1日以降から、30日を超えて保持されたログに対して、GiBあたり$0.01の金額が課金される

::: note warn
適切にCloud Loggingのコストを管理するためには、Log Storage costで取り込むべきログのみを保持する運用が重要です。
:::

## コスト最適化
監査ログに関する観点でコスト最適化のアプローチを以下に記載します。

### データアクセス監査ログ
データアクセス監査ログについて、使用していない場合は設定を見直しましょう。

例えば、フォルダにログルーターのシンクを設定して、監査ログを集約している状況だとします。
フォルダ配下のプロジェクト側で、データアクセス監査ログに対する設定を個別に行っている場合、自ずとフォルダ側で設定している監査ログも同じログが出力されるため、コストに対する影響が発生します。

通常、データアクセス監査ログはデフォルトでBigQueryに関するログしか出力されません。
以下のように監査ログの設定を確認すると、全て`-`になっていて無効化されていることが確認できます。

![スクリーンショット 2023-10-05 20.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/6d510a32-491e-361e-7f91-198cd52f0908.png)

Cloud Storageを例にすると、以下のように青色でチェックが入っている場合は、データアクセス監査ログに対する設定が有効になっています。

![スクリーンショット 2023-10-05 20.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/c835fc62-eb30-d44b-f88a-ff401b1a1fe3.png)

::: note warn
フォルダにログルーターのシンクを設定している状況で、集約した監査ログからBigQuery以外のログが出力されている場合は、プロジェクト側で有効になっている可能性があります。
:::

### 必要なログのみを抽出する
データアクセス監査ログと管理アクティビティ監査ログは、出力されるログが多いため、集約する際は注意が必要です。

コスト増加対策として、公式ドキュメントの[フィルタの例](https://cloud.google.com/logging/docs/export/configure_export_v2?hl=ja#filter-examples)を参考にしながら、不要なログは除外しましょう。

例えば以下のような除外設定を行うことで、デフォルトで出力されるBigQueryに関連するすべてのログを除外できます。

```console
resource.type=("bigquery_dataset" OR "bigquery_project" OR "bigquery_job" OR "bigquery_job_config" OR "bigquery_table" OR "bigquery_table_data" OR "bigquery_view" OR "dataflow_step" OR "bigquery_dts_config" OR "bigquery_resource") AND logName:"cloudaudit.googleapis.com%2Fdata_access"
```

### 圧縮して保存する
監査ログの観点ですが、監査ログをCloud Storageで保存する場合の話です。

以前[「Cloud RunとCloud Storage FUSE　コンテナからFUSEを介してCloud Storage（GCS）のオブジェクトを圧縮する方法」](https://qiita.com/Brutus/items/80afc7f9809dfe0d9d34)の記事でも書きましたが、AWSの場合はCloudTrailによって生成されるログのサフィックスは`.json.gz`となっているので、自動的に圧縮されていることが分かります。

しかし、Google Cloudの監査ログは、`.json`のまま保存されているため、圧縮されていません。

従って圧縮することで**コストの削減が可能**です。詳細は上記記事をご参照ください。

## 監査ログの分析
Cloud Loggingの仕様を踏まえて、監査ログの分析方法について記載します。

AWSのCloudTrailと比較すると、Cloud Loggingの場合はGoogleの検索機能がユーザーライクに使えるのが特徴だと思います。

### ログ エクスプローラ
Cloud Loggingで管理するログは、**ログ エクスプローラ**から確認できます。

ログの見方やどのように検索できるかなどは、公式ドキュメントの[ログ エクスプローラを使用してログを表示する](https://cloud.google.com/logging/docs/view/logs-explorer-interface?hl=ja)をご参照ください。
ログのフォーマットについては、公式ドキュメントの[LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry)から確認できます。

すべての監査ログを表示するには、次のいずれかのクエリをクエリエディタフィールドに入力し、「クエリを実行」をクリックします。

```text
logName:"cloudaudit.googleapis.com"

protoPayload."@type"="type.googleapis.com/google.cloud.audit.AuditLog"
```

リソース識別子の変数を含む監査ログ名は次のとおりです。

```text
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Factivity
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Factivity
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fpolicy
```

特定のリソースと監査ログタイプの監査ログを表示するには、クエリビルダペインから「ログ名」を選択して表示することもできます。

![スクリーンショット 2023-10-12 20.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4a298c22-dfcd-a954-75d0-a1ec1dfea0c2.png)

::: note
LogEntryの**insertId**は、ログエントリの一意の識別子です。
サポートケースで問い合わせを行う際にも、どのログで発生したかなど情報を共有する際にも使用されます。
:::

### BigQuery
BigQueryから監査ログの分析を行う場合は工夫が必要です。

本記事執筆時点の監査ログのフォーマット形式で、そのままBigQueryにインポートする場合、以下のようなエラーが出力されます。

- 全ての監査ログのキーで、`@type`というキーが存在するため、テーブル作成時に`Invalid field name "@type". Fields must contain only letters, numbers,
 and underscores, start with a letter or underscore, and be at most 300 characters long.`のエラーが発生
- 管理アクティビティ監査ログと、データアクセス監査ログについて、`Unsupported empty struct type for field 'protoPayload.status'`のエラーが発生して、スキーマを作成することができない

この件については、以前からIssue Trackerの[Feature request: Exporting Older Logs](https://issuetracker.google.com/issues/111878351)に起票されていて現在も課題になっています。

そのため、BigQueryにインポートしたい場合は、列の命名規則に適合しないJson要素を回避する必要があります。
特に、データアクセス監査ログが構造上ネストを繰り返しているため、取り扱いが厄介なため、手間がかかります。

### Metrics Explorer
毎月どのプロジェクトのログが多く出力しているかについて気になる場合は、[Cloud Monitoring](https://cloud.google.com/monitoring?hl=ja)の**Metrics Explorer**から以下のような手順で確認できます。

1. Metrics Explorerを開く。
1. 画面上部のリンクマークの右横にある「期間」を設定する。
1. 画面中央の「指標」から`Log bucket monthly bytes ingested`を選択する。
1. フィルタ設定は全て削除する。
1. グループ条件について「ラベル」は`log_source`を選択して「グループ化関数」については`合計`を選択する。
1. 画面右上部「ウィジェットタイプ」から`Stacked Bar Chart`を選択する。

:::note warn
対象期間を考慮して正確な数字を確認したい場合、log ingestion bytesのメトリクスは、JST(日本標準時)ではなくPST/PDT(Pacific Time)に基づいているため、任意の値が含まれるように期間を調整する必要があります。 
:::

# おわりに
Cloud Audit Logsは、構造的なログになっているので情報量が多く、利便性があると思います。

しかし、AWSと比べるとデフォルトでデータアクセス監査ログが一部有効になっているため、コスト的には安くはない仕組みになっているように感じました。

ログを出力するということは大事なことですが、クラウドを利用する際は、蛇口の水は回しっぱなしにしないように注意が必要です。

## 参考
- [クラウド管理者向けの Cloud Logging の料金: そのアプローチと費用を削減する方法](https://cloud.google.com/blog/ja/topics/cost-management/how-to-approach-cloud-logging-pricing-for-cloud-admins)
- [Cloud Logging の費用を予算内で管理するための 4 つのステップ](https://cloud.google.com/blog/ja/products/devops-sre/cloud-logging-cost-management-best-practices)
- [AWS や Azure サービスと Google Cloud を比較する](https://cloud.google.com/free/docs/aws-azure-gcp-service-comparison?hl=ja)