(시리즈3) AWS를 이용한 클라우드 네이티브 어플리케이션 인프라 구축 (1) - 클라우드 네이티브 & 12 factor

msyhu·2021년 5월 27일
0
post-thumbnail

글의 목적

AWS를 사용하기 전에, 클라우드 네이티브 환경에 대해 알아봅니다. 왜 AWS를 써야 하는지에 대한 당위성을 얻을 수 있었습니다.

클라우드 네이티브 애플리케이션이란 분산된 클라우드 인프라를 활용한 애플리케이션입니다.

  • Cloud Native, O'Reilly

분산 시스템

클라우드는 기본적으로 분산 시스템으로 이루어져 있으며, 분산 시스템이란 개별 컴퓨터들이 네트워크로 연결되어서 하나의 컴퓨터로 보이는 시스템입니다. 분산 시스템에는 몇 가지 잘못된 가정이 있으며, 썬 마이크로시스템즈의 피터 도이치라는 분이 이 문제의 목록을 정의했습니다.

  1. 네트워크는 안정적이다
  2. 네트워크 지연이 없다
  3. 대역폭은 무한대다
  4. 네트워크는 안전하다
  5. 토폴로지는 변하지 않는다
  6. 관리자는 한 명이다
  7. 전송 비용이 없다
  8. 네트워크는 동등하다

AWS 또한 비슷한 문제들에 직면했으며, 그 문제들은 다음과 같다고 합니다.

  • 엔지니어가 오류 조건을 결합할 수 없습니다. 대신, 엔지니어는 장애에 대한 많은 순열을 고려해야 합니다. 대부분의 오류는 다른 오류 조건과는 독립적으로, 그리고 잠재적으로 함께 결합하여 언제라도 발생할 수 있습니다.
  • 네트워트 작동 결과가 UNKNOWN 상태일 수 있으며, 이때 요청은 성공, 실패 또는 수신되었지만 처리되지 않은 상태일 수 있습니다.
  • 분산 문제는 단순히 하위 수준의 실제 머신이 아니라, 분산 시스템의 모든 논리적 수준에서 발생합니다.
  • 분산 시스템은 반복성 때문에 시스템의 상위 수준에서 더 악화됩니다.
  • 분산 버그는 종종 시스템에 배포된 후 오랜 시간이 경과한 후 나타나기도 합니다.
  • 분산 버그는 전체 시스템으로 퍼질 수 있습니다.
  • 위의 많은 문제는 변경되지 않는 네트워킹의 물리 법칙에 따라 파생됩니다.

그 외에도 시간 동기화, 트랜젝션, 합의 알고리즘 등 분산 시스템에서 기초적이고 중요한 문제들이 쌓여 있습니다.

대충 봐도 위와 같이 분산 시스템을 처음부터 구축해야 한다면 수많은 문제를 해결해야 합니다. 다행히 이미 클라우드 벤더들은 위 문제들을 합리적인 방법으로 관리하고 있으며, 우리는 퍼블릭 클라우드를 사용하는 법만 학습하면 어플리케이션 개발에 집중할 수 있습니다.

12요소 앱

앞에서는 인프라 레벨에서 클라우드와 분산 시스템의 문제에 대해 알아봤습니다. 이번에는 어플리케이션 레벨에서 지켜야 할 원칙(모범 사례) 에 대해 알아보겠습니다.

온프레미스에서의 확장은 주로 장비에 자원을 추가하는 방식의 수직적 확장이지만, 클라우드에서의 확장은 장비 여러 대에 로드를 분산하는 수평적 확장입니다. 따라서 애플리케이션에는 상태가 없어야 하며, 상태가 없는 어플리케이션을 만들기 위한 원칙들을 정의한 것을 12요소 앱 방법론이라고 합니다.

그 원칙들에는 다음과 같은 것들이 있습니다.

  1. 코드베이스 : 버전 관리되는 하나의 코드베이스와 다양한 배포
  2. 종속성 : 명시적으로 선언되고 분리된 종속성
  3. 설정 : 환경(environment)에 저장된 설정
  4. 백엔드 서비스 : 백엔드 서비스를 연결된 리소스로 취급
  5. 빌드, 릴리즈, 실행 : 철저하게 분리된 빌드와 실행 단계
  6. 프로세스 : 애플리케이션을 하나 혹은 여러개의 무상태(stateless) 프로세스로 실행
  7. 데이터 격리 : 각 서비스가 자신의 데이터를 관리
  8. 동시성(Concurrency) : 프로세스 모델을 사용한 확장
  9. 폐기 가능(Disposability) : 빠른 시작과 그레이스풀 셧다운(graceful shutdown)을 통한 안정성 극대화
  10. 개발/프로덕션환경 일치 : 개발, 스테이징, 프로덕션 환경을 최대한 비슷하게 유지
  11. 로그 : 로그를 이벤트 스트림으로 취급
  12. 관리 프로세스 : 관리 작업을 일회성 프로세스로 취급

정리하면 다양한 기술 및 개발 방법론을 활용해 위 요건을 충족해 나가는 것이 클라우드 네이티브한 어플리케이션 개발이라고 할 수 있을 것 같습니다. 제 경험상 새로운 오픈소스 및 환경을 사용할 때 위 요소 중 어떤 부분을 충족하기 위해 쓰는 것인지 생각해 보면 해당 오픈소스를 이해하는 데 도움이 되었던 것 같습니다.

결론

이번 글에서는 AWS를 사용하기 전 왜 AWS를 사용해야 하는지, 클라우드 환경이란 무엇인지에 대해 간단하게 알아보았습니다. 또한 클라우드 환경에서 어플리케이션을 개발할 때 무엇을 고려해야 하는지에 대해서 알아보았습니다. 다음 글부터는 AWS 환경 구축을 시작해 보겠습니다.

혹시 글에 잘못된 점이 있다면 댓글로 지적해 주시면 정말 감사하겠습니다!

감사합니다.

profile
컨테이너, k8s, 마이크로서비스 등 클라우드 네이티브 환경에 관심이 많습니다.

0개의 댓글