こんにちは、SCSKの齋藤です。
今回は、Google Cloud Monitoring を活用してログ監視を実装してみました。Terraformを使用して、Cloud WorkflowsやDataformなどのログを監視し、SlackやPagerDutyに通知を送る仕組みを構築しました。
本記事では、その実装内容を紹介します。
この記事でわかること
- TerraformでGoogle Cloud Monitoringのアラートポリシーを定義する方法
- ログ監視の条件設定、通知先設定、環境ごとの設定の違い
- 具体的な監視項目の設定例(Cloud Run, Composer)
- 設定のポイントと工夫
![]()
実装の概要
Google Cloud MonitoringのアラートポリシーをTerraformで定義し、以下のようなログ監視を実装しました。
- 特定のサービスの成功/失敗ログ監視
- Cloud WorkflowsやCloud Run、Dataformなどの処理結果を監視し、成功や失敗を検知
- データ処理パイプラインの状態監視
- Composer(Airflow)のDAG実行結果を監視し、成功時に通知
- 通知先としてSlackやPagerDutyを活用
- 環境ごとに異なる通知先を設定し、本番環境ではPagerDutyを利用
実装のポイント
Terraformでのアラートポリシー定義
Terraformのgoogle_monitoring_alert_policyリソースを使って、ログ監視の条件や通知先を定義します。重要な属性は以下の通りです。
display_name: アラートポリシーの名前(Google Cloud Consoleに表示)combiner: 複数の条件をどのように組み合わせるかconditions: 監視する条件を定義するブロックenabled: アラートポリシーを有効にするかどうかalert_strategy: アラートがトリガーされた際の挙動を設定notification_channels: 通知先チャネルのリストdocumentation: アラート発生時に表示するドキュメント
以下は、テンプレートとして再利用可能なアラートポリシーの例です。この例では、特定のリソースタイプのログから、特定のパターンに合致するログを検知します。
resource "google_monitoring_alert_policy" "example_alert_policy" {
display_name = "Service - Example Alert"
combiner = "OR"
conditions {
display_name = "Example Condition"
condition_matched_log {
filter = <<EOT
severity=INFO
resource.type="example_resource_type"
log_name="projects/example-project/logs/example-log"
resource.labels.example_label =~ "example-pattern"
EOT
label_extractors = {
key1 = "EXTRACT(jsonPayload.key1)"
key2 = "EXTRACT(jsonPayload.key2)"
}
}
}
enabled = true
alert_strategy {
notification_prompts = ["OPENED"]
notification_rate_limit {
period = "300s" # 通知の頻度を制限
}
auto_close = "1800s" # 自動クローズの時間
}
notification_channels = [var.notification_channels["example_channel"]]
documentation {
content = <<EOT
Key1: $${log.extracted_label.key1}
Key2: $${log.extracted_label.key2}
EOT
mime_type = "text/markdown"
}
}
コード解説:
-
filter: Cloud Monitoringのログフィルタを指定します。このフィルタによって、監視対象のログを絞り込みます。severity=INFO: INFOレベル以上のログを対象とする。resource.type="example_resource_type": 特定のリソースタイプ(例:gce_instance)のログを対象とする。log_name="projects/example-project/logs/example-log": 特定のログ名(例:projects/my-project/logs/stdout)を対象とする。resource.labels.example_label =~ "example-pattern": リソースのラベルに対して正規表現でマッチングを行う。
-
label_extractors: ログの内容から特定の情報を抽出します。抽出した情報は、通知内容に含めることができます。key1 = "EXTRACT(jsonPayload.key1)":jsonPayloadのkey1というフィールドの値を抽出する。
-
notification_rate_limit: アラート通知の頻度を制限します。過剰な通知を防ぐために重要です。 -
documentation: アラート発生時に表示されるドキュメントを記述します。抽出したログの情報を記載することで、問題の原因特定に役立ちます。
通知先の設定
通知先としてSlackやPagerDutyを利用しました。これはTerraformの変数として定義し、環境ごとの柔軟に切り替え可能にしています。
variable "notification_channels" {
description = "通知チャネルのマッピング"
type = map(string)
}
ポイント:
type = map(string): 文字列型のキーと文字列型の値を持つマップとして定義します。default: デフォルトの値を設定します。実際の環境に合わせて適切な値を設定してください。 これらのIDは、Google Cloud Consoleから取得できます。
環境ごとの柔軟な設定
環境(開発、ステージング、本番)ごとに異なる設定を適用するため、var.envを使用しました。
本番環境ではPagerDuty通知を追加しています。
notification_channels = concat( [var.notification_channels["example_channel"]], var.env == "prod" ? [var.notification_channels["pagerduty_channel"]] : [] )
コード解説:
concat: 複数のリストを結合する関数です。var.env == "prod" ? [var.notification_channels["pagerduty_channel"]] : []:var.envがprod(本番環境)の場合、PagerDutyの通知チャネルをリストに追加します。それ以外の場合は、空のリスト([])を追加します。
実装した監視項目の例
Cloud Runジョブのエラーログ監視
特定のジョブのエラーを検知し、通知を行う設定
resource "google_monitoring_alert_policy" "job_error_alert" {
display_name = "Job - Error Detected"
combiner = "OR"
conditions {
display_name = "Job Error"
condition_matched_log {
filter = <<EOT
severity>=ERROR
resource.type="job_resource_type"
resource.labels.job_name =~ "example-job-pattern"
EOT
label_extractors = {
error_message = "EXTRACT(jsonPayload.error_message)"
}
}
}
enabled = true
notification_channels = [var.notification_channels["error_channel"]]
documentation {
content = <<EOT
Job Name: $${resource.labels.job_name}
Error Message: $${log.extracted_label.error_message}
EOT
mime_type = "text/markdown"
}
}
Composer DAGの成功通知
AirflowのDAG実行結果を監視し、成功時に通知を行う設定
resource "google_monitoring_alert_policy" "dag_success_alert" {
display_name = "Composer - DAG Success"
combiner = "OR"
conditions {
display_name = "DAG Success"
condition_matched_log {
filter = <<EOT
resource.type="cloud_composer_environment"
resource.labels.environment_name="example-composer-env"
textPayload:("DagRun Finished" AND "state=success")
EOT
}
}
enabled = true
notification_channels = [var.notification_channels["info_channel"]]
documentation {
content = <<EOT
DAG実行が成功しました。
EOT
mime_type = "text/markdown"
}
}
ポイント:
- Cloud Runジョブのエラーログ監視では、
severity>=ERRORでエラーレベルのログを絞り込み、resource.type="cloud_run_job"でCloud Runジョブのログに限定しています。 - Composer DAGの成功通知では、
textPayload:("DagRun Finished" AND "state=success")でログメッセージの内容を確認し、DAGの成功を判断しています。
実装の工夫
- 再利用性の高いテンプレート設計
環境変数や通知チャンネルを変数化することで、異なるプロジェクトや環境でも簡単に適用可能な構成に - 詳細なログ情報の抽出
`label_extractors`を活用し、ログから必要な情報を抽出して通知内容に反映 - 通知の頻度制限
`notification_rate_limit`を設定し、通知が過剰にならないように制御
参考ドキュメント
以下の公式ドキュメントを参考にしました。TerraformやGoogle Cloud Monitoringの設定に役立つ情報が記載されています。
Terraform関連
- Terraform Google Provider Documentation
https://registry.terraform.io/providers/hashicorp/google/latest/docs
Google CloudリソースをTerraformで管理するための公式ドキュメントです。 - Terraform Configuration Language
https://developer.hashicorp.com/terraform/language
Terraformの基本的な構文や変数の使い方、モジュールの作成方法などが記載されています。
Google Cloud Monitoring関連
- Google Cloud Monitoring Documentation
https://cloud.google.com/monitoring/docs
Google Cloud Monitoringの概要やアラートポリシーの設定方法、通知チャネルの作成方法などが記載されています。 - Log-based Metrics
https://cloud.google.com/logging/docs/logs-based-metrics
ログベースのメトリクスを作成する方法についてのドキュメントです。
まとめ
Terraformを使用することで、Google Cloud Monitoringのログ監視を効率的に構築できます。テンプレート化により、他のプロジェクトや環境にも容易に適用でき、運用コストを削減できます。
今後は、さらに監視項目を増やし、Custom MetricsやLog-based Metricsを活用して、システム全体の可観測性を向上させていきたいと考えています。
この記事が、皆様のログ監視実装の一助となれば幸いです。
