まったく筆が乗らないかっぱです。
tl;dr
8/9 の AWS上でのサーバーレスアーキテクチャ入門 を何気なく聞いていたら JRuby という単語が聞こえてきたので、「あー、確かに Lambda で Java は動くから JRuby を使えば内部処理は Ruby で書けるんぢゃないかな」と思ってググッてみたら...
株式会社ソラコムの片山さん が既に上記のようなプロジェクトを作られていたので、参考にさせて頂きつつ試してみることにした。
memo
git clone してくる
git clone https://github.com/c9katayama/aws-lambda-jruby.git
Ruby で内部処理を書く
src/main/resources/main.rb に Ruby で以下のような内部処理を書く。Lambda が受け取った引数を使って足し算して結果を返すだけ。(せっかくなので定数で定義されている Ruby のバージョン等も出力するようにしてみた。)
require "yaml" require "json" require "java" json = JSON.load $lambda_arg # json = JSON.load '{"a": 1, "b": 2, "c": 3}' hash = java.util.HashMap.new result = json["a"] + json["b"] + json["c"] hash.put("ruby_version", RUBY_VERSION) hash.put("ruby_description", RUBY_DESCRIPTION) hash.put("ruby_platform", RUBY_PLATFORM) hash.put("result", result) return hash # return { ruby_version: RUBY_VERSION, result: result.to_s }
Java の HashMap クラスを呼べたりするのが新鮮。
ビルドする
cd aws-lambda-jruby
./gradlew build
Lambda Function を作ってアップロードする
メモリ容量は 512MB 以上を指定しておかないとメモリ不足のエラーとなるので注意。
動作確認
以下のようにテストデータを用意。
Test ボタンをポチッとな。
API Gateway を絡める
以下のように curl で呼んでみる。
% curl -s -d '{"a": 1000, "b": 2, "c": 4}' https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/jruby-test "{result=1006, ruby_description=jruby 9.0.0.0 (2.2.2) 2015-07-21 e10ec96 OpenJDK 64-Bit Server VM 25.77-b03 on 1.8.0_77-b03 +jit [linux-amd64], ruby_platform=java, ruby_version=2.2.2}"
最後に
出来なかったこと
- API っぽく結果を JSON で返したいけど String で返ってくるのを何とかしたかったけど無理だった(自分のスキルの限界)
- JSON の入出力を Lambda でやろうとする場合 POJO を使うようだ → https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-handler-using-predefined-interfaces.html
- POJO とは何?というレベルなので引き続き...
結局
Lambda Funciton を直接 Ruby で書けるというわけではないけど、内部処理を Java よりちょっと身近な Ruby で書けるのは色々と夢が広がりそうな気がした。
Lambda 関係無いけど
New – AWS Application Load Balancer | AWS Blog https://t.co/jOXkslEhOC
— Shingo (@yoshidashingo) 2016年8月11日
Powerful AWS Platform Features, Now for Containers | AWS Blog https://t.co/PrAm6CMQcr
— Shingo (@yoshidashingo) 2016年8月11日
@yoshidashingo さんのツイートで確認。ELB にアプリケーションロードバランサの昨日が追加されてて驚いた。