DevOps 부트캠프 Final Project 회고
본문 바로가기
DevOps 부트캠프/후기

DevOps 부트캠프 Final Project 회고

by liveloper jay 2022. 6. 7.

부트캠프의 마지막 프로젝트도 오늘을 마지막으로 끝났다. 이번 프로젝트는 기간도 길었던만큼 기존 프로젝트에 비해 더 많은 것을 해볼 수 있었던 것 같다. 그래서 이번 프로젝트를 통해 내가 어떤 일을 했으며, 그 과정에서 느낀 점들도 함께 정리해보려고 한다.

 

 

프로젝트 정리

 이번 프로젝트에서는 사용자가 화물 운송 예약 및 조회 서비스를 구성해 보았으며, 구현한 내용은 다음과 같다.

  •  소비자가 상,하차지 등 운송정보를 입력하면, 해당 플랫폼을 통해 요청이 드라이버에게 전달이 되는 서비스를 구현
  •  예약에 관련된 기능을 수행하는 API 서버가 구현되어 있으며, 이는 ELB와 AutoScaling을 통해 가용성을 보장하고 확장을 용이하게 함.
  •  예약 API 서버의 각 기능이 수행된 후, 분석 가능하게 하기위하여 ElasticSearch에 예약 정보에 대한 로깅
  •  예약 정보 조회 시 빠른 조회를 위한 ElasticCache (Cache가 비어있으면 데이터베이스에서 조회)
  •  예약 정보를 RDS를 통해 저장 
  •  사용자가 예약을 한 경우 해당 내용에 대한 알림 메시지를 드라이버에게 전달하기 위한 SQS 
  •  SQS로 전달된 메시지를 소비 및 기사에게 전달하기 위한 알림 API 서버 (알림 서버에서 메시지 소비/삭제)
  •  위 인프라를 Terraform 코드로 구현

 

 아키텍처로 나타내면 다음과 같다.

Final Project Architecture

 

 

 

내가 맡은 파트

 이번 프로젝트 간 내가 맡았던 파트에는 Elasticsearch 구축, 예약 API 서버 개발, 알림 API 서버 개발 및 Elasticsearch에 관한 terraform 코드 작성을 진행하였다.

 

 1. ElasticSearch 구성

 먼저 서버에서 생성/조회/수정/삭제 등의 요청을 처리한 경우, 해당 동작에 대한 로그를 서버에서 생성하여 그 로그를 저장하기 위해 로그를 Elasticsearch로 전송하여 로그를 저장하는 방식을 선택하였다. AWS Opensearch를 이용하지 않고, 직접 구성하기로 결정,  Github의 docker-elk repository를 이용하여 elasticsearch를 EC2 환경에 직접 구성하였다.  

참고 repo : https://github.com/deviantony/docker-elk   

 

 2. 예약 서버 개발

 예약 서버는 Node.js express 프레임워크를 이용하여 개발을 진행하였으며,  크게 예약 생성, 예약 조회, 예약 변경, 예약 삭제 의 4가지 동작을 수행하는 간단한 CRUD 작업만으로 구성하였다. 

  • 생성 : 예약 내역이 DB에 저장, 예약 내용 생성 성공/실패에 따른 로그 , SQS로 메시지 생성 후 전송
  • 조회 : 예약 내역 elasticache에 있는지 조회 -> 없으면 DB에서 조회, 조회 성공/실패 여부에 따른 로그
  • 수정 : 수정한 예약 내역 DB에 반영 , 예약 내용 수정 성공/실패에 따른 로그
  • 삭제 : 예약 내역 DB에서 삭제, 삭제 성공/실패에 따른 로그

 

 3. 알림 서버 개발 / SQS 생성

 알림서버도 Node.js express 프레임워크를 이용하여 개발을 진행하였으며, 예약 관련 메시지를 비동기로 처리하기 위해 SQS를 구축하였다. 이후 예약 서버로 부터 전송받은 메시지가 SQS에 있으면 해당 메시지를 소비(받아옴) 하고, 큐에서 해당 메시지를 삭제하는 방식으로 구성하였다. 

 참고 repo : https://github.com/Einsteinish/aws-sqs-node-js-example  

 

 4. Elasticsearch 관련 Terraform 코드 작성

 Elasticsearch 테스트 완료 후 인프라를 코드로 작성하기 위해 Terraform을 이용하여 서브넷, IGW, 라우팅 테이블, NAT GW , Eip, Security Group... 등을 생성하는 과정을 테스트 해보고 정상적으로 되는 것 확인 후 다른 팀원에게 코드를 넘겨주었다. ( 이 이후의 코드 병합이나, 필요한 내용에 대해서는 인수 받은 팀원이 추가로 작성하였다.)

 

 

 

 

 

아쉬운점/개선점

프로젝트를 진행하면서 굉장히 아쉬움이 크게 남았던 부분들도 분명 존재한다. 이번에는 프로젝트간 아쉬웠거나 개선해야 할 점들에 대해 작성해 보려고 한다.

 

1. ElasticSearch 관련 계속된 문제 발생으로 인한 계획 변경

최초 ElasticSearch를 사용하고자 계획할 때에는 AWS의 Opensearch를 사용하고자 하였다. 그런데 최초 4일간 Opensearch를 사용하였을 때 생각보다 많은 비용이 청구됐었고, 팀원들과 상의 끝에 비용문제가 발생할 수 있을 것이라 판단하여 직접 구성하는 방식으로 변경하기로 했다.

그 이후 위 사진과 같은 방식에 filebeat를 추가하여 로그 수집 과정을 구성하고자 하였는데,  이 과정에서도 filebeat에 로그를 수집하는 과정이 권한 등의 여러 문제가 발생하여 정상적으로 진행되지 못해 결국 예약 서버에서 로그 format을 직접 만들어 바로 Elasticsearch로 전송하는 방식으로 최종 수정하였다.

 

 이 과정에서 계획이 계속 수정되었고, 그 시간 동안 다른 일들을 많이 못했다고 생각하기 때문에 많이 아쉬움이 남았고, 앞으로 진행하게 될 수많은 프로젝트에 대해선 이와 같은 실수를 최대한 줄이도록 노력해야 할 것이다.

 

 

2. 배포 시 EC2 환경에서의 DB Connection 문제

 API 서버 작성 완료 후 로컬에서의 테스트가 정상적으로 되는 것을 확인 후, AWS EC2 환경에서의 수동 테스트 과정에서 DB Connection Error가 발생하였다. 확인해보니 환경변수의 값이 undefined, 작성해놓은 환경변수가 적용이 안된 것이 원인이었다.

그렇게 한참을 생각해보니 로컬 테스트 환경에서는 .env 파일이 DB 연결하는 코드와 같은 경로에 있으나, Terraform으로 작성한 코드에서 모든 환경변수는 /opt 경로에 작성된 것을 알게 되었다. (이런실수를...ㅠㅠ)

그래서 서버측 코드에 작성해놓은 시작스크립트에 다음과 같이 추가해주었고, 정상적으로 연결되는 것을 확인할 수 있었다.

source /opt/env_elastic_pass
source /opt/env_redis_host
source /opt/env_db_endpoint
source /opt/env_db_port
source /opt/env_db_user
source /opt/env_db_pass
source /opt/env_db_use
source /opt/env_server_port
source /opt/env_notify_arn

 

 

3. ElastiCache Connection 문제

 테스트 진행 중 ElastiCache에 연결 되는 과정에서부터 에러가 발생하였다. 이 부분은 연결하고 데이터를 가져오는 부분만관여를 하였고, ElastiCache에서 조회하거나 생성하는 코드는 직접 작성하지 않았다. 그리고 ElastiCahe에 관련된 코드가 문제없이 잘 작동한다고 했기에 계속 원인을 찾지 못하고 있었다. 후에 알고보니 get_cache와 set_cache 함수를 직접 만들어서 예약 내역 조회를 진행하는 방식이었고, 이 코드가 동작하지 않아 발생하는 문제였던 것이었다....

 원인을 찾은 후 해당 부분을 Redis 내장 함수인 .get 과 .set 사용하는 것으로 코드 수정 진행하였고, 문제 없이 잘 진행이 되는 것을 확인할 수 있었다. 이를 계기로 꼭 내 파트가 아니더라도 연관되는 부분에 대해서는 최소한의 이해는 하고 있어야 삽질(?)을 덜 하게 된다는 것을 알게 되었다.

 

 

4. ElastiCache 예약 조회 관련 문제

로컬 환경에서의 모든 테스트가 끝나고 AWS 환경에서의 테스트를 진행하는데 다른 과정은 잘 되는데, ElastiCache에서 빠른 검색을 위해 캐시를 조회하는 과정에서 다음과 같은 메시지와 함께 에러가 발생하였다.

TypeError: args.flat is not a function

 해당 에러 메시지를 찾아보니 브라우저나 Node 버전에 따라 문제가 발생한다는 내용을 확인하였고, Node 11 버전 이상에서 지원하는 것을 알 수 있었다. 그러나 Ubuntu 20.04 버전에서 Node 의 디폴트 버전은 10 버전이었다. 해당 버전의 node를 완전 삭제 후 Node 16 버전으로 재설치 후 테스트를 진행해보니 에러가 발생하지 않는 것을 확인하였고, 시작 스크립트 initialize.sh 파일에 다음과 같이 추가하여 16버전으로 설치될 수 있게 설정해주었다.

#!/bin/bash
cd /home/ubuntu/super-g/server
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
apt install -y nodejs
npm install
npm install pm2@latest -g

 

 

 

댓글