sensitive는 값을 콘솔 출력과 로그에서 마스킹(가리기)하는 플래그.
암호화 기능이 아니라는 점! 상태/플랜 파일에는 값이 들어갈 수 있으니 백엔드 보안은 따로 챙겨야 함.
sensitive = true 또는 sensitive() 함수로 노출 최소화terraform output -json/-raw로 기계가 읽고, 사람 화면엔 숨기기variable "db_password" {
type = string
sensitive = true
}
plan/apply 출력에서 값이 Sensitive로 가려집니다.output "db_password" {
value = var.db_password
sensitive = true
}
terraform output -json 또는 -raw로 프로그램이 읽게만 사용.resource "local_file" "secret" {
filename = "secret.txt"
sensitive_content = var.db_password # content 대신 sensitive_content
}
local_sensitive_file(민감 콘텐츠 전용)locals {
masked_token = sensitive(var.api_token) # 민감성 부여
last4 = nonsensitive(regex("\\d{4}$", var.card_number)) # 안전한 파생값만 평문 처리
}
sensitive(): 해당 값에 민감 표시 추가nonsensitive(): 민감 표시 제거(주의! 콘솔에 평문이 찍힐 수 있으니 안전한 파생값에만)sensitive 값으로 만든 모든 파생값은 기본적으로 민감 표시가 따라갑니다.nonsensitive()로 안전한 부분만 꺼내 쓰세요(예: 카드번호 마지막 4자리).sensitive는 출력 가리기일 뿐, 저장 차단/암호화가 아님. 그래서:
원격 상태(S3 등) + 암호화
IAM 최소권한: 상태 버킷/락 테이블에 읽기·쓰기 최소만 부여
로컬 상태 금지: 팀 환경에선 절대 local 백엔드 쓰지 않기
백엔드 예시:
terraform {
backend "s3" {
bucket = "my-tf-state-bucket"
key = "projectA/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "tf-lock"
encrypt = true # S3 서버측 암호화
}
}
variable "db_password" {
type = string
sensitive = true
description = "DB password (환경변수 TF_VAR_db_password 권장)"
}
# 사용 예: 파일로 쓰되 로그에 노출 안 함
resource "local_file" "db_secret" {
filename = "db.pass"
sensitive_content = var.db_password
}
output "db_password" {
value = var.db_password
sensitive = true
}
variable "card_number" { type = string; sensitive = true }
output "card_last4" {
value = nonsensitive(regex("\\d{4}$", var.card_number))
}
# 터미널/CI에서
export TF_VAR_db_password='SuperSecret#1234'
terraform apply -auto-approve
❌ “sensitive면 저장도 안 되겠지?” → 아니요. state/plan에는 들어감.
✅ 백엔드 암호화 + 접근제어를 반드시 구성.
❌ output에 비밀을 그대로 노출
✅ sensitive = true 또는 안전한 파생값만 nonsensitive()로 가공해서 노출.
❌ UserData/로그 파일에 비밀 평문 기록
✅ 가능하면 시크릿 매니저(예: AWS Secrets Manager/Vault)와 통합하고, 로그에 찍히지 않도록 설계.
❌ tfvars에 비밀 커밋
✅ 비밀은 환경변수/시크릿 스토어로 주입, terraform.tfvars엔 기본값만.
✅ .gitignore: *.tfstate, .terraform/, *.tfvars(민감용) 등 포함.
sensitive = true 지정sensitive_content/sensitive() 사용terraform output -json/-raw로만 기계에 전달(사람 화면엔 숨김)
sensitive는 “안 보이게” 만드는 마스킹 플래그일 뿐, 보관 보안은 백엔드에서 책임진다.
콘솔엔 숨기고, 저장소는 암호화/권한으로 지키자.