[AWS] 클라우드 모범사례

김아름·2022년 4월 20일
0

1. 장애를 고려한 디자인

  • 클라우드 환경에서 설계를 할 때 장애가 발생한다는 가정 하에 보수적으로 설계를 진행하고, 장애로부터 복구, 복원이 가능하도록 시스템을 디자인 함

  • 하드웨어의 장애가 발생하더라도 애플리케이션이나 서비스 레벨의 장애로 직결되지 않도록 단일 부분의 장애요소(SPOF)들을 제거한다.

  • SPOF(Single Point of Failure): 단일 장애요소, 시스템 단일 구성요소가 동작하지 않았을 때 전체 시스템에 영향을 주는 요소

  • SPOF가 제거 되었을 때 탄력성, 확장성을 보장 할수O


(SPOF를 제거한)서비스 이중화 사례

  • 1개의 웹서버가 있고 뒷단에 1개 DB만 통신하고 있을 때, 네트워크 장애가 발생한다면 전체적인 시스템에 영향을 준다.
  • 그래서 이중화를 해야함
  • Primary(Master or Live)서버에서 제트워크 장애가 발생을 하더라도 Secondary(Slave or Backup)서버에서 서비스를 가능하게끔 한다.

대표적인 정책요소

(1) 일관성 있는 백업과 복구정책과 자동화

  • 클라우드 환경 뿐만 아니라 온프라미스 환경에서도 백업과 복구정책이 있어야 함
  • 하나의 서비스가 장애발생 했고 다른 서비스로 대체 한다고 할 때, 그것에 해당하는 백업 서버 or 복구를 할수있는 정책들이 있어야 함
  • 정책들 위에 자동화된 스크립트 프로그래밍을 통해서 장애를 회피할 수 있는 기능들을 만들어야 함

(2) 재기동 이후에 진행되는 프로세스의 정립

  • 서버가 장애가 발생해서 재기동 되었을 때, 이후에 올라오는 프로세스, 소프트웨어, 설정같은 것들이 정립이 안되어있다면 서버의 장애가 서비스의 장애로 직결 됨
  • 설정값이라던가 데이터들이 최신버전으로 맞춰져있지 않다면 서비스의 인프라의 장애 이외에 서비스의 장애가 발생된다. 따라서 프로세스 상에 정립을 해야 함

(3) 데이터를 리로드하여 다시 동기화 할 수 있는 상태 허용

  • 웹서버 or was서버가 재기동 되었을 때 / 프로세스가 리로드 되었을 때
    중앙에서 공유하고 있는 데이터or 어떤 메세지들을 가져올 수 있게 상태가 허용 되어야 함
  • 하나의 서버에 데이터 or 유저 세션 등을 공유하면 X, 중앙의 데이터베이스 or 큐 를 통해 메세지를 통신 함
    --> 재기동 되었을 때 데이터들을 리로드 하고 다시 동기화 할 수 있도록 서버를 설정 해야 함

(4) 이미지에 표준화 된 사전 설정 (pre-config), 최적화 정책 관리

  • 서버가 재기동 되었거나 서버가 문제가 생겨서 다른 서버로 대체 하였을 때
    기본적인 OS 위에 올라오는 설정값, 프로세스 설치, 구성에 대한 자동화 등이 구성이 되어야 함
    --> 표준화 된 상태로 서비스가 올라올 수O
  • 다양한 툴을 통해서 최신 버전을 체크 하고 제대로 동작하는 지 확인

(5) 인메모리 세션이나 유저 정보 상태를 저장하는 방식을 지양

  • 데이터를 리로드 하고 다시 동기화 할 수 있어야 하는데
  • 하나의 서버에 메모리의 세션을 들고있다거나 유저정보 상태를 들고있을 때, 서버에 장애가 났다면 전체 서비스에 영향을 준다.
  • 자기만의 독립적인 데이터가 있을 때 서비스가 장애가 났을 때는 이 세션이나 유저 정보에 대해서는 다른 서버들이 알지못하기 때문에 서비스 품질이 저하 됨
  • 인메모리 세션이나 유저 정보 상태는 로컬에 저장X, 공유할 수 있는 중앙에 저장O



2. 컴포넌트에 대한 소결합

  • 클라우드에서는 SOA의 디자인 원칙 중에 하나인 "더 큰 확장을 위해서 시스템의 구성요소들을 보다 소결합 시킨다"를 따르는 설계방식을 가져간다.

  • 다양한 요소들을 구성할 때 서로간에 밀결합(tight coupled)을 지양하여 하나의 구성요소에 문제가 발생하였을 때 다른 구성요소는 해당 문제와 상관없이 지속적으로 서비스 가능해야한다는 개념이다.


소결합 vs 밀결합

(1) 소결합(Loose Coupled)

  • 5가지 단계가 있을 때, 각 단계가 독립적으로 운영&관리 할수있는 방식
  • 프로세스를 수행 or 클라우드환경에서 웹어플리케이션을 구성할 때, web was / DB / storage 등이 독립적으로 구성
  • 만약 web에서 장애가 발생하면 was / DB / storage는 장애에 영향X
    --> 새로운 web server로 바꾸고 연동하면 서비스 다시 가능
  • 각각의 컴포넌트별로 구성 후 API(표준화된 인터페이스 형태)로 연동하는 방식

(2) 밀결합(Tight Coupled)

  • 하나의 구성요소들이 독립적으로 구성된 것이 아니라 밀접하게 구성
  • web, was, DB등이 모두 밀접하게 하나의 서버에 함께 구성
  • web에서 장애가 발생하면 was, DB 등 모두 장애에 영향O



3. 탄력성 / 동시성 / 보안을 고려한 구성

(1) 탄력성 있는 구성

  • 탄력성을 구현하기 위해 (OS, 소프트웨어 등의)배포절차를 자동화하고 (설정값을 간소화하는 등)구성을 간소화하는 프로세스 구성 필요
  • 사용자의 개입 없이 확장 필요
  • 실 사용량에 부합되는 자원을 제공
    <--> 전통적인 인프라 스트럭쳐 방식에서는 낭비요소가 많음
  • 자원의 효율성과 비용 효율성을 가져온다.

(2) 동시성 있는 구성

  • = 병렬화 라고도 함
  • 멀티 스레드 형태로 병렬적으로 서비스를 구성
  • 클라우드에서는 동시성을 구현하는데 어렵지 않음
  • 예를들어, 동일한 시점에 데이터를 저장하면서 요청을 수행하는 작업을 실행할 수 있음
  • 클라우드는 작업을 병렬화하고 자동화 할 수 있음
  • 하나의 서버의 자원이 하나의 job을 처리하는데 10시간이 걸린다면,
    클라우드에서는 탄력적으로 서버를 10개로 늘릴 수 있다.
    --> 똑같은 job을 1시간에 끝낼 수 있다.

(3) 보안을 고려한 구성

  • 데이터 전송 시에 정보 보호

    • 데이터 전송 하는 중에 누군가에 의해 탈취 당할 수 있음
  • 저장에 대한 정보 보호

    • 아무리 논리적으로 분리가 되었어도물리적인 환경 자체가 공유된 환경이기 때문에 정보보호를 해야함
    • 공유되는 풀 안에서도 저장 시에 특정 암호화방식을 택해서
      나의 서비스만 읽을 수 있게끔 구성
  • 어플리케이션의 보호

    • 디도스 등 해킹을 방지 할 수 있게
      포트 라던가 네트워크 레벨에서 WAF 등을 통해 보호
  • 클라우드 자원의 보호

    • 클라우드 자원 위에 서비스를 올리는데 클라우드 자원 역시 보호 필요
    • UI, API, CLI 등을 통해 서비스를 생성할 때
      이것들에 대한 액세스 키나 시크릿 키를 통해 보호
  • 다수의 사용자 혹은 권한에 대한 보호

    • 하나의 서비스를 구성하는 다수의 사람들의 권한을 쪼개서 보호
    • 예를들어 개발자는 서버자원에 대해 read only 권한 / 엔지니어는 read&write 권한/ 사업팀은 빌링에 대한 read 권한...



학습정리



참고

profile
쿄쿄쿄

0개의 댓글