์ฃผ์ ๊ธฐ๋ฅ
- Terraform ์คํ์ผ ๋ธ๋ก, ์์ฑ, ๋ชฉ๋ก/๋งต ๋ฐ heredoc์ ๋ํ HCL2 ์ธ์ ํฌ๋งทํ
- =, ์ผํ, ์ค๊ดํธ ๋ฐ ์ค์ฒฉ ๋ธ๋ก ์ฃผ๋ณ์ ์ผ๊ด๋ ๋ค์ฌ์ฐ๊ธฐ์ ๊ฐ๊ฒฉ
- ๊ฐ๋ ์ฑ์ ์ํด ์ฃผ์๊ณผ ์๋์ ์ธ ๋น ์ค์ ๊ฐ๋ฅํ ํ ๋ณด์กด
- .tf, .hcl, HCL ๊ธฐ๋ฐ .tfvars ๋ฐ Packer .pkr.hcl ํ์ผ๊ณผ ํธํ
- ๋ฉฑ๋ฑ์ฑ ์ถ๋ ฅ: ํฌ๋งทํฐ๋ฅผ ๋ค์ ์คํํด๋ ๋์ผํ ๊ฒฐ๊ณผ
- ์ต์ํ์ ์ธํฐํ์ด์ค: ๋จ์ผ 'ํฌ๋งท' ์์ , ๋ ผ์ํ ์คํ์ผ ์ค์ ์์
- ํธ์ง๊ธฐ์์ ํฌ๋งท๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ์ ํด๋ฆญ์ผ๋ก ๋ณต์ฌ ๋๋ ๋ค์ด๋ก๋
- ๋ณด์ ์๋ํฌ์ธํธ๋ฅผ ํตํ ์๋ฒ ์ง์ ์ฒ๋ฆฌ โ ๋น ๋ฅธ ์์ ์ ์ ํฉ; ๋งค์ฐ ๋ฏผ๊ฐํ ์ฝ๋๋ ๋ก์ปฌ CLI ์ฌ์ฉ ๊ถ์ฅ
๐ง HCL ํฌ๋งทํฐ ์ฌ์ฉ ๋ฐฉ๋ฒ for hcl-formatter
1. ์ฝ๋ ๋ถ์ฌ๋ฃ๊ธฐ ๋๋ ๋๋กญ
HCL/Terraform ํ์ผ(.tf, HCL ๊ธฐ๋ฐ .tfvars, .hcl, .pkr.hcl ๋ฑ)์ ์ด๊ณ ๋ด์ฉ์ ํธ์ง๊ธฐ์ ๋ถ์ฌ๋ฃ๊ฑฐ๋, ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ๋ ๊ฒฝ์ฐ ํ์ผ์ ๋๋กญํ์ธ์.
2. "ํฌ๋งท" ํด๋ฆญ
ํฌ๋งท ๋ฒํผ์ ํด๋ฆญํ์ธ์. ๊ตฌ์ฑ์ด ๋ณด์ ๋ฐฑ์๋๋ก ์ ์ก๋์ด terraform fmt ์คํ์ผ ๊ท์น์ด ๋ค์ฌ์ฐ๊ธฐ, ๊ฐ๊ฒฉ ๋ฐ ๋ ์ด์์์ ์ ์ฉ๋ ํ ํฌ๋งท๋ HCL2๊ฐ ๋ฐํ๋ฉ๋๋ค.
3. ๊ฒํ , ๋ณต์ฌ ๋๋ ๋ค์ด๋ก๋
ํธ์ง๊ธฐ์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ํ IDE์ ๋ค์ ๋ณต์ฌํ๊ฑฐ๋ ํฌ๋งท๋ ํ์ผ์ ๋ค์ด๋ก๋ํ์ฌ ์ ์ฅ์์ ์ปค๋ฐํ์ธ์.
๊ธฐ์ ์ฌ์
์คํ ๋ชจ๋ธ
์ด ํฌ๋งทํฐ๋ ์๋ฒ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ฉฐ HCL2์ ๋ํ terraform fmt ์คํ์ผ ๋ ์ด์์ ์ ๊ทํ๋ฅผ ๋ชจ๋ฐฉํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
| ํญ๋ชฉ | ์์ธ ๋ด์ฉ |
|---|---|
| ๋ชจ๋ | ์๋ฒ ๊ธฐ๋ฐ (๋ธ๋ผ์ฐ์ ๋ด WASM ์์) |
| ๋ฒ์ | ๊ณต๋ฐฑ, ๋ค์ฌ์ฐ๊ธฐ, ๊ฐ๊ฒฉ, ๊ธฐ๋ณธ ๋ ์ด์์ |
| ์ฌ์ ๋ ฌ | ๋ฆฌ์์ค ๋๋ ๋ธ๋ก์ ์๋ฏธ๋ก ์ ์ฌ์ ๋ ฌ ์์ |
| ์ต์ | ์์ โ ์์ธก ๊ฐ๋ฅํ ์ถ๋ ฅ์ ์ํ ๋จ์ผ ํฌ๋งท ์์ |
| ์ ํ | ์ฝ 1โ2 MB ์ ๋ ฅ, ~25์ด ์๋ฒ ํ์์์ (์กฐ์ ๊ฐ๋ฅ) |
| ๋ณด์กด | ์ผ์์ ์ฒ๋ฆฌ โ ์ ๋ ฅ์ ํฌ๋งท ํ ์ญ์ ๋จ |
์ธ์ด ์ง์ ๋ฒ์
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 -recursiveTerraform ํ์ผ์ด ์ ๋๋ก ํฌ๋งท๋์ง ์์ผ๋ฉด ์ํฌํ๋ก์ฐ๋ฅผ ์ค์งํฉ๋๋ค.
ํ ๋ฆฌํ์คํธ์์ ์๋ ํฌ๋งทํ (์ ํ์ฌํญ)
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๋ฅผ ์ ์ฉํ๊ณ ํฌ๋งทํ ์ ์ฉ ์ปค๋ฐ์ ๋ธ๋์น๋ก ๋ค์ ํธ์ํฉ๋๋ค.
์ค์ ์ ์ฉ ์ฌ๋ก
PR ๊ด๋ฆฌ ๋ฐ ๋ฆฌ๋ทฐ
๊ณต๋ฐฑ๊ณผ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ํ์คํํ์ฌ ๋ฆฌ๋ทฐ์ด๊ฐ ์ค์ ์ธํ๋ผ ๋ณ๊ฒฝ์ ์ง์คํ ์ ์๋๋ก ํฉ๋๋ค.
- ํ ๋ฆฌํ์คํธ๋ฅผ ์ด๊ธฐ ์ ์ ํฌ๋งทํ ์คํ
- Terraform ๋ฆฌ๋ทฐ์์ ์ฌ์ํ ์คํ์ผ ๊ด๋ จ ์ฝ๋ฉํธ ์ค์ด๊ธฐ
- git diff๋ฅผ ์๊ณ ์๋ฏธ ์๊ฒ ์ ์ง
Terraform ๋ชจ๋ ๊ฐ๋ฐ
ํ, ์ ์ฅ์, ๋ ์ง์คํธ๋ฆฌ ๊ฐ์ ๋ชจ๋์ ์ผ๊ด๋๊ฒ ์ ์งํฉ๋๋ค.
- ๊ณต์ ๋ชจ๋์์ ๋ณ์์ ์ถ๋ ฅ ๋ธ๋ก ์ ๋ ฌ
- ์์ ๊ตฌ์ฑ์ด ๋จ์ผ ํ์ฐ์ค ์คํ์ผ๊ณผ ์ผ์นํ๋๋ก ๋ณด์ฅ
CI ๊ฒ์ดํธํคํ
CI์์ terraform fmt ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์คํ์ผ์ด ๋ณํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- `terraform fmt -check -recursive`๋ฅผ ํ์ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ก ์ถ๊ฐ
- ๋ชจ๋ .tf ํ์ผ์ด ํฌ๋งท๋ ๋๊น์ง ๋ณํฉ ์ฐจ๋จ
์จ๋ณด๋ฉ ๋ฐ ๋ฌธ์ํ
๊ฐ๋ ์ฑ ์๋ ์์ ๋ ์๋ก์ด ํ์์ด Terraform๊ณผ ํ์ฐ์ค ์คํ์ผ์ ๋น ๋ฅด๊ฒ ๋ฐฐ์ฐ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- README์ ์ผ๊ด๋๊ฒ ํฌ๋งท๋ ์ค๋ํซ ๊ฒ์
- ๋ด๋ถ Terraform ๊ต์ก ์ธ์ ์์ ๊น๋ํ ์์ ์ฌ์ฉ
โ Frequently Asked Questions
๐๋ด ์ฝ๋๋ ๋ก์ปฌ์์ ์ฒ๋ฆฌ๋๋์?
๐ก๏ธ์ฌ๊ธฐ์ ๋น๋ฐ ์ ๋ณด๋ฅผ ๋ถ์ฌ๋ฃ์ด๋ ๋ ๊น์?
๐งฉํฌ๋งทํ ์ด ๊ตฌ์ฑ ๋์์ ๋ณ๊ฒฝํ๋์?
๐.tfvars ํ์ผ์ ํฌ๋งทํ ํ ์ ์๋์?
JSON ๊ธฐ๋ฐ ๋ณ์๋ ์ง์ํฉ๋๋ค; ์ด๋ฌํ ํ์ผ์ JSON ๊ท์น์ ๋ฐ๋ฅด๋ฉฐ JSON ํฌ๋งทํฐ๋ `terraform fmt` ์์ฒด๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.โ๏ธ์ด๊ฒ์ด `terraform fmt`์ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์?
๐งฏํฌ๋งทํ ์ด ์คํจํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
JSON ์คํ์ผ tfvars์ HCL ๊ตฌ๋ฌธ์ ํผํฉ. ๊ตฌ์กฐ์ ๋ฌธ์ ๋ฅผ ์์ ํ๊ฑฐ๋(๋๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ์ธ/ํฌ๋งทํฐ๋ฅผ ์ฌ์ฉ) ๋ค์ ์๋ํ์ธ์.Pro Tips
CI์์ `terraform fmt -check -recursive`๋ฅผ ์ ์ฉํ์ฌ ๋๊ท๋ชจ ์ธํ๋ผ ์ ์ฅ์์์ ํฌ๋งทํ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ์ธ์.
๋น๋ฐ ์ ๋ณด๋ ์ํ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์จ๋ผ์ธ ๋๊ตฌ์ ๋ถ์ฌ๋ฃ์ง ๋ง์ธ์; ๊ตฌ์ฑ ์์ ๋ ๊นจ๋ํ๊ฒ ์ ์งํ๊ณ ์ค์ ์ธํ๋ผ ์ฝ๋์๋ ๋ก์ปฌ CLI ํฌ๋งทํฐ๋ฅผ ์คํํ์ธ์.
์๋ํฐ์์ ํํ ์ค๋ฐ๊ฟ๊ณผ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ ๊ทํํ์ฌ Terraform ํ์ผ์ด ํ๋ซํผ ๊ฐ์ ๊นจ๋ํ๊ณ ์์ ์ ์ธ diff๋ฅผ ์์ฑํ๋๋ก ํ์ธ์.
`terraform fmt`๋ฅผ ์คํํ๋ pre-commit ํ ์ ์ถ๊ฐํ์ฌ ํ ๋ฆฌํ์คํธ๊ฐ ์ด๋ฏธ ํฌ๋งทํ ๋ ์ํ๋ก ๋์ฐฉํ๊ณ ๊ฒํ ๋ํ๊ฐ ์ํคํ ์ฒ์ ์ํ์ ์ง์คํ ์ ์๋๋ก ํ์ธ์.
Additional Resources
Other Tools
- CSS ์ ๋ฆฌ ๋๊ตฌ
- HTML ์ ๋ฆฌ ๋๊ตฌ
- ์๋ฐ์คํฌ๋ฆฝํธ ์ ๋ฆฌ ๋๊ตฌ
- PHP ์ ๋ฆฌ ๋๊ตฌ
- ์์ ์ ํ๊ธฐ
- ์คํ๋ผ์ดํธ ์ถ์ถ๊ธฐ
- Base64 ๋์ฝ๋
- Base64 ์ธ์ฝ๋
- C# ํฌ๋งทํฐ
- CSV ํฌ๋งทํฐ
- Dockerfile Formatter
- Elm ํฌ๋งทํฐ
- ENV ํฌ๋งทํฐ
- Go ํฌ๋งทํฐ
- GraphQL ํฌ๋งทํฐ
- INI ํฌ๋งทํฐ
- JSON ํฌ๋งทํฐ
- LaTeX ํฌ๋งทํฐ
- ๋งํฌ๋ค์ด ํฌ๋งทํฐ
- Objective-C ํฌ๋งทํฐ
- Php Formatter
- ํ๋กํ ์ฝ ๋ฒํผ ํฌ๋งทํฐ
- Python ํฌ๋งทํฐ
- Ruby ํฌ๋งทํฐ
- Rust ํฌ๋งทํฐ
- Scala ํฌ๋งทํฐ
- ์ ธ ์คํฌ๋ฆฝํธ ํฌ๋งทํฐ
- SQL ํฌ๋งทํฐ
- SVG ํฌ๋งทํฐ
- Swift ํฌ๋งทํฐ
- TOML ํฌ๋งทํฐ
- Typescript Formatter
- XML ํฌ๋งทํฐ
- YAML ํฌ๋งทํฐ
- Yarn ํฌ๋งทํฐ
- CSS ์์ถ๊ธฐ
- Html Minifier
- Javascript Minifier
- JSON ์์ถ๊ธฐ
- XML ์ต์ํ ๋๊ตฌ
- HTTP ํค๋ ๋ทฐ์ด
- PDF ํ ์คํธ ๋ณํ
- ์ ๊ท์ ํ ์คํฐ
- ๊ฒ์ ์์ ํ์ธ๊ธฐ
- Whois ์กฐํ