๐Ÿš€ Terraform 6์ผ์ฐจ: ์ „๋ฌธ์ ์ธ Terraform ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

๋ฐœํ–‰: (2025๋…„ 12์›” 12์ผ ์˜คํ›„ 03:41 GMT+9)
5 min read
์›๋ฌธ: Dev.to

Source: Dev.to

์™œ Terraform ํŒŒ์ผ์„ ์กฐ์งํ•ด์•ผ ํ• ๊นŒ์š”?

์ดˆ๋ณด์ž๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋„ฃ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค:

  • Providers
  • Resources
  • Variables
  • Outputs
  • Backend
  • Locals

์ด๋Š” ์•„์ฃผ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ๋‹จ์ผ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค:

  • โŒ ์ฝ๊ธฐ ์–ด๋ ค์›€
  • โŒ ์—…๋ฐ์ดํŠธ ์–ด๋ ค์›€
  • โŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€
  • โŒ ํŒ€ ์ž‘์—…์— ๋ถ€์ ํ•ฉ
  • โŒ ํ™•์žฅ ๋ถˆ๊ฐ€๋Šฅ

Dayโ€ฏ6์—์„œ๋Š” ๋ฉ€ํ‹ฐ ํŒŒ์ผ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“ˆ, ํ™˜๊ฒฝ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธํ”„๋ผ์™€ ๊ฐ™์€ ํ–ฅํ›„ ๊ฐœ๋…์˜ ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ Terraform ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

Terraform์€ ํŒŒ์ผ ์ด๋ฆ„์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  .tf ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊น”๋”ํ•œ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

project/
โ”œโ”€โ”€ main.tf          # resources
โ”œโ”€โ”€ variables.tf     # input variables
โ”œโ”€โ”€ outputs.tf       # output declarations
โ”œโ”€โ”€ providers.tf     # provider configuration (AWS, etc.)
โ”œโ”€โ”€ backend.tf       # remote backend configuration
โ”œโ”€โ”€ locals.tf        # local reusable values
โ”œโ”€โ”€ .gitignore       # exclude sensitive/state files
โ””โ”€โ”€ terraform.tfvars # default variable values (optional)

ํ•ต์‹ฌ ์ธ์‚ฌ์ดํŠธ
Terraform์€ ํŒŒ์ผ ์ˆœ์„œ๋‚˜ ์ด๋ฆ„์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ๋ช…๋ช… ๊ทœ์น™์€ ๊ฐ€๋…์„ฑ๊ณผ ํ˜‘์—…์„ ์œ„ํ•œ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค์ž…๋‹ˆ๋‹ค.

์‹ค์Šต: Terraform ํŒŒ์ผ ๋ถ„ํ• 

Dayโ€ฏ6 ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ•์‚ฌ๋Š” ์„ค์ •์„ ์ „์šฉ ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

backend.tf

terraform {
  backend "s3" {
    bucket = "my-terraform-backend"
    key    = "dev/terraform.tfstate"
    region = "us-east-1"
  }
}

providers.tf

provider "aws" {
  region = var.region
}
  • ์ž…๋ ฅ ๋ณ€์ˆ˜ โ†’ variables.tf
  • ๋กœ์ปฌ ๋ณ€์ˆ˜ โ†’ locals.tf
  • ์ถœ๋ ฅ๊ฐ’ โ†’ outputs.tf
  • ๋ฆฌ์†Œ์Šค โ†’ main.tf

์ด๋Ÿฌํ•œ ๋ถ„๋ฆฌ๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ณด์•ˆ: .gitignore ๋งŒ๋“ค๊ธฐ

Terraform ์ƒํƒœ ํŒŒ์ผ์ด๋‚˜ .terraform ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ GitHub์— ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”.

.gitignore

.terraform/
terraform.tfstate
terraform.tfstate.backup
crash.log
*.tfvars

์™œ?

  • ์ƒํƒœ ํŒŒ์ผ์—๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • .terraform ํด๋”์—๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ๋ถˆํ•„์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—… ํŒŒ์ผ๊ณผ ํฌ๋ž˜์‹œ ๋กœ๊ทธ๋Š” ๋‚ด๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋“ค์„ ๋ฒ„์ „ ๊ด€๋ฆฌ์—์„œ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ๊ณผ ๊น”๋”ํ•œ ๋ ˆํฌ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๊ณ„ํš: ๊ธฐ๋ณธ์„ ๋„˜์–ด

1. ํ™˜๊ฒฝ ํด๋”

environments/
โ”œโ”€โ”€ dev/
โ”œโ”€โ”€ stage/
โ””โ”€โ”€ prod/

๊ฐ ํ™˜๊ฒฝ์€ ์ž์ฒด main.tf, variables.tf, terraform.tfvars, ๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ ๊ตฌ์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ

modules/
โ”œโ”€โ”€ networking/
โ”œโ”€โ”€ compute/
โ””โ”€โ”€ security/

๋ชจ๋“ˆ์€ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด์ง€๋งŒ ๋” ๊นŠ์€ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹คโ€”์ด๋Š” ์ดํ›„ ์ฑŒ๋ฆฐ์ง€์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

3. ๋‹จ์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ๋‹ค์ค‘ tfvars

terraform apply -var-file=dev.tfvars
terraform apply -var-file=prod.tfvars

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ฐฐํฌ์— ์ตœ๋Œ€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž๋Š” ๋ชจ๋“ˆ์— ๋›ฐ์–ด๋“ค๊ธฐ ์ „์— ํŒŒ์ผ ๋ถ„๋ฆฌ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ˆ™๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

Dayโ€ฏ6์€ ์ œ๊ฐ€ Terraform ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ์‹์„ ๋ฐ”๊พธ์–ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” ํ•˜๋‚˜์˜ ์ง€์ €๋ถ„ํ•œ ํŒŒ์ผ ๋Œ€์‹  ๋‹ค์Œ์„ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • ์˜ฌ๋ฐ”๋ฅธ Terraform ์กฐ์ง ๋ฐฉ๋ฒ•
  • ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ๋ณด์•ˆ ๋ฐฉ๋ฒ•
  • ๋‹ค์ค‘ ํ™˜๊ฒฝ ์„ค์ • ์ค€๋น„ ๋ฐฉ๋ฒ•
  • ์ „๋ฌธ์ ์ด๊ณ  ๋ชจ๋“ˆํ™”๋œ ์ธํ”„๋ผ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด ๊ตฌ์กฐ๋Š” ์ดํ›„ ๋ชจ๋“  ์ž‘์—…์˜ ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚ด์ผ: Terraform ํƒ€์ž… ์ œ์•ฝ โ€” ๋ณ€์ˆ˜ ๊ฒ€์ฆ ๋ฐ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

Day 06: ํด๋ฆฐ Terraform ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ดํ•ด

Terraform ํ•™์Šต ์—ฌ์ •์˜ 6์ผ ์ฐจ์—, ๋‚˜๋Š” ์ดˆ๊ธฐ์— ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉด์„œ๋„ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ค‘์š”ํ•œ ๊ฒƒ, ์ฆ‰ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์— ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊น”๋”ํ•œ ๊ตฌ์กฐโ€ฆ

์Šคํฌ๋ฆฝํŒ…์„ ๋ฉˆ์ถ”๊ณ , ์„ค๊ณ„ ์‹œ์ž‘: Terraform์— ๋Œ€ํ•œ OOP ์ ‘๊ทผ

TL;DR ๋ฌธ์ œ: Terraform ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ข…์ข… ์Šคํ”„๋ ˆ์ผโ€”๋ณต์‚ฌโ€‘๋ถ™์—ฌ๋„ฃ๊ธฐ๋œ ๋ฆฌ์†Œ์Šค, ๊ธด๋ฐ€ํ•œ ๊ฒฐํ•ฉ, ๊ทธ๋ฆฌ๊ณ  ์Šค์ผ€์ผ๋ง์„ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ˆ„์ˆ˜๋œ ์ถ”์ƒํ™”โ€”์œผ๋กœ ๊ณ ํ†ต๋ฐ›๋Š”๋‹ค. The So...

Terraform ๋ฐ์ดํ„ฐ ์†Œ์Šค (AWS)

Terraform ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”? ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” Terraform์—์„œ ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ , Terraform์€ ...