ようへいの日々精進XP

よかろうもん

ラムダこりゃ(Amazon Lambda チュートリアル 6)〜 AWS Lambda で JRuby を 30 分位試したメモ 〜

まったく筆が乗らないかっぱです。

tl;dr

aws.typepad.com

8/9 の AWS上でのサーバーレスアーキテクチャ入門 を何気なく聞いていたら JRuby という単語が聞こえてきたので、「あー、確かに Lambda で Java は動くから JRuby を使えば内部処理は Ruby で書けるんぢゃないかな」と思ってググッてみたら...

github.com

qiita.com

株式会社ソラコムの片山さん が既に上記のようなプロジェクトを作られていたので、参考にさせて頂きつつ試してみることにした。

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 を作ってアップロードする

f:id:inokara:20160811183334p:plain

メモリ容量は 512MB 以上を指定しておかないとメモリ不足のエラーとなるので注意。

動作確認

以下のようにテストデータを用意。

f:id:inokara:20160811183724p:plain

Test ボタンをポチッとな。

f:id:inokara:20160811185351p:plain

API Gateway を絡める

せっかくなので API Gateway と絡めてみる。

f:id:inokara:20160811184029p:plain

以下のように 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}"

最後に

出来なかったこと

結局

Lambda Funciton を直接 Ruby で書けるというわけではないけど、内部処理を Java よりちょっと身近な Ruby で書けるのは色々と夢が広がりそうな気がした。


Lambda 関係無いけど

@yoshidashingo さんのツイートで確認。ELB にアプリケーションロードバランサの昨日が追加されてて驚いた。

f:id:inokara:20160812005102p:plain