CI/CD 스터디 08: Secrets, Config, Observability
CI/CD secret, config, protected variable, environment gate, 배포 후 관측성, smoke test, 로그 안전성을 정리합니다.
CI/CD에서 가장 위험한 부분은 배포 명령 자체보다 권한과 관측성입니다. secret이 잘못 흘러가거나 배포 후 상태를 못 보면 자동화는 장애를 더 빨리 퍼뜨립니다.
Secrets와 Config 구분
config는 노출되어도 시스템을 장악할 수 없는 설정이고, secret은 노출되면 인증이나 권한이 넘어가는 값입니다. CI/CD YAML에는 secret 값을 직접 적지 않습니다. 이름만 참조하고 값은 플랫폼의 secret store, cloud secret manager, vault, OIDC federation 같은 경로에서 관리합니다.
| 항목 | 예시 | 관리 방식 |
|---|---|---|
| config | 환경 이름, public endpoint, feature flag 기본값 | repository 또는 config map으로 관리할 수 있습니다. |
| secret | deploy credential, signing key, database credential | CI/CD secret store 또는 외부 secret manager에 둡니다. |
| ephemeral identity | OIDC로 발급받는 짧은 수명의 cloud 권한 | 장기 credential을 줄이는 방향입니다. |
YAML에서 지켜야 할 규칙
# 값 자체를 쓰지 않고 이름만 참조한다.
deploy:
stage: deploy
script:
- ./scripts/deploy.sh
variables:
DEPLOY_ENV: production
rules:
- if: '$CI_COMMIT_TAG'로그 안전성
masked variable은 사고를 줄이는 장치이지 악성 스크립트를 완전히 막는 방패가 아닙니다. 신뢰할 수 없는 branch나 fork에서 운영 secret에 접근하지 못하게 해야 합니다. 또한 디버깅을 위해 env 전체를 출력하는 습관은 반드시 버려야 합니다.
# 피해야 할 습관
env
printenv
set -x
# 필요한 값만 안전하게 존재 여부를 확인한다.
test -n "${DEPLOY_ENV:-}" && echo "DEPLOY_ENV is set"
test -n "${CI_COMMIT_SHA:-}" && echo "commit metadata is available"배포 관측성
배포 후에는 파이프라인 성공 표시보다 실제 서비스 상태가 중요합니다. 최소한 health endpoint, error rate, latency, pod restart, recent logs, synthetic smoke test를 확인해야 합니다.
# HTTP smoke test
curl -fsS https://service.example.com/health
# Kubernetes 상태 확인
kubectl -n app get deploy,pod
kubectl -n app rollout status deployment/app --timeout=180s
kubectl -n app logs deploy/app --tail=120
kubectl -n app get events --sort-by=.lastTimestamp | tail -n 30GitHub Actions deployment protection
GitHub Actions의 environment와 deployment protection rule은 운영 배포 job이 바로 실행되지 않게 승인, 대기, branch 제한 같은 조건을 둘 수 있습니다. 이 기능은 secret 관리와 별개로 배포 시점의 운영 게이트 역할을 합니다.
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- run: ./scripts/deploy.sh
- run: ./scripts/smoke-test.shGitLab 변수 운영 기준
GitLab CI/CD 변수는 project, group, instance 범위로 관리할 수 있고, protected/masked/hidden 같은 옵션을 조합합니다. 운영 배포에 필요한 변수는 protected branch 또는 protected tag에서만 사용할 수 있게 제한하는 것이 기본입니다.
변수 설계 예시
- DEPLOY_ENV: config, repository 또는 pipeline variable 가능
- REGISTRY_IMAGE: config, repository variable 가능
- CLOUD_ROLE_NAME: config, protected variable 권장
- DEPLOY_PRIVATE_KEY: secret, 가능하면 장기 key 대신 OIDC/short-lived credential로 대체실무 점검 목록
- CI/CD YAML, 로그, artifact, test report에 secret 값이 들어가지 않게 합니다.
- 운영 secret은 protected branch/tag 또는 environment gate 뒤에서만 사용합니다.
- fork PR과 외부 contributor pipeline에는 운영 secret을 주지 않습니다.
- 배포 후 health check와 smoke test를 job 안에서 실행합니다.
- 배포 실패 시 알림에는 commit, image digest, environment, 실패 job, rollback 링크를 포함합니다.
- secret rotation과 runner 폐기 절차를 문서화합니다.