Terraform ๋ฉด์ ์ง๋ฌธ ์๋ฒฝ ๊ฐ์ด๋ 2026: Infrastructure as Code ํต์ฌ ์ ๋ฆฌ
Terraform ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ ์ํ ๊ด๋ฆฌ, ๋ชจ๋, ์ํฌ์คํ์ด์ค, ํ๋ก๋ฐ์ด๋, IaC ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค. 2026๋ Terraform 1.14 ๋ฐ HCP Terraform ์ต์ ๋ด์ฉ์ ๋ฐ์ํ์์ต๋๋ค.

Terraform ๋ฉด์ ์ง๋ฌธ์ ํ๋ณด์๊ฐ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ฅผ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ์ํ(state)๋ฅผ ์์ ํ๊ฒ ๋ค๋ฃจ๋ฉฐ, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋์ ์ค๊ณํ๋ ๋ฅ๋ ฅ์ ํ๊ฐํฉ๋๋ค. Terraform 1.14์์ ๋ชจ๋ ์์ค์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๊ณ HCP Terraform์ด ๊ด๋ฆฌํ ์คํ ํ๋ซํผ์ ํ์ฅํจ์ ๋ฐ๋ผ, 2026๋ ๋ฉด์ ๊ด์ ํ๋ณด์์๊ฒ ๊ธฐ๋ณธ์ ์ธ HCL ์ง์๋ฟ๋ง ์๋๋ผ ์งํํ๋ IaC ์ํ๊ณ์ ๋ํ ์ดํด๋๊น์ง ๊ธฐ๋ํฉ๋๋ค.
Terraform ๋ฉด์ ์์ ๋ฌธ๋ฒ ์๊ธฐ๋ฅผ ์ค์ํ๋ ๊ฒฝ์ฐ๋ ๋๋ญ ๋๋ค. ํต์ฌ ํ๊ฐ ์์ญ์ ์ํ ๊ด๋ฆฌ ์ ๋ต, ๋ชจ๋ ์ค๊ณ ํจํด, ์ํฌ๋ฆฟ ์ฒ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ด์ ํ๊ฒฝ์์์ plan/apply ์ฌ์ดํด์ ๋ํ ์ถ๋ก ๋ฅ๋ ฅ์ ๋๋ค.
๋ชจ๋ ํ๋ณด์๊ฐ ์์์ผ ํ Terraform ํต์ฌ ๊ฐ๋
Terraform์ด๋ ๋ฌด์์ด๋ฉฐ ๋ค๋ฅธ IaC ๋๊ตฌ์ ์ด๋ป๊ฒ ๋ค๋ฆ ๋๊น?
Terraform์ HCL(HashiCorp Configuration Language)๋ก ์์ฑ๋ ๊ตฌ์ฑ ํ์ผ์ ํตํด ํด๋ผ์ฐ๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ์ ์ธ์ Infrastructure as Code ๋๊ตฌ์ ๋๋ค. Ansible์ด๋ ์ ธ ์คํฌ๋ฆฝํธ์ ๊ฐ์ ๋ช ๋ นํ(imperative) ๋๊ตฌ์ ๋ฌ๋ฆฌ, Terraform์ ํ์ฌ ์ธํ๋ผ๋ฅผ ์ถ์ ํ๋ ์ํ ํ์ผ์ ์ ์งํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ ์ ์ฐจ์ด์ ("plan")์ ๊ณ์ฐํฉ๋๋ค.
ํต์ฌ ์ฐจ๋ณ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Terraform์ ํด๋ผ์ฐ๋ ๋น์ข ์์ (AWS, Azure, GCP ๋ฐ ์๋ฐฑ ๊ฐ์ ํ๋ก๋ฐ์ด๋๋ฅผ ์ง์)์ด๋ฉฐ, ์๊ธฐ์น ์์ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๋ plan-before-apply ์ํฌํ๋ก๋ฅผ ์ฌ์ฉํ๊ณ , ๋ด๋ถ ๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ(DAG)๋ฅผ ํตํด ๋ฆฌ์์ค ์ข ์์ฑ์ ๊ด๋ฆฌํฉ๋๋ค.
ํํํ ๋ต๋ณ์๋ ์ํ๊ณ ๋ณํ์ ๋ํ ์ธ๊ธ๋ ํฌํจ๋์ด์ผ ํฉ๋๋ค. HashiCorp๊ฐ 2023๋ ์ BSL ๋ผ์ด์ ์ค๋ฅผ ์ฑํํ ์ดํ, Linux Foundation ์ฐํ์์ ์คํ์์ค ํฌํฌ์ธ OpenTofu๊ฐ ๋ฑ์ฅํ์์ต๋๋ค. ๋ ๋๊ตฌ๋ ๋์ผํ HCL ๊ตฌ๋ฌธ์ ๊ณต์ ํ์ง๋ง ๊ธฐ๋ฅ ๋ฉด์์ ๋ถํ๋๊ณ ์์ต๋๋ค. Terraform 1.14๋ HCP์์ ํ๋ซํผ ํตํฉ์ ์ค์ ์ ๋๊ณ , OpenTofu 1.9๋ ์ํ ์ํธํ ๋ฐ ๋์ ๋ฐฑ์๋๋ฅผ ์ฐ์ ์ํฉ๋๋ค.
Terraform ์ํฌํ๋ก ์ค๋ช : init, plan, apply, destroy
๋ค ๊ฐ์ง ํต์ฌ ๋ช ๋ น์ด๋ ๋ชจ๋ Terraform ์์ ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
# 1. Initialize - ํ๋ก๋ฐ์ด๋์ ๋ชจ๋ ๋ค์ด๋ก๋
terraform init
# 2. Plan - ์๋ฌด๊ฒ๋ ์์ ํ์ง ์๊ณ ๋ณ๊ฒฝ๋ ๋ด์ฉ ํ์
terraform plan -out=tfplan
# 3. Apply - ๊ณํ๋ ๋ณ๊ฒฝ ์ฌํญ ์คํ
terraform apply tfplan
# 4. Destroy - ๊ด๋ฆฌ ์ค์ธ ๋ชจ๋ ๋ฆฌ์์ค ์ญ์
terraform destroyterraform init์ ํ๋ก๋ฐ์ด๋ ํ๋ฌ๊ทธ์ธ์ ๋ค์ด๋ก๋ํ๊ณ ๋ฐฑ์๋๋ฅผ ์ด๊ธฐํํฉ๋๋ค. terraform plan์ ์ํ๋ ์ํ(๊ตฌ์ฑ ํ์ผ)์ ์ค์ ์ํ(์ํ ํ์ผ)๋ฅผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ ์ธํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. terraform apply๋ ํด๋น ๋ณ๊ฒฝ ์ธํธ๋ฅผ ์คํํฉ๋๋ค. -out ์ต์
์ผ๋ก plan์ ํ์ผ์ ์ ์ฅํ๋ฉด ๊ฒํ ๋ ์ ํํ plan์ด ์ ์ฉ๋๋๋ก ๋ณด์ฅํ ์ ์์ผ๋ฉฐ, ์ด๋ CI/CD ํ์ดํ๋ผ์ธ์์ ํ์์ ์
๋๋ค.
์ํ ๊ด๋ฆฌ: ๊ฐ์ฅ ์์ฃผ ์ถ์ ๋๋ ๋ฉด์ ์ฃผ์
Terraform ์ํ๋ ๋ฌด์์ด๋ฉฐ ์ ์ค์ํฉ๋๊น?
Terraform ์ํ๋ ๊ตฌ์ฑ ๋ฆฌ์์ค๋ฅผ ์ค์ ์ธํ๋ผ ๊ฐ์ฒด์ ๋งคํํ๋ JSON ํ์ผ(terraform.tfstate)์
๋๋ค. ์ํ ์์ด๋ Terraform์ด ๋ฌด์์ด ์กด์ฌํ๋์ง, ๋ฌด์์ด ๋ณ๊ฒฝ๋์๋์ง, ๋ฌด์์ ์ญ์ ํด์ผ ํ๋์ง ํ๋จํ ์ ์์ต๋๋ค.
์ํ์๋ ๋ฆฌ์์ค ID, ์์ฑ ๊ฐ, ์ข ์์ฑ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ํ๋ฅผ ์์ผ๋ฉด Terraform์ด ๊ด๋ฆฌํ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ถ์ ํ ์ ์๊ฒ ๋๋ฉฐ, ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก importํ๊ฑฐ๋, ๋ ์ฌํ ๊ฒฝ์ฐ ๋น์ฉ์ด ๊ณ์ ๋ฐ์ํ๋ ๊ณ ์ ํด๋ผ์ฐ๋ ๋ฆฌ์์ค๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค.
์ด์ ํ๊ฒฝ์์ ์ํ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๊น?
๋ก์ปฌ ์ํ ํ์ผ์ ํ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ค ์ด์ ํ๊ฒฝ ์ค์ ์ ์ ๊ธ(locking) ๊ธฐ๋ฅ์ด ์๋ ์๊ฒฉ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# backend.tf
terraform {
backend "s3" {
bucket = "company-terraform-state"
key = "prod/networking/terraform.tfstate"
region = "eu-west-1"
dynamodb_table = "terraform-locks"
encrypt = true
}
}์ด ๊ตฌ์ฑ์ ์๋ฒ ์ธก ์ํธํ๋ฅผ ์ ์ฉํ์ฌ S3์ ์ํ๋ฅผ ์ ์ฅํ๊ณ , DynamoDB๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ ๊ธ์ ์ํํฉ๋๋ค. ์ ๊ธ์ ๋ ๋ช
์ ์์ง๋์ด(๋๋ ๋ ๊ฐ์ CI ํ์ดํ๋ผ์ธ)๊ฐ ๋์์ apply๋ฅผ ์คํํ์ฌ ์ํ๋ฅผ ์์์ํค๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
HCP Terraform(์ด์ ๋ช ์นญ Terraform Cloud)์ ์ถ๊ฐ ์ธํ๋ผ ์์ด ์ํ ์ ์ฅ, ์ ๊ธ, ์คํ ์ด๋ ฅ, RBAC๋ฅผ ์ฒ๋ฆฌํ๋ ๊ด๋ฆฌํ ๋์์ ์ ๊ณตํฉ๋๋ค. HashiCorp ์ํ๊ณ์ ์ด๋ฏธ ํฌ์ํ ์กฐ์ง์ ๊ฒฝ์ฐ, S3 ๋ฒํท๊ณผ DynamoDB ํ ์ด๋ธ์ ์ ์ง ๊ด๋ฆฌํ๋ ์ค๋ฒํค๋๋ฅผ ์์จ ์ ์์ต๋๋ค.
์ํ ํ์ผ ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ฌด์์ ๋๊น?
terraform.tfstate๋ฅผ ์ ๋๋ก ๋ฒ์ ๊ด๋ฆฌ์ ์ปค๋ฐํ์ง ์์์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น๋ฐ๋ฒํธ, API ํค ๋ฑ์ ์ํฌ๋ฆฟ์ด ํ๋ฌธ์ผ๋ก ํฌํจ๋ ์ ์์ต๋๋ค.- ๋ฐฑ์๋์์ ์ ์ฅ ์ ์ํธํ๋ฅผ ํ์ฑํํฉ๋๋ค(S3 SSE, GCS ์ํธํ, Azure Storage ์ํธํ).
- ํ๊ฒฝ๋ณ๋ก ๋ณ๋์ ์ํ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค. dev, staging, production์ ๋จ์ผ ์ํ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฐ๋ฐ์ ํ๊ดด์ ์์ธ์ด ๋ฉ๋๋ค.
- ์ํ ์ ๊ธ์ ๊ตฌํํฉ๋๋ค. ์ ๊ธ์ ์ง์ํ๋ ๋ชจ๋ ์๊ฒฉ ๋ฐฑ์๋์์ ์ ๊ธ์ ํ์ฑํํด์ผ ํฉ๋๋ค.
terraform state list์terraform state show๋ฅผ ์คํํ์ฌ ์ํ๋ฅผ ์์ ํ์ง ์๊ณ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
์ํ ๋ฐฑ์๋์์ ํญ์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค(S3 ๋ฒ์ ๊ด๋ฆฌ, GCS ๊ฐ์ฒด ๋ฒ์ ๊ด๋ฆฌ). ๋ฐฑ์
์์ด ์ํ ํ์ผ์ด ์์๋๊ฑฐ๋ ์ค์๋ก ์ญ์ ๋๋ฉด ๋ณต๊ตฌ๋ฅผ ์ํด ์ ์๊ฐ์ ์๋ terraform import ์์
์ด ํ์ํ ์ ์์ต๋๋ค.
๋ชจ๋: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ธํ๋ผ ์ปดํฌ๋ํธ
Terraform ๋ชจ๋์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
๋ชจ๋์ ๋ฆฌ์์ค ์งํฉ์ ์บก์ํํ๋ .tf ํ์ผ์ด ํฌํจ๋ ๋๋ ํฐ๋ฆฌ์
๋๋ค. ๋ชจ๋ Terraform ๊ตฌ์ฑ์ ๊ธฐ์ ์ ์ผ๋ก ๋ชจ๋(๋ฃจํธ ๋ชจ๋)์
๋๋ค. ์์ ๋ชจ๋์ ์ฌ์ฌ์ฉ์ ์ด์งํ๊ณ ํ์ค์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฃจํธ ๋ชจ๋์์ ํธ์ถ๋ฉ๋๋ค.
# main.tf - ๋ชจ๋ ํธ์ถ
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.16.0"
name = "production-vpc"
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
single_nat_gateway = true
}Terraform 1.14๋ ์ค์ํ ๊ฐ์ ์ฌํญ์ ๋์
ํ์์ต๋๋ค. ์ด์ ๋ชจ๋ source์ version ์์ฑ์ ๋ณ์(variables)์ locals๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ์๋ ๋์ ๋ชจ๋ ์์ฑ์ ์ํด Terragrunt์ ๊ฐ์ ์ฐํ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๋ ๊ณ ์ ์ ์ธ ์ ํ ์ฌํญ์ด์์ต๋๋ค.
์ ์ค๊ณ๋ ๋ชจ๋์ ์กฐ๊ฑด์ ๋ฌด์์ ๋๊น?
์ด์ ์์ค์ ๋ชจ๋์ ๋ค์ ์์น์ ๋ฐ๋ฆ ๋๋ค.
- ๋ช ํํ ์ ์ถ๋ ฅ: ๋ชจ๋ ๋ณ์์ ์ค๋ช , ํ์ ์ ์ฝ ์กฐ๊ฑด, ์ ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ด ์์ด์ผ ํฉ๋๋ค. ์ถ๋ ฅ(outputs)์ ํ๋ฅ ๋ชจ๋์ด ํ์๋ก ํ๋ ๊ฐ์ ๋ ธ์ถํฉ๋๋ค.
- ์ต์ ๋ฒ์: ๋ชจ๋์ ํ๋์ ๋ ผ๋ฆฌ์ ์ปดํฌ๋ํธ(VPC, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ, Kubernetes ๋ค์์คํ์ด์ค)๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ ์ฒด ํ๊ฒฝ์ ๊ด๋ฆฌํ์ง ์์ต๋๋ค.
- ํ๋์ฝ๋ฉ ๊ธ์ง: ํ๋ก๋ฐ์ด๋ ๊ตฌ์ฑ, ๋ฆฌ์ , ๊ณ์ ID, ํ๊ฒฝ๋ณ ๊ฐ์ ๋ณ์๋ฅผ ํตํด ์ ๋ฌ๋๋ฉฐ, ๋ชจ๋ ๋ด๋ถ์์ ๋ฆฌํฐ๋ด๋ก ์์ฑํ์ง ์์ต๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ๋ ๋ฆด๋ฆฌ์ค: ๊ฒ์๋ ๋ชจ๋์ ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
version = "5.16.0"์ ๊ณ ์ ํ๋ฉด ์๊ธฐ์น ์์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
DevOps ๋ฉด์ ์ค๋น๊ฐ ๋์ จ๋์?
์ธํฐ๋ํฐ๋ธ ์๋ฎฌ๋ ์ดํฐ, flashcards, ๊ธฐ์ ํ ์คํธ๋ก ์ฐ์ตํ์ธ์.
์ํฌ์คํ์ด์ค, ํ๊ฒฝ, ํ๋ก์ ํธ ๊ตฌ์กฐ
๋ค์ค ํ๊ฒฝ์ ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๊น?
์ธ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจํด์ด ์กด์ฌํ๋ฉฐ, ๊ฐ๊ฐ ๋๋ ทํ ํธ๋ ์ด๋์คํ๊ฐ ์์ต๋๋ค.
| ํจํด | ๋ฉ์ปค๋์ฆ | ์ ํฉํ ๊ฒฝ์ฐ | ์ํ ์์ |
|------|----------|-------------|----------|
| ์ํฌ์คํ์ด์ค | terraform workspace select prod | ๋จ์ํ ํ๋ก์ ํธ, ํ๊ฒฝ๋ณ ๋์ผ ๊ตฌ์ฑ | ๊ณต์ ์ํ ๋ฐฑ์๋, ์๋ชป๋ ์ํฌ์คํ์ด์ค์ apply ์คํ ๊ฐ๋ฅ |
| ๋๋ ํฐ๋ฆฌ๋ณ ํ๊ฒฝ | ๋ณ๋์ dev/, staging/, prod/ ๋๋ ํฐ๋ฆฌ | ํ๊ฒฝ ๊ฐ ์์ ํ ๊ฒฉ๋ฆฌ | ๋๋ ํฐ๋ฆฌ ๊ฐ ์ฝ๋ ์ค๋ณต |
| Terragrunt | ๋ฐฑ์๋ ๊ตฌ์ฑ์ ์์ฑํ๋ DRY ๋ํผ | ๋๊ท๋ชจ ๋ฉํฐ ๊ณ์ ํ๊ฒฝ | ์ถ๊ฐ ๋๊ตฌ ์์กด์ฑ |
๊ณต์ ๋ชจ๋์ ์ฌ์ฉํ ๋๋ ํฐ๋ฆฌ๋ณ ํ๊ฒฝ ์ ๊ทผ ๋ฐฉ์์ด ์ด์ ํ๊ฒฝ์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์
๋๋ค. ๊ฐ ํ๊ฒฝ ๋๋ ํฐ๋ฆฌ์๋ ๋์ผํ ๋ชจ๋์ ๋ค๋ฅธ ๋ณ์ ๊ฐ์ผ๋ก ํธ์ถํ๋ main.tf๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ๊ฐ๊ฐ ์์ฒด์ ์ผ๋ก ๊ฒฉ๋ฆฌ๋ ์ํ ํ์ผ์ ๋ณด์ ํฉ๋๋ค.
terraform workspace์ ๋๋ ํฐ๋ฆฌ ๊ฒฉ๋ฆฌ์ ์ฐจ์ด์ ์ ๋ฌด์์
๋๊น?
์ํฌ์คํ์ด์ค๋ ๋์ผํ ๋ฐฑ์๋ ๋ด์์ ์ด๋ฆ์ด ์ง์ ๋ ์ํ ํ์ผ์ ์์ฑํฉ๋๋ค. terraform workspace select staging์ผ๋ก ์ํฌ์คํ์ด์ค๋ฅผ ์ ํํ๋ฉด Terraform์ด ์ฝ๊ณ ์ฐ๋ ์ํ ํ์ผ์ด ๋ณ๊ฒฝ๋์ง๋ง, ๊ตฌ์ฑ ์์ฒด๋ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค.
์ ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ํฌ์คํ์ด์ค๋ ๋์ผํ ๋ฐฑ์๋ ๊ตฌ์ฑ๊ณผ ํ๋ก๋ฐ์ด๋ ์ค์ ์ ๊ณต์ ํฉ๋๋ค. ๋๋ ํฐ๋ฆฌ ๊ฒฉ๋ฆฌ๋ ๋ ๊ฐ๋ ฅํ ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ฐ ํ๊ฒฝ์ด ๋ค๋ฅธ AWS ๊ณ์ , ๋ค๋ฅธ ์ํ ๋ฐฑ์๋, ๋๋ ๋ค๋ฅธ ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๊ฒฉํ ํญ๋ฐ ๋ฐ๊ฒฝ ์ ์ด๊ฐ ํ์ํ ๊ท์ ํ๊ฒฝ์์๋ ๋๋ ํฐ๋ฆฌ ๊ฒฉ๋ฆฌ๊ฐ ๋ ์์ ํ ์ ํ์ ๋๋ค.
ํ๋ก๋ฐ์ด๋, ๋ฐ์ดํฐ ์์ค, ๋ฆฌ์์ค ์๋ช ์ฃผ๊ธฐ
ํ๋ก๋ฐ์ด๋๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ๊ตฌ์ฑํฉ๋๊น?
ํ๋ก๋ฐ์ด๋๋ HCL ๊ตฌ์ฑ์ ํน์ ํ๋ซํผ์ ๋ํ API ํธ์ถ๋ก ๋ณํํ๋ ํ๋ฌ๊ทธ์ธ์ ๋๋ค. AWS ํ๋ก๋ฐ์ด๋๋ AWS API๋ฅผ ํธ์ถํ๊ณ , Kubernetes ํ๋ก๋ฐ์ด๋๋ Kubernetes API ์๋ฒ์ ํต์ ํฉ๋๋ค.
# providers.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.80"
}
}
}
provider "aws" {
region = var.aws_region
default_tags {
tags = {
Environment = var.environment
ManagedBy = "terraform"
Team = var.team_name
}
}
}~> 5.80 ๋ฒ์ ์ ์ฝ ์กฐ๊ฑด์ ํจ์น ์
๋ฐ์ดํธ(5.80.x)๋ฅผ ํ์ฉํ์ง๋ง ๋ง์ด๋ ๋ฒ์ ๋ณ๊ฒฝ์ ์ฐจ๋จํ์ฌ, ์์ ์ฑ๊ณผ ๋ณด์ ํจ์น ์ฌ์ด์ ๊ท ํ์ ์ ์งํฉ๋๋ค. default_tags ๋ธ๋ก์ ํ๋ก๋ฐ์ด๋๊ฐ ์์ฑํ๋ ๋ชจ๋ ๋ฆฌ์์ค์ ์ผ๊ด๋ ํ๊น
์ ์ ์ฉํ๋ฉฐ, ์ด๋ ๊ฑฐ๋ฒ๋์ค ๋ฐ ๋น์ฉ ํ ๋น์ ๋ํ ์ผ๋ฐ์ ์ธ ๋ฉด์ ๋
ผ์ ํฌ์ธํธ์
๋๋ค.
๋ฐ์ดํฐ ์์ค์ ๋ฆฌ์์ค์ ์ฐจ์ด์ ์ ์ค๋ช ํ์ญ์์ค
๋ฆฌ์์ค(resource ๋ธ๋ก)๋ ์ธํ๋ผ๋ฅผ ์์ฑ, ์
๋ฐ์ดํธ, ์ญ์ ํฉ๋๋ค. ๋ฐ์ดํฐ ์์ค(data ๋ธ๋ก)๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ ์ฝ๊ธฐ๋ง ํฉ๋๋ค.
# ๋ฐ์ดํฐ ์์ค - ๊ธฐ์กด AMI๋ฅผ ์ฝ์ผ๋ฉฐ, ์๋ฌด๊ฒ๋ ์์ฑํ์ง ์์
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
}
}
# ๋ฆฌ์์ค - ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ EC2 ์ธ์คํด์ค ์์ฑ
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
}๋ฐ์ดํฐ ์์ค๋ plan ์ค์ ํ๊ฐ๋๋ฏ๋ก, ๊ณต์ ์ธํ๋ผ ์ฐธ์กฐ(๋ค๋ฅธ ํ์ด ์์ฑํ VPC), ๋์ ๊ฐ ์กฐํ(์ต์ AMI ID), ์ธ๋ถ ๊ตฌ์ฑ ์ฝ๊ธฐ(SSM ํ๋ผ๋ฏธํฐ, Vault ์ํฌ๋ฆฟ)์ ์ ์ฉํฉ๋๋ค.
๋ฉด์ ์์ ์์ฃผ ๋ฑ์ฅํ๋ ์ธ ๊ฐ์ง ์๋ช
์ฃผ๊ธฐ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. create_before_destroy(๋ฌด์ค๋จ ๊ต์ฒด), prevent_destroy(๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ์ค์ ๋ฆฌ์์ค ๋ณดํธ), ignore_changes(ASG desired capacity์ ๊ฐ์ด Terraform ์ธ๋ถ์์ ์์ ๋๋ ํ๋์ ๋ํ ๋๋ฆฌํํธ ๋ฐฉ์ง).
๊ณ ๊ธ ์ฃผ์ : Import, Moved ๋ธ๋ก, ํ ์คํ
terraform import๋ ์ด๋ป๊ฒ ์๋ํ๋ฉฐ ์ธ์ ํ์ํฉ๋๊น?
terraform import๋ ๊ธฐ์กด ํด๋ผ์ฐ๋ ๋ฆฌ์์ค๋ฅผ Terraform ๋ฆฌ์์ค ๋ธ๋ก์ ์ฐ๊ฒฐํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ์ธํ๋ผ๊ฐ ์๋์ผ๋ก(ClickOps) ๋๋ ๋ค๋ฅธ ๋๊ตฌ๋ก ์์ฑ๋์๊ณ , ํ์ด ์ด์ Terraform์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ ๊ฒฝ์ฐ์
๋๋ค.
Terraform 1.5 ์ด์์์๋ CLI ์ ์ฉ ์ํฌํ๋ก๋ฅผ ๋์ฒดํ๋ import ๋ธ๋ก์ ๊ตฌ์ฑ์ ์ง์ ๋์
ํ์์ต๋๋ค.
# import.tf
import {
to = aws_s3_bucket.legacy_data
id = "my-legacy-bucket-name"
}
resource "aws_s3_bucket" "legacy_data" {
bucket = "my-legacy-bucket-name"
}์ด ๋ธ๋ก๊ณผ ํจ๊ป terraform plan์ ์คํํ๋ฉด ๊ธฐ์กด ๋ฒํท์ ์ํ๋ก ์์ฉํ๋ plan์ด ์์ฑ๋ฉ๋๋ค. ์ด ์ ์ธ์ import ์ ๊ทผ ๋ฐฉ์์ ํ ๋ฆฌํ์คํธ์์ ๊ฒํ ๊ฐ๋ฅํ๊ณ , ๋ฐ๋ณต ๊ฐ๋ฅํ๋ฉฐ, ์ํ์ ๋ํ ์ง์ ์ ์ธ CLI ์ก์ธ์ค๊ฐ ํ์ํ์ง ์์ต๋๋ค.
moved ๋ธ๋ก์ด๋ ๋ฌด์์
๋๊น?
Terraform ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋ง(๋ฆฌ์์ค ์ด๋ฆ ๋ณ๊ฒฝ, ๋ชจ๋๋ก ์ด๋)ํ ๋ ๊ณผ๊ฑฐ์๋ terraform state mv ๋ช
๋ น์ด ํ์ํ์์ต๋๋ค. moved ๋ธ๋ก์ ์ด๋ฅผ ์ ์ธ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
# ๋ฆฌ์์ค ์ด๋ฆ์ "web"์์ "app"์ผ๋ก ๋ณ๊ฒฝ
moved {
from = aws_instance.web
to = aws_instance.app
}Terraform์ plan ์ค์ ์ด๋์ ์ธ์ํ๊ณ ์ํ๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ, ์ญ์ ํ ์ฌ์์ฑ ์ฌ์ดํด์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ๋๊ท๋ชจ ๊ตฌ์ฑ์ ๋ชจ๋๋ก ์ฌ๊ตฌ์กฐํํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
Terraform ํ ์คํ ์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
Terraform 1.6 ์ด์์๋ .tftest.hcl ํ์ผ์ ์ฌ์ฉํ๋ ๋ค์ดํฐ๋ธ ํ
์คํ
ํ๋ ์์ํฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
# tests/vpc.tftest.hcl
run "creates_vpc_with_correct_cidr" {
command = plan
assert {
condition = aws_vpc.main.cidr_block == "10.0.0.0/16"
error_message = "VPC CIDR block does not match expected value"
}
}
run "creates_three_private_subnets" {
command = plan
assert {
condition = length(aws_subnet.private) == 3
error_message = "Expected 3 private subnets"
}
}Terraform 1.14์์๋ ํจ์๋ฅผ ํ์ฉํ๋ mock ๋ธ๋ก, ์คํจํ ํ
์คํธ ๋๋ฒ๊น
์ ์ํ skip_cleanup, run ๋ธ๋ก ๋ด์ ๊ฒฉ๋ฆฌ๋ ํ
์คํธ ์ํ๋ฅผ ์ํ backend ๋ธ๋ก ๋ฑ์ผ๋ก ๊ธฐ๋ฅ์ด ํ์ฅ๋์์ต๋๋ค. ๋ค์ดํฐ๋ธ ํ
์คํ
์ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ฆ์ ์ํด Terratest์ ๊ฐ์ ์ธ๋ถ ๋๊ตฌ์ ํ์์ฑ์ ์์ ์ค๋๋ค.
CI/CD ํ์ดํ๋ผ์ธ์์์ Terraform
์ด์ ํ๊ฒฝ Terraform ํ์ดํ๋ผ์ธ์ ์ด๋ค ๋ชจ์ต์ ๋๊น?
๊ฒฌ๊ณ ํ CI/CD ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ๋จ๊ณ์์ ์์ ์ ๊ฐ์ ํฉ๋๋ค.
- ๋ฆฐํธ ๋ฐ ๊ฒ์ฆ:
terraform fmt -check์terraform validate๋ก ๊ตฌ๋ฌธ ๋ฌธ์ ๋ฅผ ๊ฐ์งํฉ๋๋ค. - PR ์ Plan: ๋ชจ๋ ํ ๋ฆฌํ์คํธ์์
terraform plan์ ์คํํ๊ณ ์ถ๋ ฅ์ PR ์ฝ๋ฉํธ๋ก ๊ฒ์ํฉ๋๋ค. ๊ฒํ ๋ plan ์์ด๋ apply๋ฅผ ์ํํ์ง ์์ต๋๋ค. - ์ ์ฑ ๊ฒ์ฌ: OPA(Open Policy Agent), Sentinel(HCP Terraform), Checkov ๋ฑ์ ๋๊ตฌ๋ก ์กฐ์ง ์ ์ฑ (ํผ๋ธ๋ฆญ S3 ๋ฒํท ๊ธ์ง, ํ์ ์ํธํ, ํ์ ํ๊ทธ)์ ๋ํด plan์ ๊ฒ์ฆํฉ๋๋ค.
- ๋จธ์ง ์ Apply: PR ์น์ธ ๋ฐ ์ ์ฑ
๊ฒ์ฌ ํต๊ณผ ํ, ์ ์ฅ๋ plan ํ์ผ์์
terraform apply๊ฐ ์๋์ผ๋ก ์คํ๋ฉ๋๋ค. - ์ํ ๋ฐฑ์ : apply ํ ํ์ดํ๋ผ์ธ์ด ์ํ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๊ณ , ๋ฐฑ์๋์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์๋ก์ด ์ํ ๋ฒ์ ์ ์บก์ฒํฉ๋๋ค.
ํฉ๊ธ๋ฅ : ์ด๋ค ์ฌ๋๋ ๋ก์ปฌ ๋จธ์ ์์ ์ด์ ํ๊ฒฝ์ ๋ํด terraform apply๋ฅผ ์คํํด์๋ ์ ๋ฉ๋๋ค. ๋ชจ๋ ์ด์ ํ๊ฒฝ apply๋ ํ์ดํ๋ผ์ธ์ ํตํด ์ํ๋์ด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
Terraform ๋ฉด์ ์ค๋น์ ํต์ฌ ์์ฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ํ ๊ด๋ฆฌ๋ ๊ฐ์ฅ ์ค์ํ ๋จ์ผ ์ฃผ์ ์ ๋๋ค. ๋ฉด์ ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ์๊ฒฉ ๋ฐฑ์๋, ์ ๊ธ, ์ํธํ, ์ฌํด ๋ณต๊ตฌ ์ ๋ต์ ๋ฐ๋์ ์ดํดํด์ผ ํฉ๋๋ค.
- ๋ชจ๋ ์ค๊ณ๋ ์ฃผ๋์ด์ ์๋์ด ํ๋ณด์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ๋ช ํํ ์ธํฐํ์ด์ค์ ์ต์ ๋ฒ์๋ฅผ ๊ฐ์ง ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ๋ฒ์ ๊ด๋ฆฌ๋ ๋ชจ๋์ ๊ตฌ์ถํ๋ ๋ฅ๋ ฅ์ ๋ณด์ฌ์ฃผ์ด์ผ ํฉ๋๋ค.
- plan/apply ์ํฌํ๋ก๋ฅผ ๊น์ด ์ดํดํด์ผ ํฉ๋๋ค. plan์ ํ์ผ๋ก ์ ์ฅํ๋ ๊ฒ์ด ์ ์ค์ํ์ง, DAG๊ฐ ์คํ ์์๋ฅผ ์ด๋ป๊ฒ ๊ฒฐ์ ํ๋์ง,
-target์ด ๋ฌด์์ ํ๋์ง(๊ทธ๋ฆฌ๊ณ ์ ์๊ปด์ ์ฌ์ฉํด์ผ ํ๋์ง) ์ค๋ช ํ ์ ์์ด์ผ ํฉ๋๋ค. - Terraform 1.14๋ ๋ชจ๋ ์์ค์์์ ๋ณ์ ์ฌ์ฉ, ํ์ฅ๋ ํ ์คํ , ๋ ๊ธด๋ฐํ HCP ํตํฉ์ ์ ๊ณตํฉ๋๋ค. ์ต์ ๊ธฐ๋ฅ์ ์ธ๊ธํ๋ฉด ์ํ๊ณ์ ๋ํ ์ ๊ทน์ ์ธ ๊ด์ฌ์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
- Terraform ๋ OpenTofu ํํฉ์ ์์งํ๊ฒ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค. ๋ผ์ด์ ์ค ๋ถ๋ฆฌ, ๊ธฐ๋ฅ ๋ถํ, ๊ฐ ๋๊ตฌ์ ์ ํฉํ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ์ดํดํ๋ฉด ๊ตฌ๋ฌธ ์ง์์ ๋์ด์ ์ํคํ ์ฒ์ ์ฑ์๋๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
- Terraform ์ธ๋ถ ์ฌํญ๊ณผ ํจ๊ป DevOps ๋ฉด์ ๊ธฐ์ด๋ฅผ ํ์ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฉด์ ๊ด์ IaC ์ง๋ฌธ๊ณผ ๋ ๋์ ์ธํ๋ผ ์ฃผ์ ๋ฅผ ์์ฃผ ํผํฉํ์ฌ ์ถ์ ํฉ๋๋ค.
- Terraform์ด Kubernetes ์ํฌ๋ก๋๊ฐ ์คํ๋๋ ํด๋ฌ์คํฐ๋ฅผ ํ๋ก๋น์ ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก, Kubernetes ๋ฐฐํฌ ๊ฐ๋ ๋ ํจ๊ป ๋ณต์ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฐ์ต์ ์์ํ์ธ์!
๋ฉด์ ์๋ฎฌ๋ ์ดํฐ์ ๊ธฐ์ ํ ์คํธ๋ก ์ง์์ ํ ์คํธํ์ธ์.
ํ๊ทธ
๊ณต์
๊ด๋ จ ๊ธฐ์ฌ

Kubernetes ๋ฉด์ ์๋ฒฝ ๊ฐ์ด๋: Pod, Service, Deployment ํต์ฌ ์ ๋ฆฌ
Kubernetes ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ Pod, Service, Deployment์ ํต์ฌ ๊ฐ๋ ์ YAML ์์ ์ ํจ๊ป ์์ธํ ์ ๋ฆฌํฉ๋๋ค. 2026๋ ์ต์ ํธ๋ ๋๋ฅผ ๋ฐ์ํ ์ค์ ๋๋น ๊ฐ์ด๋์ ๋๋ค.

DevOps ์ธํฐ๋ทฐ ํ์ ์ง๋ฌธ: ์์ ๊ฐ์ด๋ 2026
CI/CD, Kubernetes, Docker, Terraform, SRE ์ค์ฒ์ ๊ดํ ํ์ ์ง๋ฌธ์ผ๋ก DevOps ์ธํฐ๋ทฐ๋ฅผ ์ค๋นํ์ญ์์ค. ์์ธํ ๋ต๋ณ ํฌํจ.

Docker: ๊ฐ๋ฐ์์ ํ๋ก๋์ ๊น์ง
์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋ํ๋ฅผ ์ํ ์๋ฒฝํ Docker ๊ฐ์ด๋. Dockerfile, Docker Compose, ๋ฉํฐ์คํ ์ด์ง ๋น๋ ๋ฐ ํ๋ก๋์ ๋ฐฐํฌ๋ฅผ ์ค์ฉ์ ์ธ ์์ ์ ํจ๊ป ์ค๋ช ํฉ๋๋ค.