기업 과제

1. 2,000명 이하의 동접수를 지원하는 채팅 서비스의 System을 AWS 서비스를 이용해서 구성해보십시오.( 요구사항 spring 기반 백엔드, vueJS 기반 프론트, 대용량 멀티미디어 파일 메시지 가능, 한달 후 장기보관)

Archi1

첫번째 아키텍쳐입니다. 비용 최적화를 우선으로 생각한 아키텍쳐입니다. 사용자는 CloudFront를 통하여 vueJS로 빌드된 S3 정적 호스팅 웹에 접근할 수 있고 2개의 가용영역으로 이루어진 Private Subnet에 있는 백엔드 서버와 교신합니다. 백엔드 서버는 spring boot나 kotlin으로 이루어져있고 EC2나 Fargate 중에 요구사항에 적절하면서 비용을 최적화한 모델을 선택합니다. 저는 EC2보다 MSA환경에 적합하고 2000명 이하의 동접자라면 사용량에 따른 비용을 지불하는 Fargate가 더 적절하다고 생각하여 이렇게 구성하였습니다. 이러한 백엔드 서버의 CI/CD는 깃허브액션을 예를 들었지만 젠킨스 등 다양한 옵션을 선택할 수 있고 저는 Fargate를 예로 들었기때문에 ECR에 컨테이너 이미지를 저장 ECS를 통해 배포하는 예시를 들었습니다. S3에 수명주기 정책을 걸어 미디어 오브젝트에 대한 관리를 직접 지정할 수 있고 log 데이터 등은 다른 S3에서 다른 수명주기를 걸어 관리할 수 있습니다. 마지막으로 관리자는 public의 Bastion Host를 통해 private 서브넷의 서버에 접속해 관리할 수 있으며 CloudWatch를 통해 긴급상황시 SNS를 통해 이메일 연락을 받도록 설계할 수 있습니다.







Archi1

두번째 아키텍쳐입니다. 첫번째와 가장 큰 차이점은 S3 정적호스팅을 Fargate로 프론트를 구성하였다는 것입니다. 이렇게 구성한 이유는 S3의 정적호스팅은 높은 트래픽을 처리할 수 있고 비용 효율성, 관리가 용이하지만 보안 문제를 해결하기 위해서는 상당한 OAI OAC 설정과 클라우드 프론트가 필수입니다. 이때 보안에서의 핵심은 백엔드와의 통신과 클라우드 프론트와의 연결은 모두 가능해야 한 구조에서 S3의 엔드포인트가 노출되거나 S3가 퍼블릭에 노출되지 않도록 하는 것입니다. 동적 컨텐츠를 제공하기 위해 같은 서브넷에 위치하면 S3에서 vpc endpoint를 통한것보다 짧은 네트워크 지연시간을 가집니다. 따라서 설정이 간편하고 짧은 네트워크 지연시간을 원한다면 2번째 구조가 더 적합하다고 생각합니다.

다음과 같이 2개의 아키텍쳐를 예상하였고 저에게 만약 어떤 구조를 선택하냐고 묻느냐면 기업이라면 아마 2번째 아키텍쳐를 선택할거라고 생각합니다. 첫번째 아키텍쳐는 두번째 아키텍쳐에 비해 더 비용효율적인 면이 강조될 수 있지만 보안 등 해결해야 할 문제들이 많고 잦은 업데이트가 필요한 상황이나 혹시라도 S3 오브젝트에 대한 쓰기 읽기 요청이 충분히 늘어나는 상황에서는 비용적 측면도 오히려 효율적이지 못하게 되기 때문입니다. 요약하자면 업데이트나 가변적인 상황에 대처하기 쉽기 두번째 아키텍쳐를 선호하지만 가변적인 상황이 적고 업데이트가 필요없는 환경에서 비용적인 면을 챙겨야한다면 첫번째 아키텍쳐를 선택할 거 같습니다.