AWS Lambda でサポートされていない言語を使ってみた #アドカレ2015

毎度お馴染み流浪の動かしてみた & C 芸人の Fujimura です。

モバイルバックエンドとしても有用な AWS Lambda ですが、以前に紹介した AWS Lambda で BeanShell を動かしてみた のようにインタプリタを動かすことでサポートされていない言語でも Java による実装があれば動かすことができるため、今回は Scheme インタプリタである jakld を動かしてみました。

準備

$ git clone https://github.com/fd00/aws-lambda-jakld.git
$ cd aws-lambda-jakld
$ ./gradlew jar

生成された build/libs/aws-lambda-jakld-0.1.jar をアップロードします。

Configure function

実装

ハンドラの実装は以下のようになります。今回はあらかじめ fib を定義しておきました。jakld のドキュメントによると Eval.loadProgram(String fileName) で外部の scheme ファイルを読み込んでおくことも可能なようです。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class AwsLambdaJakld implements RequestHandler<String, String> {
    @Override
    public String handleRequest(String input, Context context) {
        Eval.initializeSystem();
        Eval.runProgram("(define (fib n) (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1)))))");
        return Eval.runProgram(input).toString();
    }
}

実行

payload として S 式を渡します。

$ aws lambda invoke --function-name AwsLambdaJakld --payload "\"(fib 10)\"" /dev/stderr > /dev/null 
"55"
$ aws lambda invoke --function-name AwsLambdaJakld --payload "\"(fib 20)\"" /dev/stderr > /dev/null 
"6765"
$ aws lambda invoke --function-name AwsLambdaJakld --payload "\"(fib 30)\"" /dev/stderr > /dev/null 
"832040"

まとめ

AWS Lambda でサポートされていない言語のインタプリタを動かすことで、AWS Lambda でサポートされていない言語を AWS Lambda で処理できるようにしてみました。既存の非サポート言語で書かれたコードを AWS Lambda で動かしたいということはレアケースだとは思いますが、意外に使いやすい言語との組み合わせも見つかるかもしれません。

明日 (12/14) は 能登 諭 による Amazon ML 関連の記事です。どうぞお楽しみに!