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으로 관리할 수 있습니다.
secretdeploy credential, signing key, database credentialCI/CD secret store 또는 외부 secret manager에 둡니다.
ephemeral identityOIDC로 발급받는 짧은 수명의 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 30

GitHub 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.sh

GitLab 변수 운영 기준

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로 대체

실무 점검 목록

  1. CI/CD YAML, 로그, artifact, test report에 secret 값이 들어가지 않게 합니다.
  2. 운영 secret은 protected branch/tag 또는 environment gate 뒤에서만 사용합니다.
  3. fork PR과 외부 contributor pipeline에는 운영 secret을 주지 않습니다.
  4. 배포 후 health check와 smoke test를 job 안에서 실행합니다.
  5. 배포 실패 시 알림에는 commit, image digest, environment, 실패 job, rollback 링크를 포함합니다.
  6. secret rotation과 runner 폐기 절차를 문서화합니다.

참고 문서

BGM EVER