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


(이종은(Jong Lee)) #1

목적은 다음글에서 처럼 parse-server에 지금 job이 오픈소스가 아니니 정기적으로 돌아야하는 background job을 구현하기 위함입니다.

위 글에 언급되었듯이 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:
  01-cron-job:
    command: |
      if [ "${ENV_NAME}" == "production" ]; then
        "cat .ebextensions/cron_job.txt > /etc/cron.d/playce_cron_job && chmod 644 /etc/cron.d/playce_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) 잊지말고 적으세요.)

참고한 문서


Parse Server에서 반복적인 Background Job 구현하기
(InGrowth) #2

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


(이종은(Jong Lee)) #3

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


(이종은(Jong Lee)) #4

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