4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BigQueryジョブの実行元を確認する方法

Posted at

GCPの監査ログから、BigQueryジョブの実行元を確認する方法を残しておきます。

Log RouterからBigQuery向けのsinkが作成されていることを想定します。

監査ログの概要やsinkを作成する方法については、以下の公式ドキュメントを参考してください。

ログを受信する特定のデータセットをに対して、以下のクエリを実行します。
実行すると、BigQueryジョブ毎に、どこから実行されていたかが分かります。

WITH
base AS (
SELECT
  resource.labels.project_id,
  protopayload_auditlog.authenticationInfo.principalEmail AS email,
  REGEXP_EXTRACT(protopayload_auditlog.resourceName, r'^projects/[\w-]+/jobs/([\w-]+)$') as job_id,
  timestamp,
  protopayload_auditlog.requestMetadata.callerSuppliedUserAgent AS user_agent,
  protopayload_auditlog.metadataJson AS metadata_json
FROM
  `<プロジェクトID>.<データセットID>.cloudaudit_googleapis_com_data_access_*`
WHERE
  timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND operation.first = true
),
audit AS (
SELECT
  CASE 
    WHEN starts_with(job_id, 'scheduled_query_')
      THEN 'scheduled_query'
    WHEN starts_with(job_id, 'script_job_')
      THEN 'script_job'
    WHEN starts_with(job_id, 'bquxjob_')
      THEN 'bq user interface'
    WHEN starts_with(job_id, 'job_') AND json_value(metadata_json, '$.jobInsertion.job.jobConfig.type') = 'EXPORT'
      THEN 'BQ UI data export to Google Drive'
    WHEN starts_with(job_id, 'sheets_dataconnector_')
      THEN 'sheets_dataconnector'
    WHEN starts_with(job_id, 'job_') AND json_value(metadata_json, '$.jobInsertion.job.jobConfig.labels.requestor') = 'looker_studio'
      THEN 'looker_studio'
    WHEN starts_with(job_id, 'job_') AND user_agent LIKE 'Tableau%'
      THEN 'tableau'
    WHEN starts_with(job_id, 'job_') AND user_agent IS NOT NULL
      THEN user_agent
    WHEN regexp_contains(job_id, '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$')
      THEN 'google-colab'
    ELSE 'unknown'
  END execution_source,
  json_value(metadata_json, "$.jobInsertion.job.jobConfig.queryConfig.query") AS query,
  *
FROM
  base
),
sheets_info AS (
SELECT
  job_id,
  'https://docs.google.com/spreadsheets/d/' || json_value(metadata_json, '$.firstPartyAppMetadata.sheetsMetadata.docId') as sheet_url,
  json_value(metadata_json, '$.jobInsertion.job.jobConfig.labels.sheets_trigger') AS sheets_trigger,
FROM
  base
)

SELECT
  project_id,
  email,
  timestamp,
  execution_source,
  query,
  sheet_url,
  sheets_trigger
FROM
  audit a FULL OUTER JOIN sheets_info s
    ON a.job_id = s.job_id

BigQueryのジョブIDは、その実行元のタイプによって決まりますので、IDからどの実行元に基づいたかを推測できます。
実行元のタイプがSpread Sheetだった場合、クエリを実行したシートの情報まで確認できます。

INFORMATION_SCHEMAからスロット消費量などを追加して、どこでスロットを消費しているのかも確認できますね
(Spread Sheet以外はurlを確認するのは難しいですが。。)

ジョブIDの分類は公式ではなく、経験に基づいていますが、もっとよい方法があったらコメントください。

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?