[DEVOPS-007][중급] 설정·비밀·배포 결과물 나누기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DEVOPS-007][중급] 설정·비밀·배포 결과물 나누기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 130회 작성일 26-09-02 19:34

본문

[이번 수업]
배포할 때 설정, 비밀정보와 아티팩트를 섞지 않는 방법을 배웁니다. 아티팩트(artifact)는 빌드가 만든 이미지·실행 파일·패키지 같은 배포 결과물입니다.

[선수지식]
DEVOPS-004의 빌드·테스트 자동화, DEVOPS-005의 배포·롤백, DEVOPS-006의 컨테이너와 핵심 객체를 알고 Python과 터미널을 실행할 수 있어야 합니다.

[학습목표]
1. 설정·비밀·아티팩트의 역할을 구분한다.
2. 같은 아티팩트에 환경별 값을 실행 시 주입한다.
3. 버전과 다이제스트로 배포 대상을 식별한다.

[핵심개념]
설정은 로그 수준, 기능 켜기·끄기, 서비스 주소처럼 환경마다 달라질 수 있지만 공개되어도 인증 권한을 주지 않는 값입니다. 설정 파일이나 환경변수로 코드와 분리하고 변경 이력을 검토합니다. 컨테이너 환경에서는 ConfigMap 같은 기능을 쓸 수 있지만 ConfigMap은 비밀 저장소가 아닙니다.

비밀은 암호, API 토큰, 개인키처럼 노출되면 권한을 빼앗길 수 있는 값입니다. 소스 저장소, 컨테이너 이미지, 일반 설정 파일, 빌드 로그에 넣지 않습니다. 전용 비밀 저장소에서 필요한 작업에만 짧게 전달하고 최소 권한·암호화·교체 정책을 적용합니다. Base64 인코딩은 암호화가 아닙니다.

아티팩트는 한 번 빌드한 뒤 바꾸지 않는 것이 원칙입니다. 같은 결과물을 개발·검증·운영 환경으로 승격하고 환경 차이는 실행 시 설정으로 줍니다. 다이제스트(digest)는 내용으로 계산한 식별값입니다. OCI 이미지의 디스크립터도 미디어 유형, 크기와 다이제스트로 내용을 가리킵니다. 배포 기록에는 아티팩트 버전·다이제스트, 설정 버전, 비밀의 참조 이름이나 버전을 남기되 비밀값 자체는 남기지 않습니다.

[따라하기]
아래 코드를 `deploy_demo.py`로 저장합니다. 고정된 배포 결과물의 다이제스트와 실행 시 주입된 설정을 따로 확인하는 예제입니다.

```python
import hashlib
import os

artifact = b"demo-app-v1\n"
digest = hashlib.sha256(artifact).hexdigest()
mode = os.environ.get("APP_MODE", "development")
secret_loaded = bool(os.environ.get("APP_TOKEN"))

print(f"artifact=sha256:{digest[:12]}")
print(f"mode={mode}")
print(f"secret_loaded={secret_loaded}")
```

macOS·Linux 터미널에서는 다음처럼 실행합니다.

```sh
APP_MODE=staging APP_TOKEN=local-demo python3 deploy_demo.py
APP_MODE=production APP_TOKEN=local-demo python3 deploy_demo.py
```

Windows PowerShell에서는 실행 후 임시 변수를 지웁니다.

```powershell
$env:APP_MODE = "staging"
$env:APP_TOKEN = "local-demo"
py deploy_demo.py
Remove-Item Env:APP_TOKEN
```

예상 결과의 첫 줄은 두 환경에서 같고 `mode`만 달라집니다. 이는 아티팩트를 다시 만들지 않고 설정만 바꿨다는 뜻입니다. Windows 예제의 mode는 staging입니다.

```text
artifact=sha256:72ea852dce73
mode=staging
secret_loaded=True
```

[흔한 실수]
- 운영 주소나 비밀을 이미지 안에 굽고 환경마다 다시 빌드한다.
- 바뀔 수 있는 태그만 기록하고 실제 다이제스트를 남기지 않는다.
- 비밀값을 Base64로 바꾼 뒤 암호화됐다고 생각한다.
- 설정 변경을 검토·버전 관리하지 않는다.
- 비밀을 교체했지만 실행 중인 작업이 새 값을 읽는지 확인하지 않는다.

[보안 주의]
예제에는 `local-demo` 같은 가짜 값만 사용합니다. 실제 비밀을 명령줄에 직접 쓰면 셸 기록이나 프로세스 정보에 남을 수 있으므로 운영에서는 승인된 비밀 저장소와 짧은 수명의 자격증명을 사용합니다. 비밀 조회 권한은 해당 작업에만 주고 출력·로그·오류 메시지에는 값 대신 로드 성공 여부만 남깁니다. 저장소에 올라간 비밀은 삭제만 하지 말고 즉시 폐기·교체합니다.

[직접 해볼 과제]
`APP_REGION` 설정을 추가하고 staging과 production을 각각 실행하세요. 두 실행의 아티팩트 다이제스트는 같고 설정만 다른지 표로 기록한 뒤, `APP_TOKEN`이 없으면 프로그램을 중단하도록 검증 코드를 추가합니다.

[확인문제]
1. 일반 설정과 비밀정보를 나누는 기준은 무엇인가요?
2. 같은 아티팩트를 여러 환경으로 승격하는 이유는 무엇인가요?
3. 배포 기록에 비밀값 대신 무엇을 남겨야 하나요?

[다음 학습]
다음 SEC-007에서는 암호화, 키 관리와 TLS를 연결해 배웁니다.

[공식 참고 자료]
- Kubernetes ConfigMap: https://kubernetes.io/docs/concepts/configuration/configmap/
- Kubernetes Secret 보안 권고: https://kubernetes.io/docs/concepts/security/secrets-good-practices/
- OCI 이미지 디스크립터: https://specs.opencontainers.org/image-spec/descriptor/
- OCI 이미지 매니페스트: https://specs.opencontainers.org/image-spec/manifest/
- Python 환경변수: https://docs.python.org/3/library/os.html#os.environ
- Python 해시 함수: https://docs.python.org/3/library/hashlib.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,801
어제
6,862
최대
16,772
전체
770,752
Copyright © 소유하신 도메인. All rights reserved.