본문 바로가기
대외활동/DateEngineering Zoom Camp

[DE-Zoomcamp] 1-2. Terraform으로 GCP 인프라(GCS + BigQuery) 실습하기

by 드인 2026. 1. 25.
 이 글은 Data Engineering Zoomcamp의 Module 1: Containerization and Infrastructure as Code를 기반으로,  Terraform을 사용하여 GCS Bucket + BigQuery Dataset을 생성/삭제하는 IaC(Infra as Code) 워크플로우를 소개합니다.

 

 

목차

  1. 왜 Terraform인가
  2. 사전 준비: GCP 인증/권한
  3. Terraform 프로젝트 구조
  4. 예시 코드: GCS Bucket + BigQuery Dataset
  5. Terraform 워크플로: init → plan → apply → destroy
  6. 참고자료/출처

1. 왜 Terraform인가

https://developer.hashicorp.com/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. 참고자료/출처