이번 글에서는 애플리케이션과 Vault를 연동하는 과정에서 버전 호환성 문제로 인해 발생한 오류와 그 해결 과정을 작성해보고자 합니다.
문제는 로드밸런스 통해 어플리케이션 서버로 PII 저장 요청을 보내는 과정에서 발생했습니다. (참고로, 애플리케이션은 파이썬으로 작성되었습니다.)

hvac 라이브러리를 통해 Vault에 접속은 시도했으나, 시크릿을 가져오는 과정에서 실패하고 있었습니다. 네트워크 연결(Connecting...)은 성공했기 때문에 방화벽 관련 문제는 아니라고 판단했고 아마 Vault와 애플리케이션 간의 호환성 문제임을 의심했습니다...
로그에 찍힌 URL 경로(.../v1/secret/data/pii-db)와 실제 Vault 설정을 비교해보니 원인은 KV(Key-Value) 엔진의 버전 불일치였습니다.
애플리케이션 코드에서 hvac 라이브러리를 사용할 때는 KV Version 2 방식을 사용하였으나
# 애플리케이션 코드 (v2 방식 사용)
read_response = client.secrets.kv.v2.read_secret_version(path='pii-db')
하지만 . . . 실제 구축된 Vault 서버의 설정을확인해보니, secret/ 경로의 엔진 타입이 기본값인 Version 1으로 설정되어 있었습니다.
$ vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
secret/ kv kv_~~~~~ n/a
결론적으로, Vault 엔진은 v1인데 코드는 v2 방식으로 /data/ 경로를 접근하려해서 오류가 발생한 것입니다.
코드를 v1 방식으로 수정하는 방법보다 Vault 엔진을 업그레이드 하는게 오버헤드가 적기도하고 Version 2가 제공하는 버전 관리(Versioning) 기능의 이점도 얻는게 더 효율적이라고 판단하여 진행하였습니다.
Vault CLI를 통해 secret/ 마운트 포인트의 KV 엔진을 v2로 마이그레이션했습니다.
# 기존 KV 엔진을 2로 업그레이드
vault secrets tune -version=2 secret/
엔진 업그레이드 후, 기존 데이터 정합성을 확실히 하기 위해 DB 접속 정보를 v2 방식으로 다시 저장해주었습니다.
# 시크릿 재등록
vault kv put secret/pii-db \
username="------" \
password="------" \
host="10.10.10.10" \
port="3306"
설정 변경 후 테스트를 통해 애플리케이션이 Vault에서 Credentials를 받아오며 정장적인 API 응답을 확인했습니다. 프로젝트 진행하면서 에러를 너무 많이 마주쳐서 그런지 단순한 버젼 호환성 문제라서 다행이라고 생각합니다...
