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

tl;dr

こんにちは、テクニカルトレーナーの鬼形です。 8月のAWS Black Belt オンラインセミナー...

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

aws-lambda-jruby - Run ruby code on JRuby on AWS Lambda Java

github.com
#コードコード一式は https://github.com/c9katayama/aws-lambda-jruby にあります。#使い方githubからclone後、src/main/resources/main.rb にru...

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

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

動作確認

以下のようにテストデータを用意。
20160811183724
Test ボタンをポチッとな。
20160811185351

API Gateway を絡める

せっかくなので API Gateway と絡めてみる。
20160811184029
以下のように 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 関係無いけど


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

元記事はこちら

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