의문점 공부하기/☁️ 클라우드

☁️ 12factor 란?

아리빠 2023. 6. 12. 18:50

12factor는 클라우드 애플리케이션을 개발하는 데 유용한 방법론 중 하나입니다. 이 방법론은 클라우드에서 애플리케이션을 개발하는 데 있어 다음과 같은 12가지 원칙을 제시합니다.

  • 코드베이스: 코드 저장소를 하나만 유지한다.
  • 종속성: 종속성을 명확하게 선언하고, 격리된 환경에서 실행한다.
  • 설정: 설정 정보는 환경변수를 통해 전달한다.
  • 백엔드 서비스: 백엔드 서비스는 호스트 이름으로 연결한다.
  • 빌드, 릴리스, 실행: 빌드, 릴리스, 실행 단계는 분리되어야 한다.
  • 프로세스: 애플리케이션은 하나 이상의 무상태 프로세스로 실행된다.
  • 포트 바인딩: 포트 바인딩을 통해 애플리케이션에 접근한다.
  • 동시성: 애플리케이션은 동시성을 고려하여 설계되어야 한다.
  • 확장성: 애플리케이션은 수평적으로 확장 가능해야 한다.
  • 흐름: 로그를 이벤트 스트림으로 취급한다.
  • 프로세스 관리: 프로세스는 관리 프로세스에 의해 실행된다.
  • 드디어 어플리케이션: 개발자는 드디어 어플리케이션을 실행할 수 있다.

12factor 방법론은 애플리케이션 개발 과정에서 다음과 같은 이점을 제공합니다. 

  • 코드베이스의 단일화로 인한 쉬운 유지보수와 배포
  • 종속성 명시로 인한 애플리케이션 격리와 안정성 향상
  • 환경변수를 통한 설정 관리의 편리성
  • 백엔드 서비스 호스트 이름으로 연결으로 인한 유연성
  • 빌드, 릴리스, 실행 분리로 인한 안정성 보장
  • 무상태 프로세스로 인한 확장성과 유연성
  • 포트 바인딩을 통한 애플리케이션 접근성 향상
  • 동시성 고려로 인한 성능 향상
  • 수평적 확장 가능성으로 인한 성능 향상
  • 이벤트 스트림으로 취급하는 로그 처리로 인한 유지보수성 향상
  • 프로세스 관리 프로세스 실행으로 인한 안정성 보장
  • 드디어 어플리케이션 실행 가능으로 인한 빠른 개발 주기

1. 코드베이스 – 버전 관리되는 하나의 코드베이스

버전 콘트롤을 통해 코드베이스와 앱 사이에는 항상 1대1 관계가 성립시키는 것이 중요합니다. AWS CodeCommit은 완전 관리형 Git 서비스로서 AWS 내 앱 저장소로서 유용합니다.

 

2. 의존성 명시 – 별도로 선언되고 분리된 의존성 기반

특정 패키지가 암묵적으로 존재하는 것에 의존하지 않으며, 기본적으로, Node, Python, Ruby 언어 부터, Docker 파일 등 명시적 선언에 의해 의존성을 정의하고 이를 개발 및 서비스 환경에서 사용해야 합니다. 서버리스(Serverless) 환경에서는 AWS Serverless Model(SAM)이 대표적입니다.

 

3. 설정 분리 – 환경 변수 및 파라미터 별도 저장

애플리케이션 내 설정 값을 하드-코드에 저장해서는 안되며, 코드에서 엄격하게 분리 해서 독립적으로 관리합니다. AWS System Manager: Parameter Store를 통해 애플리케이션 및 시스템 구성 데이터 관리가 가능하며, AWS Lambda Variables을 사용하면 서버리스 함수 내 환경 변수들도 구성 가능합니다.

 

4. 백엔드 서비스 – 각종 백엔드를 서비스 자원으로 구성

애플리케이션은 로컬 서비스와 서드파티 서비스를 구별하지 않고 양 쪽 모두 연결된 리소스로서, API 혹은 다른 로케이터와 인증 정보를 사용해 접근합니다. 스토리지, DB, 캐시, 큐 등 다양한 자원을 서비스로서 활용하기 위해, AWS에서는 Amazon S3, RDS, ElastiCache, SQS 등 다양한 완전 관리형 서비스를 이용할 수 있습니다

 

5. 빌드, 출시 및 배포 –  철저하게 분리된 각 개발 단계

코드, 의존성, 바이너리를 묶어 테스트, 스테이지, 실서비스에 배포할때, 배포 파일(Artifact), 배포 설정을 통해 독립적으로 주기적 배포가 가능하도록 해야 합니다. 흔히, 이를 지속적 통합(CI)  배포 (CD)라고 하며, 중요한 데브옵스(DevOps) 원칙입니다. AWS에서 CI/CD 파이프라인 설정을 위해서는 AWS CodePipeline을 비롯 다양한 완전 관리 서비스를 이용할 수 있습니다.

 

6. 프로세스 – 애플리케이션을 무상태(stateless) 프로세스로 실행

6번째 원칙부터는 높은 확장성을 가진 앱을 개발하는 방법에 대한 가이드입니다. 앱 내부에서 디스크나 메모리에 저장하는 쿠키나 세션 등을 가져 가지 않는 무상태(stateless)로 만들것을 권고 합니다. 만약 유지될 필요가 있는 데이터는 데이터베이스 (혹은 캐시) 같은 안정된 백엔드 서비스에 저장되어야 합니다. 기본적으로 AWS Lambda 기반 서버리스 앱을 개발한다면, 무상태 앱을 쉽게 만들 수 있습니다.

 

7. 포트 바인딩 – 포트 바인딩을 통한 서비스 제공

최근에는 컨테이너를 기반으로 한 서버 내에서 다양한 서비스가 독립적으로 수행될 수 있기 때문에 독립 포트를 바인딩하여 서비스로 제공하고, 개별 포트로 들어오는 요청을 처리하는 것이 일반적입니다. AWS에서는 Application Load Balancing을 통한 URL별 고급 라우팅을 할 수 있고, Amazon ECS에 동적 포트 맵핑을 통해 개별 컨테이너 서비스 제공이 가능합니다.  서버리스앱의 경우, 포트 바인딩 대신 타 API나 AWS  서비스에서 발생하는 이벤트 기반으로 동기 (push), 비동기(event), Poll-based 방식으로 동작하게 됩니다.

 

8. 동시성(Concurrency) – 프로세스 모델을 사용한 확장

각 앱을 프로세스 모델을 기반으로 수직적(Scale-up) 및 수평적(Scale-out) 확장을 제공할 수 있도록 하라는 원칙입니다. AWS 서비스들은 규모에 따른 확장성이 기본적으로 제공 되고 있습니다. 가장 대표적인 Amazn EC2 Auto Scaling 뿐만 아니라, AWS Auto Scaling (ECS, EMR, SageMaker 등)에서 자동 확장 기능이 제공됩니다. 특히, 서버리스 기반의 AWS Lambda (컴퓨팅), AWS Fargate (컨테이너), Aurora Serverless (RDB), DynamoDB On-demand (NoSQL) 등 다양한 자동 확장 기능을 제공합니다.

 

9. 폐기 가능(Disposability) – 빠른 시작과 그레이스풀 셧다운(graceful shutdown)을 통한 안정성 극대화

각 프로세스는 간단하게 바로 시작하거나 종료될 수 있도록 해서 탄력성있는 확장과 코드 및 설정의 변화를 빠르게 배포할 수 있어야 합니다. 클라우드 기반에서 서비스의 변화를 빠르게 모니터링 하는 도구를 제공합니다. AWS에서는 다양한 AWS 모니터링 도구를 통한 애플리케이션 요청/응답 프로파일이 가능하며, 대표적으로 Amazon CloudWatch AWS X-Ray가 있습니다. 그 외에 다양한 오픈 소스 기반 모니터링 도구를 사용할 수 도 있겠죠.

 

10. 개발/프로덕션 환경 일치 – 개발, 스테이징, 프로덕션 환경을 같도록 유지

“개발, 테스트 및 정식 서비스 환경을 최대한 동일하게 유지하라”는 모범 사례를 위해 데브옵스 환경의 코드 기반 자동화와 지속적 통합 및 배포 (CI/CD)는 필수적입니다. ‘5번 빌드, 출시 및 배포’에 활용되는 AWS 기반 코드 시리즈를 통합적으로 활용할 수 있는 프로젝트 관리 도구뿐만 아니라,   소규모 팀을 위한 데브옵스 운영 도구인 AWS CodeStar와 클라우드 기반 IDE 및 디버깅, 손쉬운 개발 협업을 제공하는 AWS Cloud9 역시 개발 및 실서비스 환경을 통합하는데 유리한 서비스입니다.

 

11. 로그 – 로그를 이벤트 스트림으로 취급

로그 파일을 작성하거나, 관리하기 보다 이벤트 스트림을 관리하는 것이 중요합니다. 그래야만 장기간에 걸쳐 앱의 동작을 조사할 수 있는 강력함과 유연성을 가지게 됩니다. 대개 Logplex, Fluentd 같은 오픈 소스 로그 라우터를 사용하여, Hadoop/Hive 혹은 Splunk같은 범용 데이터 분석 시스템을 활용합니다. AWS에서는 다양한 로그를 스트림으로 처리하는 다양한 서비스가 제공 중입니다. 대표적으로 Amazon Kinesis Data Streams, Amazon Managed Streaming for Kafka, Amazon Elasticsearch Service 등이 있습니다.

 

12. Admin 프로세스 – 관리 작업을 실서비스와 함께 구현 및 배포

관리 작업과 백 오피스 업무는 기존 애플리케이션 같은 환경에서 동일 형태로 취급하도록 하는 것은 매우 중요합니다. 클라우드 네이티브 애플리케이션의 관리 작업을 위해 다양한 워크 플로를 구성하도록 지원해 주는 서비스들이 있습니다. Amazon Simple Queue Service를 큐(Queue) 기반 작업을 구성하거나, AWS Step Functions은 다양한 관리 작업을 만들 수 있고, Amazon EventBridge를 통해 이벤트로 들어오는 작업을 SaaS로 연동 가능합니다.

지금까지 클라우드 기반 애플리케이션을 위한 12가지 원칙과 수행하기 위해 활용 가능한 AWS 서비스를 대략적으로 알아보았습니다. 좀 더 자세한 사항은 각 제품 홈페이지와 시작하기(Getting Started) 및 실습 자료를 참고하시기 바랍니다.

'의문점 공부하기 > ☁️ 클라우드' 카테고리의 다른 글

☁️ Saga 패턴이란?  (0) 2023.06.08