C.W.K.
Stream
Lesson 08 of 08 · published

암호화된 YAML, 템플릿팅, CUE 대안

~10 min · yaml, sops, kustomize, cue

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

탈출 출구 — plain YAML 로 부족할 때

SOPS — commit 됐지만 암호화된 secret

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
SOPS-암호화 YAML (git 에 안전하게 commit)·yaml
# secrets.enc.yaml — commit 됨!
database_url: ENC[AES256_GCM,data:Tr3y+kQs...,iv:abcd...,tag:efgh...]
api_key:      ENC[AES256_GCM,data:9Pq2...,iv:1234...,tag:5678...]
sops:
  kms:
    - arn: arn:aws:kms:us-east-1:123:key/abc
      created_at: '2026-05-04T01:30:11Z'
Kustomize — base + overlay·yaml
# base/kustomization.yaml
resources:
  - deployment.yaml
  - service.yaml

# overlays/prod/kustomization.yaml
resources:
  - ../../base
replicas:
  - name: pippa
    count: 10
images:
  - name: ghcr.io/cwk/pippa
    newTag: '1.0.42'

# prod manifest 빌드
kustomize build overlays/prod/ | kubectl apply -f -
CUE — 같은 데이터, 타입 포함·text
// pippa.cue
package pippa

#Service: {
    name:     string
    replicas: int & >0 & <=20
    image:    string
    port:     int & >=1024 & <=65535
}

production: #Service & {
    name:     "pippa"
    replicas: 10
    image:    "ghcr.io/cwk/pippa:1.0.42"
    port:     8000
}

// cue export pippa.cue --out yaml > production.yaml

External links

Exercise

현재 평문 secret (.env 파일, YAML 의 하드코딩 API 엔드포인트) 가진 리포 골라. age 암호화로 SOPS 셋업 (AWS 계정 불필요). secret 하나 암호화, commit, 로컬에서 복호화. 복호화 단계를 dev/start 스크립트에 추가. '실수로 key commit' 문제가 이제 구조적으로 해결.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.