Ruby와 serverless로 Slack에 주기적으로 게시하는 Lambda 함수 작성

serverless framework를 사용하여 하루에 한 번 실행하는 Slack에 대한 게시물을 Lambda 위에 최근 공식 지원된 루비로 씁니다.

아래 준비



Slack app을 만들어 적절한 채널에 integrate하여 webhook url을 얻으십시오. 그리고 serverless와 ruby의 설치도 잊지 마세요.

만들기


serverless create --template aws-ruby --path lottery 그러면 다음과 같은 구조의 디렉토리가 생깁니다.
lottery > tree
.
├── handler.rb
└── serverless.yml

0 directories, 2 files

생성된 handler.rbhello 메서드를 변경합니다.
require 'json'
require 'slack-notifier'

def hello(event:, context:)
  notifier = Slack::Notifier.new 'https://hooks.slack.com/services/xxxxxxxxxxxx' do
    defaults channel: '#general',
             link_names: 1
  end
  notifier.post text: '一日一善'
end

그런 다음 serverless.yaml에 정기적으로 실행할 작업을 추가합니다.
functions:
  hello:
    handler: handler.hello
    events:
      - schedule: cron(00 00 * * *)

위의 설정은 매일 0시 0분에 정기 실행되도록 되어 있습니다. 시간 설정은 crontab과 같은 기법을 사용할 수 있습니다. (참고: tutorial-scheduled-events-schedule-expressions )

이것이 끝나면 serverless deploy 그렇게하면 나머지는 매일 Slack에 게시됩니다.



주의사항



serverless 관리하에 gem 설치


bundle install --path vendor/bundle 에서 serverless 관리하에 gem을 설치하거나 Lambda Layer를 사용하십시오.
Init error when loading handler handler.lottery
{
"errorMessage": "cannot load such file -- slack/post",
"errorType": "Init<LoadError>",
"stackTrace": [
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/task/handler.rb:2:in `<top (required)>'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'"
]
}

루비 버전 맞추기



Lambda에서 지원하는 Ruby 런타임은 버전 2.5.0이므로 로컬에서도 2.5 계를 넣자.
// 上と同じエラーです
Init error when loading handler handler.lottery
{
"errorMessage": "cannot load such file -- slack/post",
"errorType": "Init<LoadError>",
"stackTrace": [
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/task/handler.rb:2:in `<top (required)>'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'"
]
}

schedule의 rate는 시간의 단수/복수에 주의



serverless.yml의 schedule에는 rate를 사용할 수도 있습니다.
    events:
      - schedule: rate(1 minute)

여기서 주의해야 할 것은 시간이 단수인가 복수인가 어떤가라고 하는 곳으로, 예를 들면 1 minutes 라고 하면(자) 에러가 나옵니다. 마찬가지로 10 minute 하지만 오류가 발생합니다. 1 minutes는 조금 용서해 주었으면 하는 마음이 있습니다만.
  Serverless Error ---------------------------------------

  An error occurred: HelloEventsRuleSchedule1 - Parameter ScheduleExpression is not valid. (Service: AmazonCloudWatchEvents; Status Code: 400; Error Code: ValidationException; Request ID: 329bfa3f-f7c9-11e8-9332-xxxxxxxx).

좋은 웹페이지 즐겨찾기