最終確認: 2026年5月
PDE 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボを完了すると、プレーンなTerraformを使って、典型的なPDEストリーミングパイプラインがプロビジョニングされます。これには、Cloud Storageインジェストバケット、イベント入力としてのPub/Subトピック、クエリコスト制御のためにパーティション分割およびクラスタリングされたBigQueryデータセット+テーブル、そしてPub/Sub → BigQueryのストリーミングを行うDataflow Flex Templateジョブが含まれます。これらは5つのブロックで構成されており、PDEのあらゆる試験で問われるPub/Sub → Dataflow → BigQueryパターンです。
これらのスニペットを単一の main.tf にドロップし、terraform init を実行してから、terraform apply をステップバイステップで実行してください。
>= 1.5 または OpenTofu >= 1.6。your-project-id を置き換えてください。Dataflowは注意すべき費用項目です:
n1-standard-1 ワーカー1台): 実行中は月額約50ドル。各ラボセッション後には速やかに破棄してください。Dataflowジョブの実行中は月額約50ドルかかります。実行し続ける予定がない場合は、gcloud dataflow jobs cancel で停止してください。
Cloud Storage、Pub/Sub、BigQuery、DataflowのAPIを有効にします。
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-pde"
managed_by = "terraform"
}
}
resource "google_project_service" "storage" {
service = "storage.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "pubsub" {
service = "pubsub.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "bigquery" {
service = "bigquery.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "dataflow" {
service = "dataflow.googleapis.com"
disable_on_destroy = false
}Dataflowジョブは、一時ファイル(Pythonホイール、JARアップロード、中間状態)のための GCSステージングバケット を必要とします。PDEで推奨されるパターンは、データドメインごとに1つのバケットを用意し、staging/、temp/、templates/ のサブフォルダで運用状態を実際のデータから分離することです。
resource "random_id" "suffix" {
byte_length = 4
}
resource "google_storage_bucket" "ingest" {
name = "certlabpro-pde-ingest-${random_id.suffix.hex}"
location = "US"
uniform_bucket_level_access = true
force_destroy = true # lab-only
labels = local.labels
depends_on = [google_project_service.storage]
}PDEの典型的なストリーミング入力: パブリッシャー (クリックスストリーム、IoT、CDC) がイベントをPub/Subトピックにプッシュし、Dataflow がサブスクライブしてBigQueryに書き込みます。Pub/Subは、耐久性のある、少なくとも1回の配信と、プロデューサーに影響を与えることなくコンシューマーを変更できるデカップリングレイヤーを提供します。
ここでは、トピック events とDataflowが所有するサブスクリプション events-to-bq を作成します。サブスクリプションの ack_deadline_seconds = 60 は、PDEで推奨されるDataflowの設定であり、一般的なDataflowのウィンドウ排出頻度よりも長く設定されています。
resource "google_pubsub_topic" "events" {
name = "events"
labels = local.labels
depends_on = [google_project_service.pubsub]
}
resource "google_pubsub_subscription" "events_to_bq" {
name = "events-to-bq"
topic = google_pubsub_topic.events.id
ack_deadline_seconds = 60
message_retention_duration = "604800s" # 7 days
labels = local.labels
}PDE試験では、このパーティション分割とクラスタリングの選択が執拗に問われます。ここでは、event_time でパーティション分割 (DAY粒度、PDEの定番) し、event_type でクラスタリングされた events テーブルを作成します。これにより、event_time でフィルタリングするクエリは無関係なパーティションをスキップし、event_type でフィルタリングするクエリはパーティション内の無関係なブロックをスキップします。
require_partition_filter = true は、クエリに WHERE event_time >= ... 句を含めることを強制します。これは、誤って高額なフルテーブルスキャンが発生するのを防ぐためのPDE推奨のガードレールです。
resource "google_bigquery_dataset" "analytics" {
dataset_id = "analytics"
location = "US"
delete_contents_on_destroy = true
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
time_partitioning {
type = "DAY"
field = "event_time"
require_partition_filter = true
}
clustering = ["event_type"]
schema = jsonencode([
{ name = "event_time", type = "TIMESTAMP", mode = "REQUIRED" },
{ name = "event_type", type = "STRING", mode = "REQUIRED" },
{ name = "event_id", type = "STRING", mode = "REQUIRED" },
{ name = "payload", type = "JSON", mode = "NULLABLE" },
])
labels = local.labels
}Dataflow Flex Templates は、PDEの典型的なジョブ・アズ・リソースの形態です。Googleは一般的なパターン(Pub/Sub → BigQuery、Pub/Sub → GCS、JDBC → BigQueryなど)向けに事前構築されたテンプレートを提供しており、それらをパラメータ付きで起動します。
ここでは、Googleが提供する Pubsub_Subscription_to_BigQuery テンプレートを、ステップ3のサブスクリプションとステップ4のテーブルに対して起動します。ジョブは terraform apply の実行直後に開始されます。Dataflow → Jobsの下に表示されます。月額約50ドルのワーカー料金を停止するため、完了したら gcloud dataflow jobs cancel <job-id> --region us-central1 でキャンセルしてください。
data "google_project" "current" {}
resource "google_dataflow_flex_template_job" "pubsub_to_bq" {
provider = google-beta
name = "certlabpro-pde-pubsub-to-bq"
container_spec_gcs_path = "gs://dataflow-templates-us-central1/latest/flex/PubSub_Subscription_to_BigQuery"
region = "us-central1"
parameters = {
inputSubscription = google_pubsub_subscription.events_to_bq.id
outputTableSpec = "${data.google_project.current.project_id}:${google_bigquery_dataset.analytics.dataset_id}.${google_bigquery_table.events.table_id}"
}
temp_location = "gs://${google_storage_bucket.ingest.name}/temp"
staging_location = "gs://${google_storage_bucket.ingest.name}/staging"
on_delete = "cancel"
depends_on = [google_project_service.dataflow]
}terraform destroy ですべてが削除されます。Dataflowジョブはキャンセルされ (on_delete = "cancel")、ワーカーの課金は数分以内に停止します。Pub/Sub + BigQuery + GCS リソースはきれいに破棄されます。取り込まれたイベントを保持するBigQueryテーブルは、データセットとともに削除されます (delete_contents_on_destroy)。
PDEは、このラボでは扱いきれない多くのGCPデータサービスをカバーしています。Dataproc (マネージドHadoop / Spark)、Cloud Composer (バッチオーケストレーション用のマネージドAirflow)、Cloud Data Fusion (ビジュアルETL)、Database Migration Service (DMS)、Datastream (Oracle / MySQL / Postgres → BigQueryへのCDC)、Cloud Storage Transfer Service、BigQuery Omni / BigLake (マルチクラウド / 外部テーブル)、BigQuery ML (データベース内ML)、BigQuery BI Engine (Looker用のキャッシュクエリレイヤー)、Looker / Looker Studio、Cloud Pub/Sub Lite (安価だが制限あり)、アプリケーション層データ用のSpanner / Bigtable / Firestore ([[gcp-pcdoe]]でカバー)、Vertex AI Pipelines / Feature Store / Workbench ([[gcp-pmle]]でカバー)、PII編集用のCloud DLP / Sensitive Data Protectionなどです。
GCS + Pub/Sub + Dataflow + BigQuery のプリミティブにこだわるのは、これらがすべての試験シナリオの基礎となるPDEの標準的なストリーミングパイプラインであるためです。Composerはバッチで同じ形状をオーケストレーションします。Dataprocは、同じBigQueryに書き込むSparkワークロードの代替コンピュートエンジンです。Datastreamは、同じPub/Sub → Dataflow → BigQueryの形状のマネージドCDCバリアントです。標準的なパイプラインを習得すれば、他の選択肢も理解しやすくなります。
サービスごとの概念的な説明については、この認定ページにある 閲覧、プレイブック、および Editorial セクションを参照してください。