🛡️

今更ながらサーバーレスフレームワークのJets入門

2021/01/15に公開

概要

OSS活動をするにあたって、issueをSlackに通知してくれる機能があればいいなと思い、サーバーレスで試してみようと思いました。
今回はAWS Lambdaに容易に連携できるサーバーレスフレームワークであるJetsが気になっていたので使っていきたいと思います。これはその躓いたことの備忘録です。
今回はjobを定期実行して、helloをログに出す関数をデプロイするまでです。

実行

結論から言うと、下記を参考にして(何も躓くところがなければ)5分程度でAWS Lambdaにデプロイできます
https://rubyonjets.com/quick-start/

私の場合はDB不要・job(定期実行)関係のパッケージのみでいいので下記で実行します
DBは関係なくなるので、gemのmysql2などはインストールされなくなります

$ gem install jets
$ jets new app --mode job --no-database

あとはよしなにjobs配下にhello_job.rbを作成して、jets deployで終わりです。簡単ですね!

class HelloJob < ApplicationJob
  cron "0 */12 * * ? *"
  def hello
    puts 'hello'
  end
end

注意点

Jetsの注意点というよりはAWSやLambdaの仕様によるものがほとんどです。

  • 使用するRubyのバージョンが2.6は🙅

LambdaのRubyバージョンは2.5か2.7を使うようなので、特段理由がなければ最新の2.7を使用しましょう。作成自体はできますがデプロイでこけます。
https://rubyonjets.com/docs/extras/ruby-versions/

  • デプロイ時には、AWSのクレデンシャルを読み込むので、適切なIAMを設定しましょう。必要な権限は意外と必要ですが、基本は公式のドキュメントのポリシーをコピペすれば大丈夫です。

https://rubyonjets.com/docs/extras/minimal-deploy-iam/

$ aws configure --profile jets
  • いわゆるネイティブgem(具体的にはRuby以外のC言語で書かれているもの)で、まだServerless Gemsで提供されていないバージョンがあるので、エラーが出る場合はGemfileでバージョンを固定(ダウングレード)しましょう
    私の環境の場合、nokogiriとbyebugがだめでした。
    問題がある場合は下記のように出ます
    issue
> bundle exec jets gems:check
Checking projects gems for binary Lambda gems...
Your project requires compiled gems were not available in any of your lambdagems sources.  Unavailable pre-compiled gems:

* byebug-11.1.3

登録してtokenを取得・CLIで登録することで、フリープランでも15->30回まで拡張できます。

  • ファイル制限は250MBなので、大きすぎるファイルは🙅

単なるスクリプトなら超過することはないですが、誤って/vender配下に複数バージョンのRuby gemが存在すると超過します。どの部分が重くなっているのかを見ましょう。

Checking projects gems for binary serverlessgems...
Over the Lambda size limit of 250MB
Please reduce the size of your code.
Sizes:
Code: 197.8MB - /tmp/jets/peessue/stage/code
Gem Layer: 62.6MB - /tmp/jets/peessue/stage/opt
Total Package: 260.4MB
Over limit by: 10.4MB
  • jobを書く場合、cronの書き方はAWS流になります
    また、CLIでは直接エラー原因は出てこないので、CloudFormationのログを見に行って原因をデバッグしましょう。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
https://rubyonjets.com/docs/debugging/cloudformation/

Stack rolled back: UPDATE_ROLLBACK_COMPLETE
Time took for stack deployment: 1m 0s.
The Jets application failed to deploy. Jets creates a few CloudFormation stacks to deploy your application.
The logs above show the CloudFormation parent stack events and points to the stack with the error.
Please go to the CloudFormation console and look for the specific stack with the error.
The specific child stack usually shows more detailed information and can be used to resolve the issue.
Example of checking the CloudFormation console: https://rubyonjets.com/docs/debugging/cloudformation/

追記(2021/1/16)

nokogiriのバージョンを1.9.1で固定していると、CloudWatch側でエラーが出ていましたので、アップグレードして再デプロイしたら直りました。

- gem 'nokogiri', '1.9.1'

+ gem 'nokogiri', '~> 1.10.0'
liblzma.so.5: cannot open shared object file: No such file or directory - /opt/ruby/gems/2.7.0/gems/nokogiri-1.9.1/lib/nokogiri/nokogiri.so

終わりに

私が躓いた部分は以上です。あとは快適なサーバーレスライフを!

Discussion