코드스테이츠_Devops_4기/final project

final) 프로젝트 마무리 회고

불여우의 길 2023. 6. 28. 11:57

드디어 파이널 프로젝트가 끝났다!

내가 할 수 있을까 .. 싶었는데

역시나 항상 함께하는 팀원들이 있어서 영차영차 만들 수 있었다


프로젝트 소개

마라톤 대회 결과 기록 시스템 : 마라마라톤 (mrmrmthon)

  • 개인 사용자와 대회 주최자를 위한 시스템
    • 로그인 기능을 통해 토큰 발급 
    • 사용자에 따라 가능한 CRUD 작업이 다름
  • 유저 데이터 베이스를 분리하여 관리
  • 기록 데이터를 기반으로 사용자별 점수를 기록하는 시스템은 데이터 유실을 막기 위해 SQS를 통해 느슨하게 결합
  • 가용성, 내결함성, 확정성, 보안성을 고려하여 시스템 구성

참고로 마라마라톤 이름 제가 아이디어를 냈답니다?(❁´◡`❁)

아키텍쳐

 

1️⃣

개발자가 앱 개발을 하여 GitHub에 올리고 새로운 버전을 릴리즈하면

GitHubAction을 통한 자동화로 각 스토리지 또는 컴퓨팅 유닛에 파일이 전달된다.

S3에는 정적페이지 파일이 업로드.

ECR에는 백엔드 개발 부분이 이미지로 올라가고 테스크 정의가 새롭게 생성.

ECS에 서비스가 업데이트

람다 함수도 자동 배포

 

2️⃣

ECS, 람다, SQS, 데이터베이스를 클라우드 워치를 통해 EC2에 띄운 그라파나로 모니터링이 가능함

 

3️⃣

사용자는 Route 53을 통해 도메인 접속이 가능하며 CloudFront를 통해 S3에 호스팅된 정적 페이지가 나타남

 

4️⃣

user 서버에 요청을 보내 CRUD 작업. user_db에 접근하여 처리한다.

로그인 api로 로그인에 성공할 경우 개인사용자, 대회 주최자에 따라 토큰을 발급

5️⃣

 header에 로그인으로 발급받은 토큰을 포함하여 main 서버로 요청을 통해 CRUD 작업

main_db, user_db 에 접근하여 처리

각 토큰을 구별하여 접근할 수 있는 api가 각각 다름

6️⃣

main 서버를 통한 post 요청으로 official_record 테이블에 데이터가 들어면 해당 데이터 베이스의 테이블을 트리거로 동작하는 official_record_lamda라는 람다가 실행된다.

이 람다 함수를 통하여 해당 user 정보와 공식 기록된 마라톤에 해당되는 포인트를 조회하여 를 SNS에 전달한다.

7️⃣

SNS에 전달된 user정보와 point 정보를 SQS에 전달한다. 이 SQS를 트리거로 하는 point_increase_lamda라는 람다가 실행된다. 이 람다를 통해서 user_db에 해당 사용자에 대한 포인트가 추가된다.

8️⃣

SNS를 트리거로 하는 webhook_lamda가 실행되어 사용자가 받은 포인트를 디스코드 메세지로 전달한다.

 

 

 


 

 

 

파이널 프로젝트에서 내가 맡아 구현한 부분에 대해서 설명하겠어요..

1. 데이터베이스 구현

테이블 설계는 다같이 얘기하면서 만들었다.
mysql 테이블을 만들고 테스트할 수 있는 데이터를 넣는 데이터베이스 백업 쿼리?를 만들어서 팀원들과 공유했다.

그래서 테스트하다가 다 밀고 초기화 가능

final_user_db.sql
0.00MB

 

 

사실 별건 아니고 이거다

 

 

2. DynamoDB 연동 및 CRUD 구현

 

DynamoDB연동은 js파일로 작성했다.

aws-sdk 사용하는거라 어렵진 않았다.

const AWS = require('aws-sdk')
//const dynamoClient = new AWS.DynamoDB.DocumentClient()

require('dotenv').config()

AWS.config.update({
  region: "ap-northeast-2",
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
})

 

연동되는 부분은 이 부분..

 

CRUD 구현은 메인서버에 해당하는 부분을 맡아서했다.

 

테이블별로 나누어서 정리하자면

table name CRUD endpoint 설명
official_marathon GET  /marathon 공식 마라톤 목록 전체 조회
POST  /marathon/add 공식 마라톤 추가
PUT  /marathon/update/:id 특정 공식 마라톤 수정
DELETE  /marathon/:id 특정 공식 마라톤 삭제
player GET /player 마라톤 참가자 조회
POST /player/add 마라톤 참가자 신청
DELETE  /player/:id 마라톤 참가자 신청 취소
official_record GET /official_record 공식 기록 전체 조회
POST /official_record 공식 기록 추가
PUT /official_record/:id 특정 공식 기록 수정
DELETE  /official_record/:id 특정 공식 기록 삭제
non_official_record GET /non_official_record 비공식 기록 전체 조회
POST /non_official_record/add 비공식 기록 추가
PUT /non_official_record/:id 특정 비공식 기록 수정
DELETE  /non_official_record/:id 특정 비공식 기록 삭제
point GET /point 포인트 목록 전체 조회
GET /point/:user_id 특정 사용자 포인트 목록 조회
GET /point/:total_point/:user_id 특정 사용자 총 포인트 조회

 

이렇게 CRUD 개발을 완성하였다.

 

3. official_record_lamda 함수 개발

프로젝트 요구사항 중 !

대회 주최자에 의해 입력된 공식기록에 따라 해당 참가자에게 point가 추가됩니다.
사용자별 점수를 기록하는 시스템은 데이터 유실을 막기 위해 느슨하게 결합되어야합니다.

 

 

따라서 공식기록이 추가되는 다이나모디비를 트리거로 하는 official_record_lamda 라는 람다를 만들어 큐를 통해 point _increase_lamda 로 값을 전달하게 아키텍쳐를 만들었다.

 

하는 도중에 트러블슈팅도 만났는데 자세한 내용은👇

 

 

final) 다이나모 디비를 트리거로 사용하는 람다함수만들기

다이나모 디비에 특정 테이블에 데이터가 들어가면 람다함수가 동작되도록 구현 시작했다. 트러블슈팅 1. 다이나모디비의 Stream 권한 설정 다이나모를 통해서 람다가 동작하려면 스트림설정을

itfirefox.tistory.com

 

4. SNS & SQS 구현

위 람다함수를 만든 다음에는 sns를 통해 sqs로 메시지가 전달하도록 구성했다.

sns는 요구사항에는 해당하지 않은 부분이었지만 sns에서 이메일이나 슬랙, 디스코드 등으로 알람을 보내는 기능 구현이 추가될 것을 고려하여 추가해 두었다.

 

메시지를 전달받아 사용자의 포인트를 증가시켜주는 point_increase_lamda까지 메세지가 전달되는 것을 확인하고 DLQ 도 만들어주었다.

 

5. 웹훅 구현

이왕 아키텍쳐에 그린김에 살짝 시간이 생겨서 만들어 본 디스코드 웹훅

 

자세한 내용은 요기엣 👇

 

final) sns를 통해 웹훅으로 디스코드 메시지 전송하기

시간이 남으면 만들어 보자고 했던 웹훅 한번 만들어봤습니다. 원래 이런 아키텍쳐였는데 웹훅 개발을 하다보니 굳이 큐를 통해 메시지를 전달하지 않아도 되어서 sns에서 바로 람다가 디스코드

itfirefox.tistory.com

 

6. 모니터링 시스템 구현

이 부분은 팀원 다같이 만들었다.

AWS Cloud Watch를 가져오는 개념이었는데, 그라파네에서 AWS 서비스 별로 만들어둔 대시보드를 import 할 수 있었다.

그런데 우리 팀은 필요한 서비스의 모니터링 포인트를 한눈에 보기 위해서 직접 대시보드를 만들었다.

 

 

만드는 과정은 요깅👇

 

final) 서브넷 설정과 Grafana

서브넷 설정을 위해 새로운 VPC를 만들고 퍼블릭 서브넷과 프라이빗 서브넷을 만들었다 보안그룹도 새로 만들었당 일단 우리팀은 하나의 보안그룹을 사용하기로 해서 하나에 다 열어주었당 ECS

itfirefox.tistory.com

 

7. IaC 구현

아직 완성되진 않았지만ㅎㅎ 그래도 꽤 많이 만들었다.

 

IaC 구현을 맡은 팀원분들과

VPC 생성, 인터넷 게이트웨이 생성,  서브넷 생성, 라우팅 테이블 생성, nat 게이트 웨이 생성, eip 생성, 보안그룹 생성, 대상 그룹 생성

까지 끝내고 각자 서비스들을 맡아서 진행하였다.

 

내가 맡은 부분은

ECS, ECR, task_definition, ELB, RDS, DYNAMO DB 였다.

 

하면서 RDS에 서브넷 그룹을 연결해주면서 서브넷 그룹을 추가하였고

ECS에 배포를 하는 과정에서 iam 설정도 해주었다.

 

하지만 현재 ECR에 올라간 이미지를 ECS 서비스에 배포하는것은 실패한 상황이다.

권한설정같은데.. 아직 살펴보는 중입니다.

 

IaC를 작성하면서 만났던 에러는 👇

 

final) IaC terraform 코드 작성

이것저것 작은 실수나 오타 빼고 리얼 개빡치는 오류나 설정을 작성해 보겠숩니다. 1. rds가 자꾸 default vpc에 맨들어지고 난리 보안그룹은 새로 만든 vpc에서 사용하는 보안그룹인디 rds는 default vpc

itfirefox.tistory.com

 

다른 팀원이 만든 부분까지 합쳐서 현재 IaC는 ECS 서비스 올라가는 부분과 

최근에 만들어진 S3와 웹훅 람다 빼고 성공을 시킨 상태이다.

 


팀프로젝트다 보니 팀원들과 함께 역할을 분리해서 진행하다보니 자동화 부분과 ECS 서버 배포 부분을 손대지 못한것이 조금 아쉬웠다.

 

하지만 IaC를 통해서 ECS

서버배포를 접할 수 있었다. 

 

자동화부분은 따로 팀원분이 만들어 주신 GitHubAction 코드를 통하여 공부하고 직접 배포도 해보았다.

 

IaC를 공부하면서 AWS에서 콘솔로 만들때 자동적으로 추가되거나 연결되었던 부분을 테라폼 코드로 작성하였다.

이 부분에서 공부가 많이 되었다.

 

역시 팀프로젝트는 팀원들과 함께 상의하고 하나하나 만들어가는것이 참 뿌듯하고 즐거웠다.

우리팀은 처음부터 끝까지 분위기가 좋아서 즐겁고 더 열심히 작업할 수 있었다.

팀 분위기도 우리 프로젝트에 큰 영향을 준 것 같다.

 

전반적으로 만족스러운 프로젝트가 만들어졌다.ㅎㅎ

 

햄볶아요...💞