반응형
개요
개발 경험이 많고 Heroku 플랫폼을 운영한 사람들이 정리한 규칙이다. 현대의 클라우드 애플리케이션 (SaaS)을 효율적으로 운영하기 위한 개발 규칙이다.
주요 내용
1. Codebase
- 코드베이스와 앱은 일대일 상관관계가 있다. → 코드는 한곳에서 개발 및 배포되어야 한다.
- 코드베이스가 여러개인 경우 → 분산 시스템으로 간주한다. 각각의 코드베이스는 12 factor를 준수한다.
- 여러앱이 동일한 코드를 공유하는경우 → 12 factor를 위반한 경우이다. 공유되는 코드를 라이브러리화 하고 각 앱에 종속성을 주입한다.
- 앱 배포가 여러개인경우 → branch를 활용하여 배포 분리
2. Dependencies
- 애플리케이션은 전체 패키지의 암묵적인 존재에 절대 의존하지 않는다.
- 애플리케이션의 모든 종속성은 반드시 명시적으로 선언해야함.
3. Config
모든 애플리케이션의 구성은 배포 환경에 따라 달라질 수 있다.
- 앱의 구성 요소들을 상수로 절대 지정하지 말것, 코드에서 완전히 분리해야한다.
- config들이 올바르게 구성되었는지에 대한 리트머스 테스트는 안정성을 높여주고, 코드베이스를 오픈시킬수 있다.
- 주로 환경 변수에 구성들을 저장한다. 환경변수는 코드에 들어갈 가능성이 거의 없으며, OS에 종속적이지 않다.
- config들을 그룹화하는것도 좋다 (이거는 좀 찾아봐야할듯)
4. Backing Service
DB, 메시지 큐, SMTP, Cache 등의 모든 서비스를 의미한다. 여기에 서드파티까지 다 포함된다.
- 이들은 느슨한 결합으로 자유롭게 연결 및 분리가 되어야 한다.
- 코드 수정없이 전환이 가능해야 한다.
5. Build, Release, Run
- 빌드 단계에서 config와 결합한다. 이것으로 릴리스를 제작한다.
- 런타임에 코드를 변경하는 것은 불가능하다.
- 이전 릴리스로 롤백이 되어야 한다. 타임스탬프 또는 버전같이 고유ID가 있어야 한다.
- 가능한 사용자가 적은 시간에 배포되어야 한다.
6. Process
- stateless 환경에서 한개 이상의 프로세스로 앱이 실행된다.
- 유지해야 하는 모든 데이터는 백업 서비스에 저장 (DB, S3, MQ 등등)
- sticky session은 12 factor 위반 (인스턴스에 상태를 저장하므로) → redis 또는 memcached를 사용하자
7. Port binding
- 실행 환경에 웹 서버의 런타임 인젝션에 의존하지 않고 HTTP서비스로 접근할수 있게 한다 → 적절한 포트(80) 개방
- 각 어플리케이션은 각자의 책임만 진다.
8. Concurrency
- 애플리케이션은 stateless하므로, 빠르게 scale-out이 되어야 한다.
- 12 factor에서 프로세스는 1급 시민이다. → HTTP요청은 웹 프로세스가 처리하며, 시간이 오래 걸리는 백그라운드 작업은 worker 프로세스가 처리한다.
- 1급 시민이란?
- 변수에 담을수 있다
- 함수값의 인자로 전달이 가능
- 함수의 반환값으로 전달이 가능
9. Disposability
- 프로세스를 빠르게 종료할수 있다.
- 시작시간을 최소화해야 한다 → scale-out/up 최대한 빠르게
- 현재 처리중인 요청은 처리해야한다.
- worker프로세스일 경우 현재 처리중인 작업을 job queue로 돌리는 방법으로 구현함.
- 예상치못한 작업 종료는 큐잉 백엔드로 돌리는 것을 권장함.
10. Dev/Prod parity
- deployment, staging, production 환경을 최대한 비슷하게 유지하기
- 개발 환경과 배포 환경의 차이를 최대한 적게 유지하여 지속적인 배포가 되게 하는것이 목표임
11. Log
- app은 로그 파일을 작성하거나 관리해서는 안된다. 대신 이벤트 스트림을 버퍼링 없이 stdout에 출력한다.
- 배포 환경에서는 애플리케이션의 스트림을 실행 환경에서 수집한 후 로그 수집 파트에서 수집한다.
12. Admin 프로세스
- 어드민이나 유지보수 작업은 일회성 프로세스 (마이그레이션, 스크립트 실행 등) 로 실행되어야함
- 관리/유지보수 및 admin 작업은 release와 같이 실행
- REPL shell을 최대한 활용하는것도 좋을듯함
반응형
'서버 인프라 > DevOps' 카테고리의 다른 글
Github action 개선하기 (1) | 2023.11.25 |
---|---|
쿠버네티스의 Network Solution에 대하여 (0) | 2023.04.14 |
Terraform 훑어보기 (0) | 2023.04.02 |
자동 배포 환경 Github Action으로 이전하기 (0) | 2022.10.07 |
Jenkins를 이용하여 Docker 애플리케이션 배포하기 [3] (0) | 2022.03.25 |