Loadingโ€ฆ

์†Œ๊ฐœ ์˜จ๋ผ์ธ HCL / Terraform ํฌ๋งทํ„ฐ

Terraform, Packer ๋ฐ ๊ธฐํƒ€ HashiCorp ๋„๊ตฌ๋Š” ๋ชจ๋‘ HCL2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ผ๊ด€๋œ ํฌ๋งท์œผ๋กœ ์ž‘์„ฑ๋  ๋•Œ ๋” ๋ณด๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด HCL ํฌ๋งทํ„ฐ๋Š” ๊ตฌ์„ฑ์„ ๋ณด์•ˆ ๋ฐฑ์—”๋“œ๋กœ ์ „์†กํ•˜์—ฌ ๋“ค์—ฌ์“ฐ๊ธฐ, ๊ฐ„๊ฒฉ ๋ฐ ๋ ˆ์ด์•„์›ƒ์— terraform fmt ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„, ์˜๋ฏธ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ •๊ทœํ™”๋œ HCL2๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • Terraform ์Šคํƒ€์ผ ๋ธ”๋ก, ์†์„ฑ, ๋ชฉ๋ก/๋งต ๋ฐ heredoc์— ๋Œ€ํ•œ HCL2 ์ธ์‹ ํฌ๋งทํŒ…
  • =, ์‰ผํ‘œ, ์ค‘๊ด„ํ˜ธ ๋ฐ ์ค‘์ฒฉ ๋ธ”๋ก ์ฃผ๋ณ€์˜ ์ผ๊ด€๋œ ๋“ค์—ฌ์“ฐ๊ธฐ์™€ ๊ฐ„๊ฒฉ
  • ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์ฃผ์„๊ณผ ์˜๋„์ ์ธ ๋นˆ ์ค„์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ณด์กด
  • .tf, .hcl, HCL ๊ธฐ๋ฐ˜ .tfvars ๋ฐ Packer .pkr.hcl ํŒŒ์ผ๊ณผ ํ˜ธํ™˜
  • ๋ฉฑ๋“ฑ์„ฑ ์ถœ๋ ฅ: ํฌ๋งทํ„ฐ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ
  • ์ตœ์†Œํ•œ์˜ ์ธํ„ฐํŽ˜์ด์Šค: ๋‹จ์ผ 'ํฌ๋งท' ์ž‘์—…, ๋…ผ์Ÿํ•  ์Šคํƒ€์ผ ์„ค์ • ์—†์Œ
  • ํŽธ์ง‘๊ธฐ์—์„œ ํฌ๋งท๋œ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ ๋ณต์‚ฌ ๋˜๋Š” ๋‹ค์šด๋กœ๋“œ
  • ๋ณด์•ˆ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ง€์› ์ฒ˜๋ฆฌ โ€” ๋น ๋ฅธ ์ˆ˜์ •์— ์ ํ•ฉ; ๋งค์šฐ ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ๋Š” ๋กœ์ปฌ CLI ์‚ฌ์šฉ ๊ถŒ์žฅ

๐Ÿ”ง HCL ํฌ๋งทํ„ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• for hcl-formatter

1

1. ์ฝ”๋“œ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋˜๋Š” ๋“œ๋กญ

HCL/Terraform ํŒŒ์ผ(.tf, HCL ๊ธฐ๋ฐ˜ .tfvars, .hcl, .pkr.hcl ๋“ฑ)์„ ์—ด๊ณ  ๋‚ด์šฉ์„ ํŽธ์ง‘๊ธฐ์— ๋ถ™์—ฌ๋„ฃ๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ์„ ๋“œ๋กญํ•˜์„ธ์š”.

2

2. "ํฌ๋งท" ํด๋ฆญ

ํฌ๋งท ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”. ๊ตฌ์„ฑ์ด ๋ณด์•ˆ ๋ฐฑ์—”๋“œ๋กœ ์ „์†ก๋˜์–ด terraform fmt ์Šคํƒ€์ผ ๊ทœ์น™์ด ๋“ค์—ฌ์“ฐ๊ธฐ, ๊ฐ„๊ฒฉ ๋ฐ ๋ ˆ์ด์•„์›ƒ์— ์ ์šฉ๋œ ํ›„ ํฌ๋งท๋œ HCL2๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

3

3. ๊ฒ€ํ† , ๋ณต์‚ฌ ๋˜๋Š” ๋‹ค์šด๋กœ๋“œ

ํŽธ์ง‘๊ธฐ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ ํ›„ IDE์— ๋‹ค์‹œ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ํฌ๋งท๋œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•˜์„ธ์š”.

๊ธฐ์ˆ  ์‚ฌ์–‘

์‹คํ–‰ ๋ชจ๋ธ

์ด ํฌ๋งทํ„ฐ๋Š” ์„œ๋ฒ„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ HCL2์— ๋Œ€ํ•œ terraform fmt ์Šคํƒ€์ผ ๋ ˆ์ด์•„์›ƒ ์ •๊ทœํ™”๋ฅผ ๋ชจ๋ฐฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์ƒ์„ธ ๋‚ด์šฉ
๋ชจ๋“œ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ (๋ธŒ๋ผ์šฐ์ € ๋‚ด WASM ์—†์Œ)
๋ฒ”์œ„๊ณต๋ฐฑ, ๋“ค์—ฌ์“ฐ๊ธฐ, ๊ฐ„๊ฒฉ, ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ
์žฌ์ •๋ ฌ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ธ”๋ก์˜ ์˜๋ฏธ๋ก ์  ์žฌ์ •๋ ฌ ์—†์Œ
์˜ต์…˜์—†์Œ โ€” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ถœ๋ ฅ์„ ์œ„ํ•œ ๋‹จ์ผ ํฌ๋งท ์ž‘์—…
์ œํ•œ์•ฝ 1โ€“2 MB ์ž…๋ ฅ, ~25์ดˆ ์„œ๋ฒ„ ํƒ€์ž„์•„์›ƒ (์กฐ์ • ๊ฐ€๋Šฅ)
๋ณด์กด์ผ์‹œ์  ์ฒ˜๋ฆฌ โ€” ์ž…๋ ฅ์€ ํฌ๋งท ํ›„ ์‚ญ์ œ๋จ
๋ชจ๋“  ์˜จ๋ผ์ธ ๋„๊ตฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋กœ๋•์…˜ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๋ถ™์—ฌ๋„ฃ์ง€ ๋งˆ์„ธ์š”. ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ์—์„œ terraform fmt ๋˜๋Š” packer fmt๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์–ธ์–ด ์ง€์› ๋ฒ”์œ„

Terraform ๋ฐ ๊ธฐํƒ€ HashiCorp ๋„๊ตฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ HCL2 ๊ตฌ๋ฌธ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์˜ˆ์‹œ์ฐธ๊ณ 
๋ธ”๋กresource, variable, output, module, locals, job, task์ค‘์ฒฉ ๋ธ”๋ก ๊ตฌ์กฐ ์œ ์ง€
์†์„ฑname = "web", count = 2= ์ฃผ๋ณ€ ๋ฐ ์†์„ฑ ๊ฐ„ ๊ฐ„๊ฒฉ ์ •๊ทœํ™”
์ปฌ๋ ‰์…˜[1, 2, 3], { key = value }๋ฆฌ์ŠคํŠธ์™€ ๋งต/๊ฐ์ฒด์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ๋ ˆ์ด์•„์›ƒ
ํžˆ์–ด๋…<<-EOF ... EOF๋งˆ์ปค ์œ ์ง€; ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋“ค์—ฌ์“ฐ๊ธฐ ์ •๊ทœํ™”
์ฃผ์„# ๋ฐ // ์Šคํƒ€์ผ ์ฃผ์„์˜๋„์™€ ๋ฌธ์„œํ™”๋ฅผ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์œ ์ง€

๊ฐ„๋‹จํ•œ ์ „/ํ›„ ๋น„๊ต

Terraform ๋ฆฌ์†Œ์Šค์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ ๋ฐ ๊ฐ„๊ฒฉ ์ •๋ฆฌ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ž‘์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

# ์ด์ „
resource "aws_s3_bucket" "b"{bucket="demo"
  tags={Name="demo"}}

# ์ดํ›„
resource "aws_s3_bucket" "b" {
  bucket = "demo"

  tags = {
    Name = "demo"
  }
}
๋ ˆ์ด์•„์›ƒ๋งŒ ๋ณ€ํ™˜: ์‹๋ณ„์ž, ํ‘œํ˜„์‹ ๋ฐ ์ฐธ์กฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ.

์˜ค๋ฅ˜ ๋ฐ ์˜ˆ์™ธ ์ƒํ™ฉ

ํฌ๋งทํŒ…์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ HCL2 ์ž…๋ ฅ์˜ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฌธ์ œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฆ์ƒ๊ฐ€๋Šฅํ•œ ์›์ธํ™•์ธํ•  ์‚ฌํ•ญ
์ถœ๋ ฅ ์—†์Œ / ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜๋‹ซํžˆ์ง€ ์•Š์€ ์ค‘๊ด„ํ˜ธ, ๋Œ€๊ด„ํ˜ธ ๋˜๋Š” ๊ด„ํ˜ธ{ }, [ ], ( ) ์Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋งž์ถ”๊ณ  ๋ชจ๋“  ๋ธ”๋ก์„ ๋‹ซ์œผ์„ธ์š”
ํžˆ์–ด๋… ๋ฌธ์ œ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ข…๊ฒฐ์žEOF์™€ ๊ฐ™์€ ๋งˆ์ปค๊ฐ€ ์ •ํ™•ํžˆ ์ž์‹ ์˜ ์ค„์— ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”
ํ˜ผํ•ฉ๋œ ์Šคํƒ€์ผํƒญ/๊ณต๋ฐฑ ๋˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฌธ์ž๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์ •๊ทœํ™”ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ œ์–ด ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”
.tfvars ํ˜ผ๋ž€JSON ๋Œ€ HCL ๊ตฌ๋ฌธ*.tfvars.json ํŒŒ์ผ์—๋Š” JSON ํฌ๋งทํ„ฐ ๋˜๋Š” terraform fmt๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”

๋ช…๋ น์ค„ ๋Œ€์•ˆ

์ผ์ƒ์ ์ธ Infrastructure as Code ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ ๋ฐ CI์—์„œ ๊ณต์‹ ํฌ๋งทํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ด ์˜จ๋ผ์ธ ๋„๊ตฌ๋Š” ๋น ๋ฅธ ์ž„์‹œ ์ •๋ฆฌ๋ฅผ ์œ„ํ•ด ์œ ์ง€ํ•˜์„ธ์š”.

macOS / Linux

Terraform: ์ œ์ž๋ฆฌ์—์„œ ํฌ๋งท

terraform fmt

ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ .tf ๋ฐ HCL ๊ธฐ๋ฐ˜ .tfvars ํŒŒ์ผ์„ ๋‹ค์‹œ ์”๋‹ˆ๋‹ค.

Terraform: ์žฌ๊ท€์  CI ๊ฒ€์‚ฌ (์“ฐ๊ธฐ ์—†์Œ)

terraform fmt -check -recursive

ํฌ๋งทํŒ…์ด ํ•„์š”ํ•œ ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด 0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค โ€” CI ๋ฐ ์ปค๋ฐ‹ ์ „ ํ›…์— ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค.

Packer: ํ…œํ”Œ๋ฆฟ ํฌ๋งท

packer fmt path/to/template.pkr.hcl

์ง€์ •๋œ Packer HCL ํŒŒ์ผ์„ ์ œ์ž๋ฆฌ์—์„œ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค.

Windows (PowerShell)

๋ชจ๋“  Terraform ํŒŒ์ผ์„ ์žฌ๊ท€์ ์œผ๋กœ ํฌ๋งท

Get-ChildItem -Recurse -Filter *.tf | ForEach-Object { terraform fmt $_.FullName }

ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์—์„œ ๋ฐœ๊ฒฌ๋œ ๊ฐ .tf ํŒŒ์ผ์— ๋Œ€ํ•ด terraform fmt๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

CI ์Šคํƒ€์ผ ํฌ๋งทํŒ… ๊ฒ€์‚ฌ

terraform fmt -check -recursive

ํฌ๋งทํŒ…์ด ์ตœ์‹  ์ƒํƒœ๊ฐ€ ์•„๋‹ ๋•Œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‹คํŒจํ•˜๋„๋ก ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions

ํฌ๋งทํŒ…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋นŒ๋“œ ์‹คํŒจ

steps:
  - uses: hashicorp/setup-terraform@v3
  - run: terraform fmt -check -recursive

Terraform ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ํฌ๋งท๋˜์ง€ ์•Š์œผ๋ฉด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์—์„œ ์ž๋™ ํฌ๋งทํŒ… (์„ ํƒ์‚ฌํ•ญ)

steps:
  - run: terraform fmt -recursive
  - run: git diff --quiet || (git config user.name "bot" && git config user.email "bot@example" && git commit -am "chore: terraform fmt" && git push)

terraform fmt๋ฅผ ์ ์šฉํ•˜๊ณ  ํฌ๋งทํŒ… ์ „์šฉ ์ปค๋ฐ‹์„ ๋ธŒ๋žœ์น˜๋กœ ๋‹ค์‹œ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ทœ์ œ๋˜๊ฑฐ๋‚˜ ๊ธฐ๋ฐ€ ์ธํ”„๋ผ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ์˜จ๋ผ์ธ ํฌ๋งทํ„ฐ๋กœ ํŒŒ์ผ์„ ์ „์†กํ•˜๋Š” ๋Œ€์‹  ๋กœ์ปฌ CLI ๋„๊ตฌ๋ฅผ ์„ ํ˜ธํ•˜๊ณ  CI์—์„œ `terraform fmt -check -recursive`๋ฅผ ์ ์šฉํ•˜์„ธ์š”.

์‹ค์ „ ์ ์šฉ ์‚ฌ๋ก€

PR ๊ด€๋ฆฌ ๋ฐ ๋ฆฌ๋ทฐ

๊ณต๋ฐฑ๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‹ค์ œ ์ธํ”„๋ผ ๋ณ€๊ฒฝ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์—ด๊ธฐ ์ „์— ํฌ๋งทํŒ… ์‹คํ–‰
  • Terraform ๋ฆฌ๋ทฐ์—์„œ ์‚ฌ์†Œํ•œ ์Šคํƒ€์ผ ๊ด€๋ จ ์ฝ”๋ฉ˜ํŠธ ์ค„์ด๊ธฐ
  • git diff๋ฅผ ์ž‘๊ณ  ์˜๋ฏธ ์žˆ๊ฒŒ ์œ ์ง€

Terraform ๋ชจ๋“ˆ ๊ฐœ๋ฐœ

ํŒ€, ์ €์žฅ์†Œ, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ„์— ๋ชจ๋“ˆ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณต์œ  ๋ชจ๋“ˆ์—์„œ ๋ณ€์ˆ˜์™€ ์ถœ๋ ฅ ๋ธ”๋ก ์ •๋ ฌ
  • ์˜ˆ์ œ ๊ตฌ์„ฑ์ด ๋‹จ์ผ ํ•˜์šฐ์Šค ์Šคํƒ€์ผ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๋ณด์žฅ

CI ๊ฒŒ์ดํŠธํ‚คํ•‘

CI์—์„œ terraform fmt ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์Šคํƒ€์ผ์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • `terraform fmt -check -recursive`๋ฅผ ํ•„์ˆ˜ ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋กœ ์ถ”๊ฐ€
  • ๋ชจ๋“  .tf ํŒŒ์ผ์ด ํฌ๋งท๋  ๋•Œ๊นŒ์ง€ ๋ณ‘ํ•ฉ ์ฐจ๋‹จ

์˜จ๋ณด๋”ฉ ๋ฐ ๋ฌธ์„œํ™”

๊ฐ€๋…์„ฑ ์žˆ๋Š” ์˜ˆ์ œ๋Š” ์ƒˆ๋กœ์šด ํŒ€์›์ด Terraform๊ณผ ํ•˜์šฐ์Šค ์Šคํƒ€์ผ์„ ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

  • README์— ์ผ๊ด€๋˜๊ฒŒ ํฌ๋งท๋œ ์Šค๋‹ˆํŽซ ๊ฒŒ์‹œ
  • ๋‚ด๋ถ€ Terraform ๊ต์œก ์„ธ์…˜์—์„œ ๊น”๋”ํ•œ ์˜ˆ์ œ ์‚ฌ์šฉ

โ“ Frequently Asked Questions

๐Ÿ”’๋‚ด ์ฝ”๋“œ๋Š” ๋กœ์ปฌ์—์„œ ์ฒ˜๋ฆฌ๋˜๋‚˜์š”?

์•„๋‹ˆ์š”. ์ด HCL ํฌ๋งทํ„ฐ๋Š” ์„œ๋ฒ„ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค: ์ž…๋ ฅ์€ ํฌ๋งทํŒ…์„ ์œ„ํ•ด ๋ณด์•ˆ ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†ก๋˜๊ณ  ๊ฒฐ๊ณผ HCL์ด ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๋ฏผ๊ฐํ•˜๊ฑฐ๋‚˜ ๊ทœ์ œ๋œ ์ธํ”„๋ผ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ์—์„œ `terraform fmt`(๋˜๋Š” `packer fmt`)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์„ธ์š”.

๐Ÿ›ก๏ธ์—ฌ๊ธฐ์— ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๋ถ™์—ฌ๋„ฃ์–ด๋„ ๋ ๊นŒ์š”?

์˜จ๋ผ์ธ ๋„๊ตฌ์— ํ”„๋กœ๋•์…˜ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๋ถ™์—ฌ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธ๋˜๋ฉฐ ์ผ์‹œ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ, ์žฅ๊ธฐ๊ฐ„ ์œ ์ง€๋˜๊ฑฐ๋‚˜ ๋งค์šฐ ๋ฏผ๊ฐํ•œ ์ž๊ฒฉ ์ฆ๋ช…์€ ๋กœ์ปฌ ํŒŒ์ผ, ๋น„๋ฐ€ ์ €์žฅ์†Œ ๋˜๋Š” CI ๋ณผํŠธ์—๋งŒ ๋ณด๊ด€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ๋ธŒ๋ผ์šฐ์ € ๋„๊ตฌ์—๋Š” ๋ณด๊ด€ํ•˜์ง€ ๋งˆ์„ธ์š”.

๐Ÿงฉํฌ๋งทํŒ…์ด ๊ตฌ์„ฑ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋‚˜์š”?

์•„๋‹ˆ์š”. ํฌ๋งทํ„ฐ๋Š” ๋ ˆ์ด์•„์›ƒ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค: ๊ณต๋ฐฑ, ๋“ค์—ฌ์“ฐ๊ธฐ ๋ฐ ๊ฐ„๊ฒฉ. ์›๋ณธ HCL์ด ์œ ํšจํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ๋ฆฌ์†Œ์Šค ๋ธ”๋ก, ์ธ์ˆ˜, ํ‘œํ˜„์‹ ๋ฐ ์ฐธ์กฐ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“„.tfvars ํŒŒ์ผ์„ ํฌ๋งทํŒ…ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

์˜ˆ, .tfvars ํŒŒ์ผ์ด HCL ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Terraform์€ `.tfvars.json`์„ ํ†ตํ•ด JSON ๊ธฐ๋ฐ˜ ๋ณ€์ˆ˜๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค; ์ด๋Ÿฌํ•œ ํŒŒ์ผ์€ JSON ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉฐ JSON ํฌ๋งทํ„ฐ๋‚˜ `terraform fmt` ์ž์ฒด๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

โš™๏ธ์ด๊ฒƒ์ด `terraform fmt`์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

`terraform fmt`๋Š” Terraform๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ํ‘œ์ค€ ํฌ๋งทํ„ฐ๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋ฐ CI์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ด ์›น ๋„๊ตฌ๋Š” CLI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘์€ ์ฝ”๋“œ ์กฐ๊ฐ์„ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋น ๋ฅด๊ณ  ์ž„์‹œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿงฏํฌ๋งทํŒ…์ด ์‹คํŒจํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋Œ€๋ถ€๋ถ„์˜ ์‹คํŒจ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค: ๋‹ซํžˆ์ง€ ์•Š์€ ์ค‘๊ด„ํ˜ธ๋‚˜ ๋Œ€๊ด„ํ˜ธ, ์ž˜๋ชป๋œ heredoc, ๋˜๋Š” JSON ์Šคํƒ€์ผ tfvars์™€ HCL ๊ตฌ๋ฌธ์˜ ํ˜ผํ•ฉ. ๊ตฌ์กฐ์  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜(๋˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์–ธ/ํฌ๋งทํ„ฐ๋ฅผ ์‚ฌ์šฉ) ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.

Pro Tips

CI Tip

CI์—์„œ `terraform fmt -check -recursive`๋ฅผ ์ ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์ธํ”„๋ผ ์ €์žฅ์†Œ์—์„œ ํฌ๋งทํŒ… ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

Security Tip

๋น„๋ฐ€ ์ •๋ณด๋‚˜ ์ƒํƒœ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์˜จ๋ผ์ธ ๋„๊ตฌ์— ๋ถ™์—ฌ๋„ฃ์ง€ ๋งˆ์„ธ์š”; ๊ตฌ์„ฑ ์˜ˆ์ œ๋Š” ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์‹ค์ œ ์ธํ”„๋ผ ์ฝ”๋“œ์—๋Š” ๋กœ์ปฌ CLI ํฌ๋งทํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

Best Practice

์—๋””ํ„ฐ์—์„œ ํ›„ํ–‰ ์ค„๋ฐ”๊ฟˆ๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์ •๊ทœํ™”ํ•˜์—ฌ Terraform ํŒŒ์ผ์ด ํ”Œ๋žซํผ ๊ฐ„์— ๊นจ๋—ํ•˜๊ณ  ์•ˆ์ •์ ์ธ diff๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜์„ธ์š”.

Best Practice

`terraform fmt`๋ฅผ ์‹คํ–‰ํ•˜๋Š” pre-commit ํ›…์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ์ด๋ฏธ ํฌ๋งทํŒ…๋œ ์ƒํƒœ๋กœ ๋„์ฐฉํ•˜๊ณ  ๊ฒ€ํ†  ๋Œ€ํ™”๊ฐ€ ์•„ํ‚คํ…์ฒ˜์™€ ์œ„ํ—˜์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์„ธ์š”.

Additional Resources

Other Tools