본문 바로가기
사이드 프로젝트/뉴스구독 웹서비스

aws whats'new 뉴스레터 업그레이드3 | Flask웹 aws배포(DB)+Cron

by 카프리썬 2021. 5. 13.
728x90

아아ㅏㅏㅏㅏ거의 다 썼는데 날라갔다. 아놔. 

2021.05.12 - aws whats'new 뉴스레터 업그레이드3 | Flask웹 aws배포(Route53)

2021.05.12 - aws whats'new 뉴스레터 업그레이드3 | Flask웹 aws배포(ELB)

 

생각보다 오래걸렸다. 별것도 아닌데...그리고 기록하던 중에 다 날라가버리는 바람에..하..

 

 

AWS데이터베이스 써보기? 

사실 조금 막막했다. 지금까지 테스트환경 즉 개발환경의 내 로컬PC에서는 Mongodb를 사용했다.

그런데 이걸 어떻게 운영환경이랑 연결하지?

지금 개발한 앱들은 ec2에 있는데 어떻게 db에 접속을 해야하지?

2021.04.16 - AWS 뉴스메일 자동화 | python에서 mongoDB 사용하기

 

AWS 뉴스메일 자동화 | python에서 mongoDB 사용하기

일단 현재는 RSS로 긁어온 데이터들을 출력해논 상태이다. (python의 feedparser이용) 이제 이 데이터들을 mongoDB에 저장해볼까 한다. MongoDB설치하기 python에서 사용할 수 있는 pymongo라는 패키지가 있다.

pearlluck.tistory.com

데이터를 아직 저장하지 않은 상태라 다행이지 있는 상태로 변경하려면.. 혹시 그게 마이그레이션일까

 

일단 mongodb를 대신할 수 있는 클라우드 서비스를 알아보았다. 

documentdb라고 있는데 mongodb와 호환되는 완전관리형 서비스였다. 

하지만 프리티어에서는 제공하지 않는 서비스로 사용한만큼 비용이 든다. 

 

그래서 비용을 먼저 알아보았다 << document db 비용

Amazon DocumentDB를 사용할 때는 사용한 만큼만 비용을 지불하면 되고, 선불 비용과 최소 요금이 없습니다. Amazon DocumentDB는 4가지 측면에서 요금이 부과됩니다.

  1. 온디맨드 인스턴스 클러스터 하나에 대한 컴퓨팅 인스턴스 사용량(초당 요금, 최소 10분)
  2. 데이터베이스 I/O: 클러스터 스토리지 볼륨에서 데이터를 읽고 쓸 때의 I/O 횟수(I/O 100만 회당 요금).
  3. 데이터베이스 스토리지: 클러스터 스토리지 볼륨에 저장된 데이터 용량(월 GB당 요금).
  4. 백업 스토리지: 클러스터 데이터베이스 스토리지 사용량을 초과하여 사용한 백업 스토리지 용량(월 GB당 요금).

이렇게 나와있는데 대충 비용계산 해보면..

일단 db인스터스로 db.t3.medium을 쓴다고 치면..초당 요금이 0.119이니까..하루만 해도 86400초니까..

하루만 쳐도 8640달러가 나오는데..?맞나? 벌써부터 너무 비싼데?

그리고 데이터베이스IO는 100만회당 요금인데 100만회는 안넘을꺼 같아서 괜찮고, 

백업도 안한다고 치면 백업스토리지 용량도 안들고 대신 

데이터베이스 스토리지용량까지 더 추가한다면..??

 

비용걱정없이 그냥 EC2안에서 MONOGBDB설치하자..클라우드 환경같진 않지만..뭐 어때.. 

 

mongodb를 쓰고 싶은데

결국 EC2안에서 몽고디비를 설치하기로 했다. 나는 우분투 20.4 OS인 EC2인데 뭔가 불안했다.

공식 가이드에 따라 몽고비디를 설치했는데 실패했다.  << mongdb 설치하기

정말 난 설치오류가 제일 싫다... 

구글링해보니 우분투에서 안그래도 몽고디비 설치관련해서 잡음이 좀 있나보다 연관검색어가 있다. 

두세번 설치를 시도하다가 결국 이런생각이 들었다.

굳이 mongodb를 써야하나..?

사실 몽고디비는 그냥 한번 써보려고 한 것 뿐이지 굳이 이메일만 저장하는 현재데이터베이스에선 굳이였따. 그래서 결국 가장 만만한 mysql을 설치했다. 

 

역시 가장만만한 mysql

mysql로 바꾸면서 대신 코드를 대거(?) 수정해야했다.

아예 새로운 파일을 가지고 db로 접근해서 데이터 insert와 select하는 코드를 수정했다.

insert 

아, 여기에서 주목해야할 부분은 저 %s 이다. 파라미터로 받은 값을 받아서 insert문을 수행한다.  

#input email data
def insert_email(value1,value2):
    mysql_client = pymysql.connect(user=mysql_user,passwd=mysql_pwd,host=mysql_host,db=mysql_db,autocommit=True)
    cursor = mysql_client.cursor(pymysql.cursors.Cursor)
    input_sql="INSERT INTO emails values(%s,%s);"
    val = (value1,value2)
    cursor.execute(input_sql,val)

select

여기에선 receivers[0]을 주목해야한다. 실제로 fetchall()한 결과는 튜플형식들로 묶인 리스트들이 되기 때문이다. [('이메일1',), ('이메일2',),..] 이런식이기 떄문에 튜플중에 첫번쨰 값인 이메일을 넣어야한다. 

def find_email():
    email_list = []
    mysql_client = pymysql.connect(user=mysql_user,passwd=mysql_pwd,host=mysql_host,db=mysql_db,autocommit=True)
    cursor = mysql_client.cursor(pymysql.cursors.Cursor)
    cursor.execute("Select email FROM emails")
    receivers = cursor.fetchall()
    for receiver in receivers:
        email_list.append(receiver[0])
    return email_list

 

MYDB라는 데이터베이스 생성하고 EMAILS 테이블을 생성했다. 

 

그런데 또 문제가 생겼다. 이번엔 조금 답답했다. 오류가 남지도 않았기 떄문이다. 

insert가 되고 나서 post로 200이 찍혔는데, 실제로 db에 접속해보니까 테이블에 변경이 안된 것이다. 

참 답답할 따름이였다. 분명 잘 들어간건데 왜 디비에는 업데이트가 안되냐 나원참. 

디버깅을 해보고, 코드단에 로그를 남겨봐도 아무문제가 없었다. 

 

알고보니 코드상의 문제라기 보다 db상의 문제였다. 아니 코드문제이기도 하지?ㅋㅋㅋ

원인은 Commit이 안된 것이다. 

실제로 이메일을 입력하면 db에 저장하는 insert문을 수행하고, 저장되지 않은 것이다. 

 

<< 이거 보고 commit으로 해결했다!

 

그래서 db connect 코드에 commit옵션을 추가했따.

mysql_client = pymysql.connect(user=mysql_user,passwd=mysql_pwd,host=mysql_host,db=mysql_db,autocommit=True)

 

아, 그리고 추가로 어플리케이션 단에서 변경한 것도 있는데 

+추가로 db에 구독한 시간도 넣었는데 뭔가 이상했다. 알고보니 UTC 시간이였다. 

그래서 pytc라는 패키지를 가지고 서울시간으로 변경했따. >> 이거보고 시간변환했다. 

 

 

Cron 스케쥴 걸어두기

이제 90%정도 완성된 것 같다. 이제 남은 것은 스케쥴링이다. 

ec2안에서 이메일 전송을 수행하는 new.py라는 파일이 화요일 오전 10시마다 수행되도록 'cron'을 넣었다.

 

cron과 crontab

리눅스계열에서 특정시간에 특정작업을 하는 데몬을 Cron(크론)이라고 하고, 

이 크론이 언제 무슨일을 하도록 설정해 특정파일에 저장하는 걸 Crontab(크론탭)이라고 한다.  

원래 내가 설정했떤 윈도우즈 스케쥴러랑 비슷하다.

24시간 가동되고 있는 서버에 적절한 명령어로 자동으로 실행시키는 컨셉이라고 보면 된다.

>>윈도우 작업 스케쥴러

2021.04.20 - AWS What's new 뉴스레터4 | 매주 화요일마다 메일이 전송됩니다~

 

AWS What's new 뉴스레터4 | 매주 화요일마다 메일이 전송됩니다~

▼▼ AWS 뉴스메일 자동화 프로그램 개발일지 ▼▼ 2021.04.16 - AWS What's new 뉴스레터1 | MongoDB를 써볼까?! 2021.04.18 - AWS What's new 뉴스레터2 | 이메일 전송 사전준비 및 이해 2021.04.18 - AWS What'..

pearlluck.tistory.com

 

crontab설정하기 

크론탭등록 : crontab -e 
이렇게 크론탭으로 들어가서 명령어를 편집하고 나오면 크론설정이 끝이다. 

>> cron에대한 설명은 여기를 참고해서 알아봤다. 

cron은 이렇게 crontab으로 명령문을 수정하는데 처음에 어떤 에디터를 쓸지 선택하게 된다.

나는 vim을 쓸꺼라 3번을 택했다. nano는 가장 쉽다고 하지만 나는 너무 답답함..

 

+아 그리고, /etc/crontab 파일을 직접 편집해서 설정하는 방법도 있는데 잘 작동하지 않는다고 한다. 

그래서 되도록이면 위의 방법대로 하기

 

crontab 명령

m h dom mon dow user command 순서로 명령을 입력해주면 된다 

  • m: 분(minute) 0 ~ 59
  • h: 시(hour) 0 ~ 23
  • dom: 날(day of month) 1 ~ 31
  • mon: 월(month) 1 ~ 12
  • dow: 요일 (day of week) 0 ~ 7 (0과7은 일요일, 1 월, 2 화 .... 6 토
  • user: username
  • command: 실행할 명령어

내가 반복해야할 파일은 new.py이다. 이걸 매주 화요일 오전 10시마다 수행하는 스케쥴이 필요하다.

그래서 아래와 같이 cron명령을 만들었다.

>> crontab 설정사례 참고하기

 

 

cron명령을 수정한 다음엔 cron을 시작해야한다.

cron서비스 시작 : service cron start

만약에, 권한문제로 실행이 안된다면, 내가 실행할 파일에 권한을 부여하면 된다. 

권한부여 : chmod +x  /home/ubuntu/NewsLetter/Front/new.py

>>크론탭 명령문은 여기를 참고해서 이렇게 했따.

 

내가 설정한 크론명령어를 다시 볼수 있다. 

크론명령어보기 : crontab -l 

 

테스트

cron이 동작하는지 테스트해볼 시간(9시 45분)에 맞춰서기다려보았다. 과연..?

엥 안왔다. 아아 알고보니 리눅스 안에서 시간은 지금 KST가 아니잖아?

CRON에 적용하는 시간은 UTC시간으로 해야하는 것일까? 그래서 UTC시간으로 변경했다. 

 

크론로그 보기 : sudo tail -f grep CRON /var/log/syslog

로그에서는 잘 실행됐다고 나오는데 실제론 왜 메일이 안오는거지?ㅠㅠ

아, 중간에 

Ubuntu20.04 CRON No MTA installed, discarding output 이라는 에러가 크론로그에서 발견되었따.

그래서 sudo apt-get install postfix를 설치했다. >>여기에서 구글링함 

메일을 발송하기 위한 프로그램이라고 한다. 흠

 

반응형

$(document).ready(function() { var $toc = $("#toc"); $toc.toc({content: ".tt_article_useless_p_margin", headings: "h2,h3,h4"}); });