SOPS 는 YAML 의 값만 암호화하고 키는 그대로 둬. 그래서 grep 이 계속 먹혀. 뒤에는 AWS KMS, GCP KMS, Azure Key Vault, age 를 붙일 수 있고. 흔한 방식은 이래. secrets.enc.yaml 을 git 에 넣어두고, 배포할 때 CI 가 자기 키로 풀어. 평문 secret 을 commit 할 일이 아예 없어져.
Kustomize — overlay, templating 없음
Kustomize 는 YAML 을 겹쳐서 조립해. base 디렉토리에는 평범한 manifest 를 두고, overlay 디렉토리에는 덧댈 patch 를 둬. kustomize build prod/ 를 돌리면 합쳐진 결과가 나와. Go template 도 없고 문자열이냐 숫자냐 하는 함정도 없어. YAML 이 YAML 을 합칠 뿐이거든.
Jinja2 — Ansible / k8s / config 의 풀 templating
YAML anchor 로는 부족하고 조건문과 반복, include 까지 필요해지면 그때 Jinja2 를 꺼내. Ansible 에는 이미 들어 있고, 홀로 쓰는 YAML 파일은 j2cli 로 렌더할 수 있어. FluxCD 의 HelmRelease 도 Jinja 로 렌더한 값을 받아줘.
CUE — YAML/JSON 의 강타입 superset
CUE 는 YAML 이나 JSON 으로 컴파일되는 config 언어야. 여기에 타입과 제약, 그리고 여러 조각 schema 를 하나로 합치는 기능이 더 붙어. Istio, Dagger, KubeVela 가 이걸 써. 배우는 데 시간이 꽤 들지만, 한 번 손에 익으면 복잡한 플랫폼에서 YAML 을 손으로 쓸 일이 없어져.
원칙: YAML 이 실제로 아파질 때만 다음 층으로 올라가. 평범한 YAML 에서 anchor 로, 거기서 Kustomize overlay 로, Helm template 으로, 마지막에 CUE 로. 한 단계씩 힘이 세지는 만큼 배울 것도 늘어나. 대부분의 프로젝트는 '평범한 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 스크립트에 넣어. 이제 '실수로 키를 commit 했다' 는 사고가 구조적으로 안 일어나.
Progress
Progress is local-only — sign in to sync across devices.