이 글은 Data Engineering Zoomcamp의 Module 1: Containerization and Infrastructure as Code를 기반으로, Terraform을 사용하여 GCS Bucket + BigQuery Dataset을 생성/삭제하는 IaC(Infra as Code) 워크플로우를 소개합니다.
목차
- 왜 Terraform인가
- 사전 준비: GCP 인증/권한
- Terraform 프로젝트 구조
- 예시 코드: GCS Bucket + BigQuery Dataset
- Terraform 워크플로: init → plan → apply → destroy
- 참고자료/출처
1. 왜 Terraform인가

데이터 엔지니어링을 시작하면 가장 먼저 필요한 게 "클라우드 리소스 준비"입니다. GCS 버킷(데이터 레이크)과 BigQuery 데이터셋(웨어하우스)을 콘솔에서 만들 수도 있지만, 아래 문제가 발생할 수 있습니다.
- 환경(dev/stg/prod) 분리 시 설정이 꼬임
- 팀원이 바뀌거나 재구축할 때 재현이 어려움
- 삭제 누락으로 비용이 누적됨
- 무엇이 언제 바뀌었는지 추적이 어려움
Terraform(Infrastructure as Code)은 이를 코드로 선언해두고 apply/destroy로 반복 가능하게 만드는 방식입니다. 실습에서도 해당 작업을 반복하여 진행하게 됩니다.
2. 사전 준비: GCP 인증/권한
Terraform이 GCP 리소스를 만들려면 서비스 계정 키(JSON) 와 권한이 필요합니다.
2.1 서비스 계정 권한(실습 기준 예시)
실습에서는 다음 권한만을 사용합니다.
- Storage 관련 권한(버킷 생성/관리)
- BigQuery 관련 권한(데이터셋 생성/관리)
운영 환경에서는 최소 권한 원칙 적용을 권장합니다.
2.2 인증 키(JSON)와 환경변수 설정
키 파일을 내려받아 로컬/VM/Codespaces 등에 저장한 뒤, Terraform이 읽을 수 있도록 환경변수로 지정합니다.
Linux/macOS
export GOOGLE_CREDENTIALS="$HOME/.gcp/my-creds.json"
Windows PowerShell
$env:GOOGLE_CREDENTIALS="C:\keys\my-creds.json"
3. Terraform 프로젝트 구조
Terraform은 보통 다음과 같이 파일을 분리합니다.
- main.tf : provider 설정 + 리소스 선언(핵심)
- variables.tf : 변수 선언(환경에 따라 바뀌는 값 정의)
- terraform.tfvars : 변수 값(내 프로젝트 값 입력)
- outputs.tf : 생성된 리소스 정보 출력
이 패턴을 쓰면 코드는 동일하고 값만 분리할 수 있어서, 재사용성과 운영성이 올라갑니다.
4. 예시 코드: GCS Bucket + BigQuery Dataset
다음 코드는 GCS Bucket 1개 + BigQuery Dataset 1개를 생성합니다.
variables.tf의 default 값만 본인 프로젝트에 맞게 수정하면 됩니다.
4.1 main.tf
terraform {
required_version = ">= 1.0"
required_providers {
google = {
source = "hashicorp/google"
version = ">= 4.0"
}
}
}
provider "google" {
project = var.project_id
region = var.region
}
# 1) GCS Bucket (Data Lake)
resource "google_storage_bucket" "data_lake_bucket" {
name = var.gcs_bucket_name
location = var.location
uniform_bucket_level_access = true
# 필요 시 버전닝 활성화 가능
versioning {
enabled = false
}
# 예시: 30일 지난 객체 삭제(학습/테스트 환경 비용 관리 목적)
lifecycle_rule {
condition {
age = 30
}
action {
type = "Delete"
}
}
}
# 2) BigQuery Dataset (Data Warehouse)
resource "google_bigquery_dataset" "dataset" {
dataset_id = var.bq_dataset_id
project = var.project_id
location = var.location
# destroy 시 dataset 내부 테이블까지 삭제 가능(실습엔 편하지만 운영은 주의)
delete_contents_on_destroy = true
}
4.2 variables.tf
variable "project_id" {
type = string
description = "GCP Project ID"
}
variable "region" {
type = string
description = "GCP region for provider"
default = "us-central1"
}
variable "location" {
type = string
description = "GCS/BQ location (e.g., US, EU, asia-northeast3)"
default = "US"
}
variable "gcs_bucket_name" {
type = string
description = "Globally-unique GCS bucket name"
}
variable "bq_dataset_id" {
type = string
description = "BigQuery dataset id"
}
5. Terraform 워크플로: init → plan → apply → destroy
실습/운영 모두에서 Terraform은 다음 순서를 바탕으로 진행됩니다.
5.1 init (플러그인 다운로드/초기화)
terraform init
5.2 plan (변경 계획 확인)
terraform plan
5.3 apply (리소스 생성/변경 적용)
terraform apply -auto-approve
# 또는 terraform apply 후 yes 입력
5.4 destroy (전체 삭제)
terraform destroy -auto-approve
# 또는 terraform destroy 후 yes 입력
6. 참고자료/출처
- 실습 폴더(01-docker-terraform/terraform): https://github.com/DataTalksClub/data-engineering-zoomcamp/tree/main/01-docker-terraform/terraform
- Terraform provider for Google Cloud 문서: https://registry.terraform.io/providers/hashicorp/google/latest/docs
- Terraform Google Storage Bucket 문서: https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/storage_bucket
- Terraform Google BigQuery Dataset 문서: https://registry.terraform.io/providers/hashicorp/google/6.3.0/docs/resources/bigquery_dataset