콘텐츠 대표 이미지 - Terraform으로 완성하는 멀티 클라우드 인프라 프로비저닝

Terraform으로 완성하는 멀티 클라우드 인프라 프로비저닝

클라우드 인프라, 더 이상 클릭으로 만들지 마. 코드로 설계하고, 지휘하고, 자동화하자!

안녕! 👋 혹시 새벽에 서비스 배포하다가 서버 설정 하나 잘못 건드려서 식은땀 흘려본 경험, 다들 한 번쯤 있지 않아?
AWS 콘솔 들어가서 EC2 인스턴스 하나 만들고, 보안 그룹 설정하고, 로드 밸런서 붙이고...
이 모든 걸 손으로 하나하나 클릭하다 보면 꼭 실수가 생기기 마련이잖아.
게다가 오늘은 AWS, 내일은 GCP, 모레는 Azure... 클라우드마다 UI도 다르고 용어도 헷갈려서 머리가 터질 지경이지.

이런 '클릭 노동'과 '인프라 파편화'의 늪에서 우리를 구해줄 구원자가 바로 오늘 이야기할 **테라폼(Terraform)**이야.
테라폼은 클라우드 인프라를 마치 코딩하듯, 텍스트 파일로 관리하게 해주는 마법 같은 도구거든.
이 글 하나로 너의 인프라 관리 방식이 180도 바뀔 거라고 장담해. 자, 그럼 시작해볼까?

1. 인프라 관리, 패러다임의 전환: Infrastructure as Code (IaC)

테라폼을 이해하려면 먼저 **Infrastructure as Code**, 줄여서 IaC라는 개념부터 알아야 해.
이름 그대로 '코드로 관리하는 인프라'라는 뜻이야.
이게 무슨 말이냐고?

예전에는 서버가 필요하면 어떻게 했어?
데이터 센터에 가서 랙에 서버 꽂고, 케이블 연결하고, OS 설치하고... 완전 노가다였지.
클라우드가 등장하면서 AWS, GCP 같은 웹 콘솔에서 마우스 클릭 몇 번으로 서버를 뚝딱 만들 수 있게 됐어. 이건 정말 혁명이었지.
하지만 이것도 한계가 있었어. 수십, 수백 대의 서버를 관리하려면 여전히 반복적인 클릭 작업이 필요했고, 사람이 하다 보니 실수가 잦았지.
A 서버랑 B 서버 설정이 미묘하게 다른 '설정 드리프트(Configuration Drift)' 현상 때문에 장애가 나기도 하고 말이야.

IaC는 이런 문제를 해결하기 위해 등장했어.
우리가 애플리케이션 코드를 작성하고 Git으로 버전을 관리하는 것처럼,
서버, 데이터베이스, 네트워크 같은 인프라 자원들을 **코드 파일로 정의하고 관리**하는 거야.

이게 왜 좋냐고? 장점이 정말 많아.

  • **✨ 자동화와 속도:** 코드만 실행하면 인프라가 자동으로 뚝딱 만들어져. 수동 작업에 비해 비교할 수 없이 빠르지.
  • **✨ 일관성과 재현성:** 똑같은 코드는 언제, 어디서 실행하든 항상 똑같은 결과(인프라)를 만들어내. "내 컴퓨터에선 됐는데..." 같은 변명이 사라지는 거지. 개발, 스테이징, 프로덕션 환경을 동일하게 구성하기도 쉬워.
  • **✨ 버전 관리와 협업:** 인프라 코드를 Git 같은 버전 관리 시스템에 올리면 누가, 언제, 무엇을 변경했는지 추적할 수 있어. 동료와 함께 인프라를 개선하고 코드 리뷰를 통해 안정성을 높일 수도 있지.
  • **✨ 문서화:** 잘 작성된 인프라 코드는 그 자체로 가장 정확한 '인프라 명세서'가 돼. 코드를 보면 현재 인프라가 어떻게 구성되어 있는지 명확하게 알 수 있어.

IaC는 단순히 편의성을 높이는 도구가 아니라,
인프라를 안정적이고 예측 가능하게 운영하기 위한 현대 DevOps 문화의 핵심 철학이라고 할 수 있어.

Terraform으로 완성하는 멀티 클라우드 인프라 프로비저닝 인프라 코드 (Terraform .tf 파일) 버전 관리 (Git / GitHub) IaC 도구 (Terraform) 클라우드 인프라 (AWS, GCP, Azure)

2. 테라폼, 대체 정체가 뭐야?

자, 이제 주인공인 테라폼에 대해 본격적으로 알아보자.
테라폼은 하시코프(HashiCorp)라는 회사에서 만든 오픈소스 IaC 도구야.
이 녀석의 가장 큰 특징이자 장점은 바로 **'멀티 클라우드'**를 지원한다는 점이야.

AWS에는 클라우드포메이션(CloudFormation), Azure에는 ARM 템플릿, GCP에는 클라우드 디플로이먼트 매니저(Cloud Deployment Manager)처럼 각 클라우드 제공사(CSP)가 만든 자체 IaC 도구가 있어.
이 도구들도 훌륭하지만, 치명적인 단점이 있지. 바로 해당 클라우드에서만 작동한다는 거야. 이걸 '벤더 종속성(Vendor Lock-in)'이라고 해.

하지만 테라폼은 달라.
마치 여러 언어를 구사하는 통역사처럼, **하나의 문법(HCL)으로 여러 클라우드 서비스를 동시에 제어**할 수 있어.
AWS에 EC2 인스턴스를 만들고, GCP에 Cloud SQL 데이터베이스를 만들고, Cloudflare에서 DNS 설정을 변경하는 이 모든 작업을 단 하나의 테라폼 설정 파일로 관리할 수 있다는 거야.
이게 바로 테라폼이 '멀티 클라우드 시대의 끝판왕'으로 불리는 이유지.

테라폼의 언어: HCL (HashiCorp Configuration Language)

테라폼은 HCL이라는 자체 언어를 사용해.
"아, 또 새로운 언어를 배워야 해?"라고 걱정할 필요 없어.
HCL은 사람이 읽고 쓰기 매우 쉽게 설계되었거든. JSON과 비슷하지만 좀 더 간결하고 직관적이야.

예를 들어 AWS에 t2.micro 사양의 EC2 인스턴스를 하나 만드는 코드를 볼까?

# main.tf

# 사용할 클라우드 제공사(Provider)를 선언
provider "aws" {
  region = "ap-northeast-2" # 서울 리전
}

# 생성할 자원(Resource)을 정의
resource "aws_instance" "my_web_server" {
  ami           = "ami-0c94855ba95c71c99" # Amazon Linux 2 AMI ID
  instance_type = "t2.micro"

  tags = {
    Name = "MyWebServer-Terraform"
  }
}

어때? 코드를 잘 몰라도 대충 뭘 하는 건지 감이 오지 않아?
`provider "aws"`는 "나 이제부터 AWS 쓸 거야!"라고 선언하는 거고,
`resource "aws_instance" "my_web_server"`는 "AWS에서 EC2 인스턴스를 만들 건데, 이름은 my_web_server로 할게"라는 뜻이야.
그 아래 `ami`나 `instance_type`은 인스턴스의 세부 사양을 정하는 거지.
이렇게 선언적인(Declarative) 방식으로 '내가 원하는 인프라의 최종 상태'를 코드에 명시하면, 테라폼이 알아서 그 상태를 만들어주는 거야.

3. 테라폼의 핵심 개념 뽀개기

테라폼을 제대로 쓰려면 몇 가지 핵심 개념을 알아야 해.
이것만 알면 테라폼의 절반은 이해한 거나 다름없어.
하나씩 차근차근 뜯어보자.

1) 프로바이더 (Providers)

프로바이더는 테라폼과 실제 클라우드 서비스(AWS, GCP, Azure 등)를 연결해주는 **'플러그인' 또는 '어댑터'** 같은 거야.
테라폼 코어 자체는 클라우드를 제어하는 방법을 몰라.
우리가 코드에 `provider "aws"`라고 선언하면, 테라폼은 AWS 프로바이더를 다운로드해서 AWS API와 통신할 준비를 하는 거지.

프로바이더는 클라우드 서비스뿐만 아니라 GitHub, Datadog, Kubernetes 등 API를 제공하는 거의 모든 서비스를 지원해.
덕분에 테라폼 하나로 인프라 프로비저닝부터 애플리케이션 배포, 모니터링 설정까지 모두 자동화할 수 있는 엄청난 확장성을 갖게 돼.

Terraform AWS GCP Azure Kubernetes GitHub Datadog 테라폼은 프로바이더를 통해 다양한 서비스와 통신하며 인프라를 관리한다.

2) 리소스 (Resources)

리소스는 IaC의 가장 기본 단위로, **우리가 생성하고 관리하고 싶은 인프라 자원 하나하나**를 의미해.
AWS의 EC2 인스턴스, S3 버킷, VPC 네트워크, GCP의 Compute Engine, Cloud Storage, Azure의 Virtual Machine 등이 모두 리소스에 해당돼.

테라폼 코드에서 `resource` 블록을 사용해서 리소스를 선언해.

resource "리소스_타입" "리소스_이름" {
  # 인수 (Argument) 설정
  argument1 = "value1"
  argument2 = "value2"
}
  • **리소스 타입 (Resource Type):** 어떤 종류의 리소스를 만들지 지정해. `aws_instance`, `google_storage_bucket`처럼 `프로바이더명_자원종류` 형식으로 되어 있어. 이건 프로바이더 문서에 다 나와 있으니 외울 필요는 없어.
  • **리소스 이름 (Resource Name):** 테라폼 코드 내에서 이 리소스를 식별하기 위한 이름이야. 변수명처럼 우리가 자유롭게 지을 수 있어.
  • **인수 (Argument):** 리소스의 세부 설정을 정의하는 부분이야. 인스턴스 타입, 이미지 ID, 디스크 크기 등을 여기에 적어주지.

3) 상태 파일 (State File)

이거 정말 중요해. 별 다섯 개! ⭐⭐⭐⭐⭐
**상태 파일(`terraform.tfstate`)**은 테라폼의 **'기억' 또는 '두뇌'**와 같은 역할을 해.
테라폼이 코드를 통해 만든 실제 클라우드 상의 리소스 정보를 JSON 형태로 저장해두는 파일이야.

테라폼은 이 상태 파일을 보고 다음 작업을 결정해.

  1. 코드를 실행하면(`terraform apply`), 테라폼은 먼저 상태 파일을 확인해.
  2. 그리고 현재 코드에 정의된 리소스와 상태 파일에 기록된 리소스를 비교하지.
  3. 마지막으로 실제 클라우드 환경의 리소스와도 비교해.

이 비교를 통해 테라폼은 뭘 해야 할지 정확히 알아내.
- 코드에는 있는데 상태 파일에 없으면? -> **새로운 리소스를 생성(Create)**
- 코드와 상태 파일의 설정이 다르면? -> **기존 리소스를 변경(Update)**
- 코드에는 없는데 상태 파일에 있으면? -> **기존 리소스를 삭제(Destroy)**

이 상태 파일 덕분에 테라폼은 항상 최소한의 변경으로 우리가 원하는 인프라 상태를 유지할 수 있는 거야.

🚨 절대 주의! 🚨

상태 파일(`terraform.tfstate`)은 **절대로 수동으로 수정하면 안 돼!**
이 파일이 깨지거나 실제 인프라와 내용이 달라지면 테라폼이 정신을 못 차리고 엉뚱한 동작을 할 수 있어.
마치 뇌수술을 함부로 하는 것과 같아.
또한, 이 파일에는 민감한 정보(예: DB 비밀번호)가 평문으로 저장될 수 있으니, **Git에 올릴 때 반드시 `.gitignore`에 추가**해야 해!

4) 변수와 출력 (Variables & Outputs)

코드를 짜다 보면 반복적으로 사용되거나, 환경(개발/운영)에 따라 달라져야 하는 값들이 있어.
예를 들어 인스턴스 타입이나 리전 같은 것들 말이야.
이런 값들을 코드에 직접 박아두면(하드코딩) 나중에 수정하기가 너무 힘들어.
이럴 때 사용하는 게 **변수(Variables)**야.

변수를 사용하면 코드의 재사용성과 유연성이 확 올라가.

# variables.tf
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t2.micro"
}

# main.tf
resource "aws_instance" "my_web_server" {
  ami           = "ami-0c94855ba95c71c99"
  instance_type = var.instance_type # 변수 사용
}

이렇게 `variable` 블록으로 변수를 선언하고, `var.변수명` 형태로 가져다 쓸 수 있어.
나중에 인스턴스 타입을 바꾸고 싶으면 `variables.tf` 파일의 `default` 값만 바꾸면 되니 정말 편하지.

**출력(Outputs)**은 테라폼이 생성한 리소스의 정보를 외부에서 사용하거나 터미널에 표시하고 싶을 때 사용해.
예를 들어, EC2 인스턴스를 만들고 나서 할당된 공인 IP 주소를 알고 싶을 때가 있잖아.
이럴 때 `output`을 정의해두면 `terraform apply`가 끝난 후 화면에 딱 보여줘.

# outputs.tf
output "public_ip" {
  description = "Public IP address of the web server"
  value       = aws_instance.my_web_server.public_ip
}

5) 모듈 (Modules)

모듈은 **재사용 가능한 테라폼 코드 묶음**이야.
함수나 클래스 같은 개념이라고 생각하면 쉬워.
예를 들어, 웹 서버를 배포하려면 EC2 인스턴스, 보안 그룹, 탄력적 IP(EIP) 등 여러 리소스가 한 세트로 필요하잖아.
이 세트를 하나의 '웹 서버 모듈'로 만들어두면, 나중에 웹 서버가 필요할 때마다 이 모듈을 호출하기만 하면 돼.

# ./modules/web_server/main.tf (모듈 코드)
resource "aws_instance" "..." { ... }
resource "aws_security_group" "..." { ... }
resource "aws_eip" "..." { ... }

# ./main.tf (루트 코드에서 모듈 호출)
module "my_production_server" {
  source = "./modules/web_server" # 모듈 경로
  
  instance_name = "prod-web-01"
  instance_type = "t3.large"
}

module "my_staging_server" {
  source = "./modules/web_server"
  
  instance_name = "stg-web-01"
  instance_type = "t3.micro"
}

모듈을 사용하면 코드가 훨씬 간결해지고, 구조화되고, 유지보수하기 쉬워져.
잘 만들어진 모듈은 팀 전체의 생산성을 폭발적으로 높여주는 치트키야.

4. 실전! 테라폼으로 인프라 지휘하기 (기본 워크플로우)

백문이 불여일견! 직접 테라폼을 실행해보면서 감을 익혀보자.
테라폼의 기본 작업 흐름은 딱 3단계(+1)만 기억하면 돼: **Init → Plan → Apply (+ Destroy)**.

🛠️ 준비물

시작하기 전에 네 컴퓨터에 테라폼이 설치되어 있어야 하고,
인프라를 만들 클라우드(이 예제에서는 AWS)의 CLI 설정이 완료되어 있어야 해. (Access Key, Secret Key 설정)

먼저, 아까 봤던 간단한 EC2 인스턴스 생성 코드를 `main.tf`라는 이름으로 저장하자.

# main.tf

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c7c16d3e49a8a2e4" # Ubuntu 22.04 LTS (Seoul)
  instance_type = "t2.micro"

  tags = {
    Name = "Terraform-Practice"
  }
}

1단계: `terraform init` (초기화)

코드 작성이 끝났으면, 터미널에서 해당 디렉토리로 이동한 뒤 첫 번째 명령어를 실행해.

$ terraform init

이 명령어는 코드를 스캔해서 어떤 프로바이더가 필요한지 파악하고, 필요한 프로바이더 플러그인을 다운로드하는 역할을 해.
프로젝트를 처음 시작하거나, 새로운 프로바이더를 추가했을 때 딱 한 번만 실행해주면 돼.
성공적으로 끝나면 `.terraform`이라는 디렉토리가 생긴 걸 볼 수 있을 거야.

2단계: `terraform plan` (실행 계획 검토)

다음은 `plan` 명령어. 이건 정말 중요한 단계야.

$ terraform plan

`plan`은 우리가 작성한 코드와 현재 상태 파일(지금은 없지만)을 비교해서, **실제로 어떤 변경 작업이 일어날지 미리 보여주는** '드라이 런(Dry Run)' 기능이야.
어떤 리소스가 생성(create), 변경(update), 또는 삭제(destroy)될지 초록색(+), 노란색(~), 빨간색(-)으로 표시해줘.
실수로 중요한 서버를 날리는 대참사를 막으려면, `apply` 하기 전에 반드시 `plan` 결과를 꼼꼼히 확인하는 습관을 들여야 해.

3단계: `terraform apply` (실행)

`plan` 결과를 보고 "음, 내가 원했던 변경이 맞군!"이라는 확신이 들면, 드디어 실제 인프라를 생성할 차례야.

$ terraform apply

이 명령어를 실행하면 `plan`에서 봤던 내용을 한 번 더 보여주고, 정말로 실행할 건지 물어봐.
`yes`를 입력하고 엔터를 치면, 테라폼이 AWS API를 호출해서 EC2 인스턴스를 만들기 시작해.
몇 분 뒤 "Apply complete!" 메시지가 뜨면 성공! AWS 콘솔에 들어가 보면 'Terraform-Practice'라는 이름의 인스턴스가 짠~ 하고 만들어져 있을 거야.
동시에 현재 디렉토리에는 `terraform.tfstate` 파일이 생성되었을 거야. 바로 이 인스턴스의 정보가 담긴 '기억' 파일이지.

+1단계: `terraform destroy` (파괴)

연습이 끝났으면 리소스를 깔끔하게 정리해야지. 안 그러면 요금 폭탄을 맞을 수도 있으니까! 💣

$ terraform destroy

이 명령어는 테라폼으로 생성한 모든 리소스를 삭제해줘.
`apply`와 마찬가지로 어떤 리소스가 삭제될지 미리 보여주고, 정말 삭제할 건지 확인을 받아.
`yes`를 입력하면 생성했던 EC2 인스턴스가 구름 속으로 사라질 거야.
클릭 몇 번으로 리소스를 지우는 것보다 훨씬 안전하고 확실한 방법이지.

5. 꿈의 조합: 테라폼으로 멀티 클라우드 엮기

자, 이제 이 글의 하이라이트, 멀티 클라우드 프로비저닝이야.
요즘 잘나가는 서비스들은 더 이상 하나의 클라우드에만 의존하지 않아.
비용, 성능, 안정성 등 다양한 이유로 여러 클라우드의 장점을 조합해서 사용하거든.
예를 들어, 웹 애플리케이션은 AWS의 안정적인 EC2와 RDS 위에서 돌리고,
빅데이터 분석과 머신러닝은 GCP의 BigQuery와 AI Platform을 활용하는 식이지.

이런 멀티 클라우드 환경을 수동으로 관리한다고 상상해봐.
AWS 콘솔, GCP 콘솔을 번갈아 드나들며 설정하고... 생각만 해도 끔찍하지?
하지만 우리에겐 테라폼이 있잖아! 테라폼을 사용하면 이 모든 걸 하나의 프로젝트, 하나의 워크플로우로 통합할 수 있어.

어떻게 가능하냐고? 그냥 필요한 프로바이더를 전부 선언하면 돼. 정말 간단해.

AWS에 웹 서버를, GCP에 파일 저장용 스토리지 버킷을 만드는 가상의 시나리오를 코드로 구현해보자.

# main.tf

# 1. AWS 프로바이더 설정
provider "aws" {
  region = "ap-northeast-2"
}

# 2. GCP 프로바이더 설정
provider "google" {
  project = "my-gcp-project-id"
  region  = "asia-northeast3" # 서울 리전
  zone    = "asia-northeast3-a"
}

# --- AWS 리소스 정의 ---
resource "aws_instance" "web_server" {
  provider      = aws # 어떤 프로바이더를 사용할지 명시 (생략 가능)
  ami           = "ami-0c7c16d3e49a8a2e4"
  instance_type = "t2.micro"

  tags = {
    Name = "Multi-Cloud-WebServer-AWS"
  }
}

# --- GCP 리소스 정의 ---
resource "google_storage_bucket" "file_storage" {
  provider = google # 어떤 프로바이더를 사용할지 명시
  name     = "my-unique-multi-cloud-bucket-12345"
  location = "ASIA-NORTHEAST3"

  force_destroy = true
}

# --- 출력 정의 ---
output "aws_instance_public_ip" {
  value = aws_instance.web_server.public_ip
}

output "gcp_bucket_url" {
  value = google_storage_bucket.file_storage.url
}

코드를 봐. `provider "aws"`와 `provider "google"`을 둘 다 선언했지?
그리고 각 `resource` 블록에서 어떤 프로바이더를 사용할지 지정했어. (사실 프로바이더가 여러 개일 때, 리소스 타입(`aws_instance`, `google_storage_bucket`)만 봐도 테라폼이 알아서 적절한 프로바이더를 찾아주기 때문에 `provider = aws` 같은 구문은 생략해도 괜찮아.)

이제 이 디렉토리에서 `terraform init`을 실행하면?
테라폼은 AWS와 Google 프로바이더를 둘 다 다운로드할 거야.
그리고 `terraform apply`를 실행하면, **단 한 번의 명령으로 AWS에는 EC2 인스턴스가, GCP에는 스토리지 버킷이 동시에 생성돼.**

이게 바로 테라폼이 가진 멀티 클라우드 관리의 힘이야.
개발자는 더 이상 여러 클라우드의 복잡한 API나 콘솔 UI를 배울 필요 없이, 오직 테라폼 HCL 문법 하나에만 집중하면 돼.
인프라가 어떤 클라우드 위에 있든, 동일한 방식으로 코드를 작성하고, `plan`하고, `apply`하면 끝이니까.
팀의 생산성과 운영 효율성이 극대화되는 거지.

Terraform으로 완성하는 멀티 클라우드 인프라 프로비저닝 Terraform 코드 (main.tf) Terraform CLI Amazon Web Services EC2 Instance (web_server) S3 Bucket (logs) Google Cloud Platform Cloud SQL (database) Storage Bucket (file_storage)

6. 레벨 업! 테라폼 전문가를 위한 꿀팁

기본기를 다졌으니, 이제 실무에서 테라폼을 더 잘 쓸 수 있는 고급 기술과 베스트 프랙티스를 알아볼 차례야.
이런 디테일이 너를 '테라폼 좀 써봤네'에서 '테라폼 전문가'로 만들어 줄 거야.

1) 원격 상태 저장소 (Remote Backend) 사용하기

앞에서 상태 파일(`terraform.tfstate`)은 로컬에 생성되고, 절대로 Git에 올리면 안 된다고 했지?
그럼 혼자가 아니라 팀으로 일할 땐 어떻게 할까? 내 컴퓨터에 있는 상태 파일을 동료에게 메일로 보내줄 수도 없고...
이 문제를 해결하는 게 바로 **원격 상태 저장소(Remote Backend)**야.

로컬 대신 AWS S3, GCP Cloud Storage, Terraform Cloud 같은 원격 저장소에 상태 파일을 저장하는 거야.
이렇게 하면 다음과 같은 장점이 있어.

  • **협업:** 팀원 모두가 동일한 최신 상태 파일을 공유할 수 있어.
  • **상태 잠금 (State Locking):** 동료와 내가 동시에 `terraform apply`를 실행해서 인프라가 꼬이는 걸 방지해줘. 한 명이 작업하는 동안에는 상태 파일이 잠겨서 다른 사람이 수정할 수 없게 막아주는 기능이야.
  • **안정성:** 내 노트북이 고장 나도 상태 파일은 안전하게 원격지에 보관돼.

S3를 백엔드로 사용하는 설정은 아주 간단해.

# backend.tf
terraform {
  backend "s3" {
    bucket         = "my-terraform-state-bucket-unique-name"
    key            = "global/s3/terraform.tfstate"
    region         = "ap-northeast-2"
    encrypt        = true
    dynamodb_table = "my-terraform-locks" # 상태 잠금을 위한 DynamoDB 테이블
  }
}

이 코드를 추가하고 `terraform init`을 다시 실행하면, 테라폼이 로컬 상태를 S3로 옮겨줄까? 하고 물어볼 거야.
팀 프로젝트라면 원격 백엔드 설정은 선택이 아닌 필수야!

2) 작업 공간 (Workspaces)으로 환경 분리하기

보통 서비스를 운영할 때 개발(dev), 스테이징(stg), 운영(prod) 환경을 분리해서 사용하잖아.
이 환경들은 구성은 거의 같지만, 인스턴스 사양이나 개수 같은 세부 설정은 조금씩 달라.
이걸 어떻게 관리할까? dev, stg, prod 폴더를 따로 만들어서 코드를 복사할까?
그건 너무 비효율적이지. 이럴 때 쓰는 게 **작업 공간(Workspaces)**이야.

작업 공간을 사용하면 **동일한 코드 셋을 가지고 여러 개의 독립된 상태 파일**을 만들 수 있어.
즉, 코드 하나로 dev, stg, prod 환경의 인프라를 각각 따로 관리할 수 있다는 거지.

# 현재 작업 공간 확인
$ terraform workspace show
default

# 새로운 작업 공간 생성
$ terraform workspace new dev
Switched to workspace "dev".

# 작업 공간 목록 확인
$ terraform workspace list
* dev
  default

# 이제 'terraform apply'를 실행하면 dev 환경용 인프라가 생성되고,
# 상태 파일은 'terraform.tfstate.d/dev/terraform.tfstate'에 저장됨

코드에서는 `terraform.workspace` 변수를 사용해서 현재 어떤 작업 공간인지 확인하고, 환경에 따라 다른 값을 적용할 수 있어.

variable "instance_count" {
  type = map(number)
  default = {
    default = 1
    dev     = 2
    prod    = 10
  }
}

resource "aws_instance" "web" {
  count = lookup(var.instance_count, terraform.workspace, 1)
  # ...
}

3) 민감 정보는 안전하게 관리하기

DB 비밀번호, API 키 같은 민감 정보를 코드에 그대로 넣는 건 최악의 보안 습관이야.
이런 정보들은 절대로 Git에 커밋되면 안 돼.
그럼 어떻게 관리해야 할까? 몇 가지 방법이 있어.

  • **환경 변수 사용:** `TF_VAR_db_password` 같은 이름의 환경 변수로 값을 전달하는 방법.
  • **tfvars 파일 사용:** `secret.tfvars` 같은 별도의 변수 파일을 만들고, 이 파일은 `.gitignore`에 추가해서 Git에 올라가지 않도록 하는 방법.
  • **Vault 또는 클라우드 Secret Manager 연동:** 가장 안전하고 권장되는 방법이야. HashiCorp Vault, AWS Secrets Manager, GCP Secret Manager 같은 전문 보안 도구에 민감 정보를 저장하고, 테라폼에서는 데이터 소스(Data Source)를 통해 이 값을 동적으로 읽어오는 거지.

이런 고급 기술들은 혼자서 책이나 문서만 보고 익히기 어려울 수 있어.
그럴 땐 **재능넷** 같은 재능 공유 플랫폼에서 실제 현업 DevOps 전문가의 멘토링이나 코드 리뷰를 받아보는 것도 실력을 빠르게 키울 수 있는 좋은 방법이야.
막히는 부분을 전문가에게 직접 물어보고 해결책을 얻는 경험은 성장에 큰 도움이 될 거야.

마치며: 당신도 이제 클라우드 지휘자

와, 정말 긴 여정이었어!
클릭 노동의 고통에서 시작해서 IaC의 개념을 배우고, 테라폼의 핵심 기능들을 하나씩 뜯어봤어.
그리고 마침내 여러 클라우드를 자유자재로 엮어내는 멀티 클라우드 프로비저닝의 세계까지 경험했지.

테라폼은 단순히 인프라를 만드는 도구가 아니야.
인프라를 **안정적으로, 예측 가능하게, 그리고 효율적으로** 관리하기 위한 철학이자 문화야.
테라폼을 사용한다는 건, 당신이 더 이상 인프라의 '작업자'가 아니라, 전체 그림을 그리고 조율하는 **'설계자'이자 '지휘자'**가 된다는 의미야.

오늘 배운 내용을 바탕으로 작은 것부터 시작해봐.
개인 프로젝트의 작은 서버 하나부터 테라폼으로 관리해보는 거야.
코드로 인프라가 만들어지고 사라지는 마법을 직접 경험하고 나면, 다시는 예전의 '클릭 노동' 시절로 돌아가고 싶지 않을걸?
이 글이 너의 DevOps 여정에 든든한 첫걸음이 되었기를 바라.
이제 너의 손으로 클라우드라는 거대한 오케스트라를 멋지게 지휘해봐!

댓글 작성

이 글에 대한 여러분의 생각을 들려주세요

댓글 0
댓글을 불러오는 중입니다.

아직 댓글이 없습니다.