티스토리 뷰

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으로 자동으로 설정된 Lambda 제한시간

 

class_timeout 단위는 '초 단위'이며, AWS Lambda 기준 상으로는 최대 15분(900초)을 지원합니다.

기본 Timeout 설정시간은 60초(1분) 입니다.

 

 

  • 관련자료

1. Jets Docs : Job [클릭]

 

 

  • 자료 참고

1. 당근마켓 Ruby on Jets 연사 발표 [클릭]

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함