BigQuery Scheduled Query 12 Factor App

BigQuery Scheduled Query 12 Factor App คืออะไร

BigQuery เป็น serverless data warehouse จาก Google Cloud ที่ประมวลผล SQL queries บน petabytes ของข้อมูลได้ในวินาที Scheduled Queries คือการตั้งเวลารัน SQL อัตโนมัติ เช่น ETL jobs, reports, aggregations 12-Factor App เป็นหลักการออกแบบ cloud-native applications 12 ข้อจาก Heroku การรวมสามแนวคิดนี้ช่วยสร้าง data pipelines บน BigQuery ที่ maintainable, scalable และ production-ready ตามหลัก 12-Factor
Terraform Infrastructure as Code

# terraform.tf — Terraform config for BigQuery scheduled queries
# Factor III (Config) + Factor V (Build, Release, Run)
# main.tf
resource "google_bigquery_data_transfer_config" "daily_metrics" {
display_name = "Daily User Metrics"
location = var.region
data_source_id = "scheduled_query"
schedule = "every day 02:00"
destination_dataset_id = google_bigquery_dataset.analytics.dataset_id
params = {
query = file("/queries/daily_user_metrics.sql")
destination_table_name_template = "user_metrics_daily"
write_disposition = "WRITE_APPEND"
}
service_account_name = google_service_account.bq_scheduler.email
email_preferences {
enable_failure_email = true
}
}
resource "google_bigquery_data_transfer_config" "hourly_kpi" {
display_name = "Hourly KPI Report"
location = var.region
data_source_id = "scheduled_query"
schedule = "every 1 hours"
destination_dataset_id = google_bigquery_dataset.analytics.dataset_id
params = {
query = templatefile("/queries/hourly_kpi.sql", {
project = var.project_id
dataset = var.dataset_id
})
}
service_account_name = google_service_account.bq_scheduler.email
}
# variables.tf
variable "project_id" {
description = "GCP Project ID"
type = string
}
variable "dataset_id" {
description = "BigQuery Dataset ID"
type = string
default = "analytics"
}
variable "region" {
description = "BigQuery region"
type = string
default = "asia-southeast1"
}
# environments/prod.tfvars
# project_id = "my-prod-project"
# dataset_id = "prod_analytics"
# environments/dev.tfvars
# project_id = "my-dev-project"
# dataset_id = "dev_analytics"
FAQ - คำถามที่พบบ่อย
Q: BigQuery Scheduled Query กับ Cloud Composer (Airflow) อันไหนดี?
A: Scheduled Query: ง่าย, ฟรี (จ่ายแค่ query cost), เหมาะ simple ETL/aggregation Cloud Composer: ซับซ้อนกว่า, dependencies, branching, retry logic, multi-step pipelines ใช้ Scheduled Query: SQL-only jobs, simple scheduling ใช้ Composer: complex DAGs, cross-service orchestration, conditional logic
Q: ค่าใช้จ่าย BigQuery Scheduled Query เท่าไหร่?
A: Scheduling: ฟรี (ไม่มีค่า scheduling fee) Query cost: $6.25/TB processed (on-demand) หรือ flat-rate slots ลดค่า: ใช้ partitioned tables, clustering, materialized views Cache: repeated queries ไม่เสียค่า (ถ้า result cached) ประมาณ: daily query scan 100GB = $0.625/day = ~$19/month
Q: Idempotent queries สำคัญอย่างไร?
A: Idempotent = รัน query ซ้ำกี่ครั้งก็ได้ผลเหมือนเดิม สำคัญมากสำหรับ scheduled queries เพราะ: retry ได้โดยไม่สร้าง duplicate data, backfill ได้ง่าย Patterns: MERGE (upsert), CREATE OR REPLACE, INSERT OVERWRITE หลีกเลี่ยง: INSERT INTO (สร้าง duplicates ถ้ารันซ้ำ)
Q: 12-Factor App เหมาะกับ data pipelines ไหม?
A: เหมาะมาก โดยเฉพาะ: Config in environment (ไม่ hardcode project IDs), Codebase in Git, Dev/Prod parity (แยก datasets), Logs as event streams, Disposability (idempotent queries) ช่วยให้ pipelines maintainable, testable, deployable ข้าม environments





