스탠드얼론 정적 바이너리로 도구를 배포해야 하는 이유
(ashishb.net)- 독립 실행형 정적 바이너리로 도구를 배포하면 사용자가 별도의 개발 환경이나 도구 체인 설치 없이 바로 사용할 수 있음
- 컴파일 과정은 비정상 동작 코드 배포 가능성을 낮추는 추가 안전장치 역할을 함
- 인터프리터 언어 기반 도구는 각종 의존성 설치 및 디스크 공간 낭비, 업그레이드 시 반복적 재설치 등 유지관리 부담이 큼
- 의존성이 많을수록 보안 취약점 및 공격 표면이 커지며, 해킹 위험이나 유지보수 이슈가 발생하기 쉬움
- 컴파일 언어 기반의 정적 바이너리는 외부 환경 변화에도 영향을 받지 않으므로, 배포 후에도 안정적 사용성을 보장함
독립 실행형 정적 바이너리 배포의 장점
설치 없이 즉시 사용 가능
- Open AI가 Codex를 Rust로 다시 빌드하며 TypeScript를 버린 사례처럼, 컴파일 언어로 작성된 단일 바이너리를 배포하면 사용자는 추가적인 도구 체인 설치 없이 바로 실행 가능함
- 가장 큰 장점은 속도나 효율성이 아니라, 설치 없이 곧바로 도구 사용이 가능하다는 점임
컴파일러의 추가 안전장치
- 컴파일 단계에서의 검사로, 비정상 코드가 배포될 가능성이 줄어듦
- 예시로 Google Cloud CLI는 Python 기반으로 여러 번 실행 불가 상태로 배포된 적 있음
- 대규모 팀도 이슈를 피하기 어려운데, 소규모 팀이 인터프리터 언어 기반 도구를 안정적으로 배포하기는 더 어려움
도구 체인 의존성 필요 없음
- 컴파일 언어 기반 도구는 단일 바이너리만 배포하면 되지만, Python, Ruby, TypeScript 등의 인터프리터 언어 도구는 반드시 해당 개발 환경이 필요함
- Ruby로 작성된 mdl(markdown linter)처럼, 개발 환경(루비)이 업그레이드될 때마다 재설치가 필요함
- JavaScript 기반 markdownlint 사용 시에는 npm 및 44개 이상의 의존성 설치 필요
디스크 공간 낭비 문제
- 인기 FOSS 코딩 어시스턴트 aider는 Python으로 작성되어 Homebrew로 설치 시 추가로 51개 패키지가 설치됨
- 실제 디스크 사용량이 3GiB 이상 늘어나며, 이는 대부분의 리눅스 배포판 용량보다 큼
- 반면 Rust로 작성된 uv 패키지 매니저는 35MiB 단일 바이너리만으로 설치 가능, Rust 자체나 rustup도 불필요
보안 취약점 증가
- 도구의 의존성이 늘수록 공격 표면 확대 및 보안 취약점 노출 가능성 증가
- OpenAI의 Codex 패키지는 24개 직접, 184개 간접 의존성이 존재함
- 모든 의존성을 OpenAI가 감사하더라도, 의존성 버전이 고정되어 있지 않아 향후 업데이트로 인해 취약점, 악성 패키지, 동작 중단 등의 이슈 발생 가능
유지보수 용이성
- JavaScript, TypeScript, Python 등 인터프리터 언어 기반 도구는 의존성이 제거되면 동작 불가
- left-pad 사건처럼, 단일 패키지 삭제로 대규모 서비스와 도구가 마비될 수 있음
- 컴파일 언어는 빌드 시점에만 의존성이 필요하므로, 이후 외부 저장소가 사라져도 도구가 계속 정상 동작
작성자의 경험
- adb-enhanced 등 과거 Python으로 도구를 만들었으나, 이후 Go로 gabo, wp2hugo 등 다양한 도구를 오픈소스화
- Python, TypeScript 등으로 독립 실행형 도구 개발은 더 이상 고려하지 않음
- 반드시 정적 링크 바이너리 배포가 가능한 언어(Rust, Go, C++ 등) 로 작성 권장
결론
- 독립 실행형 도구는 Rust, Go, C++ 등 컴파일 언어로 개발
- 최소한의 외부 의존성만을 가진 정적 바이너리 형태로 배포해야 함
디스크 공간 낭비 문제
에 대해서는 적잖이 공감할수 밖에 없네요...
AKS 운영하는데 컨테이너 이미지 용량 1GB 넘어가는 파이선 앱 볼때마다 머리가 아픕니다.
지금은 그냥 도커파일 빌려다가 제가 다시 용량줄여서 올리고, 500MB 이하로 못줄이면 그냥 포기합니다 ㅋㅋ
pytorch+cuda 의존성에 버전만 다르게 걸리는 패키지가 있어서.. 아주 가관입니다.
별 기능도 없는 녀석인데 작은 데몬별로 의존성이 2기가 가까이 깔립니다..