0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Service Accountで実行するBigQueryスケジュールクエリの失敗をメール通知する

Posted at

はじめに

BigQueryのスケジュールクエリ(Scheduled Queries)を運用する際、セキュリティや管理の観点から実行ユーザーを サービスアカウント (Service Account) に設定するのは一般的です。

しかし、ここで一つ罠があります。「コンソール上の失敗通知チェックボックスをオンにしても、メールが届かない」 という問題です。

この記事では、なぜ標準機能では通知が届かないのかを解説し、Terraformを使用して Cloud Monitoring で確実にアラートを受け取る設定を紹介します。

サービスアカウント実行時の「通知の罠」

BigQueryのスケジュールクエリ設定画面には「メール通知を送信」というオプションがあります。個人のGoogleアカウントで実行している場合は、これだけで失敗時にメールが届きます。

しかし、実行ユーザーがサービスアカウントの場合、この通知は誰にも届きません。

なぜ届かないのか?

この標準通知機能は、「クエリ実行者のメールアドレス」 宛てに送信される仕様だからです。
実行者が bq-transfer-sa@my-project.iam.gserviceaccount.com のようなサービスアカウントである場合、そのアカウントは受信ボックスを持っていないため、メールはどこにも届かずに消えてしまいます。

解決策:Cloud Monitoring によるログベースアラート

この問題を解決するには、Cloud Logging に出力される失敗ログをトリガーにして、Cloud Monitoring で通知を送る仕組みを構築します。

全体像

  1. スケジュールクエリが失敗し、severity: ERROR のログが出る。
  2. Cloud Monitoring がログを検知し、アラートを発火させる。
  3. 指定したメールアドレスに通知が飛ぶ。

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 のログベースアラートを使うのが正解。

これで、本番環境のスケジュールクエリが失敗しても即座に気づけるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?