terraform-gcp-scaffolderlisted
Install: claude install-skill rk-chavali/gcp-de-skills
# Terraform GCP scaffolder
Read `references/conventions.md` for naming and labels.
## Layout
```
infra/
modules/
bq-dataset/
cloud-run-job/
service-account/
envs/
dev/ main.tf terraform.tfvars backend.tf
prod/ main.tf terraform.tfvars backend.tf
```
One state file per environment, remote backend in GCS with versioning on. Never
share state between dev and prod, and never let a module create its own project.
```hcl
# envs/prod/backend.tf
terraform {
required_version = ">= 1.9"
backend "gcs" {
bucket = "acme-tfstate-prod"
prefix = "data-platform"
}
required_providers {
google = {
source = "hashicorp/google"
version = "~> 6.0"
}
}
}
```
## BigQuery dataset module
```hcl
# modules/bq-dataset/main.tf
resource "google_bigquery_dataset" "this" {
dataset_id = var.dataset_id
project = var.project_id
location = var.location
description = var.description
delete_contents_on_destroy = false
default_partition_expiration_ms = var.partition_expiration_days == null ? null : var.partition_expiration_days * 86400000
labels = merge(var.labels, {
env = var.env
domain = var.domain
owner = var.owner
})
}
resource "google_bigquery_dataset_iam_member" "readers" {
for_each = toset(var.reader_members)
project = var.project_id
dataset_id = google_bigquery_dataset.this.dataset_id
role = "roles/bigquery.data