はじめに
BigQueryのスケジュールクエリ(Scheduled Queries)を運用する際、セキュリティや管理の観点から実行ユーザーを サービスアカウント (Service Account) に設定するのは一般的です。
しかし、ここで一つ罠があります。「コンソール上の失敗通知チェックボックスをオンにしても、メールが届かない」 という問題です。
この記事では、なぜ標準機能では通知が届かないのかを解説し、Terraformを使用して Cloud Monitoring で確実にアラートを受け取る設定を紹介します。
サービスアカウント実行時の「通知の罠」
BigQueryのスケジュールクエリ設定画面には「メール通知を送信」というオプションがあります。個人のGoogleアカウントで実行している場合は、これだけで失敗時にメールが届きます。
しかし、実行ユーザーがサービスアカウントの場合、この通知は誰にも届きません。
なぜ届かないのか?
この標準通知機能は、「クエリ実行者のメールアドレス」 宛てに送信される仕様だからです。
実行者が bq-transfer-sa@my-project.iam.gserviceaccount.com のようなサービスアカウントである場合、そのアカウントは受信ボックスを持っていないため、メールはどこにも届かずに消えてしまいます。
解決策:Cloud Monitoring によるログベースアラート
この問題を解決するには、Cloud Logging に出力される失敗ログをトリガーにして、Cloud Monitoring で通知を送る仕組みを構築します。
全体像
- スケジュールクエリが失敗し、
severity: ERRORのログが出る。 - Cloud Monitoring がログを検知し、アラートを発火させる。
- 指定したメールアドレスに通知が飛ぶ。
Terraform による実装
以下の2つのリソースを定義します。
1. 通知チャンネルの設定
まず、通知を送る先のメールアドレスを設定します。
resource "google_monitoring_notification_channel" "email" {
display_name = "BigQuery Scheduled Query Failure Channel"
type = "email"
labels = {
email_address = "your-email@example.com"
}
}
2. アラートポリシーの設定
次に、ログを監視するポリシーを作成します。
resource "google_monitoring_alert_policy" "bq_transfer_failure" {
display_name = "BigQuery Scheduled Query Failure"
project = "your-project-id"
combiner = "OR"
severity = "ERROR"
conditions {
display_name = "Data Transfer Failed Log"
condition_matched_log {
filter = <<EOT
resource.type="bigquery_dts_config"
severity>=ERROR
EOT
}
}
notification_channels = [google_monitoring_notification_channel.email.name]
alert_strategy {
notification_rate_limit {
period = "3600s" # 通知の頻度を制限(1時間に1回など)
}
}
}
実装のポイント
ログフィルタの条件
resource.type="bigquery_dts_config" を指定することで、プロジェクト内のすべてのスケジュールクエリ(BigQuery Data Transfer Service)の失敗を網羅できます。
まとめ
- サービスアカウント実行のスケジュールクエリでは、UI標準の通知機能は使えない。
- Cloud Monitoring のログベースアラートを使うのが正解。
これで、本番環境のスケジュールクエリが失敗しても即座に気づけるようになります。