[Worisilok] 회의 정보 통합 서비스

5 more properties

1. 배경(Problem)

현황

사내 회의실 현황 파악 및 관리에 대한 부재
회의실 사용 전
공실 여부 확인
타 팀의 사용 예정 여부 확인
팀 간 회의실 사용 시간 중복 방지
회의실 예약 취소로 인한 추가 예약 가능 여부 확인

개선점

회의실, 일정, 세부사항 통합 관리
서비스 내 단위별 통합확인

2. 서비스 소개(Solution)

아이디어 목표

해당 서비스를 제공하는 앱이 없는 것은 아니지만, 회의 장소/회의록 등을 별도로 관리하고 있어, 회의에 관련된 도메인을 통합 서비스로 제공하여 회의 정보 관리를 개선하기 위함에 목적을 둠.

1) Member Service (회원)

회원가입
로그인
서비스 내부 식별자 값 제공
와이어 프레임

2) Resrvation Service (회의실 및 일정)

오늘의 회의
회의 예약
회의 스케줄러
회의 리마인더
회의 카테고리
와이어 프레임

3) Minute Service (회의록)

회의록 작성
STT (Speech to Text)
회의록 관리
회의록 전달
와이어프레임
아키텍처 및 핵심 기능

3. 아키텍처 및 핵심 기능

아키텍처

CI/CD
로컬 환경에서 Prod/Dev 프로퍼티를 나누어서 개발을 진행하였고, Git 커밋 시 AWS ECR과 미리 작성해놓은 매니페스트 파일을 통해 클러스터 내부의 네임 스페이스 별로 서비스 파드를 배포하였습니다.
AWS 리소스에 대한 시크릿과 키 파일에 대해서는 환경 변수를 통해서 커밋하도록 설정하였고, 쿠버네티스의 Secret을 활용하여 파드 실행 시 환경 변수에 값을 대입하는 형태로 진행하였습니다.
Authenticate
분산 서비스 마다 인증/인가를 하지 않도록 하고, 각 서비스에 대한 보안 관련 클래스를 통합하기 위하여 API Gateway를 활용하여 토큰을 발행한 후, 각 서비스에 인가가 완료된 요청을 할 수 있도록 설계하였습니다.
AWS API Gateway에 람다(서버 리스) 코드를 실행하기 위한 인가 클래스를 통합한 추가 코드를 작성하여 값을 수행하였고, 로그인을 통한 최초 요청은 Member Service, 토큰 발행 후 인가된 요청을 할 때는 나머지 서비스에 API를 요청하도록 설정하였습니다.
Expose
Prod와 Dev에 요청하기 위한 각 URL을 도메인을 직접 구매하여 서브 도메인으로 Staging 하였고, AWS에서 제공하는 LoadBalancer Controller를 활용하여 Ingress와 함께 ALB(L7)을 활용하여 외부에 노출하였습니다.
Staging을 구분하는 기준은 한 클러스터 내부에 Name space를 통해서 나누었고, 각 네임스페이스에 서로 다른 서브 도메인을 사용하는 Ingress를 통해서 요청을 분산하였습니다.
ALB를 선택한 이유는, 각 분산 서비스에 알맞는 API 요청을 처리하기 위해 트래픽 전달 규칙을 커스텀할 수 있기 때문에 선택하였습니다.
Frontend
처음에는 클러스터의 Public Subnet에 React app 을 배포하려 하였지만, S3와 CloudFront를 통해서 외부에 배포하게 되었습니다.

활용 라이브러리 및 개발 환경

Infra

Kubernetes
AWS EKS, AWS AMG(Grafana), AWS AMP(Prometheus)
ALB(L7)

DevOps

AWS ECR, AWS CodePipeline, Docker, AWS CodeBuilder
Git Hub

개발 도구

Java, SpringBoot FrameWork
React, Type Script

STT를 위한 AWS Transcribe 라이브러리

웹 회의중인 화면에서, 작성하지 않고 녹음 기능을 통해 녹음 파일을 생성 후 서버에 전달하여 음성을 텍스트로 변환해주는 기능입니다.
AWS Transcribe 를 활용하기 위한 AWS IAM 권한을 설정하고, 해당 시크릿과 키에 대한 정보를 미리 사용 환경에 설정해야합니다.
프로젝트 완료 기준 한국어만 해석하여 지원할 수 있도록 “UTF-8” 설정을 완료하였습니다.

API 문서 통합화

Swagger 라이브러리를 통해 서비스 별 API 명세를 진행하되, 각 분산 서비스마다 다른 URL을 가진 API 명세서가 되지 않도록,
Spring Docs 라이브러리를 추가하여 테스트 케이스를 활용한 json파일을 기반으로 한 URL에서 모든 서비스별 API명세를 확인할 수 있도록 하였습니다.

트러블 슈팅

1) Docker Build 시, EKS 클러스터 내부의 인스턴스와 개발환경의 운영체제 차이

윈도우, amazonlinux-x86~~ 시리즈 : amd64 사용
mac : arm64 사용
맥에서 빌드한 도커파일을 클러스터 환경에서 실행 했을 Crash Loop Back 에러 발생
→ docker buildx를 통해서 멀티 환경에서도 사용가능한 이미지파일 빌드

2) 로컬에서는 잘 되지만, AWS 환경에 올라간 각 컴포넌트별 CORS 에러

공식 문서를 통한 CORS 기본 설정 및 헤더 값 수정

팀 소개

김성인 (조장)
인프라 환경 구축 & 클러스터 관리
모니터링 배포
김지섭
CI/CD 파이프라인 구성
Front 개발
김창현
Backend 개발
Frontend 연동 & 테스트
인영은
Backend 개발
클러스터 관리