본문 바로가기
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 의 값만 암호화하고 키는 그대로 둬. 그래서 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
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 스크립트에 넣어. 이제 '실수로 키를 commit 했다' 는 사고가 구조적으로 안 일어나.

Progress

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

댓글 0

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

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