티스토리 뷰
AWS Lambda에서 스케쥴링 방식으로 자동으로 작업이 이루어지도록 해보겠습니다.
-
Job 생성
1. Active Job 하나를 생성해보겠습니다.
# jets g job [NAME]
jets g job crawl
그럼 app/jobs/ 위치에 crawl_job.rb 파일이 생성된게 확인됩니다.
참고 이름을 잘못 지었을 경우, 다음 명령어를 통해 삭제하세요.
# jets degenerate job [NAME]
jets degenerate job crawl
2. app/jobs/crawl_job.rb 파일을 열람 시, 다음과 같은 내용으로 되어있습니다.
class CrawlJob < ApplicationJob
rate "10 hours"
def dig
puts "done digging"
end
end
-
rate : Job schedule Time을 정합니다. (현재는 매 10시간동안 돌아가도록 설정)
-
dig : dig 이라는 이름을 가진 메소드
-
Job 작동 (테스트)
Job을 잠깐 작동 시켜볼까요?
1. 터미널에서 Jets를 콘솔 모드로 전환합니다.
# jets c
# JETS_ENV=production jets c
jets c
2. Jets 콘솔에 다음과같이 입력해보세요.
# [Job].perform_now(:[Method])
CrawlJob.perform_now(:dig)
그럼 Job이 수행되는걸 확인할 수 있습니다.
-
Job Scheduling
매 시간마다 Lambda가 자동으로 Job을 작동시켜보는 Scheduling 작업을 해보겠습니다.
1. 저는 바로 빠르게 확인하고자, Job을 1분마다 작동시키고, 작업으로서는 posts 테이블에 게시글이 쓰여지게 해보겠습니다.
class CrawlJob < ApplicationJob
rate "1 minute"
def dig
Post.create(title: "[#{Time.now.in_time_zone("Asia/Seoul").strftime('%Y-%m-%d %H:%M')}] 저는 일하고 있습니다.", content: "화이팅")
end
end
참고1 과거 당근마켓 연사발표[클릭] 때 1분, 1시간 표현에 있어 복수형(1 minutes, 1 hours)으로 표현 시, 작동이 안된다는 얘기가 있었는데 2020. 1. 21 기준으로 여전히 rate "1 minute", rate "1 hours" 표현을 하려고 할 시 오류가 생기는 것을 확인했습니다.
2. Jets을 Lambda에 Deploy를 합니다.
저는 Production 환경으로 Deploy를 해왔으므로, Production 상태로 Deploy 하겠습니다.
# jets deploy [Environment]
# jets deploy production
jets deploy production
3. Lambda에 배포되는 그 순간부터 Job은 바로 일을 시작합니다!
4. 더불어, Lambda의 활동을 기록하는 Cloud Watch에서도 Lambda가 일을 잘 수행하는지 확인할 수 있습니다.
5. 지금(5번) 부터의 과정은 반드시 꼭 하세요,
Lambda가 1분마다 작동이 되어가지고 100만번이 넘어가면 과금이 될 수 있습니다.
확인을 다 하셨으면 이제 Job 파일을 지워보겠습니다.
Ruby on Jets로 돌아가서 Job 파일을 지웁니다.
# jets degenerate job [NAME]
jets degenerate job crawl
6. Jets 프로젝트를 Deploy 하여 AWS Lambda를 최신화 합니다.
# jets deploy [Environment]
# jets deploy production
jets deploy production
-
여러개의 메소드가 있는데 특정 메소드에만 스케쥴링을 주고 싶어요
class TestJob < ApplicationJob
rate "3 minutes"
def dig
p "나는 빡빡이다."
end
def hi
p "방가"
end
end
만약 위와같은 기본 코드가 있다고 치겠습니다.
Case 1 hi 메소드에 대해서만 스케쥴러 Job(매 20분)을 돌리고 싶은 상황입니다.
A. 특정 메소드 위에다가만 rate 코드를 적어내면 됩니다.
class TestJob < ApplicationJob
def dig
p "나는 빡빡이다."
end
rate "20 minutes"
def hi
p "방가"
end
end
Case 2 dig 메소드에는 매 3분 별, hi 메소드는 매 20분 별로 크롤링을 돌리고 싶어요.
A. 각각의 메소드 이름 위에 rate 코드를 적어주면 됩니다.
class TestJob < ApplicationJob
rate "3 minutes"
def dig
p "나는 빡빡이다."
end
rate "20 minutes"
def hi
p "방가"
end
end
-
스케쥴러 규칙
각 함수별 스케쥴러 규칙은 CloudWatch 서비스 - 규칙 에 명시되어 있습니다.
-
기타 Job 표현
1. Cronjob
사실 rate 외에도 cronJob 문법을 통해서도 Scheduling 표현을 할 수 있습니다.
class HardJob < ApplicationJob
rate "10 hours" # every 10 hours
def dig
puts "done digging"
end
# Cron expression is AWS Cron Format and require 6 fields
cron "0 */12 * * ? *" # every 12 hours
def lift
puts "done lifting"
end
end
부록 AWS CloudWatch Cronjob 문법 [클릭]
만약
cron "0 1-14 * * ? *"
위와같이 표현을 한 경우, (한국 시간 기준) 매일 오전 10시~오후 23시 정각에 Job을 실행하겠다는 의미로 알아두면 됩니다.
참고1 cronjob 시간은 GMT Time 기준을 따릅니다.
만약 한국시간을 기준으로 시간을 만들고 싶다면 GMT 시간+9시간을 하면 됩니다.
이는 UTC 시간 또한 동일합니다.
참고2 GMT+0시간(영국/런던) ↔ GMT+9시간(한국/서울)
쉽게 GMT 시간을 계산하는법은 Rails 혹은 Jets 콘솔에다가 다음과 같이 계산을 해내면 됩니다.
2. class_timeout
또한 Timeout 시간도 다음과 같이 설정할 수 있습니다.
class HardJob < ApplicationJob
class_timeout 300 # 300s or 5m, current Lambda max is 15m
rate "1 hour"
def dig
puts "done digging"
end
end
이 문법은 Lambda 함수 시행에 있어 Timeout 시간을 정할 수 있습니다.
class_timeout 단위는 '초 단위'이며, AWS Lambda 기준 상으로는 최대 15분(900초)을 지원합니다.
기본 Timeout 설정시간은 60초(1분) 입니다.
-
관련자료
1. Jets Docs : Job [클릭]
-
자료 참고
1. 당근마켓 Ruby on Jets 연사 발표 [클릭]
'프로그래밍 공부 > Ruby on Jets : 서버리스 프레임워크' 카테고리의 다른 글
Ruby on Jets : AWS Lambda에서 Selenium 크롤링 (4) | 2020.01.21 |
---|---|
Ruby on Jets : AWS Lambda Project 제거 (0) | 2020.01.21 |
Ruby on Jets : AWS Lambda 배포 (0) | 2020.01.20 |
Ruby on Jets : Jets 구조, 기본/핵심기능 사용 (0) | 2020.01.20 |
Ruby on Jets : Jets 설치 (2) | 2020.01.20 |