Amazon Web Services 한국 블로그
AWS 클라이드 네이티브 기반 Twelve Factor 앱 개발 방법
2012년 Heroku에서 일하던 개발자들은 클라우드 시대에 적합한 애플리케이션 개발과 배포 방법에 맞는 12가지 원칙(Twelve Factor)을 개념화 했습니다. 이와 비슷한 원칙 중 더 나은 코드를 위한 12가지 Joel Test라는 것도 유명하죠.
Joel Test가 코드와 개발에 대한 것이라면 Twelve-Factor App 원칙의 주요 개발 동기는 아래와 같습니다.
- 애플리케이션 설정 자동화를 위한 절차(declarative)를 체계화 하여 신규 개발자의 학습 비용 절감
- 운영 체제에 따라 다른 부분을 정의하고, 배포 및 실행 환경 사이의 이식성 극대화
- 클라우드 플랫폼 배포에 적합하며, 서버와 배포 시스템 관리 최소화
- 개발 환경과 운영 환경의 차이를 최소화하고 민첩성을 위한 지속적인 배포 지향
- 개발 도구, 아키텍처, 개발 방식 변화 없이서비스 확장(scale up/out) 가능
이러한 12가지 원칙(Twelve Factor)을 기반으로, AWS 클라우드 기반으로 개별 서비스를 접목하는 솔루션이 없을까 고민했습니다. 아래 영상은 최근 클라우드 기술 동향과 새롭게 고려할 항목을 포함하여 전체를 관통하는 앱 현대화를 위한 패턴도 함께 소개합니다.
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) 및 실습 자료를 참고하시기 바랍니다.
마지막으로 5 Years of 12 Factor Apps 영상을 보면, 12가지 원칙이 나온 후 시대적 변화에 따라 추가적으로 고려할 사항으로 앱 모니터링(관제), 자동화, 보안 강화를 들고 있습니다. 이는 클라우드에서 가장 우선 순위로 두는 것들 중에 하나로서 각 분야별로 다양한 AWS 서비스가 제공되고 있습니다.
AWS에서는 이러한 12가지 앱 개발 원칙을 클라우드 네이티브 기반의 앱 현대화라고 명명하고, 마이크로서비스 아키텍처, 서버리스와 데브옵스라는 패턴을 기반으로 설명하고 있습니다. 보다 자세한 것은 앱 개발 현대화 기술 백서를 참고하실 수 있습니다.
– Channy(윤석찬);