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 개발
◦
클러스터 관리