[알토르] #18 mongoDB를 사용해 사용자 정보 로깅하기

Hyungjun·2024년 7월 18일
0

알토르

목록 보기
20/23

Mission

몽고DB가 무엇인지
무료 호스팅을 받아보기
로깅

백엔드 mongodb 설치
IP, 메세지, 응답한 내용, 시간데이터
EC2) git clone 가지고 소스코드 가져오고 그 이후에는 git pull


배경지식

#1 nosql vs sql

데이터베이스는 데이터의 저장소다. 애플리케이션과 데이터베이스 사이에서 데이터베이스를 운영하고 관리하는 소프트웨어인 DBMS가 있다. DBMS방식에 따라 많은 유형이 나뉘고, DBMS에서 사용하는 언어를 크게 sql과 nosql로 나눈다.

  1. sql
    저장하고픈 항목이 늘어날 때마다 스키마를 변경해주어야 함.
    중복 제거를 위해 정규화하도록 되어있는데, 데이터를 읽어올 때 수많은 join을 해야한다.

  2. nosql 의 등장
    인터넷이 널리 보급되면서 SNS가 많아짐. high-throughput 이 요구되고 low-latency가 요구됨. 다양한 사람들이 다양한 데이터를 만들어내면서 비정형 데이터가 증가함.

  3. nosql 특징

  • flexible schema
    schema의 틀을 먼저 정하지 않고 만들 수 있다.
  • 중복 허용 (join 회피)
  • scale-out : 컴퓨터 부하가 커지면 다른 컴퓨터를 추가해 확장이 편함
  • high-throughput, low-latency 추구

#2 mongoDB , mongoDB atlas

MongoDB는 NoSQL 데이터베이스로, 문서 기반(Document-Oriented) 데이터 저장 방식을 채택한 오픈소스 DBMS

  • MongoDB는 스키마가 없으며, 데이터는 BSON(Binary JSON) 형태로 저장
  • MongoDB Atlas
    MongoDB의 완전 관리형 클라우드 데이터베이스 서비스
    데이터베이스 클러스터를 프로비저닝 하고, 모니터링하고, 관리하기 쉽도록 도와줌

계정 만들기

  1. mongoDB에 회원가입을 하고 cluster를 만들고 그 안에 database를 만들었다.

  2. 보안 설정을 하면서 user 와 password를 설정해 주었다.
    이 부분은 openai assistant를 사용할 때와 비슷하게 flask 코드 내에서 mongoDB로 database에 로그인 할 때 필요하다. 접근 허용 ip는 0.0.0.0/0 으로 모두 열어놓았다.

그럼 아래와 같은 화면을 통해 연결 상태와 저장된 데이터를 볼 수 있다.

실습

#3 EC2에 repository clone하기

현재 EC2 인스턴스에는 flask 코드를 복사해서 올려놓았다.
하지만 git을 이용해서 최신 코드를 pull 해올 수 있다면 편할 것 같아 레포지토리를 클론하는 과정을 진행하였다.

  1. 먼저 git을 다운받아주고 클론을 해주었다.
sudo apt-get update
sudo apt-get install git
git clone https://github.com/1hjjun/artor.git
  1. nohup로 백그라운드에서 24시간 실행중인 코드를 kill 해준뒤, 최신 코드로 pull해서 재시작해주면 된다.
//프로세스 ID 찾기
ps aux | grep airesumeAPI.py

//프로세스 kill
kill PID_number

//repository로 가서 명령어 실행
cd artor
git pull origin main

//nohup로 재시작
nohup python ~/artor/lesson4/airesumeAPI.py > output.log 2>&1 &

#4 mongoDB로 로깅하기

1) local에서 먼저 작동시키기

현재 vercel 과 ec2에 배포가 되어있는 상태지만 다시 vscode 상에서 코드를 수정해 localhost에서 잘 작동되게 만들고 배포를 해야한다.
그러기 위해 api 요청 부분을 http://localhost:5001/sendMessage로 수정해서 진행했다.

  1. terminal에 pymongo와 dnspython을 다운받아준다.
    (MongoDB 서버에 연결할 때 연결 문자열에 SRV 레코드를 사용하는 경우 dnspython이 필요하다.)
pip install pymongo dnspython
  1. 라이브러리를 import 해주고 .env를 사용해 mongoDB password를 하드코딩을 하지 않고 숨겨준다. 아래와 같은 코드를 입력해주면 mongoDB에 로그인해서 데이터를 저장할 수 있게 된다.
from pymongo import MongoClient

mongo_password = os.environ.get("MONGO_PASSWORD")
mongo_connection_string = f'mongodb+srv://aut7410:{mongo_password}@resumecluster.j7ejmtd.mongodb.net/?retryWrites=true&w=majority&appName=resumeCluster'

mongoclient = MongoClient(mongo_connection_string)
db = mongoclient.log
  1. 사용자 ip주소, 질문 시간 데이터 가져오기
    1) datetime 라이브러리를 사용하였다.
    2) 먼저 클라이언트의 IP 주소를 X-Forwarded-For 헤더에서 가져오려 시도한다. 만약 해당 헤더가 있는 경우, 첫 번째 IP 주소를 사용하고, 그렇지 않은 경우에는 request.remote_addr을 사용하여 IP 주소를 가져온다. 이렇게 함으로써 클라이언트의 실제 IP 주소를 추출할 수 있다.

def get_ip():
    if request.headers.get('X-Forwarded-For'):
        ip = request.headers.get('X-Forwarded-For').split(',')[0]
    else:
        ip = request.remote_addr
    return ip

//assistant 답변 return 부분 안에
    	ip = get_ip()
        timestamp = datetime.now()

        log = {
            "ip_address": ip,
            "user_message": user_input,
            "response": ai_response,
            "timestamp": timestamp
        }
        collection.insert_one(log)
  1. auth 오류 해결
    처음 flask 코드를 작성하고 api에 질문을 요청해보니 오류가 나서 개발자 도구에 network 부분을 보니 아래와 같은 오류 JSON응답을 볼 수 있었다.

    stack overflow를 찾아보며 해결해보았는데, 주요 문제는 mongoDB의 user 이름이나 password에 특수문자가 들어가면 오류가 발생했다. 그래서 기존 비번에서 숫자와 번호의 조합만 있는 비번으로 수정하니 해결할 수 있었다.

    users 라는 새로운 collection이 생성되고 그 안에 내가 원하는 ip 주소, 사용자가 한 질문, 질문에 대한 답변, 질문한 시간의 데이터를 볼 수 있었다.

2) 배포

  1. EC2 에서 최신 코드를 git pull 로 받아와서 실행을 시키면 동작이 안된다. output.log로 오류 내용을 확인해 보니 pymongo와 dnspython 라이브러리 다운을 까먹었다. 쉽게 다운받아서 바로잡아준다.

  2. 백그라운드 실행까진 잘되었지만 mongoDB에 로그인이 안되는 것을 볼 수 있었다.

해결 : git은 .env 파일을 push하지 않는다. 제 3자가 github에 올라간 내 비번을 해킹할 수 있기 때문에 gitignore을 통해 push를 막아놓았다. 그래서 따로 EC2 내의 .env 파일에 vi로 mongoDB password 내용을 추가해주니 해결되었다.

  1. 결과
    1) 답변이 오지 않던 것이 오는 것을 확인할 수 있다.

    2) mongoDB atlas 에서 collection이 잘 저장된다!

출처
https://duckgugong.tistory.com/159
https://duckgugong.tistory.com/158
https://it-creamstory.tistory.com/entry/MongoDB-Atlas-%ED%8F%89%EC%83%9D-%EB%AC%B4%EB%A3%8C%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0

profile
Cloud Security Expert

0개의 댓글