서버 인프라/DevOps

12 Factor App 이란?

트리맨스 2023. 8. 2. 01:12
반응형

 

개요


개발 경험이 많고 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을 최대한 활용하는것도 좋을듯함

 

반응형