AWS LambdaのJavaを使用してみる

# はじめに
AWSのLambdaを用いてDynamoDBにアクセスする場合、簡単な操作はJavaScriptを用いるととても簡単にできます。ただ、複数のテーブルにクエリするような場合、JavaScript特有のCallback地獄に入ってしまい、使いづらさを感じました。またローカル環境での動作確認がしずらく、今回は新しくサポートされた、LambdaのJavaを使用してみようと思います。

# 準備
LambdaのJavaを記述する場合、Eclipse + AWS Toolkitが非常に楽です。ですので、AWS Toolkitをインストールすることをオススメします。

http://aws.amazon.com/jp/eclipse/

# 簡単なサンプルの作成
AWS Toolkitがインストールされていると、以下のように簡単にプロジェクトを作成することができます。"New AWS Lambda Java Project..."を選択します。

![スクリーンショット 2015-09-22 17.36.04.png](https://qiita-image-store.s3.amazonaws.com/0/85182/f930ae54-3dcb-53ce-5377-ebd710bdb7e0.png)

LambdaのイベントはS3Eventなど選択できますが、今回はシンプルにCustomを選択します。Input Type, Output Typeを選択できますが、両方Objectを選択します。

![スクリーンショット 2015-09-22 22.31.02.png](https://qiita-image-store.s3.amazonaws.com/0/85182/ec4f7ee8-a39f-79ca-8346-d7216f6b9494.png)

これで後はhandleRequestを実装すれば良いだけです。入力を単純に返却しているだけです。

```Java
package com.example.lamda;

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

public class MyLambdaFunctionHandler implements RequestHandler<Object, Object> {

    @Override
    public Object handleRequest(Object input, Context context) {
        return input;
    }

}
```

# ユニットテスト

Java版は簡単にEclipseでJUnitかけるのがとても良いですね。事前にローカルで入力値と出力値の簡単なテストができるのはとてもありがたいです。DynamoDBはLocalでも仮に動作させれますので、それを使えば、基本的にローカルで実装をして、最後にデプロイという形がとれます。（個人的にはローカルで環境を整備して、そこでできるだけ実装＆テストするのが開発効率が良いと思っています)

単純に入力したオブジェクトが返却されるかをテストします。

```Java
package com.example.lamda;

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.BeforeClass;
import org.junit.Test;

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

/**
 * A simple test harness for locally invoking your Lambda function handler.
 */
public class MyLambdaFunctionHandlerTest {
    private static class InputData {
        private String key1 = "value1";
    }

    private static InputData sInputData = new InputData();

    private static Object input;

    @BeforeClass
    public static void createInput() throws IOException {
        input = sInputData;
    }

    private Context createContext() {
        TestContext ctx = new TestContext();

        ctx.setFunctionName("Your Function Name");

        return ctx;
    }

    @Test
    public void testMyLambdaFunctionHandler() {
        MyLambdaFunctionHandler handler = new MyLambdaFunctionHandler();
        Context ctx = createContext();

        Object output = handler.handleRequest(input, ctx);

        assertEquals(input, output);
    }
}
```

EclipseでJUnitを実行すると無事テストも通りました。

![スクリーンショット 2015-09-22 22.41.16.png](https://qiita-image-store.s3.amazonaws.com/0/85182/42d41ae2-13c8-816c-e2e4-f3a3e8b98b08.png)

# Jarファイルの作成

AWS Toolkitを用いいると、そのままデプロイできるのですが、セキュリティ的な面からEclipseにAWSのシークレットを入力したくないので、少し面倒ですが、Jarファイルを作成してから、デプロイします。

Jarファイルは普通に先ほど再生したMyLambdaFunctionHandlerクラスだけデプロイすれば良いです。(src以下だけ選択するようにして下さい）

![スクリーンショット 2015-09-22 18.12.16.png](https://qiita-image-store.s3.amazonaws.com/0/85182/00688287-ad69-6f48-c01b-d7523af66578.png)

# Lambda Functionの作成 & テスト
Lambda Functionで新しいFunctionを作成し、Blueprintでは単純にHello Lambdaを選択します。そして、以下のようにJarファイルのUploadなどの設定をします。
(Handlerで先ほど作成したクラス名をフルパスで指定して下さい）

![スクリーンショット 2015-09-22 22.49.28.png](https://qiita-image-store.s3.amazonaws.com/0/85182/11a24600-9f02-e386-ed32-8fdfe937836f.png)

そして実行すると、無事成功しました。

![スクリーンショット 2015-09-22 22.51.35.png](https://qiita-image-store.s3.amazonaws.com/0/85182/1ea3f47f-f2de-4430-5730-80edad31cab6.png)