heroku 와 AWS의 차이
amazon AWS 와 Heroku는 소규모 취미 프로제트(시작부터)에 대해 무료이다.
아키텍처를 많이 사용자 정의하지 않고 바로 앱을 시작하면 Heroku를 선택하고,
아키텍처에 집중하고 다른 웹 서버를 사용하려면 AWS를 사용하면된다. AWS는 선택한 서비스/ 제품에 따라 시간이 많이 걸리지만, 그만한 가치가 있고, AWS는 많은 플러그인 서비스 및 제품이 제공된다.
https://devcenter.heroku.com/articles/heroku-cli#download-and-install
먼저 git으로 관리되고 있는 프로젝트 폴더로 이동(배포에 git을 이용하기 떄문에 설치가 되어있어야함)
CLI를 이용하여 login하고 heroku에 앱을 생성
$ heroku login
$ heroku create
앱이 생성되었다는 메세지와 함께 생성된 앱의 이름(heroku_app_name)이 표시됨
https://dashboard.heroku.com/apps 에 들어가면 동일한 이름의 앱이 생성되는 것을 확인할 수 있음.
$ git init
$ heroku git:remote -a blooming-everglades-60162
$ git add .
$ git commit -m "first"
$ git push heroku master
필요한 파일 추가
requirements.txt
명령으로 현재 프로젝트에 사용되고 있는 패키지들의 리스트를 저장해서 heroku에서 배포할 때도 설치할 수 있도록 해줘야한다.
밑에 코드를 하면 현재 python 환경의 모든 패키지들이 써짐으로, 내가 필요한 패키지인 것만 써주자(버전은 pip list로 확인해서 넣음된다)
APScheduler==3.6.3 beautifulsoup4==4.6.0 requests==2.18.4 firebase-admin==4.5.1
밑의 freeze 로 할시에 heroku에 안올라가는 에러가 발생했으니 주의
$ pip freeze > requirements.txt
runtime.txt
사용하고 있는 python version을 명시해줘야한다.
https://devcenter.heroku.com/articles/python-support#supported-runtimes
$ echo 'python-3.6.5' > runtime.txt
Procfile
서버에서 실행할 명령어를 넣어준다.
명령어 앞에 process type을 지정하는데
- web
- worker
- urgentworker
- clock
등을 사용할 수 있다.
clock을 사용한 이유는 Scheduler를 이용하여 특정 시간에 주기적으로 process를 실행시키기 위함이다.
$ echo 'clock: python 파일명.py' > Procfile
python build팩 설치
https://devcenter.heroku.com/articles/buildpacks
$ heroku buildpacks:set heroku/python
$ heroku create --buildpack heroku/python
- Python code를 주기적으로 수행할 수 있게 도와주는 Python Library
- APSchedular는 자체적으로 Daemon 이나 Service 가 아님
- 이미 존재하는 Application 내에서 수행
수행방식
cron
: Cron 표현식으로 Python code를 수행interval
: 일정 주기로 Python code를 수행 date
: 특정 날짜에 Python code를 수행Schedular 종류
여러가지가 있지만 2개가 가장 많이 쓰임
BlockingScheduler
: 단일 Job 수행시
BackgroundSchedular
: 다수 Job 수행시
(background 에서 Job들이 수행되며, 여러 Job들을 등록하여 동시에 수행할 수 있다)
해야할일
pip 설치
$ pip install apscheduler
clock.py
를 생성
Profile
파일 안에 clock: python clock.py
를 추가(이떄 상대경로를 입력해줘야한다.)
git add & commit 하고 $ git push heroku master
를 터미널에 입력
터미널에 $ heroku ps:scale clock=1
를 입력
cron
에 대한 부가적인 설명
cron
이란 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러
[분][시] [일][월] [요일][실행할 명령어] 로 구성
# 월 ~ 금요일 10시 30분에 test.py 실행 30 10 * * 1-5 python /home/norr/test.py # 매월 15일에 10분마다 scan.py 실행 */10 * 15 * * python /home/norr/scan.py
APScheduler의 cron 사용 document
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', minutes=3)
def timed_job():
print('This job is run every three minutes.')
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=17)
def scheduled_job():
print('This job is run every weekday at 5pm.')
sched.start()
첫 번째 지정한 데코레이터(
@sched.scheduled_job('interval', minutes=3)
)는 3분 간격으로 아래의 함수를 호출한다는 의미로This job is run every three minutes.
이라는 메세지를 출력한다.두 번째 지정한 데코레이터(
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=17)
)는 평일 17시 마다scheduled_job()
함수를 호출하여This job is run every weekday at 5pm.
이라는 메세지를 출력한다.
sched.start()
를 통해 scheduler가 동작을 시작한다.
원하는 시간에 프로그램이 실행되도록 하려면 timezone이 나의 시간과 일치해야한다
heroku 서버의 timezone도 맞춰서 설정해줘야 한다. CLI를 통해서 timezone을 지정하여 위의 명령을 실행하면 된다.
$ heroku config:add TZ="Asia/Seoul"