AWS EB를 쓸 경우 하나의 ec2 instance에서만 cron 구동하기

목적은 다음글에서 처럼 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_onlytest조건은 동시에 쓸 수 없습니다. 같이 쓰면 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) 잊지말고 적으세요.)

참고한 문서

1개의 좋아요

Elastic Beanstalk의 제공 기능에 충실한 멋진 해결방법이네요!!

내용중에 잘못된 부분이 있어 수정했습니다. 수정한 부분의 핵심은 다음과 같습니다.

eb의 container_command로 cron을 설정하는 방법에 뭔가 여러가지로 이상한 경우들이 발견되어 그냥 접고 lambda function을 cloud watch가 정기적으로 호출하게 했습니다. 차라리 이게 관리도 편하고 좋은 것 같네요.

1개의 좋아요

감사합니다. 덕분에 많은 도움이 되었어요!

히야 이런 알짜 정보가 벌써 2년이 지났군요

위에서 cron 방법이 정상작동 하지 않았던 이유는 leader가 아닐 경우 cron.d에 복사한 cronjob 파일을 삭제해줘야 합니다. 위에서 해당 코드를 수정했습니다. 테스트해보진 못했는데 위 코드데로 설정하신 분중에 잘 동작 안하면 말씀해주세요.