목적은 다음글에서 처럼 parse-server에 지금 job이 오픈소스가 아니니 정기적으로 돌아야하는 background job을 구현하기 위함입니다.
http://tidev.kr/t/parse-server-background-job/1180
위 글에 언급되었듯이 auto scaling이 적용되어 있는 것과 같이 여러 서버에서 코드가 돌아가게 될 경우 이 background job이 모든 서버에서 동작한다는 문제가 있을 수 있습니다.
저는 윗 글에서 언급한 방법 대신에 cron을 사용하여 parse-server의 cloud function을 정기적으로 호출하도록 했습니다.
Elasticbeanstalk(이하 EB)의 .ebextentions
설정을 이용하여 하나의 ec2 instance (leader_only)에만 cron이 설정되도록 햇습니다.
1. EB init이 된 프로젝트 폴더의 .ebextensions
폴더에 파일 생성
0_command.config
container_commands:
00-delete-cron-job:
command: 'rm -f /etc/cron.d/my_cron_job'
01-cron-job:
command: |
if [ "${ENV_NAME}" == "production" ]; then
"cat .ebextensions/cron_job.txt > /etc/cron.d/my_cron_job && chmod 644 /etc/cron.d/my_cron_job"
fi
leader_only: true
leader_only
는 하나의 instance를 보장하고, test는 원하는 eb envriopment에서만 실행하기 위해 넣은 조건입니다.
command의 if는 원하는 application 환경변수를 바탕으로 원하는 envriopment에서만 실행하기 위해 넣은 조건입니다.
주의! :
leader_only
와test
조건은 동시에 쓸 수 없습니다. 같이 쓰면 test 조건이 무시된다합니다.
2. cron
명령어 파일 생성
.ebextensions
폴더에 파일 cron_job.txt
파일 생성
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/
*/5 * * * * root /usr/bin/curl -X "POST" "http://my.server.com/parse/functions/backgroundJob" -H "X-Parse-Application-Id: my_parseapplication_id” -H "Content-Type: application/json"
(cron 명령어를 쓸때 사용자명(root) 잊지말고 적으세요.)
참고한 문서
- ebextension command 공식 문서 : Customizing software on Linux servers - AWS Elastic Beanstalk
- Solved: Cron Bad username and crons not running | Experts Exchange
- cron log 보기 : http://linuxforge.tistory.com/52