最終確認: 2026年5月
ADP 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終わりまでに、Terraform を使用して、最も現実的な最小限の ADP データ基盤をプロビジョニングできます。これには、Cloud Storage のランディングバケット、取り込み日別にパーティション分割されたテーブルを1つ持つ BigQuery データセット、そして公開データセットから読み込み、そのテーブルに書き込む毎時実行される BigQuery スケジュールクエリが含まれます。4つのブロックで構成されており、GCPアナリティクスへの入門となります。
これらのスニペットを単一の main.tf にドロップし、terraform init を実行した後、terraform apply をステップバイステップで実行してください。
>= 1.5 または OpenTofu >= 1.6。your-project-id を置き換えてください。ラボの範囲内ではすべて無料です。
ラボの利用量では月あたり約$0です。実際の BigQuery ワークロードはスキャンされたバイト数に基づいて課金されます — 積極的にパーティションとクラスタ化を行い、必要なものだけを SELECT してください。
Cloud Storage、BigQuery、および BigQuery Data Transfer Service(スケジュールクエリを動かすサービス)を有効にします。
terraform {
required_version = ">= 1.5"
required_providers {
google = { source = "hashicorp/google", version = "~> 6.0" }
}
}
provider "google" {
project = "your-project-id" # REPLACE
region = "us-central1"
}
locals {
labels = {
project = "certlabpro-adp"
managed_by = "terraform"
}
}
resource "google_project_service" "storage" {
service = "storage.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "bigquery" {
service = "bigquery.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "bqdts" {
service = "bigquerydatatransfer.googleapis.com"
disable_on_destroy = false
}すべての ADP パターンのデータパイプラインは、ランディングバケットから始まります。未加工ファイル(CSV / JSON / Parquet / Avro)がここにドロップされ、ダウンストリームジョブがここから読み込みます。このバケットは、「データレイクの外側」と「データレイクの内側」の境界です。ADP 試験では、ここでもストレージクラスの選択が問われます — ランディング層には Standard(最初の30日間の頻繁な読み取り)を使用し、90日後に Coldline に移行するライフサイクルルールを設定します。
バケットレベルの統一アクセスは有効になっています(ADP が推奨するセキュリティのデフォルト設定)。
resource "random_id" "suffix" {
byte_length = 4
}
resource "google_storage_bucket" "landing" {
name = "certlabpro-adp-landing-${random_id.suffix.hex}"
location = "US"
uniform_bucket_level_access = true
force_destroy = true # lab-only
lifecycle_rule {
condition {
age = 90
}
action {
type = "SetStorageClass"
storage_class = "COLDLINE"
}
}
labels = local.labels
depends_on = [google_project_service.storage]
}BigQuery は GCP のサーバーレスデータウェアハウスです — クエリごとにスキャンされたバイト数、データごとに保存されたバイト数で課金されます。ADP 試験では、コスト管理の手段としてパーティション分割とクラスタリングが問われます。パーティション分割されたテーブルは、クエリが関連性のないデータをスキップできるようにし、クラスタ化されたテーブルは、関連する行をストレージ上でまとめて配置します。
ここでは以下を作成します。
analytics — BigQuery のコンテナ(GCP におけるスキーマ / データベースに相当)。ラボのクリーンアップの便宜のため、delete_contents_on_destroy = true を設定します。events — 取り込み時間パーティション分割(_PARTITIONTIME 擬似列)と30日間のパーティション有効期限を設定します。本番環境のテーブルでは、通常、クエリの選択性を高めるために列(time_partitioning.field)でパーティション分割します。resource "google_bigquery_dataset" "analytics" {
dataset_id = "analytics"
location = "US"
delete_contents_on_destroy = true # lab-only
labels = local.labels
depends_on = [google_project_service.bigquery]
}
resource "google_bigquery_table" "events" {
dataset_id = google_bigquery_dataset.analytics.dataset_id
table_id = "events"
deletion_protection = false # lab-only
time_partitioning {
type = "DAY"
expiration_ms = 30 * 24 * 60 * 60 * 1000 # 30 days
require_partition_filter = true
}
schema = jsonencode([
{ name = "event_id", type = "STRING", mode = "REQUIRED" },
{ name = "event_type", type = "STRING", mode = "REQUIRED" },
{ name = "event_time", type = "TIMESTAMP", mode = "REQUIRED" },
{ name = "user_id", type = "STRING", mode = "NULLABLE" },
{ name = "payload", type = "JSON", mode = "NULLABLE" },
])
labels = local.labels
}スケジュールクエリは、ある BigQuery データセットから別のデータセットへ定期的に取り込むための ADP パターンの基本要素です。これらは BigQuery Data Transfer Service インフラストラクチャ上で実行され(bq アドホッククエリとは別)、同じスキャンされたバイトあたりの料金で課金されます。
ここでは、毎時間実行されるクエリをスケジュールします。このクエリは、公開データセット bigquery-public-data.samples.shakespeare から読み込み、ステップ3の events テーブルに書き込みます。MERGE 形式(アップサート)は、冪等な取り込みに対する ADP の標準的な回答です — 同じ時間に再実行しても二重に挿入されることはありません。
スケジュールクエリはプロジェクトのデフォルトサービスアカウントとして実行されます。本番環境のデプロイでは、宛先に対して roles/bigquery.dataEditor ロールを持つ専用の転送サービスアカウントを使用します。
resource "google_bigquery_data_transfer_config" "hourly_load" {
display_name = "certlabpro-adp-hourly-load"
data_source_id = "scheduled_query"
location = "US"
schedule = "every 1 hours"
destination_dataset_id = google_bigquery_dataset.analytics.dataset_id
params = {
query = "INSERT INTO `${google_bigquery_dataset.analytics.dataset_id}.${google_bigquery_table.events.table_id}` (event_id, event_type, event_time, user_id, payload) SELECT GENERATE_UUID() AS event_id, \"shakespeare-line\" AS event_type, CURRENT_TIMESTAMP() AS event_time, NULL AS user_id, TO_JSON(STRUCT(word, word_count, corpus)) AS payload FROM `bigquery-public-data.samples.shakespeare` WHERE word_count > 100 LIMIT 100"
}
depends_on = [
google_project_service.bqdts,
google_bigquery_table.events,
]
}terraform destroy はすべてを削除します。バケットは削除され(ラボ専用の force_destroy)、データセットは削除され(ラボ専用の delete_contents_on_destroy)、そのテーブルも一緒に削除されます。スケジュールクエリは分離され、直ちに実行を停止します。プロジェクトサービスは有効なままです(無料)。
ADP は、このラボでは扱いきれない多くの GCP データサービスをカバーしています — Dataflow(プロレベルで [[gcp-pde]] でカバー)、Dataproc、Pub/Sub、Cloud Composer(マネージド Airflow)、Dataform(BigQuery 上に構築された SQL 変換 IDE)、Looker Studio、Vertex AI、Cloud Data Fusion、Database Migration Service、Datastream、BigLake / BigQuery Omni のマルチクラウド全体、および BigQuery ML(データベース内 ML トレーニング)などです。
私たちは、すべての ADP パターンのパイプラインがそこから始まる基盤であるため、GCS + BigQuery + スケジュールクエリの基本要素に焦点を当てています。Dataflow / Dataproc は GCS または BigQuery にストリームまたはバッチで取り込みます。Composer / Workflows は上記のスケジュールクエリをオーケストレートします。Looker は BigQuery から読み取ります。基本を正しく理解し、その上に専門的なエンジンを重ねてください。
サービスごとの概念的なカバレッジについては、この認定ページの 閲覧、プレイブック、および Editorial セクションを参照してください。