SOPS 가 YAML 값 암호화 (key 는 grep 가능하도록 plain 으로 유지). AWS KMS, GCP KMS, Azure Key Vault, age 백엔드. 흔한 패턴: git 의 secrets.enc.yaml, 배포 시 CI key 로 복호화. 다시는 plain secret commit 안 함.
Kustomize — overlay, templating 없음
Kustomize 가 YAML 을 overlay 로 구성. base 디렉토리에 표준 manifest; overlay 디렉토리에 patch. kustomize build prod/ 가 병합 결과 emit. Go template 없음, string-vs-typed 함정 없음 — YAML 이 YAML 병합.
Jinja2 — Ansible / k8s / config 의 풀 templating
YAML anchor 가 부족하고 conditional, loop, include 필요할 때 Jinja2 잡아. Ansible 빌트인; j2cli 가 standalone YAML 파일 template; FluxCD 의 HelmRelease 가 Jinja-렌더된 값 지원.
CUE — YAML/JSON 의 강타입 superset
CUE 가 YAML/JSON 으로 컴파일 되는 config 언어. 타입, 제약, 통합 (여러 부분 schema 가 하나로 병합) 추가. Istio, Dagger, KubeVela 가 사용. 학습 곡선 가파름; 일단 내재화하면 복잡한 플랫폼에 YAML 손으로 안 씀.
원칙: YAML 만 아플 때만 다음 layer 로. plain YAML → anchor → Kustomize overlay → Helm template → CUE. 각 단계가 힘과 학습 비용 추가. 대부분 프로젝트가 'plain YAML + anchor' 에서 영원히 살아; 플랫폼 팀만 CUE 로 올라감.
Code
SOPS — YAML 암호화/복호화·bash
# 설치
brew install sops
# 한 번: .sops.yaml 에 기본 KMS key 설정
cat > .sops.yaml <<EOF
creation_rules:
- kms: arn:aws:kms:us-east-1:123:key/abc
EOF
# 암호화
sops --encrypt --in-place secrets.enc.yaml
# stdout 으로 복호화
sops --decrypt secrets.enc.yaml
# 제자리 편집 (저장 시 복호화 + 재암호화)
sops secrets.enc.yaml
현재 평문 secret (.env 파일, YAML 의 하드코딩 API 엔드포인트) 가진 리포 골라. age 암호화로 SOPS 셋업 (AWS 계정 불필요). secret 하나 암호화, commit, 로컬에서 복호화. 복호화 단계를 dev/start 스크립트에 추가. '실수로 key commit' 문제가 이제 구조적으로 해결.
Progress
Progress is local-only — sign in to sync across devices.