Terraform
๋ช ์ฌ ยท Infrastructure as Code
HashiCorp๊ฐ ๊ฐ๋ฐํ ์คํ์์ค Infrastructure as Code(IaC) ๋๊ตฌ๋ก, HCL ์ธ์ด์ ์ ์ธ์ ๊ตฌ์ฑ ํ์ผ์ ํตํด ํด๋ผ์ฐ๋ ์ธํ๋ผ ๋ฆฌ์์ค๋ฅผ ์ ์, ํ๋ก๋น์ ๋ ๋ฐ ๊ด๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค โ ์ฌํ์ฑ๊ณผ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
์๋ฐฑ ๊ฐ์ ๊ณต๊ธ์(AWS, Google Cloud, Azure, Docker, Kubernetes)์ API๋ฅผ ์์ฑ, ๊ณํ, ์ ์ฉ์ด๋ผ๋ ํตํฉ ์ํฌํ๋ก๋ก ์ถ์ํํ๋ ๋ฉํฐ ํด๋ผ์ฐ๋ DevOps ํ๋ซํผ โ ์ธํ๋ผ๋ฅผ ๊ฐ์ฌ ๊ฐ๋ฅํ๊ณ , ํ ์คํธ ๊ฐ๋ฅํ๋ฉฐ, ํ์ ๊ฐ๋ฅํ ์ฝ๋๋ก ๋ณํํฉ๋๋ค.
๋ฆฌ์์ค ๊ฐ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , `terraform plan`์ ํตํด ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ์ฐํ๋ฉฐ ๋ฉฑ๋ฑ์ฑ ์๊ฒ ์ ์ฉํ๋ ์๋ํ ์ธํ๋ผ์ ์ฐ์ ํ์ค โ ๊ตฌ์ฑ ๋๋ฆฌํํธ์ ์๋ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
Terraform์ ์ธ ๋จ๊ณ๋ก ์๋ํฉ๋๋ค: Write(์ํ๋ ๋ฆฌ์์ค๋ฅผ ์ค๋ช ํ๋ HCL ๊ตฌ์ฑ ์์ฑ), Plan(์ํ๋ ์ํ์ ๋๋ฌํ๊ธฐ ์ํด ํ์ํ ์์ ์ฌํญ ๊ณ์ฐ), Apply(๋ฆฌ์์ค ์๋ ํ๋ก๋น์ ๋). Terraform์ ์ ์ธ๋ ๊ตฌ์ฑ ๋๋น ์ค์ ๋ฆฌ์์ค๋ฅผ ๋งคํํ๋ ์ํ ํ์ผ(state)์ ์ ์งํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ด ์ํฌํ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ๊ฐ์ ๋ชจ๋ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ฅผ ์์ ์ ์ด๊ณ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค.
Terraform์ ์ฌ์ฉํ๋ฉด ์ธํ๋ผ๋ฅผ ์์ค ์ฝ๋์ฒ๋ผ ๋ฒ์ ๊ด๋ฆฌํ๊ณ , ๋์ผํ ํ๊ฒฝ์ ํ ๋ฒ์ ํด๋ฆญ์ผ๋ก ์ฌํํ๋ฉฐ, ์๋ ๊ตฌ์ฑ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ฐ์ด๋ ๋ฉํฐ ํด๋ผ์ฐ๋ ์ด์์ฑ์ ์ ๊ณตํ๋ฉฐ GitOps ์ํฌํ๋ก๋ฅผ ํตํด ํ ๊ฐ ํ์ ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ๊ณ ๊ฐ์ ์๋ฒ, MongoDB ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ Kubernetes ํด๋ฌ์คํฐ ํ๋ก๋น์ ๋์ ์๋ํํ๊ธฐ ์ํด Terraform์ ์ ํธํ๋ฉฐ, ํ๋ก๋์ ๋ฐฐํฌ ๊ธฐ๊ฐ๊ณผ ์ธ์ ๋ฆฌ์คํฌ๋ฅผ ์ค์ ๋๋ค.
Terraform ์ค์น๋ HashiCorp ๊ณต์ ์ฌ์ดํธ์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ํจํค์ง ๊ด๋ฆฌ์(macOS์ Homebrew, Linux์ apt/yum, Windows์ Chocolatey)๋ฅผ ํตํด ์ํํฉ๋๋ค. ์ค์น ํ, `terraform init` ๋ช ๋ น์ผ๋ก ํ์ํ provider๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ํ์ ๋ชจ๋ ๊ตฌ์ฑ์์ด ๋์ผํ๊ณ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๊ฒฝ์ ๊ฐ์ถ ์ ์๋๋ก Terraform์ ๊ฐ๋ฐ Docker ์ด๋ฏธ์ง์ ํตํฉํฉ๋๋ค.
Terraform provider๋ Terraform์ด ํน์ ํด๋ผ์ฐ๋ ์๋น์ค๋ ์ธํ๋ผ์ API์ ํต์ ํ ์ ์๊ฒ ํ๋ ํ๋ฌ๊ทธ์ธ์ ๋๋ค(AWS, GCP, Azure, Docker, Kubernetes, Cloudflare). ๊ฐ provider๋ ๊ตฌ์ฑ ํ์ผ์์ ์ ์ธํ ์ ์๋ ๋ฆฌ์์ค์ data source์ ์งํฉ์ ๋ ธ์ถํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์น ํ๋ก์ ํธ์ ์ ์ฒด ์ธํ๋ผ ์ฒด์ธ์ ์๋ํํ๊ธฐ ์ํด ์ฃผ๋ก AWS, Docker ๋ฐ Kubernetes provider๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Terraform์ ์ฌ์ฉํ๋ ค๋ฉด HCL๋ก provider์ ์ํ๋ ๋ฆฌ์์ค๋ฅผ ์ ์ธํ๋ `.tf` ํ์ผ์ ์์ฑํ ํ, `terraform init`์ผ๋ก ์ด๊ธฐํ, `terraform plan`์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, `terraform apply`๋ก ์ ์ฉํฉ๋๋ค. ์์ ์ฌํญ์ ์๊ฒฉ ๋ฐฑ์๋(S3, Terraform Cloud)๋ฅผ ํตํด ๊ณต์ ํ ์ ์๋ ์ํ ํ์ผ์์ ์ถ์ ๋ฉ๋๋ค. ์ ํฌ๋ ๊ณ ๊ฐ์ Terraform ๋์ ์ ์ง์ํ๋ฉฐ ๋ชจ๋์ ๊ตฌ์กฐํํ๊ณ ์๋ํ๋ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํฉ๋๋ค.
Terraform์ ๋ชจ๋ ์ธํ๋ผ ๋ฆฌ์์ค(์๋ฒ, ๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, DNS)๋ฅผ ๋ฒ์ ๊ด๋ฆฌ๋ ๊ตฌ์ฑ ํ์ผ์ ์ ์ํ ํ ํด๋ผ์ฐ๋ ๊ณต๊ธ์์ API๋ฅผ ํตํด ์๋์ผ๋ก ํ๋ก๋น์ ๋ํ ์ ์๋ Infrastructure as Code(IaC) ๋๊ตฌ์ ๋๋ค. ๋์งํธ ์ธํ๋ผ๋ฅผ ์ํ ๊ฑด์ถ๊ฐ์ ์ค๊ณ๋์ ๊ฐ์ต๋๋ค. ์ ํฌ ์์ด์ ์๋ ๊ฐ ํ๋ก์ ํธ ์ธํ๋ผ์ ์ฌํ์ฑ๊ณผ ์ถ์ ๊ฐ๋ฅ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด Terraform์ ํ์ ๋๊ตฌ๋ก ๊ฐ์ฃผํฉ๋๋ค.
Docker ์ด๋ฏธ์ง๋ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ์ฝ๋, ์์กด์ฑ ๋ฐ ๊ตฌ์ฑ์ ํฌํจํ๋ ๋ถ๋ณ ํ ํ๋ฆฟ์ ๋๋ค. Terraform ์ปจํ ์คํธ์์ Docker provider๋ ์ด๋ฏธ์ง์ ๋ผ์ดํ์ฌ์ดํด(build, pull, push)์ ์ ์ธ์ ์ด๊ณ ์๋ํ๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฟ๋ง ์๋๋ผ ์ด๋ฅผ ์ง์ํ๋ ์ธํ๋ผ๊น์ง ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ์ํด Terraform๊ณผ Docker๋ฅผ ๊ฒฐํฉํ์ฌ ์ข ๋จ๊ฐ ์ผ๊ด๋ ๋ฐฐํฌ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
๋ค, Terraform์ Docker ์ปจํ ์ด๋, ์ด๋ฏธ์ง, ๋คํธ์ํฌ ๋ฐ ๋ณผ๋ฅจ์ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ๊ณต์ Docker provider๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ Docker ์ธํ๋ผ๋ฅผ `.tf` ํ์ผ์ ์ ์ํ๊ณ ์ฝ๋์ฒ๋ผ ๋ฒ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ด ํตํฉ์ ํ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์์ ํ ์ถ์ ๊ฐ๋ฅ์ฑ๊ณผ ํจ๊ป ์์ ํ Docker ๊ฐ๋ฐ ๋ฐ ํ๋ก๋์ ํ๊ฒฝ์ ํ๋ก๋น์ ๋์ ์๋ํํฉ๋๋ค.
Terraform๊ณผ Docker๋ ์๋ก ๋ค๋ฅธ ์์ค์์ ์๋ํฉ๋๋ค: Docker๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ํ(ํจํค์ง ๋ฐ ์คํ)ํ๊ณ , Terraform์ ์ด๋ฌํ ์ปจํ ์ด๋๊ฐ ์คํ๋๋ ์ธํ๋ผ(์๋ฒ, ๋คํธ์ํฌ, ํด๋ฌ์คํฐ)๋ฅผ ํ๋ก๋น์ ๋ํฉ๋๋ค. Terraform์ ์ ์ฉ provider๋ฅผ ํตํด ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ์ฌ Docker๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. Async Code์์๋ ๋์ ์๋์ง์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค: Terraform์ด ํด๋ผ์ฐ๋ ์ธํ๋ผ์ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ํ๋ก๋น์ ๋ํ๊ณ , Docker๊ฐ Kubernetes๊ฐ ์ค์ผ์คํธ๋ ์ด์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจํค์งํฉ๋๋ค.
Terraform์ HashiCorp๊ฐ ๋ง๋ ์คํ์์ค ๋๊ตฌ๋ก ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ๋ณํํ์ฌ ์ธํ๋ผ ๊ด๋ฆฌ๋ฅผ ํ์ ํฉ๋๋ค. ์น ์ฝ์์ ํตํด ์๋์ผ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ ๋์ , ๋ฒ์ ๊ด๋ฆฌ๋ ํ ์คํธ ํ์ผ์ ์ธํ๋ผ๋ฅผ ๊ธฐ์ ํ๋ฉด Terraform์ด ๋ชจ๋ ๊ฒ์ ์๋์ผ๋ก ์์ฑ, ์์ ๋๋ ์ญ์ ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ธ์ ์ค๋ฅ ์์ด ๊ณ ๊ฐ์๊ฒ ์์ ์ ์ด๊ณ ๋ฌธ์ํ๋๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด Terraform์ ํ์ฉํฉ๋๋ค.